domaca_uloha_3
This commit is contained in:
		
							parent
							
								
									329fac5f3d
								
							
						
					
					
						commit
						6fcb8313a3
					
				
							
								
								
									
										
											BIN
										
									
								
								du3/program
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								du3/program
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										100
									
								
								du3/program.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								du3/program.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,100 @@
 | 
			
		||||
#include <stdio.h>	//pripojím potrebné knižnice
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#define DLZKA_VSTUPU 10	//nastavím príslušné konštanty
 | 
			
		||||
 | 
			
		||||
void kopirovanieCiselnehoPola(int velkostNajmensiehoPolaPola, double* starePole, double* novePole);	//zadeklarujem vlastné funkcie
 | 
			
		||||
double umocnenie(double mocnitel, double exponent);
 | 
			
		||||
 
 | 
			
		||||
int main() {
 | 
			
		||||
	char vstup[DLZKA_VSTUPU];	//vytvorím pole pre načítanie vstupu z klávesnice
 | 
			
		||||
	char* stav_vstupu = fgets(vstup, DLZKA_VSTUPU, stdin);	//načítam hodnotu polynómu, uložím ju do poľa pre načítanie vstupu a stav funkcie fgets uložím do premennej určenej pre kontrolu úspešnosti vykonania
 | 
			
		||||
	
 | 
			
		||||
	double* polynom = (double*) calloc(1, sizeof(double));	//dynamicky alokujem jednu bunku pamäte, podľa potreby budem realokovávať pamäť (pre zachovanie už načítaných hodnôt použijem medzipamäťové dynamické pole)
 | 
			
		||||
	if (polynom == NULL) return 0;
 | 
			
		||||
 | 
			
		||||
	double* medzipamat = (double*) calloc(1, sizeof(double));
 | 
			
		||||
	if (medzipamat == NULL) return 0;
 | 
			
		||||
 | 
			
		||||
	if (stav_vstupu == NULL) {	//ak sa mi nepodarí úspešne načítať stupeň polynómu,
 | 
			
		||||
		printf("Chyba: Nepodarilo sa načítať hodnotu polynómu.\n");	//tak vypíšem hlásenie o neúspešnom načítaní zo vstupu,
 | 
			
		||||
 | 
			
		||||
		free(polynom);	//vyčistím dynamicky alokované pamäte,
 | 
			
		||||
		free(medzipamat);
 | 
			
		||||
 | 
			
		||||
		return 0;	//a program ukončím
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	double premennaPolynomu = atof(vstup);	//zadaný stupeň polynómu prevediem na matematické číslo
 | 
			
		||||
	int pocetClenovPolynomu = 0, i = 0;
 | 
			
		||||
		
 | 
			
		||||
	while (1) {	//načítam taký počet čísel, aký je stupeň polynómu
 | 
			
		||||
		stav_vstupu = fgets(vstup, DLZKA_VSTUPU, stdin);	//načítam číslo príslušného indexu polynómu
 | 
			
		||||
			
 | 
			
		||||
		if (stav_vstupu == NULL) {	//ak sa načítanie niektorého z čísel nepodarí
 | 
			
		||||
			printf("Chyba: Zlyhalo načítanie %d. člena polynómu.\n", i + 1);	//tak vypíšem informáciu o tom, pri ktorom člene polynómu zlyhalo načítavanie
 | 
			
		||||
			
 | 
			
		||||
			free(polynom);	//vyčistím dynamicky alokované pamäte,
 | 
			
		||||
			free(medzipamat);
 | 
			
		||||
			
 | 
			
		||||
			return 0;	//a program ukončím
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if (strcmp(vstup, "\n") == 0) break;	//ak načítam prázdny riadok, tak ukončím načítavanie hodnôt
 | 
			
		||||
 | 
			
		||||
		else if (strcmp(vstup, "0") == 0 && strcmp(vstup, "0.0") == 0) {	//funkcia atof() považuje nulu za chybový stav, takže musím ošetriť použitie nuly
 | 
			
		||||
			polynom[i] = atof(vstup);
 | 
			
		||||
			
 | 
			
		||||
			//na začiatku programu neviem, koľko vstupov úžívateľ zadá, preto potrebujem po každom zadaní čísla dynamicky zväčšíť pamäť o jedno miesto a kvôli zachovaniu dát pri realokácii pamäte musím hodnoty skopírovať do medzipamäte
 | 
			
		||||
			kopirovanieCiselnehoPola(i + 1, polynom, medzipamat);	//skopírujem uložené hodnoty do medzipamäte
 | 
			
		||||
			polynom = (double*) calloc(i + 2, sizeof(double));	//pôvodnú pamäť realokujem
 | 
			
		||||
			
 | 
			
		||||
			kopirovanieCiselnehoPola(i + 1, medzipamat, polynom);	//hodnoty z medzipamäte skopírujem naspäť do realokovanej pôvodnej pamäte
 | 
			
		||||
			medzipamat = (double*) calloc(i + 2, sizeof(double));	//realokujem aj medzipamäť, aby som pri ďalšom načítaní mohol znova zväčšiť pamäť o jedno miesto
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			polynom[i] = atof(vstup);	//zadaný vstu prevediem na matematické číslo
 | 
			
		||||
			
 | 
			
		||||
			kopirovanieCiselnehoPola(i + 1, polynom, medzipamat);	//skopírujem uložené hodnoty do medzipamäte
 | 
			
		||||
			polynom = (double*) calloc(i + 2, sizeof(double));	//pôvodnú pamäť realokujem
 | 
			
		||||
			
 | 
			
		||||
			kopirovanieCiselnehoPola(i + 1, medzipamat, polynom);	//hodnoty z medzipamäte skopírujem naspäť do realokovanej pôvodnej pamäte
 | 
			
		||||
			medzipamat = (double*) calloc(i + 2, sizeof(double));	//realokujem aj medzipamäť, aby som pri ďalšom načítaní mohol znova zväčšiť pamäť o jedno miesto
 | 
			
		||||
			
 | 
			
		||||
			
 | 
			
		||||
			/*if (polynom[i] == 0.0) { 	//ak sa nepodarí konverzia vstupu na matematické číslo,
 | 
			
		||||
				printf("Chyba: Zlyhalo načítanie %d. člena polynómu.\n", i + 1);	//tak vypíšem chybové hlásenie
 | 
			
		||||
				return 0;	//a program ukončím
 | 
			
		||||
			}*/
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pocetClenovPolynomu++;	//každý úspešne prekonvertovaný vstup započítam
 | 
			
		||||
		i++;	//hodnota indexu poľa i je v tomto prípade rovnaká ako hodnota premennej pocetClenovPolynomu
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	double vysledok = 0.0;	//vyčíslenú hodnotu polynómu uložím do pamäte
 | 
			
		||||
	for (i = 0; i < pocetClenovPolynomu; i++) vysledok += (polynom[i] * umocnenie(premennaPolynomu, pocetClenovPolynomu - 1 - i));	//vyčíslim hodnotu polynómu pre danú premennú
 | 
			
		||||
	
 | 
			
		||||
	printf("Vysledok je: %.2f\n", vysledok);	//vypíšem výsledok s presnosťou na dve desatinné miesta
 | 
			
		||||
	
 | 
			
		||||
	free(polynom);	//vyčistím dynamicky alokované pamäte
 | 
			
		||||
	free(medzipamat);
 | 
			
		||||
 | 
			
		||||
	return 0;	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void kopirovanieCiselnehoPola(int velkostNajmensiehoPola, double* starePole, double* novePole) {	//funkcia skopíruje čísla z jedného číselného poľa do druhého, pričom polia sú rovnako veľké
 | 
			
		||||
	int i;
 | 
			
		||||
	for (i = 0; i < velkostNajmensiehoPola; i++) novePole[i] = starePole[i];	//prekopírujem čísla zo starého poľa do nového
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
double umocnenie(double mocnitel, double exponent) {	//funkcia umocní čislo (mocniteľa) na daný exponent
 | 
			
		||||
	int i;
 | 
			
		||||
	double vysledok = mocnitel;	//mocniteľa budem násobiť mocniteľom niekoľkokrát
 | 
			
		||||
	
 | 
			
		||||
	if (exponent == 0) return 1;	//akékoľvek číslo na 0 = 1
 | 
			
		||||
	for (i = 0; i < exponent - 1; i++) vysledok *= mocnitel;
 | 
			
		||||
	
 | 
			
		||||
	return vysledok;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user