From fa09da2a6d43741d537a5d22e9027f6cf0f457b2 Mon Sep 17 00:00:00 2001 From: Bohdana Marchenko Date: Wed, 12 Mar 2025 17:38:46 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20du3/program.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- du3/program.c | 63 +++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/du3/program.c b/du3/program.c index e84d197..9e74e26 100644 --- a/du3/program.c +++ b/du3/program.c @@ -4,22 +4,22 @@ #include #include -#define EPSILON 0.001 // Tolerancia pre porovnanie reálnych čísel: ak rozdiel dvoch čísel je menší alebo rovný EPSILON, považujeme ich za rovnaké. +#define EPSILON 0.001 // Tolerancia pre porovnanie reálnych čísel: ak je rozdiel dvoch čísel menší alebo rovný EPSILON, považujeme ich za rovnaké. /* * Funkcia trim_newline * -------------------- * Odstraňuje znak nového riadku ('\n') zo zadaného reťazca, ak je prítomný. - * Táto funkcia je užitočná, keď načítavame riadky pomocou fgets, - * pretože fgets zachytáva aj znak nového riadku, ktorý by mohol narušiť parsovanie. + * Pri načítavaní riadkov pomocou fgets sa totiž často na konci reťazca nachádza '\n', + * ktorý by mohol ovplyvniť ďalšie spracovanie. * * Parametre: - * - line: reťazec, z ktorého chceme odstrániť koncový znak nového riadku. + * - line: Reťazec, z ktorého sa má odstrániť koncový znak nového riadku. * * Príklad použitia: * char buffer[256]; * fgets(buffer, sizeof(buffer), stdin); - * trim_newline(buffer); // Odstráni '\n' na konci, ak existuje. + * trim_newline(buffer); // Odstráni '\n' z konca reťazca, ak existuje. */ void trim_newline(char *line) { size_t len = strlen(line); @@ -35,10 +35,10 @@ void trim_newline(char *line) { * a vráti ukazovateľ na prvý znak, ktorý nie je whitespace. * * Parametre: - * - str: reťazec, v ktorom chceme preskočiť medzery. + * - str: Reťazec, v ktorom chceme preskočiť medzery. * * Návratová hodnota: - * - Ukazovateľ na prvý znak, ktorý nie je medzera. + * - Ukazovateľ na prvý znak, ktorý nie je whitespace. */ char* skip_spaces(char *str) { while(*str && isspace((unsigned char)*str)) { @@ -177,7 +177,7 @@ float calculate(float num1, char op, float num2, int *error) { * * Postup: * 1. Skopíruje vstupný riadok do lokálneho bufferu a odstráni prípadný koncový znak nového riadku. - * 2. Ak riadok obsahuje iba medzery, nastaví output na "KONIEC". + * 2. Predpokladá sa, že riadok nie je prázdny (kontrola prázdnoty sa vykoná v main). * 3. Pokúsi sa rozparsovať riadok na jednotlivé časti: prvé číslo, operátor, druhé číslo a výsledok. * 4. Ak parsovanie zlyhá, nastaví output na "CHYBA". * 5. Ak ide o delenie nulou, tiež nastaví output na "CHYBA". @@ -187,26 +187,20 @@ float calculate(float num1, char op, float num2, int *error) { * * Parametre: * - line: Vstupný riadok (napr. "10.0 / 2.0 = 5.0"). - * - output: Buffer, do ktorého sa uloží výsledný reťazec ("OK", "ZLE", "CHYBA" alebo "KONIEC"). + * - output: Buffer, do ktorého sa uloží výsledný reťazec ("OK", "ZLE" alebo "CHYBA"). * - output_size: Veľkosť bufferu output. * * Príklad vstupu a výstupu: - * Vstup: "1+2=3" + * Vstup: "1 + 1 = 2" * Výstup: "OK" */ void process_line(const char *line, char *output, size_t output_size) { char buffer[256]; + // Skopírujeme vstupný riadok do lokálneho bufferu strncpy(buffer, line, 255); buffer[255] = '\0'; // Zabezpečíme, že buffer je správne zakončený '\0' trim_newline(buffer); - // Ak riadok obsahuje iba medzery, nastavíme výstup na "KONIEC" - char *tmp = skip_spaces(buffer); - if (*tmp == '\0') { - snprintf(output, output_size, "KONIEC"); - return; - } - float num1, num2, givenResult; char op; // Pokúsime sa rozparsovať matematický príklad @@ -228,8 +222,8 @@ void process_line(const char *line, char *output, size_t output_size) { return; } - // Porovnáme vypočítaný výsledok so zadaným výsledkom - // Ak je absolútny rozdiel menší alebo rovný EPSILON, výsledok považujeme za správny + // Porovnáme vypočítaný výsledok so zadaným výsledkom. + // Ak je absolútny rozdiel menší alebo rovný EPSILON, považujeme príklad za správny. if (fabs(calculatedResult - givenResult) <= EPSILON) { snprintf(output, output_size, "OK"); } else { @@ -240,7 +234,7 @@ void process_line(const char *line, char *output, size_t output_size) { /* * Hlavná funkcia programu. * ------------------------- - * Tento program načíta riadky zo štandardného vstupu. Každý riadok obsahuje matematický príklad vo formáte: + * Program načíta riadky zo štandardného vstupu. Každý riadok obsahuje matematický príklad vo formáte: * * ČÍSLO OPERÁCIA ČÍSLO = VÝSLEDOK * @@ -248,17 +242,17 @@ void process_line(const char *line, char *output, size_t output_size) { * 10.0 / 2.0 = 5.0 * 1+2=3 * 3.333+4.667=8.0 - * [prázdny riadok] // Po načítaní prázdneho riadku program vypíše "KONIEC" a ukončí sa. * - * Pre každý riadok program vypíše na štandardný výstup: - * OK - ak je výsledok správny - * ZLE - ak je výsledok nesprávny - * CHYBA - ak je riadok zle zapísaný alebo nastala chyba (napr. delenie nulou) - * KONIEC - ak je riadok prázdny + * Program pre každý neprázdny riadok overí správnosť zápisu a výsledku a na štandardný výstup + * vypíše "OK", "ZLE" alebo "CHYBA". * - * Ako spustiť program: - * - Kompilujte: gcc program.c -o program -lm - * - Spustite: ./program + * Poznámka: Ak sa načíta prázdny riadok (obsahuje iba medzery), program ho ignoruje a ukončí sa. + * + * Ako skompilovať: + * gcc program.c -o program -lm + * + * Ako spustiť: + * ./program */ int main(int argc, char *argv[]) { char buffer[256]; @@ -267,14 +261,13 @@ int main(int argc, char *argv[]) { // Načítavame riadky zo štandardného vstupu (napr. z konzoly alebo súboru) while (fgets(buffer, sizeof(buffer), stdin) != NULL) { trim_newline(buffer); - process_line(buffer, output, sizeof(output)); - printf("%s\n", output); - // Ak je vstup prázdny (obsahuje iba medzery), ukončíme program - char *tmp = skip_spaces(buffer); - if (*tmp == '\0') { + // Ak je riadok prázdny (iba medzery), ukončíme cyklus a teda program + if (*skip_spaces(buffer) == '\0') { break; } + process_line(buffer, output, sizeof(output)); + printf("%s\n", output); } return 0; -} +} \ No newline at end of file