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