pvjc22/du3/program.c
2022-04-26 19:38:55 +02:00

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