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
 | 
					int najdiNepovoleneZnaky(char* vstup);	//inicializujem vlastné funkcie
 | 
				
			||||||
char priklad(char *vstup, float *prveCislo, float *druheCislo, float *zadanyVysledok);
 | 
					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);
 | 
					float vypocitaj(float cislo1, float cislo2, char matematickaOperacia);
 | 
				
			||||||
void mazanie_znakov_v_retazci(char* vstup, char nepotrebnyZnak);
 | 
					void mazanie_znakov_v_retazci(char* vstup, char nepotrebnyZnak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,7 +25,7 @@ int main() {
 | 
				
			|||||||
	memset(kontrolneVysledky, 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
 | 
						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 vstup[VELKOST_VSTUPU];	//inicializujem polia pre načítanie príkladov
 | 
				
			||||||
	char* stav_vstupu;
 | 
						char* stav_vstupu;
 | 
				
			||||||
@ -43,8 +43,9 @@ int main() {
 | 
				
			|||||||
		else {
 | 
							else {
 | 
				
			||||||
			matematickaOperacia = priklad(vstup, &prveCisla[i], &druheCisla[i], &vysledky[i]);	//v príklade vyhľadám príslušnú aritmetickú operáciu
 | 
								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
 | 
								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
 | 
								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;
 | 
						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 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;	//nainicializujem potrebné premenné
 | 
						int pocetRovnaSa = 0, pocetMatematickejOperacie = 0, h, pocetMinus = 0;	//nainicializujem potrebné premenné
 | 
				
			||||||
	const int DLZKA_PRIKLADU = strlen(priklad);	//dĺžka príkladu bude konštantná
 | 
						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
 | 
						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++;
 | 
							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 (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 (pocetRovnaSa != 1) return EXIT_FAILURE;
 | 
							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í
 | 
						char matematickeOperacie[] = "+-*/";	//vytvorím zoznam matematických operácií
 | 
				
			||||||
	const int POCET_MATEMATICKYCH_OPERACII = strlen(matematickeOperacie);	//a zistím ich počet
 | 
						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
 | 
						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 (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
 | 
						return EXIT_SUCCESS;	//ak kontrola prebehla úspešne, tak vrátim stavové hlásenie EXIT_SUCCESS
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user