This commit is contained in:
Полина Хромова 2023-05-22 13:12:36 +00:00
parent b2e4931c15
commit fbe148d487

188
calc.c Normal file
View File

@ -0,0 +1,188 @@
#include <stdio.h>
#include <stdlib.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;
};
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;
}