Update du3/program.c
This commit is contained in:
parent
31b8e7c8d4
commit
7bf0cfe0d8
@ -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
|
// Skontrolujeme delenie nulou
|
||||||
if (isnan(vysledok)) {
|
if (operacia == '/' && cislo2 == 0) {
|
||||||
printf("CHYBA\n");
|
printf("ZLE\n");
|
||||||
}
|
continue;
|
||||||
// Porovname zaokruhleny vypocitany vysledok s ocakavanym vysledkom
|
}
|
||||||
else if (fabs(vysledok - zadany_vysledok) < 0.005) {
|
|
||||||
printf("OK\n"); // Vysledok je spravny
|
double vysledok = operacia_func(cislo1, cislo2);
|
||||||
}
|
|
||||||
else {
|
// Porovnáme s požadovaným výsledkom (zaokrúhlené na 2 desatinné miesta)
|
||||||
printf("ZLE\n"); // Vysledok je nespravny
|
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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user