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