#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; } printf("num1: %d | num2: %d | result: %d | operation: %d | state: %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); break; 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; calc.state = RESULT; break; case MUL: calc.result = calc.num1 * calc.num2; calc.state = RESULT; break; case DIV: calc.result = calc.num1 / calc.num2; calc.state = RESULT; break; } break; case 15: break; } printf("num1: %d | num2: %d | result: %d | operation: %d | state: %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; printf("num1: %d | num2: %d | result: %d | operation: %d | state: %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); break; } break; } } }