domaca_uloha_4
This commit is contained in:
parent
9877565fea
commit
273e1aef67
55
a1/program.c
Normal file
55
a1/program.c
Normal file
@ -0,0 +1,55 @@
|
||||
#include <stdio.h> //pripojím si potrebné knnižnice
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#define DLZKA_RETAZCA 100 //zadefinujem potrebnú konštantu
|
||||
int main() {
|
||||
struct tm* vypoctovyCas1 = calloc(1, sizeof(struct tm)); //dynamicky alokujem štruktúry potrebné pre výpočet 1 týždňa v číselnej reprezentácií
|
||||
if (vypoctovyCas1 == NULL) return 0; //ak sa alokácia pamäte nepodarí, tak program ukončím
|
||||
|
||||
vypoctovyCas1->tm_mday = 1; //nastavím príslušné parametre pre výpočet
|
||||
vypoctovyCas1->tm_mon = 6;
|
||||
vypoctovyCas1->tm_year = 121;
|
||||
|
||||
struct tm* vypoctovyCas2 = calloc(1, sizeof(struct tm)); //analogicky s vyššie uvedenou štruktúrou
|
||||
if (vypoctovyCas2 == NULL) return 0; //ak sa alokácia pamäte nepodarí, tak program ukončím
|
||||
|
||||
vypoctovyCas2->tm_mday = 8;
|
||||
vypoctovyCas2->tm_mon = 6;
|
||||
vypoctovyCas2->tm_year = 121;
|
||||
|
||||
time_t tyzden = difftime(mktime(vypoctovyCas2), mktime(vypoctovyCas1)); //vypočítam čas 1 týždňa v číselnej reprezentácii
|
||||
|
||||
struct tm* zadanyCas = calloc(1, sizeof(struct tm)); //dynamicky alokujem štruktúru pre vstupný čas
|
||||
if (zadanyCas == NULL) return 0; //ak sa alokácia pamäte nepodarí, tak program ukončím
|
||||
|
||||
char vstup[DLZKA_RETAZCA]; //nainicializujem pamäť pre vstup
|
||||
if (fgets(vstup, DLZKA_RETAZCA, stdin) == NULL) return 0; //načítam dátum a ak sa jeho načítanie nepodarí, tak program ukončím
|
||||
|
||||
char bodka1, bodka2; //nainicializujem dodatočné pamäte
|
||||
|
||||
sscanf(vstup, "%d %c %d %c %d", &zadanyCas->tm_mday, &bodka1, &zadanyCas->tm_mon, &bodka2, &zadanyCas->tm_year); //jednotlivé vstupné údaje načítam do príslušných premenných
|
||||
if (zadanyCas->tm_mday == 0) return 0; //ak nezadám do vstupu dátum, tak program ukončím
|
||||
|
||||
zadanyCas->tm_mon -= 1; //odpočítam potrebné konštanty
|
||||
zadanyCas->tm_year -= 1900;
|
||||
|
||||
struct tm* casOdovzdania = calloc(1, sizeof(struct tm)); //dynamicky alokujem pamäť pre vypočítaný dátum
|
||||
if (casOdovzdania == NULL) return 0; //ak sa alokácia pamäte nepodarí, tak program ukončím
|
||||
|
||||
time_t vypocetCasu = mktime(zadanyCas) + tyzden; //vypočítam nový dátum
|
||||
casOdovzdania = localtime(&vypocetCasu); //vypočítaný čas prevediem z číselnej reprezentácie na štrukturovanú
|
||||
|
||||
char vypis[DLZKA_RETAZCA]; //inicializujem pamäť pre uloženie reťazcovej reprezentácie dátumu
|
||||
size_t stavPrevodu = strftime(vypis, DLZKA_RETAZCA, "%d.%m.%Y", casOdovzdania); //dátum prevediem z o štrukturovanej reprezentácie do reťazcovej
|
||||
if (stavPrevodu == 0) return 0; //ak sa prevod nepodarí, tak program ukončím
|
||||
|
||||
printf("%s\n", vypis); //nový dátum vypíšem
|
||||
|
||||
free(vypoctovyCas1); //uvoľním dynamicky alokované pamäte
|
||||
free(vypoctovyCas2);
|
||||
free(zadanyCas);
|
||||
free(casOdovzdania);
|
||||
|
||||
return 0;
|
||||
}
|
@ -7,7 +7,7 @@
|
||||
|
||||
int najdiNepovoleneZnaky(char* vstup); //inicializujem vlastné funkcie
|
||||
char priklad(char *vstup, float *prveCislo, float *druheCislo, float *zadanyVysledok);
|
||||
int kontrolaViacnasobnejOperacie(char* priklad, char matematickaOperacia);
|
||||
int kontrolaViacnasobnejOperacie(char* priklad, char matematickaOperacia, float* prveCislo, float* druheCislo, float* zadanyVysledok);
|
||||
float vypocitaj(float cislo1, float cislo2, char matematickaOperacia);
|
||||
void mazanie_znakov_v_retazci(char* vstup, char nepotrebnyZnak);
|
||||
|
||||
@ -25,7 +25,7 @@ int main() {
|
||||
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);
|
||||
memset(chybovyStav, 0, POCET_CISEL * sizeof(int));
|
||||
|
||||
char vstup[VELKOST_VSTUPU]; //inicializujem polia pre načítanie príkladov
|
||||
char* stav_vstupu;
|
||||
@ -43,8 +43,9 @@ int main() {
|
||||
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
|
||||
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
|
||||
if (obsahNepovolenychZnakov == EXIT_FAILURE) chybovyStav[i] = obsahNepovolenychZnakov; //ak je príklad zapísaný v nesprávnom formáte, tak program ukončím
|
||||
else if (matematickaOperacia == '/' && *druheCisla == 0) chybovyStav[i] = EXIT_FAILURE;
|
||||
else kontrolneVysledky[i] = vypocitaj(prveCisla[i], druheCisla[i], matematickaOperacia); //vyčíslim skutočnú hodnotu príkladu
|
||||
}
|
||||
}
|
||||
@ -78,8 +79,8 @@ char priklad(char* vstup, float *prveCislo, float *druheCislo, float *zadanyVysl
|
||||
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é
|
||||
int kontrolaViacnasobnejOperacie(char* priklad, char matematickaOperacia, 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í
|
||||
int pocetRovnaSa = 0, pocetMatematickejOperacie = 0, h, pocetMinus = 0; //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
|
||||
@ -87,15 +88,38 @@ int kontrolaViacnasobnejOperacie(char* priklad, char matematickaOperacia) { //fu
|
||||
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;
|
||||
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) return EXIT_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) return EXIT_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) return EXIT_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) return EXIT_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
|
||||
|
||||
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
|
||||
|
||||
if (strchr(priklad, matematickeOperacie[h]) != NULL) { //ak sa v príklade vyskytuje iná matematická operácia
|
||||
if (matematickeOperacie[h] == '-') { //ak je danou operáciou -, tak skontrolujem, či niektoré zo zadaných čísel nie je záporné
|
||||
if (*prveCislo < 0) continue; //ak je niektoré z čísel záporné, tak kontrolu preskočím
|
||||
if (*druheCislo < 0) continue;
|
||||
if (*zadanyVysledok < 0) continue;
|
||||
else return EXIT_FAILURE; //ak ani jedno z čísel nie je záporné, tak vrátim EXIT_FAILURE, pretože príklad nie je zadaný v príslušnom formáte
|
||||
}
|
||||
else return EXIT_FAILURE; //inak vrátim EXIT_FAILURE, pretože príklad nie je zadaný v príslušnom formáte
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS; //ak kontrola prebehla úspešne, tak vrátim stavové hlásenie EXIT_SUCCESS
|
||||
|
Loading…
Reference in New Issue
Block a user