diff --git a/du3/program.c b/du3/program.c index 92d9eee..546a0e2 100644 --- a/du3/program.c +++ b/du3/program.c @@ -1,112 +1,143 @@ #include #include #include +#include +#include -#define EPSILON 0.001 -#define BUFFER_SIZE 100 +#define EPSILON 0.001 -// Функция вычисления результата -float vypocitaj(float a, float b, char op, int* error) { - if (op == '+') return a + b; - if (op == '-') return a - b; - if (op == '*') return a * b; - if (op == '/') { - if (b == 0) { - *error = 1; // Ошибка: деление на ноль - return 0; - } - return a / b; - } - *error = 1; // Ошибка: некорректный оператор - return 0; -} - -// Функция проверки результата -void over_vysledok(float skutocny, float ocakavany) { - if (abs(skutocny - ocakavany) <= EPSILON) { - printf("OK\n"); - } else { - printf("ZLE\n"); +void trim_newline(char *line) { + size_t len = strlen(line); + if (len > 0 && line[len - 1] == '\n') { + line[len - 1] = '\0'; } } -// Функция обработки одной строки -void spracuj_riadok(char* riadok) { - char* zaciatok = riadok; - char* koniec; +char* skip_spaces(char *str) { + while (*str && isspace((unsigned char)*str)) { + str++; + } + return str; +} + +int parse_expression(char *line, float *num1, char *op, float *num2, float *result) { + char *ptr = line; - // Читаем первое число - float a = strtof(zaciatok, &koniec); - if (zaciatok == koniec) { - printf("CHYBA\n"); - return; + ptr = skip_spaces(ptr); + char *endPtr; + *num1 = strtof(ptr, &endPtr); + if (ptr == endPtr) { + return 1; } - - // Пропускаем пробелы перед оператором - while (*koniec == ' ') koniec++; - - // Читаем оператор - char op = *koniec; - if (op != '+' && op != '-' && op != '*' && op != '/') { - printf("CHYBA\n"); - return; + ptr = endPtr; + + ptr = skip_spaces(ptr); + if (*ptr == '\0') return 1; + *op = *ptr; + if (*op != '+' && *op != '-' && *op != '*' && *op != '/') { + return 1; } - - // Двигаем указатель дальше - koniec++; - while (*koniec == ' ') koniec++; - - // Читаем второе число - float b = strtof(koniec, &koniec); - if (koniec == zaciatok) { - printf("CHYBA\n"); - return; + ptr++; + + ptr = skip_spaces(ptr); + *num2 = strtof(ptr, &endPtr); + if (ptr == endPtr) { + return 1; } - - // Пропускаем пробелы перед знаком "=" - while (*koniec == ' ') koniec++; - if (*koniec != '=') { - printf("CHYBA\n"); - return; + ptr = endPtr; + + ptr = skip_spaces(ptr); + if (*ptr != '=') { + return 1; } - - // Двигаем указатель дальше - koniec++; - while (*koniec == ' ') koniec++; - - // Читаем результат - float vysledok = strtof(koniec, &koniec); - if (koniec == zaciatok) { - printf("CHYBA\n"); - return; + ptr++; + + ptr = skip_spaces(ptr); + *result = strtof(ptr, &endPtr); + if (ptr == endPtr) { + return 1; } - - // Вычисляем реальный результат - int error = 0; - float skutocny = vypocitaj(a, b, op, &error); - if (error) { - printf("CHYBA\n"); - return; + ptr = endPtr; + + ptr = skip_spaces(ptr); + if (*ptr != '\0') { + return 1; } - - // Проверяем правильность ответа - over_vysledok(skutocny, vysledok); + + return 0; } -int main() { - char buffer[BUFFER_SIZE]; - while (1) { - printf("Zadajte priklad:\n"); +float calculate(float num1, char op, float num2, int *error) { + *error = 0; + float res; + switch(op) { + case '+': + res = num1 + num2; + break; + case '-': + res = num1 - num2; + break; + case '*': + res = num1 * num2; + break; + case '/': + if (fabs(num2) < EPSILON) { + *error = 1; + return 0; + } + res = num1 / num2; + break; + default: + *error = 1; + return 0; + } + return res; +} - if (!fgets(buffer, sizeof(buffer), stdin)) break; // Проверяем конец ввода - if (buffer[0] == '\n') { - printf("KONIEC\n"); + +void process_line(const char *line, char *output, size_t output_size) { + char buffer[256]; + strncpy(buffer, line, 255); + buffer[255] = '\0'; + trim_newline(buffer); + + float num1, num2, givenResult; + char op; + if (parse_expression(buffer, &num1, &op, &num2, &givenResult) != 0) { + snprintf(output, output_size, "CHYBA"); + return; + } + + int calcError = 0; + float calculatedResult = calculate(num1, op, num2, &calcError); + if (calcError) { + snprintf(output, output_size, "ZLE"); + return; + } + + float roundedResult = round(calculatedResult * 100) / 100; + + if (fabs(roundedResult - givenResult) <= EPSILON) { + snprintf(output, output_size, "OK"); + } else { + snprintf(output, output_size, "ZLE"); + } +} + + +int main(int argc, char *argv[]) { + char buffer[256]; + char output[32]; + + while (fgets(buffer, sizeof(buffer), stdin) != NULL) { + trim_newline(buffer); + if (*skip_spaces(buffer) == '\0') { break; } - - spracuj_riadok(buffer); + process_line(buffer, output, sizeof(output)); + printf("%s\n", output); } - + return 0; } \ No newline at end of file