diff --git a/du4/program.c b/du4/program.c index 8477261..6a5bbd5 100644 --- a/du4/program.c +++ b/du4/program.c @@ -1,91 +1,87 @@ +#include #include #include -#include #include int main() { - int ch = getchar(); - char priklad[300]; + char line[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; - for (int idx = 0; 1; idx++) { - priklad[idx] = ch; - if (ch == '\n') { - count++; - } - ch = getchar(); - if ((priklad[idx] == '\n' && ch == '\n') || ch == EOF) { - break; - } - } - - char *start = priklad, *end = NULL; - - for (int c = 0; c < count; c++) { - int skip = 0, z = 0; - - for (int idx = 0; start[idx] != '\n'; idx++) { - if (start[idx] == '+' || start[idx] == '-' || start[idx] == '*' || start[idx] == '/') { - z = 1; - } - if ((start[idx] < '0' || start[idx] > '9') && start[idx] != ' ' && start[idx] != '=' && start[idx] != '+' && start[idx] != '-' && start[idx] != '*' && start[idx] != '/' && start[idx] != '.') { - skip = 1; - printf("CHYBA\n"); - while ((*start) != '\n') { - start++; + while (*start != '\n') { + if (*start == '+' || *start == '-' || *start == '*' || *start == '/') { + if (has_operator) { + printf("CHYBA\n"); + goto next_line; } - start++; - break; - } - } - - if (skip == 1) { - continue; - } - if (z == 0) { - while ((*start) != '\n') { - start++; + has_operator = 1; + op = *start; + } else if ((*start < '0' || *start > '9') && *start != ' ' && *start != '=' && *start != '.') { + printf("CHYBA\n"); + goto next_line; } start++; + } + + if (!has_operator) { printf("CHYBA\n"); - continue; - } - float num1 = strtof(start, &end); - if (end == start) { - printf("KONIEC\n"); - } - while ((*start) != '+' && (*start) != '-' && (*start) != '/' && (*start) != '*') { - start++; - } - char znak = (*start); - start++; - - float num2 = strtof(start, &end); - start = end; - while (((*start) < '0' || (*start) > '9') && (*start) != '-') { - start++; + goto next_line; } - float vysledok2 = strtof(start, &end); - start = end; - start++; - float vysledok = 0; - - if (znak == '-') { - vysledok = num1 - num2; - } else if (znak == '+') { - vysledok = num1 + num2; - } else if (znak == '*') { - vysledok = num1 * num2; - } else if (znak == '/') { - vysledok = num1 / num2; + num1 = strtof(line, &next); + while (*next == ' ') next++; + if (*next != op) { + printf("CHYBA\n"); + goto next_line; } - vysledok = (round(vysledok * 100)) / 100; - if (vysledok2 - vysledok < 0.001 && vysledok2 - vysledok > -0.001) { + next++; + num2 = strtof(next, &next); + while (*next == ' ') next++; + if (*next == '=') { + next++; + expected_result = strtof(next, &next); + while (*next == ' ') next++; + } else { + printf("CHYBA\n"); + goto next_line; + } + if (*next != '\n') { + printf("CHYBA\n"); + goto next_line; + } + + 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"); + goto next_line; + } + 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; }