From b05aee6a2088ff2fffdf0a986a55fc959a3d6e42 Mon Sep 17 00:00:00 2001 From: Anzhelika Nikolaieva Date: Fri, 17 Mar 2023 21:25:17 +0000 Subject: [PATCH] Update 'du4/program.c' --- du4/program.c | 137 +++++++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 62 deletions(-) diff --git a/du4/program.c b/du4/program.c index 55d7d55..257af06 100644 --- a/du4/program.c +++ b/du4/program.c @@ -1,77 +1,90 @@ -#include #include #include -#include +#include int main() { - char line[300]; + char priklad[300]; int count = 0; - while (fgets(line, sizeof(line), stdin)) { - count++; - char *start = line, *end = NULL; - int has_operator = 0; - float num1 = 0, num2 = 0, expected_result = 0; - char op, *next; - while (*start != '\n') { - if (*start == '+' || *start == '-' || *start == '*' || *start == '/') { - has_operator = 1; - op = *start; - } else if ((*start < '0' || *start > '9') && *start != ' ' && *start != '=' && *start != '.') { - goto next_line; + // Read input line by line + while (fgets(priklad, sizeof(priklad), stdin) != NULL) { + count++; + + // Parse expression and evaluate it + char *start = priklad; + char *end = NULL; + int valid = 1; + float num1 = strtof(start, &end); + if (end == start) { + printf("KONIEC\n"); + continue; + } + start = end; + + // Find the operation symbol + char op = *start; + if (op != '+' && op != '-' && op != '*' && op != '/') { + printf("CHYBA\n"); + valid = 0; + } + start++; + + // Parse second number + float num2 = strtof(start, &end); + if (end == start) { + printf("CHYBA\n"); + valid = 0; + } + start = end; + + // Check for extra characters + while (*start != '\0') { + if (*start != '\n' && (*start < '0' || *start > '9') && *start != '.' && *start != ' ') { + printf("CHYBA\n"); + valid = 0; + break; } start++; - - if (!has_operator) { - printf("CHYBA\n"); - goto next_line; } - if (!has_operator) { - printf("CHYBA\n"); - goto next_line; - } + if (valid) { + // Evaluate expression + float result; + switch (op) { + case '+': + result = num1 + num2; + break; + case '-': + result = num1 - num2; + break; + case '*': + result = num1 * num2; + break; + case '/': + if (num2 == 0) { + printf("CHYBA\n"); + continue; + } + result = num1 / num2; + break; + } - num1 = strtof(line, &next); - while (*next == ' ') next++; - if (*next != op) { - printf("KONIEC\n"); - goto next_line; + // Round result and compare to expected value + float expected; + if (sscanf(start, "%f", &expected) != 1) { + printf("KONIEC\n"); + continue; + } + expected = round(expected * 100) / 100; + if (fabs(result - expected) < 0.001) { + printf("OK\n"); + } else { + printf("ZLE\n"); + } } - next++; - num2 = strtof(next, &next); - while (*next == ' ') next++; - if (*next == '=') { - next++; - expected_result = strtof(next, &next); - while (*next == ' ') next++; - } else { - goto next_line; - } - - float result; - switch (op) { - case '+': - result = num1 + num2; - break; - case '-': - result = num1 - num2; - break; - case '*': - result = num1 * num2; - break; - case '/': - result = num1 / num2; - break; - } - result = roundf(result * 100) / 100; - if (fabs(result - expected_result) < 0.001) { - printf("OK\n"); - } else { - printf("ZLE\n"); - } - next_line: - continue; } + return EXIT_SUCCESS; } + + \ No newline at end of file