24.11.2.24011920. Definirati i implementirati klasu “Polinom”, koja omogućava rad sa polinomima. Klasa treba da ima konstruktor sa dva parametra koji predstavljaju redom stepen polinoma, kao i ime nezavisne varijable u polinomu, koje obavezno predstavlja samo jedan znak, a ne string (ovo će se koristiti samo pri ispisu polinoma). Koeficijenti polinoma treba da se čuvaju u dinamički alociranom nizu realnih brojeva. Zbog toga je neophodno da klasa ima definirane i destruktor, konstruktor kopije i prekopljeni operator dodjele (inače neće biti moguće definirati operatorske funkcije koje će raditi ispravno). Klasa bi trebala da ima preklopljeni operator “[]” kojim se omogućava pristup koeficijentima polinoma. Indeksi koeficijenata polinoma se kreću od nule (slobodni član) do stepena polinoma, a u slučaju indeksa izvan opsega treba baciti izuzetak. Za računanje vrijednosti polinoma koristi se preklopljeni operator “()” kojem se prosljeđuje vrijednost argumenta za koji treba izračunati vrijednost polinoma. Treba podržati i binarne operatore “+”, “–”, “*”, “/” i “%” za sabiranje, oduzimanje, množenje, djeljenje i nalaženje ostatka pri dijeljenju dva polinoma, njihove bliske srodnike “+=”, “–=”, “*=”,“/=” i “%=”, kao i unarni operator “–“ koji kao rezultat daje polinom sa izvrnutim predznacima svih koeficijenata. Binarne operacije nad polinomima su podržane samo nad dva polinoma koji zavise od iste promjenljive (u suprotnom, treba baciti izuzetak). Dalje, treba podržati i binarne relacione operatore “==” i “!=” koji testiraju jednakost, odnosno nejednakost dva polinoma. Konačno, treba podržati i operator za ispis “<<” koji ispisuje polinom na ekran, koristeći ime nezavisne varijable koje je bilo zadato u konstruktoru. Na primjer, mogući izgled ispisanog polinoma mogao bi izgledati ovako:
3 + 2 x^2 – 4 x^3 – x^5 + 6 x^6
uz pretpostavku da su koeficijenti polinoma bili redom 3, 0, 2, –4, 0, –1 i 6. Obavezno napisati i mali testni program u kojem će se testirati svi zahtijevani elementi ove klase.

Opis rješenja:

Listing programa:

#include <iostream>
#include <conio.h>
#include <algorithm>

using namespace std;
class Poli{
  int st_poli;
  double *koef;
  char ime;
public:
  Poli(int n,const char z):st_poli(n),koef(new double[n+1]),ime(z){}
  Poli(const Poli &v);
  ~Poli(){ delete[] koef; }
  Poli &operator =(const Poli &v);
  double operator [](int i) const;
  double &operator [](int i);
  double operator ()(double x) const;
  friend void operator -(const Poli &p){
  for(int i=0;i<=p.st_poli;i++){
    double a=-p.koef[i];
    p.koef[i]=a;
    }
  }
  friend const Poli operator +(const Poli &v1, const Poli &v2);
  friend const Poli operator -(const Poli &v1, Poli &v2){
  if(v1.ime!=v2.ime)throw "error!";-v2;return v1+v2;}
  friend const Poli operator *(const Poli &v1, const Poli &v2);
  friend const Poli operator /(const Poli &v1, const Poli &v2);
  friend const Poli operator %(const Poli &v1, const Poli &v2);
  friend void  operator +=(Poli &v1,  Poli &v2){v1+v2;}
  friend void  operator -=(Poli &v1,  Poli &v2){v1-v2;}
  friend void  operator /=(Poli &v1,  Poli &v2){v1/v2;}
  friend void  operator %=(Poli &v1,  Poli &v2){v1%v2;}
  friend const bool operator ==(const Poli &v1, const Poli &v2);
  friend const bool operator !=(const Poli &v1, const Poli &v2){
        if(v1==v2)return false;return true;}
  friend ostream &operator<<(ostream &cout,const Poli &d);
};
Poli::Poli(const Poli &v):ime(v.ime),
    st_poli(v.st_poli),koef(new double[v.st_poli+1]){
    copy(v.koef,v.koef+v.st_poli+1,koef);
}
Poli &Poli::operator =(const Poli &v){
if(st_poli<v.st_poli){
    delete[] koef;
    koef=new double[v.st_poli+1];
    }
st_poli=v.st_poli;
copy(v.koef,v.koef+v.st_poli+1,koef);
ime=v.ime;
return *this;
}
double Poli::operator [](int i) const {
  if(i < 0 || i > st_poli) throw "Pogrešan indeks!\n";
  return koef[i];
}

