From e84cf19cb5bdc84662c94f6ed76464c5e0848cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Gejdo=C5=A1?= Date: Thu, 19 Mar 2026 21:00:43 +0000 Subject: [PATCH] asi final zacistene, fgets mi zacisti pole, nemusim si memsetovat, odstranenie zbytocnych premennych. nemusim robit zbytocne divne funkcie, strtof mi to pekne rozparsuje --- du3/program.c | 88 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 19 deletions(-) diff --git a/du3/program.c b/du3/program.c index 77c6a14..ecf33f3 100644 --- a/du3/program.c +++ b/du3/program.c @@ -1,41 +1,91 @@ #include #include #include +#include #define LINE_SIZE 100 int main() { char input[LINE_SIZE]; - memset (input, '\0', LINE_SIZE); - char* end; + char* cast1; //budem prehadzovat odseknuty riadok hore dole - do { - char *citaj = fgets (input, LINE_SIZE, stdin); - if (input[0] != '\n' || input == NULL) exit(0); - float a; - float b; - float result; - char seg_a[20]; - char operation[1]; - char seg_b[20]; - char seg_c[20]; - int i = 0; - for (; i < LINE_SIZE; i++) { - if ((input[i] >= '0' && input[i] <= '9') || input[i] == '.') { - seg_a[i] = input[i]; - } + while (1) { + if (fgets(input, LINE_SIZE, stdin) == NULL || input [0] == '\n') break; + + char *cast2 = input; //beriem si nacitany riadok ktory idem riesit + + //nacitam si prve cislo a okontrolujem ci je validne + float a = strtof(cast2, &cast1); //float kde si nahram prve cislo prikladu + if (cast2 == cast1) { //podla toho co som odparsoval, ak sa neodparsoval cislo, ostane mi tam stale cely string + printf ("CHYBA\n"); + continue; + } + cast2 = cast1; //ulozim si poziciu v pamati kde som naposledy skoncil + + while (*cast2 == ' ') cast2++; //zbavim sa medzier + + char operacia = *cast2; //nacitam si do jednotkovej premennej char prvy prvok pola cast2, + //ktory by malo byt znamienko operacie + if (operacia != '+' || operacia != '-' || operacia != '*' || operacia != '/') { + printf ("CHYBA\n"); + continue; } + cast2++; //posuniem sa na dalsiu poziciu pola char kde by malo byt cislo alebo medzera + while (*cast2 == ' ') cast2++; //zbavim sa medzier + float b = strtof(cast2, &cast1); //float kde si nahram druhe cislo prikladu (kopia nacitania prveho cisla) + if (cast2 == cast1) { //podla toho co som odparsoval, ak sa neodparsoval cislo, ostane mi tam stale cely string + printf ("CHYBA\n"); + continue; + } + cast2 = cast1; //ulozim si poziciu v pamati kde som naposledy skoncil - memset (input, '\0', LINE_SIZE); - } while (input[0] != '\n') + while (*cast2 == ' ') cast2++; //zbavim sa medzier po = + char operacia = *cast2; //nacitam si do jednotkovej premennej znak, dufam ze je to = + if (operacia != '=') { + printf ("CHYBA\n"); + continue; + } + + float c = strtof(cast2, &cast1); //float kde si nahram druhe cislo prikladu (kopia nacitania prveho cisla) + if (cast2 == cast1) { //podla toho co som odparsoval, ak sa neodparsoval cislo, ostane mi tam stale cely string + printf ("CHYBA\n"); + continue; + } + float vysledok; + switch (operacia) { + case '+': + vysledok = a + b; + break; + case '-': + vysledok = a - b; + break; + case '*': + vysledok = a * b; + break; + case '/': + if (b == 0) { + printf ("CHYBA\n"); + continue; + } + vysledok = a / b; + break; + + default: + printf ("CHYBA\n"); + continue; + } + float zaokruhleny_vysledok = roundf(vysledok * 100) / 100; //zaokruhlim moj vysledok na 2 des. miesta + float zaokruhlene_c = roundf(c * 100) / 100; //zaokruhlim nacitane c na 2 des. miesta + if (zaokruhleny_vysledok == zaokruhlene_c) printf("OK\n"); else printf ("ZLE\n") + } return 0; }