#include #include #include #include #include #include int main() { char* input = (char*) calloc(100, sizeof(char)); char symbol; int counter; int operation; char* number1 = (char*) calloc(25, sizeof(char)); char* number2 = (char*) calloc(25, sizeof(char)); char* result = (char*) calloc(30, sizeof(char)); char* ptr; bool equals = false; for(int i = 0; fgets(input, 100, stdin) != NULL; i++){ if(!input || !strcmp(input, "") || input[0] == EOF || input[0] == '\n' || input[0] == '\0') break; counter = 0; operation = 0; equals = false; memset(number1, '\0', 25); memset(number2, '\0', 25); memset(result, '\0', 30); while(input[counter] != '\0' && input[counter] != '\n'){ symbol = input[counter++]; while (isspace(symbol)) symbol = input[counter++]; if(symbol == '\0' || symbol == '\n') break; switch (symbol) { case '+': operation = 1; break; case '-': if(operation == 0) operation = 2; else{ result[strlen(result)] = symbol; result[strlen(result)] = '\0'; } break; case '*': operation = 3; break; case '/': operation = 4; break; case '=': equals = true; break; default: if (isdigit(symbol) || symbol == '.'){ if (operation == 0) { number1[strlen(number1)] = symbol; number1[strlen(number1)] = '\0'; } else if(!equals){ number2[strlen(number2)] = symbol; number2[strlen(number2)] = '\0'; } else{ result[strlen(result)] = symbol; result[strlen(result)] = '\0'; } } else{ printf("CHYBA\n"); goto LABEL; } break; } } switch(operation){ case 1: if((strtof(number1, &ptr) != roundf(strtof(number1, &ptr))) || (strtof(number2, &ptr) != roundf(strtof(number2, &ptr))) || (strtof(result, &ptr) != roundf(strtof(result, &ptr)))) printf("%s\n", (roundf((strtof(number1, &ptr) + strtof(number2, &ptr))*100)/100 > strtof(result, &ptr) - 0.001 && roundf((strtof(number1, &ptr) + strtof(number2, &ptr))*100)/100 < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); else printf("%s\n", (strtof(number1, &ptr) + strtof(number2, &ptr) > strtof(result, &ptr) - 0.001 && strtof(number1, &ptr) + strtof(number2, &ptr) < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); break; case 2: if((strtof(number1, &ptr) != roundf(strtof(number1, &ptr))) || (strtof(number2, &ptr) != roundf(strtof(number2, &ptr))) || (strtof(result, &ptr) != roundf(strtof(result, &ptr)))) printf("%s\n", (roundf((strtof(number1, &ptr) - strtof(number2, &ptr))*100)/100 > strtof(result, &ptr) - 0.001 && roundf((strtof(number1, &ptr) - strtof(number2, &ptr))*100)/100 < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); else printf("%s\n", (strtof(number1, &ptr) - strtof(number2, &ptr) > strtof(result, &ptr) - 0.001 && strtof(number1, &ptr) - strtof(number2, &ptr) < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); break; case 3: if((strtof(number1, &ptr) != roundf(strtof(number1, &ptr))) || (strtof(number2, &ptr) != roundf(strtof(number2, &ptr))) || (strtof(result, &ptr) != roundf(strtof(result, &ptr)))) printf("%s\n", (roundf((strtof(number1, &ptr) * strtof(number2, &ptr))*100)/100 > strtof(result, &ptr) - 0.001 && roundf((strtof(number1, &ptr) * strtof(number2, &ptr))*100)/100 < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); else printf("%s\n", (strtof(number1, &ptr) * strtof(number2, &ptr) > strtof(result, &ptr) - 0.001 && strtof(number1, &ptr) * strtof(number2, &ptr) < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); break; case 4: if((strtof(number1, &ptr) != roundf(strtof(number1, &ptr))) || (strtof(number2, &ptr) != roundf(strtof(number2, &ptr))) || (strtof(result, &ptr) != roundf(strtof(result, &ptr)))) printf("%s\n", (roundf((strtof(number1, &ptr) / strtof(number2, &ptr))*100)/100 > strtof(result, &ptr) - 0.001 && roundf((strtof(number1, &ptr) / strtof(number2, &ptr))*100)/100 < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); else printf("%s\n", (strtof(number1, &ptr) / strtof(number2, &ptr) > strtof(result, &ptr) - 0.001 && strtof(number1, &ptr) / strtof(number2, &ptr) < strtof(result, &ptr) + 0.001) ? "OK" : "ZLE"); break; default: printf("CHYBA\n"); } LABEL: i = i; } free(input); return 0; }