pvjc22/du3/program.c

101 lines
4.9 KiB
C
Raw Normal View History

2022-04-26 17:38:55 +00:00
#include <stdio.h> //pripoj<6F>m potrebn<62> kni<6E>nice
#include <stdlib.h>
#include <string.h>
#define DLZKA_VSTUPU 10 //nastav<61>m pr<70>slu<6C>n<EFBFBD> kon<6F>tanty
void kopirovanieCiselnehoPola(int velkostNajmensiehoPolaPola, double* starePole, double* novePole); //zadeklarujem vlastn<74> funkcie
double umocnenie(double mocnitel, double exponent);
int main() {
char vstup[DLZKA_VSTUPU]; //vytvor<6F>m pole pre na<6E><61>tanie vstupu z kl<6B>vesnice
char* stav_vstupu = fgets(vstup, DLZKA_VSTUPU, stdin); //na<6E><61>tam hodnotu polyn<79>mu, ulo<6C><6F>m ju do po<70>a pre na<6E><61>tanie vstupu a stav funkcie fgets ulo<6C><6F>m do premennej ur<75>enej pre kontrolu <20>spe<70>nosti vykonania
double* polynom = (double*) calloc(1, sizeof(double)); //dynamicky alokujem jednu bunku pam<61>te, pod<6F>a potreby budem realokov<6F>va<76> pam<61><6D> (pre zachovanie u<> na<6E><61>tan<61>ch hodn<64>t pou<6F>ijem medzipam<61><6D>ov<6F> dynamick<63> 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<61> <20>spe<70>ne na<6E><61>ta<74> stupe<70> polyn<79>mu,
printf("Chyba: Nepodarilo sa na<6E><61>ta<74> hodnotu polyn<79>mu.\n"); //tak vyp<79><70>em hl<68>senie o ne<6E>spe<70>nom na<6E><61>tan<61> zo vstupu,
free(polynom); //vy<76>ist<73>m dynamicky alokovan<61> pam<61>te,
free(medzipamat);
return 0; //a program ukon<6F><6E>m
}
double premennaPolynomu = atof(vstup); //zadan<61> stupe<70> polyn<79>mu prevediem na matematick<63> <20><>slo
int pocetClenovPolynomu = 0, i = 0;
while (1) { //na<6E><61>tam tak<61> po<70>et <20><>sel, ak<61> je stupe<70> polyn<79>mu
stav_vstupu = fgets(vstup, DLZKA_VSTUPU, stdin); //na<6E><61>tam <20><>slo pr<70>slu<6C>n<EFBFBD>ho indexu polyn<79>mu
if (stav_vstupu == NULL) { //ak sa na<6E><61>tanie niektor<6F>ho z <20><>sel nepodar<61>
printf("Chyba: Zlyhalo na<6E><61>tanie %d. <20>lena polyn<79>mu.\n", i + 1); //tak vyp<79><70>em inform<72>ciu o tom, pri ktorom <20>lene polyn<79>mu zlyhalo na<6E><61>tavanie
free(polynom); //vy<76>ist<73>m dynamicky alokovan<61> pam<61>te,
free(medzipamat);
return 0; //a program ukon<6F><6E>m
}
else if (strcmp(vstup, "\n") == 0) break; //ak na<6E><61>tam pr<70>zdny riadok, tak ukon<6F><6E>m na<6E><61>tavanie hodn<64>t
else if (strcmp(vstup, "0") == 0 && strcmp(vstup, "0.0") == 0) { //funkcia atof() pova<76>uje nulu za chybov<6F> stav, tak<61>e mus<75>m o<>etri<72> pou<6F>itie nuly
polynom[i] = atof(vstup);
//na za<7A>iatku programu neviem, ko<6B>ko vstupov <20><><EFBFBD>vate<74> zad<61>, preto potrebujem po ka<6B>dom zadan<61> <20><>sla dynamicky zv<7A><76><EFBFBD><EFBFBD><EFBFBD> pam<61><6D> o jedno miesto a kv<6B>li zachovaniu d<>t pri realok<6F>cii pam<61>te mus<75>m hodnoty skop<6F>rova<76> do medzipam<61>te
kopirovanieCiselnehoPola(i + 1, polynom, medzipamat); //skop<6F>rujem ulo<6C>en<65> hodnoty do medzipam<61>te
polynom = (double*) calloc(i + 2, sizeof(double)); //p<>vodn<64> pam<61><6D> realokujem
kopirovanieCiselnehoPola(i + 1, medzipamat, polynom); //hodnoty z medzipam<61>te skop<6F>rujem nasp<73><70> do realokovanej p<>vodnej pam<61>te
medzipamat = (double*) calloc(i + 2, sizeof(double)); //realokujem aj medzipam<61><6D>, aby som pri <20>al<61>om na<6E><61>tan<61> mohol znova zv<7A><76><EFBFBD>i<EFBFBD> pam<61><6D> o jedno miesto
}
else {
polynom[i] = atof(vstup); //zadan<61> vstu prevediem na matematick<63> <20><>slo
kopirovanieCiselnehoPola(i + 1, polynom, medzipamat); //skop<6F>rujem ulo<6C>en<65> hodnoty do medzipam<61>te
polynom = (double*) calloc(i + 2, sizeof(double)); //p<>vodn<64> pam<61><6D> realokujem
kopirovanieCiselnehoPola(i + 1, medzipamat, polynom); //hodnoty z medzipam<61>te skop<6F>rujem nasp<73><70> do realokovanej p<>vodnej pam<61>te
medzipamat = (double*) calloc(i + 2, sizeof(double)); //realokujem aj medzipam<61><6D>, aby som pri <20>al<61>om na<6E><61>tan<61> mohol znova zv<7A><76><EFBFBD>i<EFBFBD> pam<61><6D> o jedno miesto
/*if (polynom[i] == 0.0) { //ak sa nepodar<61> konverzia vstupu na matematick<63> <20><>slo,
printf("Chyba: Zlyhalo na<6E><61>tanie %d. <20>lena polyn<79>mu.\n", i + 1); //tak vyp<79><70>em chybov<6F> hl<68>senie
return 0; //a program ukon<6F><6E>m
}*/
}
pocetClenovPolynomu++; //ka<6B>d<EFBFBD> <20>spe<70>ne prekonvertovan<61> vstup zapo<70><6F>tam
i++; //hodnota indexu po<70>a i je v tomto pr<70>pade rovnak<61> ako hodnota premennej pocetClenovPolynomu
}
double vysledok = 0.0; //vy<76><79>slen<65> hodnotu polyn<79>mu ulo<6C><6F>m do pam<61>te
for (i = 0; i < pocetClenovPolynomu; i++) vysledok += (polynom[i] * umocnenie(premennaPolynomu, pocetClenovPolynomu - 1 - i)); //vy<76><79>slim hodnotu polyn<79>mu pre dan<61> premenn<6E>
printf("Vysledok je: %.2f\n", vysledok); //vyp<79><70>em v<>sledok s presnos<6F>ou na dve desatinn<6E> miesta
free(polynom); //vy<76>ist<73>m dynamicky alokovan<61> pam<61>te
free(medzipamat);
return 0;
}
void kopirovanieCiselnehoPola(int velkostNajmensiehoPola, double* starePole, double* novePole) { //funkcia skop<6F>ruje <20><>sla z jedn<64>ho <20><>seln<6C>ho po<70>a do druh<75>ho, pri<72>om polia s<> rovnako ve<76>k<EFBFBD>
int i;
for (i = 0; i < velkostNajmensiehoPola; i++) novePole[i] = starePole[i]; //prekop<6F>rujem <20><>sla zo star<61>ho po<70>a do nov<6F>ho
}
double umocnenie(double mocnitel, double exponent) { //funkcia umocn<63> <20>islo (mocnite<74>a) na dan<61> exponent
int i;
double vysledok = mocnitel; //mocnite<74>a budem n<>sobi<62> mocnite<74>om nieko<6B>kokr<6B>t
if (exponent == 0) return 1; //ak<61>ko<6B>vek <20><>slo na 0 = 1
for (i = 0; i < exponent - 1; i++) vysledok *= mocnitel;
return vysledok;
}