diff --git a/calc.c b/calc.c new file mode 100644 index 0000000..2620da6 --- /dev/null +++ b/calc.c @@ -0,0 +1,188 @@ +#include + +#include + +enum calculator_state { + NUMBER_FIRST, + NUMBER_SECOND, + RESULT +}; + +enum calculator_op { + NO_OP, + ADD, + SUB, + DIV, + MUL +}; +struct calculator { + // 1 число + int num1; + // 2 число + int num2; + // 3 операция + enum calculator_op operation; + // 4 результат + int result; + // 5 состояние атомата + enum calculator_state state; +}; + +int main() { + struct calculator calc; + calc.state = NUMBER_FIRST; + calc.operation = NO_OP; + calc.num1 = 0; + calc.num2 = 0; + calc.result = 0; + + int input; + while (1) { + scanf("%d", & input); + switch (calc.state) { + case NUMBER_FIRST: + switch (input) { + case 0: + calc.num1 = (calc.num1 * 10) + 7; + break; + case 1: + calc.num1 = (calc.num1 * 10) + 8; + break; + case 2: + calc.num1 = (calc.num1 * 10) + 9; + break; + case 3: + calc.operation = DIV; + calc.state = NUMBER_SECOND; + break; + case 4: + calc.num1 = (calc.num1 * 10) + 4; + break; + case 5: + calc.num1 = (calc.num1 * 10) + 5; + break; + case 6: + calc.num1 = (calc.num1 * 10) + 6; + break; + case 7: + calc.operation = MUL; + calc.state = NUMBER_SECOND; + break; + case 8: + calc.num1 = (calc.num1 * 10) + 1; + break; + case 9: + calc.num1 = (calc.num1 * 10) + 2; + case 10: + calc.num1 = (calc.num1 * 10) + 3; + break; + case 11: + calc.operation = SUB; + calc.state = NUMBER_SECOND; + break; + case 12: + calc.num1 = 0; + break; + case 13: + calc.state = NUMBER_FIRST; + calc.operation = NO_OP; + calc.num1 = 0; + calc.num2 = 0; + calc.result = 0; + break; + case 14: + break; + case 15: + calc.operation = ADD; + calc.state = NUMBER_SECOND; + break; + } + break; + printf("%d %d %d %d %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); + + case NUMBER_SECOND: + switch (input) { + case 0: + calc.num2 = (calc.num2 * 10) + 7; + break; + case 1: + calc.num2 = (calc.num2 * 10) + 8; + break; + case 2: + calc.num2 = (calc.num2 * 10) + 9; + break; + case 3: + + break; + case 4: + calc.num2 = (calc.num2 * 10) + 4; + break; + case 5: + calc.num2 = (calc.num2 * 10) + 5; + break; + case 6: + calc.num2 = (calc.num2 * 10) + 6; + break; + case 7: + break; + case 8: + calc.num2 = (calc.num2 * 10) + 1; + break; + case 9: + calc.num2 = (calc.num2 * 10) + 2; + case 10: + calc.num2 = (calc.num2 * 10) + 3; + break; + case 11: + break; + case 12: + calc.num2 = 0; + break; + case 13: + calc.state = NUMBER_FIRST; + calc.operation = NO_OP; + calc.num1 = 0; + calc.num2 = 0; + calc.result = 0; + break; + case 14: + switch (calc.operation) { + case ADD: + calc.result = calc.num1 + calc.num2; + calc.state = RESULT; + break; + case SUB: + calc.result = calc.num1 - calc.num2; + break; + case MUL: + calc.result = calc.num1 * calc.num2; + break; + case DIV: + calc.result = calc.num1 / calc.num2; + break; + return calc.result; + } + break; + break; + case 15: + break; + } + printf("%d %d %d %d %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); + break; + + case RESULT: + switch (input) { + case 14: + calc.state = NUMBER_FIRST; + calc.operation = NO_OP; + calc.num1 = 0; + calc.num2 = 0; + calc.result = 0; + break; + } + break; + printf("%d %d %d %d %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); + } + } + return 0; +}