diff --git a/calculator.c b/calculator.c new file mode 100644 index 0000000..00060f9 --- /dev/null +++ b/calculator.c @@ -0,0 +1,143 @@ +#include +#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 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; + 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; +} diff --git a/calculator.h b/calculator.h new file mode 100644 index 0000000..d183a36 --- /dev/null +++ b/calculator.h @@ -0,0 +1,32 @@ +#ifndef TESTCALC_MAIN_H +#define TESTCALC_MAIN_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 //TESTCALC_MAIN_H diff --git a/main.c b/main.c new file mode 100644 index 0000000..2ef6498 --- /dev/null +++ b/main.c @@ -0,0 +1,13 @@ +#include +#include "calculator.h" + +int main() { + struct calculator calc; + clearCalc(&calc); + int input; + while (1) { + scanf("%d", &input); + handleCalc(&calc, input); + printf("num1: %d | num2: %d | result: %d | operation: %d | state: %d", calc.num1, calc.num2, calc.result, calc.operation, calc.state); + } +} \ No newline at end of file