if(stav_vstupu==NULL)return0;//skontrolujem, či sa mi príklad podarilo úspešne načítať a ak nie, tak program ukončím
elseif(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
obsahNepovolenychZnakov=kontrolaViacnasobnejOperacie(vstup,matematickaOperacia,&prveCisla[i],&druheCisla[i],&vysledky[i]);//následne ešte skontrolujem to, či bol príklad zadaný v správnom formáte
elsekontrolneVysledky[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
intnajdiNepovoleneZnaky(char*vstup){//funkcia kontroluje výskyt nepovolených znakov v zadanom príklade
charnepovoleneZnaky[]="abcdefghijklmnopqrstuvwxyz&\\|()°;ľščťžýáíéúäô§!_.:,?<>€ĐŁł[]{}&@#";//vytvorím zoznam nepovoelných znakov
intpocetNepovolenychZnakov=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)returnEXIT_FAILURE;//ak sa v príklade nachádza niektorý z nepovolených znakov, tak vrátim EXIT_FAILURE
}
returnEXIT_SUCCESS;//inak vrátim EXIT_SUCCESS
}
charpriklad(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
intkontrolaViacnasobnejOperacie(char*priklad,charmatematickaOperacia,float*prveCislo,float*druheCislo,float*zadanyVysledok){//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í
intpocetRovnaSa=0,pocetMatematickejOperacie=0,h,pocetMinus=0;//nainicializujem potrebné premenné
constintDLZKA_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
if(matematickaOperacia=='-'){//ak bude zadanou matematickou operáciou -, tak skontrolujem počet výskytov záporných čísel (operácia sa vyskytuje v príklade viackrát)
if(*prveCislo<0)pocetMinus++;//ak nájdené číslo je záporné, tak ho započítam
if(matematickaOperacia=='-')pocetMinus++;//ak nájdem operáciu -, tak ju tiež započítam, pretože menšiteľ je v pamäti interpretovaný ako kladné číslo
if(*druheCislo<0)pocetMinus++;
if(*zadanyVysledok<0)pocetMinus++;
}
if(pocetMinus!=0){//ak som našiel nejaké záporné číslo pri odčítaní
if(pocetMatematickejOperacie!=pocetMinus)returnEXIT_FAILURE;//skontrolujem, či sa počet záporných čísel v príklade (reťazci) zhoduje s počtom načítaných záporných čísel a ak sa nezhoduje, tak vrátim EXIT_FAILURE
if(pocetMinus>3)returnEXIT_FAILURE;//ak sa budú v príklade vyskytovať viac ako 3 záporné čísla, tak príklad nie je zadaný v požadovanom formáte a vrátim EXIT_FAILURE
}else{
if(pocetMatematickejOperacie!=1)returnEXIT_FAILURE;//(platí pre ostatné operácie) ak sa daná matematická operácia vyskytuje v príklade viackrát, tak vrátim EXIT_FAILURE, pretože príklad nie je zapísaný v požadovanom formáte
}
if(pocetRovnaSa!=1)returnEXIT_FAILURE;//ak sa v príklade nachádza viac ako 1 rovná sa, tak vrátim EXIT_FAILURE, pretože príklad nie je zadaný v požadovanom formáte
charmatematickeOperacie[]="+-*/";//vytvorím zoznam matematických operácií
constintPOCET_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