Update du3/program.c

This commit is contained in:
Martin Kačmár 2025-03-12 21:37:34 +00:00
parent 31b8e7c8d4
commit 7bf0cfe0d8

View File

@ -3,74 +3,65 @@
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
// Funkcie pre matematicke operacie // Funkcie pre matematické operácie
// Kazda funkcia prijima dve cisla a vracia vysledok operacie
double scitat(double a, double b) { return a + b; } double scitat(double a, double b) { return a + b; }
double odcitat(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 nasobit(double a, double b) { return a * b; }
double delit(double a, double b) { double delit(double a, double b) { return (b == 0) ? NAN : a / b; } // Ak b == 0, vrati NaN
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
// Získať funkciu pre konkrétnu operáciu
double (*get_operator_func(char operacia))(double, double) { double (*get_operator_func(char operacia))(double, double) {
switch (operacia) { switch (operacia) {
case '+': return scitat; case '+': return scitat;
case '-': return odcitat; case '-': return odcitat;
case '*': return nasobit; case '*': return nasobit;
case '/': return delit; case '/': return delit;
default: return NULL; // Neplatna operacia default: return NULL;
} }
} }
int main() { int main() {
char riadok[100]; // Pole na ulozenie riadku zo vstupu char riadok[100];
double cislo1, cislo2, zadany_vysledok; // Premenne pre dve cisla a ocakavany vysledok double cislo1, cislo2, zadany_vysledok;
char operacia; // Premenna pre matematicku operaciu char operacia;
// Nekonecny cyklus na spracovanie vstupu po riadkoch
while (1) { while (1) {
if (!fgets(riadok, sizeof(riadok), stdin)) { // Citanie riadku zo standardneho vstupu if (!fgets(riadok, sizeof(riadok), stdin)) {
break; // Ak uz nie je vstup, ukoncime cyklus break;
} }
// Ak je nacitany riadok prazdny (len novy riadok), ukoncime program // Ak je riadok prázdny, ukončíme program
if (riadok[0] == '\n') { if (riadok[0] == '\n') {
break; 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) { 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); double (*operacia_func)(double, double) = get_operator_func(operacia);
// Ak sa podarilo ziskat platnu operaciu // Ak operacia neexistuje, vypise CHYBA
if (operacia_func) { if (!operacia_func) {
double vysledok = operacia_func(cislo1, cislo2); // Vypocitame skutocny vysledok printf("CHYBA\n");
continue;
// Ak je vysledok neplatny (napriklad delenie nulou), vypiseme CHYBA }
if (isnan(vysledok)) {
printf("CHYBA\n"); // Skontrolujeme delenie nulou
} if (operacia == '/' && cislo2 == 0) {
// Porovname zaokruhleny vypocitany vysledok s ocakavanym vysledkom printf("ZLE\n");
else if (fabs(vysledok - zadany_vysledok) < 0.005) { continue;
printf("OK\n"); // Vysledok je spravny }
}
else { double vysledok = operacia_func(cislo1, cislo2);
printf("ZLE\n"); // Vysledok je nespravny
} // 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 { } else {
printf("CHYBA\n"); // Neplatna operacia printf("ZLE\n");
} }
} else { } else {
// Ak sscanf() neprecital 4 hodnoty, vstup ma nespravny format // Ak sscanf zlyhá, znamená to chybný formát
printf("CHYBA\n"); printf("CHYBA\n");
} }
} }