diff --git a/du3/program b/du3/program new file mode 100755 index 0000000..8e725f5 Binary files /dev/null and b/du3/program differ diff --git a/du3/program.c b/du3/program.c new file mode 100644 index 0000000..ee19b50 --- /dev/null +++ b/du3/program.c @@ -0,0 +1,100 @@ +#include //pripojím potrebné knižnice +#include +#include + +#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; +}