#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; }