#include #include /* Ukljucujemo zaglavlje u kome su deklarisane funkcije koje definisemo i u kome je deklarisan nov tip Polinom */ #include "polinom.h" /* Funkcija koja ispisuje polinom na stdout u citljivom obliku Polinom prenosimo po adresi, da bi ustedeli kopiranje cele strukture, vec samo prenosimo adresu na kojoj se nalazi polinom kog ispisujemo */ void ispisi(const Polinom * p) { int i; for (i = 0; i <= p->stepen; i++) { if (p->koef[i]) { if (p->koef[i] >= 0) putchar('+'); if (i > 1) { if (p->koef[i] == 1) printf("x^%d", i); else if (p->koef[i] == -1) printf("-x^%d", i); else printf("%gx^%d", p->koef[i], i); } else if (i == 1) { if (p->koef[i] == 1) printf("x"); else if (p->koef[i] == -1) printf("-x"); else printf("%gx", p->koef[i]); } else printf("%g", p->koef[i]); } } putchar('\n'); } /* Funkcija koja dodaje koeficijent u vec postojeci polinom */ void dodaj_koef(Polinom *p, double x) { p->koef[p->stepen + 1] = x; p->stepen++; } /* Funkcija racuna vrednost polinoma p u tacki x Hornerovim algoritmom */ /* x^4+2x^3+3x^2+2x+1 = ( ( (x+2)*x + 3)*x + 2)*x + 1 */ double izracunaj(const Polinom * p, double x) { double rezultat = 0; int i = p->stepen; for (; i >= 0; i--) rezultat = rezultat * x + p->koef[i]; return rezultat; } /* Funkcija koja sabira dva polinoma */ Polinom saberi(const Polinom * p, const Polinom * q) { Polinom rez; int i; rez.stepen = p->stepen > q->stepen ? p->stepen : q->stepen; for (i = 0; i <= rez.stepen; i++) rez.koef[i] = (i > p->stepen ? 0 : p->koef[i]) + (i > q->stepen ? 0 : q-> koef[i]); return rez; } /* Funkcija koja oduzima dva polinoma */ Polinom oduzmi(const Polinom * p, const Polinom * q) { Polinom rez; int i; rez.stepen = p->stepen > q->stepen ? p->stepen : q->stepen; for (i = 0; i <= rez.stepen; i++) rez.koef[i] = (i > p->stepen ? 0 : p->koef[i]) - (i > q->stepen ? 0 : q-> koef[i]); return rez; } /* Funkcija mnozi dva polinoma p i q */ Polinom pomnozi(const Polinom * p, const Polinom * q) { int i, j; Polinom r; r.stepen = p->stepen + q->stepen; if (r.stepen > MAX_STEPEN) { fprintf(stderr, "Stepen proizvoda polinoma izlazi iz opsega\n"); exit(EXIT_FAILURE); } for (i = 0; i <= r.stepen; i++) r.koef[i] = 0; for (i = 0; i <= p->stepen; i++) for (j = 0; j <= q->stepen; j++) r.koef[i + j] += p->koef[i] * q->koef[j]; return r; } /* Unarni minus */ Polinom uminus(const Polinom *p) { Polinom r; int i; r.stepen = p->stepen; for (i = 0; i <= p->stepen; i++) r.koef[i] = -(p->koef[i]); return r; } /* Poredjenje polinoma */ int jednaki(const Polinom *p, const Polinom *q) { if (p->stepen != q->stepen) return 0; int i; for (i = 0; i <= p->stepen; i++) if (p->koef[i] != q->koef[i]) return 0; return 1; } /* Funkcija racuna izvod polinoma p */ Polinom izvod(const Polinom * p) { int i; Polinom r; if (p->stepen > 0) { r.stepen = p->stepen - 1; for (i = 0; i <= r.stepen; i++) r.koef[i] = (i + 1) * p->koef[i + 1]; } else r.koef[0] = r.stepen = 0; return r; } /* Funkcija racuna integral polinoma p sa slobodnim clanom x */ Polinom integral(const Polinom * p, double x) { int i; Polinom r; r.stepen = p->stepen + 1; for (i = 1; i <= r.stepen; i++) r.koef[i] = 1.0 / i * p->koef[i - 1]; r.koef[0] = x; return r; }