From a413aea3aa31a64de422b08d7dfe2a54fc5942b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Vasi=C4=BE?= Date: Tue, 26 Apr 2022 19:39:13 +0200 Subject: [PATCH] domaca_uloha_4 --- du4/program | Bin 0 -> 7532 bytes du4/program.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100755 du4/program create mode 100644 du4/program.c diff --git a/du4/program b/du4/program new file mode 100755 index 0000000000000000000000000000000000000000..4393c1620a2988ae65889397aa9a8938fdc31b3b GIT binary patch literal 7532 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 //pripojím si potrebné knižnice +#include +#include + +#define VELKOST_VSTUPU 50 //zadefinujem konštanty +#define POCET_CISEL 500 + +int najdiNepovoleneZnaky(char* vstup); //inicializujem vlastné funkcie +char priklad(char *vstup, float *prveCislo, float *druheCislo, float *zadanyVysledok); +int kontrolaViacnasobnejOperacie(char* priklad, char matematickaOperacia); +float vypocitaj(float cislo1, float cislo2, char matematickaOperacia); +void mazanie_znakov_v_retazci(char* vstup, char nepotrebnyZnak); + +int main() { + int pocetRiadkov, i, obsahNepovolenychZnakov; + + float prveCisla[POCET_CISEL]; //inicializujem polia, do ktorých budem ukladať potrebné čísla + float druheCisla[POCET_CISEL]; + float vysledky[POCET_CISEL]; + float kontrolneVysledky[POCET_CISEL]; + + memset(prveCisla, 0, POCET_CISEL * sizeof(float)); //vykonám počiatočnú inicializáciu pamäte + memset(druheCisla, 0, POCET_CISEL * sizeof(float)); + memset(vysledky, 0, POCET_CISEL * sizeof(float)); + memset(kontrolneVysledky, 0, POCET_CISEL * sizeof(float)); + + int chybovyStav[POCET_CISEL]; //do poľa budem ukladať záznam o správnosti formátu príkladu + memset(chybovyStav, 0, POCET_CISEL); + + char vstup[VELKOST_VSTUPU]; //inicializujem polia pre načítanie príkladov + char* stav_vstupu; + char matematickaOperacia; //do pamäte si individuálne zapíšem aritmetickú operáciu príkladu + + for (i = 0; i < POCET_CISEL; i++) { //v cykle budem načítavať príklady + stav_vstupu = fgets(vstup, VELKOST_VSTUPU, stdin); //načítam príklad + if (stav_vstupu == NULL) return 0; //skontrolujem, či sa mi príklad podarilo úspešne načítať a ak nie, tak program ukončím + else if (strcmp(vstup, "\n") == 0) break; + + mazanie_znakov_v_retazci(vstup, ' '); //zo zadaného príkladu odstránom všetky medzery zadané pri vstupe + + obsahNepovolenychZnakov = najdiNepovoleneZnaky(vstup); //skontrolujem, či používateľ nazadal do príkladu nepovolené znaky + if (obsahNepovolenychZnakov == EXIT_FAILURE) chybovyStav[i] = obsahNepovolenychZnakov; //ak ich zadal, tak informáciu o danej skutočnosti zaznamená do poľa s výsledkami + else { + matematickaOperacia = priklad(vstup, &prveCisla[i], &druheCisla[i], &vysledky[i]); //v príklade vyhľadám príslušnú aritmetickú operáciu + + obsahNepovolenychZnakov = kontrolaViacnasobnejOperacie(vstup, matematickaOperacia); //následne ešte skontrolujem to, či bol príklad zadaný v správnom formáte + if (obsahNepovolenychZnakov == EXIT_FAILURE) chybovyStav[i] = obsahNepovolenychZnakov; //ak je príklad zapísaný v nesprávnom formáte, tak program ukončím + else kontrolneVysledky[i] = vypocitaj(prveCisla[i], druheCisla[i], matematickaOperacia); //vyčíslim skutočnú hodnotu príkladu + } + } + + pocetRiadkov = i; //uložím si hodnotu načítaných vstupov, pretože nemusím zakaždým využiť celú pamäť a to potom môže spôsobiť nepredvidateľné správanie programu + + for (i = 0; i < pocetRiadkov; i++) { + if (chybovyStav[i] == EXIT_FAILURE) printf("CHYBA\n"); + else if (kontrolneVysledky[i] == vysledky[i]) printf("OK\n"); + else printf("ZLE\n"); + } + + return 0; +} + +int najdiNepovoleneZnaky(char* vstup) { //funkcia kontroluje výskyt nepovolených znakov v zadanom príklade + char nepovoleneZnaky[] = "abcdefghijklmnopqrstuvwxyz&\\|()°;ľščťžýáíéúäô§!_.:,?<>€ĐŁł[]{}&@#"; //vytvorím zoznam nepovoelných znakov + int pocetNepovolenychZnakov = strlen(nepovoleneZnaky), j; //zadefinujem si potrebné premenné a zistím počet nepovolených znakov + + for (j = 0; j <= pocetNepovolenychZnakov - 1; j++) { //v cykle skontrolujem, či sa v zadanom príklade nachádza niektorý z nepovolených znakov + if (strchr(vstup, nepovoleneZnaky[j]) != NULL) return EXIT_FAILURE; //ak sa v príklade nachádza niektorý z nepovolených znakov, tak vrátim EXIT_FAILURE + } + + return EXIT_SUCCESS; //inak vrátim EXIT_SUCCESS +} + +char priklad(char* vstup, float *prveCislo, float *druheCislo, float *zadanyVysledok) { //funkcia načíta čísla do jednotlivých polí podľa príslušnosti a vypočíta kontrolných výsledok + char matematickaOperacia, rovnaSa; + sscanf(vstup, "%f %c %f %c %f", &*prveCislo, &matematickaOperacia, &*druheCislo, &rovnaSa, &*zadanyVysledok); + + return matematickaOperacia; +} + +int kontrolaViacnasobnejOperacie(char* priklad, char matematickaOperacia) { //funkcia skontroluje viacnásobný výskyt nájdenej aritmetickej operácie, operácie = a výskytu iných predtým nezachytených nepovolených znakov iných operácií + int pocetRovnaSa = 0, pocetMatematickejOperacie = 0, h; //nainicializujem potrebné premenné + const int DLZKA_PRIKLADU = strlen(priklad); //dĺžka príkladu bude konštantná + + for (h = 0; h < DLZKA_PRIKLADU; h++) { //skontrolujem, či sa nájdená matematická operácia a znamienko = nenachádzajú v príklade viackrát + if (priklad[h] == matematickaOperacia) pocetMatematickejOperacie++; //ak sa nachádza niektorí zo znakov v príklade, tak ho započítam do príslušnej premennej + else if (priklad[h] == '=') pocetRovnaSa++; + } + + if (pocetMatematickejOperacie != 1) return EXIT_FAILURE; //ak sa daná matematická operácia, alebo znamienko = nachádzajú v príklade viackrát, tak kontrolu ukončím, pretože príklad nie je zapísaný v požadovanom formáte + if (pocetRovnaSa != 1) return EXIT_FAILURE; + + char matematickeOperacie[] = "+-*/"; //vytvorím zoznam matematických operácií + const int POCET_MATEMATICKYCH_OPERACII = strlen(matematickeOperacie); //a zistím ich počet + + for (h = 0; h < POCET_MATEMATICKYCH_OPERACII; h++) { //skontrolujem, či sa okrem prvotne nájdenej matematickej operácie v príklade nenachádzajú aj iné matematické operácie + if (matematickeOperacie[h] == matematickaOperacia) continue; //ak sa hľadaná matematická operácia zhoduje s prvotne nájdenou matematickou operáciou, tak jej hľadanie preskočím, pretože kontrola tejto operácie už prebehla + if (strchr(priklad, matematickeOperacie[h]) != NULL) return EXIT_FAILURE; //ak nájdem v príklade inú matematickú operáciu než tú, ktorú som našiel prvotne, tak kontrolu ukončím, pretože príklad nie je zapísaný v požadovanom formáte + } + + return EXIT_SUCCESS; //ak kontrola prebehla úspešne, tak vrátim stavové hlásenie EXIT_SUCCESS +} + +float vypocitaj(float cislo1, float cislo2, char matematickaOperacia) { //funkcia spočíta dve čísla podľa zvolenej matematickej operácie + switch (matematickaOperacia) { //switch zvolí podľa zadanej matematickej operácie + case '+': return cislo1 + cislo2; + break; + + case '-': return cislo1 - cislo2; + break; + + case '*': return cislo1 * cislo2; + break; + + case '/': return cislo1 / cislo2; + break; + + default: return EXIT_FAILURE; //ošetrenie pre prípad, že používateľ nezadá ako parameter matematickú operáciu + } +} + +void mazanie_znakov_v_retazci(char* vstup1, char nepotrebnyZnak) { //funkcia vyhľadá v reťazci hľadaný znak a vymaže ho + int l, m, dlzkaRetazca = strlen(vstup1); //nainicializujem si potrebné premenné + + for (l = 0; l < dlzkaRetazca; l++) { //prejdem celý reťazec znak po znaku + if (vstup1[l] == nepotrebnyZnak) { //ak nájdem v reťazci znak, ktorý má byť odstránený + for (m = l; m < dlzkaRetazca; m++) vstup1[m] = vstup1[m + 1]; //tak začnem posúvať o 1 miesto naspäť reťazec od aktuálnej pozície + dlzkaRetazca--; //skrátim ho odstránený znak + l--; //nastavím presúvač na pôvodnú pozíciu v rámci reťazca (cyklu) + } + } +}