101 lines
4.9 KiB
C
101 lines
4.9 KiB
C
#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;
|
|
}
|