From 7bf0cfe0d82669532a0091571f974a4eb3c4d45f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ka=C4=8Dm=C3=A1r?= Date: Wed, 12 Mar 2025 21:37:34 +0000 Subject: [PATCH] Update du3/program.c --- du3/program.c | 71 ++++++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/du3/program.c b/du3/program.c index 1580665..bf0557f 100644 --- a/du3/program.c +++ b/du3/program.c @@ -3,74 +3,65 @@ #include #include -// Funkcie pre matematicke operacie -// Kazda funkcia prijima dve cisla a vracia vysledok operacie - +// Funkcie pre matematické operácie double scitat(double a, double b) { return a + b; } double odcitat(double a, double b) { return a - b; } double nasobit(double a, double b) { return a * b; } -double delit(double a, double b) { - if (b == 0) { - return NAN; // Vrati NaN (Not a Number), ak sa pokusime delit nulou - } - return a / b; -} - -// Funkcia, ktora vrati ukazovatel na funkciu pre danu operaciu -// Napriklad, ak operacia je '+', vrati ukazovatel na funkciu scitat -// Ak operacia nie je platna, vrati NULL +double delit(double a, double b) { return (b == 0) ? NAN : a / b; } // Ak b == 0, vrati NaN +// Získať funkciu pre konkrétnu operáciu double (*get_operator_func(char operacia))(double, double) { switch (operacia) { case '+': return scitat; case '-': return odcitat; case '*': return nasobit; case '/': return delit; - default: return NULL; // Neplatna operacia + default: return NULL; } } int main() { - char riadok[100]; // Pole na ulozenie riadku zo vstupu - double cislo1, cislo2, zadany_vysledok; // Premenne pre dve cisla a ocakavany vysledok - char operacia; // Premenna pre matematicku operaciu + char riadok[100]; + double cislo1, cislo2, zadany_vysledok; + char operacia; - // Nekonecny cyklus na spracovanie vstupu po riadkoch while (1) { - if (!fgets(riadok, sizeof(riadok), stdin)) { // Citanie riadku zo standardneho vstupu - break; // Ak uz nie je vstup, ukoncime cyklus + if (!fgets(riadok, sizeof(riadok), stdin)) { + break; } - // Ak je nacitany riadok prazdny (len novy riadok), ukoncime program + // Ak je riadok prázdny, ukončíme program if (riadok[0] == '\n') { break; } - // Skusime nacitat hodnoty v ocakavanom formate: cislo1 operacia cislo2 = vysledok + // Skontrolujeme formát: čislo1 operacia čislo2 = výsledok if (sscanf(riadok, "%lf %c %lf = %lf", &cislo1, &operacia, &cislo2, &zadany_vysledok) == 4) { - // Ziskame funkciu pre danu operaciu + // Získame správnu funkciu podľa operácie double (*operacia_func)(double, double) = get_operator_func(operacia); - // Ak sa podarilo ziskat platnu operaciu - if (operacia_func) { - double vysledok = operacia_func(cislo1, cislo2); // Vypocitame skutocny vysledok - - // Ak je vysledok neplatny (napriklad delenie nulou), vypiseme CHYBA - if (isnan(vysledok)) { - printf("CHYBA\n"); - } - // Porovname zaokruhleny vypocitany vysledok s ocakavanym vysledkom - else if (fabs(vysledok - zadany_vysledok) < 0.005) { - printf("OK\n"); // Vysledok je spravny - } - else { - printf("ZLE\n"); // Vysledok je nespravny - } + // Ak operacia neexistuje, vypise CHYBA + if (!operacia_func) { + printf("CHYBA\n"); + continue; + } + + // Skontrolujeme delenie nulou + if (operacia == '/' && cislo2 == 0) { + printf("ZLE\n"); + continue; + } + + double vysledok = operacia_func(cislo1, cislo2); + + // Porovnáme s požadovaným výsledkom (zaokrúhlené na 2 desatinné miesta) + if (fabs(vysledok - zadany_vysledok) < 0.005) { + printf("OK\n"); } else { - printf("CHYBA\n"); // Neplatna operacia + printf("ZLE\n"); } } else { - // Ak sscanf() neprecital 4 hodnoty, vstup ma nespravny format + // Ak sscanf zlyhá, znamená to chybný formát printf("CHYBA\n"); } }