From 3bd27c0a065ce7266f9d5b8a7f4f860e8c6f5eaf Mon Sep 17 00:00:00 2001 From: Miloslav Macko Date: Fri, 22 Mar 2024 13:01:57 +0100 Subject: [PATCH] 22.3 --- a1/program.c | 76 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 15 deletions(-) diff --git a/a1/program.c b/a1/program.c index 0285ef8..f15a029 100644 --- a/a1/program.c +++ b/a1/program.c @@ -10,6 +10,11 @@ bool is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } +// Funkcia na kontrolu, či je daný znak medzera +bool is_space(char c) { + return c == ' '; +} + // Funkcia na kontrolu, či je daný znak číslica bool is_digit(char c) { return isdigit(c); @@ -31,6 +36,48 @@ double calculate(double num1, char op, double num2) { } } +// Funkcia na kontrolu, či je zadaný riadok úlohy v správnom formáte +bool is_valid_task(char *line) { + int len = strlen(line); + if (len < 7) // Minimálna dĺžka: "a+b=c" + return false; + + int i = 0; + // Kontrola či prvé číslo je platné + if (!is_digit(line[i]) && line[i] != '-') + return false; + while (is_digit(line[i]) || is_space(line[i])) + i++; + + // Kontrola či operátor je platný + if (!is_operator(line[i])) + return false; + i++; + + // Kontrola či druhé číslo je platné + if (!is_digit(line[i]) && line[i] != '-') + return false; + while (is_digit(line[i]) || is_space(line[i])) + i++; + + // Kontrola či '=' je na správnom mieste + if (line[i] != '=') + return false; + i++; + + // Kontrola či výsledok je platný + if (!is_digit(line[i]) && line[i] != '-') + return false; + while (is_digit(line[i]) || is_space(line[i])) + i++; + + // Kontrola či na konci riadka už nie sú ďalšie znaky + if (line[i] != '\0') + return false; + + return true; +} + int main() { char line[100]; // Predpokladáme, že žiadny riadok nebude dlhší ako 100 znakov @@ -38,24 +85,23 @@ int main() { if (strcmp(line, "\n") == 0) // Ak je riadok prázdny, končíme break; - int len = strlen(line); - if (line[len - 1] == '\n') // Odstránenie konca riadka - line[len - 1] = '\0'; + // Odstránenie konca riadka + line[strcspn(line, "\n")] = '\0'; - char op; - double num1, num2, result; - int scanned = sscanf(line, "%lf%*[^0-9-]%c%*[^0-9-]%lf=%lf", &num1, &op, &num2, &result); - - // Kontrola, či boli načítané správne hodnoty - if (scanned != 4 || !is_operator(op)) + if (!is_valid_task(line)) { printf("CHYBA\n"); - else { - double calculated_result = calculate(num1, op, num2); - if (fabs(calculated_result - result) < 0.01) // Zaokrúhlenie na 2 desatinné miesta - printf("OK\n"); - else - printf("ZLE\n"); + continue; } + + double num1, num2, result; + char op; + sscanf(line, "%lf %c %lf = %lf", &num1, &op, &num2, &result); + + double calculated_result = calculate(num1, op, num2); + if (fabs(calculated_result - result) < 0.01) // Zaokrúhlenie na 2 desatinné miesta + printf("OK\n"); + else + printf("ZLE\n"); } return 0;