double &Poli::operator [](int i) {
  if(i < 0 || i > st_poli) throw "Pogrešan indeks!\n";
  return koef[i];
}

double Poli::operator ()(double x) const {
  double suma(0);
  for(int i = st_poli; i > 0; i--)
    suma = suma * x + koef[i];
  return suma * x+koef[0];
}
const Poli operator +(const Poli &v1, const Poli &v2){
if(v1.ime!=v2.ime)throw "error!";
Poli a(v1.st_poli,v1.ime);
if(v1.st_poli<v2.st_poli)a=Poli(v2.st_poli,v1.ime);
for(int i=0;i<=a.st_poli;i++)
    a.koef[i]=v1.koef[i]+v2.koef[i];
return a;
}    
const Poli operator *(const Poli &v1, const Poli &v2){
if(v1.ime!=v2.ime)throw "error!";
int n(v1.st_poli+v2.st_poli);
Poli P(n,v1.ime);
for(int i=0;i<=v1.st_poli;i++){
    for(int j=0;j<=v2.st_poli;j++){
        P[(i+j)%(n+1)]+=v1.koef[i]*v2.koef[j];    
        }
    }
return P;
}
const Poli operator /(const Poli &v1, const Poli &v2){
if(v1.ime!=v2.ime)throw "error!";
Poli P=v1,Q=v2,S(v1.st_poli-v2.st_poli,v1.ime);
for(int i=0;i<=S.st_poli;i++)S.koef[i]=0;
for(int i=v1.st_poli-v2.st_poli,j=v1.st_poli;i>=0;i--,j--){
    S.koef[i]=P.koef[j]/Q.koef[v2.st_poli];
    Poli L(i,v1.ime);
    for(int k=0;k<=L.st_poli;k++){
        if(k!=i)L.koef[k]=0;    
        else L.koef[k]=S.koef[i];
        }
    Poli R(Q*L),R1(P-R);
    P=R1;
    }
return S;
}
const Poli operator %(const Poli &v1, const Poli &v2){
    Poli P(v1/v2);
    Poli S(P*v2);
    return v1-S;
    }
const bool operator ==(const Poli &v1, const Poli &v2){
    if(v1.st_poli!=v2.st_poli)return false;
    bool t(true);
    for(int k=0;k<=v1.st_poli;k++)
        if(v1.koef[k]!=v2.koef[k]){t=false;break;}
    return t;
}
ostream &operator<<(ostream &cout,const Poli &d){
if(d.koef[0]!=0)cout<<d.koef[0];
bool t(true);
    for(int k=1;k<d.st_poli;k++){
        if(d.koef[k]>0&&d.koef[0]==0&&t){
                t=false;}
        else if(d.koef[k]>0)cout<<" + ";
       if(d.koef[k]!=0) cout<<" "<<d.koef[k]<<d.ime<<"^"<<k;
    }
    if(d.koef[d.st_poli]>0)cout<<" + ";
    return cout<<" "<<d.koef[d.st_poli]<<d.ime<<"^"<<d.st_poli;
}

int main(){
try{
//Ovde treba testirati klasu...
}
catch(...){
cout<<"nesto ne valja!";
}
getch();
return 0;
}

Ispis na ekranu:

Riješeni zadaci 2    Index