diff --git a/calculator.c b/calculator.c index c1dee62..c6e609d 100644 --- a/calculator.c +++ b/calculator.c @@ -1,187 +1,140 @@ #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); +#include "calculator.h" +void handleCalc(struct calculator *calc, int input) { + switch (calc->state) { + case NUMBER_FIRST: + switch (input) { + case 0: + calc->num1 = (calc->num1 * 10) + 7; 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); + case 1: + calc->num1 = (calc->num1 * 10) + 8; 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; - } + 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; + break; + case 10: + calc->num1 = (calc->num1 * 10) + 3; + break; + case 11: + calc->operation = SUB; + calc->state = NUMBER_SECOND; + break; + case 12: + calc->num1 = (calc->num1 * 10); + break; + case 13: + clearCalc(calc); + break; + case 14: + break; + case 15: + calc->operation = ADD; + calc->state = NUMBER_SECOND; break; - } + 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; + break; + case 10: + calc->num2 = (calc->num2 * 10) + 3; + break; + case 11: + break; + case 12: + calc->num2 = (calc->num2 * 10); + break; + case 13: + clearCalc(calc); + 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; + } + break; + case RESULT: + switch (input) { + case 14: + clearCalc(calc); + break; + } + break; } +} +void clearCalc(struct calculator* calc) { + calc->state = NUMBER_FIRST; + calc->operation = NO_OP; + calc->num1 = 0; + calc->num2 = 0; + calc->result = 0; } \ No newline at end of file diff --git a/calculator.h b/calculator.h new file mode 100644 index 0000000..802474d --- /dev/null +++ b/calculator.h @@ -0,0 +1,40 @@ +/* + * calculator.h + * + * Created: 29.05.2023 12:01:39 + * Author: mrnek + */ + + +#ifndef CALCULATOR_H_ +#define CALCULATOR_H_ + +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; +}; +void clearCalc(struct calculator *calc); + +void handleCalc(struct calculator *calc, int input) + +#endif /* CALCULATOR_H_ */ \ No newline at end of file