//Scortariu T. Cristina //Grupa 1067 //Numar tema (bilet):7 #include #include #include #include #include struct elemd { double coef; int grad; }; struct elemi { int coef; int grad; }; const double EPS = 0.001; templateclass polinom { T *pol; int nr; public: polinom(); polinom(int n); ~polinom(); polinom(int k,...); int grad(); double coeficient(int g); sortare(); friend ostream &operator <<(ostream&,polinom&); friend istream &operator >>(istream&, polinom&); bool operator!(); polinom &operator +(polinom&); polinom &operator -(polinom&); polinom &operator *(polinom&); polinom &operator /(polinom&); polinom &operator %(polinom&); double operator () (double&); polinom &operator --(); polinom &operator ++(); polinom &operator +(elem&); polinom &operator -(int&); double deriv(double&); double integ(double&, double&); polinom cmMdc(polinom&); polinom cmmmc(polinom&); double rad ( double&, double& ); }; //******************************************************************************************// //------------------------------Constructori si destructori--------------------------------// //constructor prin introducerea datelor de la terminat polinom::polinom(int n) { pol=new elem[n]; for(int i=nr;i>=0;i--) { cout<<"\n\t->Coefcientul pentru gradul "<>pol[i].coef; pol[i].grad=i; } } //constructor implicit polinom::polinom() { } //destructor polinom::~polinom() { } //constructor folosind functii cu numarvariabil de argumente polinom::polinom(int k,...) { int c,g,i; va_list va; va_start( va, k); nr=(int)(k/2)-1; pol=new elem[nr]; i=nr; while(i >= 0) { c=va_arg(va, int); g=va_arg(va, int); pol[i].grad=g; pol[i].coef=c; i--; } va_end(va); } //******************************************************************************************// //--------------------------------------Metode auxiliare--------------------------------// //aflarea gradului polinomului polinom::grad() { return (int)nr; } //alfarea coeficientului unui element dintr-un polinom double polinom::coeficient(int g) { double d; for(int i=nr;i>=0;i--) if(pol[i].grad==g) d=pol[i].coef; return (double)d; } //sortarea unui polinom descrescator dupa grad polinom::sortare() { int auxgrad; double auxcoef; for(int i=nr;i>0;i--) if (pol[i].grad>pol[i-1].grad) { auxgrad=pol[i].grad; auxcoef=pol[i].coef; pol[i].grad=pol[i-1].grad; pol[i].coef=pol[i-1].coef; pol[i-1].grad=auxgrad; pol[i-1].coef=auxcoef; }; } //******************************************************************************************// //-------------------------------Supraincarcarea operatorilor << si >>---------------------// //Operatia de intrare la nivel de obiect istream &operator >>(istream &is, polinom& p) { cout<<"Care este gradul polinomului?"; cin>>p.nr; p.pol=new elem[p.nr]; for(int i=p.nr;i>=0;i--) { cout<<"\n\t->Coefcientul pentru gradul "<>p.pol[i].coef; p.pol[i].grad=i; }; return is; } //Operatia de iesire la nivel de obiect ostream &operator <<(ostream &out,polinom& p) { for(int i=p.nr;i>=0;i--) {if(p.pol[i].grad==0 && p.pol[i].coef!=0) out<1&& p.pol[i].coef!=0) out<grad(); double coefsuma; if (grp>=grt) suma.nr=grp; else suma.nr=grt; suma.pol=new elem[suma.nr+1]; for(int i=suma.nr;i>=0;i--) { coefsuma=0; if(i<=grp) coefsuma=coefsuma+p.pol[i].coef; if(i<=grt) coefsuma=coefsuma+this->pol[i].coef; suma.pol[i].grad=i; suma.pol[i].coef=coefsuma; } return suma; } //Diferenta a doua polinoame polinom &polinom::operator -(polinom& p) { polinom diferenta; int grp=p.grad(); int grt=this->grad(); double coefdiferenta; if (grp>=grt) diferenta.nr=grp; else diferenta.nr=grt; diferenta.pol=new elem[diferenta.nr]; for(int i=diferenta.nr;i>=0;i--) { coefdiferenta=0; if(i<=grt) coefdiferenta=this->pol[i].coef; if(i<=grp) coefdiferenta=coefdiferenta-p.pol[i].coef; diferenta.pol[i].grad=i; diferenta.pol[i].coef=coefdiferenta; }; int k=diferenta.nr; while (k>=0 && diferenta.pol[k].coef==0) { diferenta.nr=diferenta.nr-1; k--; } if(diferenta.nr<0) diferenta.nr=0; return diferenta; } //Produsul a doua polinoame polinom &polinom::operator *(polinom& p) { polinom produs; int grp=p.grad(); int grt=this->grad(); produs.nr=grp+grt; produs.pol=new elem[produs.nr]; for(int k=produs.nr;k>=0;k--) {produs.pol[k].coef=0; produs.pol[k].grad=k; } for(int i=p.nr;i>=0;i--) for(int j=this->nr;j>=0;j--) produs.pol[i+j].coef=produs.pol[i+j].coef + p.pol[i].coef * this->pol[j].coef; return produs; } //Catul rezultat din impartirea a doua polinoame polinom &polinom::operator /(polinom& p) { polinom cat; polinom aux, deimpartit=(*this); polinom temp; int grt=deimpartit.grad(); int grp=p.grad(); cat.nr=grt-grp; cat.pol=new elem[cat.nr]; int k=cat.nr; while(deimpartit.nr>=p.nr) { grt=deimpartit.grad(); cat.pol[k].grad=k; cat.pol[k].coef=deimpartit.pol[grt].coef/p.pol[grp].coef; aux.pol=new elem[k+1]; aux.nr=k; aux.pol[k].grad=k; aux.pol[k].coef=deimpartit.pol[grt].coef/p.pol[grp].coef; for(int i=k-1;i>=0;i--) { aux.pol[i].coef=0; aux.pol[i].grad=i; }; temp=aux*p; deimpartit=deimpartit-temp; k--; } return cat; } //Restul rezultat din impartirea a doua polinoame polinom &polinom::operator %(polinom& p) { polinom cat; polinom aux, deimpartit=(*this); polinom temp; int grt=deimpartit.grad(); int grp=p.grad(); cat.nr=grt-grp; cat.pol=new elem[cat.nr]; int k=cat.nr; while(/*deimpartit.nr>=p.nr*/k>=0) { grt=deimpartit.grad(); cat.pol[k].grad=k; cat.pol[k].coef=deimpartit.pol[grt].coef/p.pol[grp].coef; aux.pol=new elem[k+1]; aux.nr=k; aux.pol[k].grad=k; aux.pol[k].coef=deimpartit.pol[grt].coef/p.pol[grp].coef; for(int i=k-1;i>=0;i--) { aux.pol[i].coef=0; aux.pol[i].grad=i; }; temp=aux*p; deimpartit=deimpartit-temp; k--; } return deimpartit; } //******************************************************************************************// //---------------------Supraincarcarea operatorilor !,--,++,+,- si () ---------------------// //Test de polinom nul bool polinom::operator!() { bool nul; nul=0; for( int i=nr;i>=0;i--) if( pol[i].grad!=0 && pol[i].coef!=0) nul=1; return nul; } //Derivare formala polinom &polinom ::operator -- () { polinom derivf; derivf.nr=this->nr-1; derivf.pol=new elem[derivf.nr]; for(int i=this->nr;i>0;i--) {derivf.pol[i-1].grad=i-1; derivf.pol[i-1].coef=this->pol[i].coef*this->pol[i].grad; } return derivf; } //Integrare formala polinom &polinom ::operator ++ () { polinom integrf; integrf.nr=this->nr+1; integrf.pol=new elem[integrf.nr]; for(int i=this->nr+1;i>0;i--) {integrf.pol[i].grad=i; integrf.pol[i].coef=this->pol[i-1].coef/(this->pol[i-1].grad+1); } integrf.pol[0].grad=0; integrf.pol[0].coef=0; return integrf; } //Adaugarea unui nou termen polinom &polinom::operator + (elem &e) { polinom rezultat; double c=e.coef; int g=e.grad; if(g>this->nr) { rezultat.nr=g; rezultat.pol=new elem[g]; rezultat.pol[g].coef=c; rezultat.pol[g].grad=g; for(int i=g-1;i>=0;i--) { if(i>this->nr) { rezultat.pol[i].coef=0; rezultat.pol[i].grad=i; } else { rezultat.pol[i].coef=this->pol[i].coef; rezultat.pol[i].grad=i; }; } } else { rezultat.nr=this->nr; rezultat.pol=new elem[rezultat.nr]; for(int i=this->nr;i>=0;i--) {if (i==g) { rezultat.pol[i].coef=this->pol[i].coef+c; rezultat.pol[i].grad=i; } else { rezultat.pol[i].coef=this->pol[i].coef; rezultat.pol[i].grad=i; }; } } return rezultat; } //Eliminarea unui termen(cheia de identificare a elementului=gradul) polinom &polinom ::operator - (int& g) { polinom rez; if(g>this->nr) cout<<"Termenul de gradul "<=0 && rez.pol[k].coef==0) { rez.nr=rez.nr-1; k--; }; } return rez; } //Calcularea valorii polinomului intr-un punct double polinom::operator() (double &punct) { double val=0; for(int i=this->nr;i>=0;i--) {val=val+this->pol[i].coef*pow(punct,(double) this->pol[i].grad);}; return val; } //********************************************************************************************// //---Functiile:integ(double,double), deriv(double), cmMdc(), cmmmc(), rad(double, double) ---// //Evaluarea derivatei intr-un punct folosind operatorii -- si () double polinom::deriv(double& pct) { polinom temp=(*this); temp=--temp; return temp(pct); } //Integrarea derivatei intr-un punct folosind operatorii ++ si () double polinom::integ(double &a, double &b) { polinom temp=(*this); temp=++temp; return temp(b)-temp(a); } //Cel mai mare divizor comun a doua polinoame polinom polinom::cmMdc(polinom &p2) { polinom p1=(*this); if(p2.grad()==0) return p1; polinom temp=p1%p2; return p2.cmMdc(temp); } //Cel mai mic multiplu comun a doua polinoame polinom polinom::cmmmc(polinom &p2) { polinom p1=(*this); polinom temp=p1*p2; temp=temp/p1.cmMdc(p2); return temp; } //Determinarea unei radacinidintr-uninterval dat double polinom::rad (double& a, double& b) { double m = (a+b) / 2; if ( fabs( a-b) < EPS ) return m; if ( (((*this)(a)) * ((*this)(m))) <= 0 ) return rad ( a, m ); else return rad ( m, b ); } //********************************************************************************************// //-----------------------------------------Corpul principal ---------------------------------// void main() { int rasp; cout<<"----------------------------------Clasa POLINOM--------------------------------"<>rasp; bool ok=false; do if(rasp==1) { cout<<"\nIntroduceti cele doua polinoame"<>p1; cin>>p2; ok=true; polinom r; double pct, a,b, rez; elem e; int elim; cout<<"-------------------------------------------------------------------------------"<>PolinomlP1(x) este nul!"; else cout<<"\n\t\t->>Polinomul nu este nul!"; if (p2.operator !()==0) cout<<"\n\t\t->>PolinomlP1(x) este nul!"; else cout<<"\n\t\t->>Polinomul nu este nul!"; cout<<"\n# Suma \n\t->>S(X)=P1(X)+P2(X)="; r=p1+p2; cout<>D(X)=P1(X)-P2(X)="; r=p1-p2; cout<>P(X)=P1(X)*P2(X)="; r=p1*p2; cout<>C(X)=P1(X)/P2(X)="; r=p1/p2; cout<>R(X)=P1(X)+P2(X)="; r=p1-p2; cout<>a polinomului P1(X)"; r=--p1; cout<>a polinomului P2(X)"; r=--p2; cout<>a polinomului P1(X)"; r=++p1; cout<>a polinomului P2(X)"; r=++p2; cout<>Introduceti punctul: "; cin>>pct; cout<<"\n\t->>P1("<>Introduceti coeficentul noului element:"; cin>>e.coef; cout<<"\n\t->>Introduceti gradul noului element:"; cin>>e.grad; r=p1+e; cout<<"\n\t->>P1(X)="<>Introduceti gradul elementului ce urmeaza a fi eliminat:"; cin>>elim; r=p1-elim; cout<<"\n\t->>P1(X)="<>Introduceti limita inferioara:"; cin>>a; cout<<"\n\t->>Introduceti limita superioara:"; cin>>b; rez=p2.integ(a,b); cout<>Introduceti punctul:"; cin>>pct; rez=p2.deriv(pct); cout<>cmMdc = "; r=p1.cmMdc(p2); cout<>cmmmc = "; r=p1.cmmmc(p2); cout<>Introduceti limita inferioara:"; cin>>a; cout<<"\n\t->>Introduceti limita superioara:"; cin>>b; rez=p2.rad(a,b); cout<<"\n\t->>Radacina este:"<>PolinomlP1(x) este nul!"; else cout<<"\n\t\t->>Polinomul nu este nul!"; if (p2.operator !()==0) cout<<"\n\t\t->>PolinomlP1(x) este nul!"; else cout<<"\n\t\t->>Polinomul nu este nul!"; cout<<"\n# Suma \n\t->>S(X)=P1(X)+P2(X)="; r=p1+p2; cout<>D(X)=P1(X)-P2(X)="; r=p1-p2; cout<>P(X)=P1(X)*P2(X)="; r=p1*p2; cout<>C(X)=P1(X)/P2(X)="; r=p1/p2; cout<>R(X)=P1(X)+P2(X)="; r=p1-p2; cout<>a polinomului P1(X)"; r=--p1; cout<>a polinomului P2(X)"; r=--p2; cout<>a polinomului P1(X)"; r=++p1; cout<>a polinomului P2(X)"; r=++p2; cout<>Introduceti punctul: "; cin>>pct; cout<<"\n\t->>P1("<>Introduceti coeficentul noului element:"; cin>>e.coef; cout<<"\n\t->>Introduceti gradul noului element:"; cin>>e.grad; r=p1+e; cout<<"\n\t->>P1(X)="<>Introduceti gradul elementului ce urmeaza a fi eliminat:"; cin>>elim; r=p1-elim; cout<<"\n\t->>P1(X)="<>Introduceti limita inferioara:"; cin>>a; cout<<"\n\t->>Introduceti limita superioara:"; cin>>b; rez=p2.integ(a,b); cout<>Introduceti punctul:"; cin>>pct; rez=p2.deriv(pct); cout<>cmMdc = "; r=p1.cmMdc(p2); cout<>cmmmc = "; r=p1.cmmmc(p2); cout<>Introduceti limita inferioara:"; cin>>a; cout<<"\n\t->>Introduceti limita superioara:"; cin>>b; rez=p2.rad(a,b); cout<<"\n\t->>Radacina este:"<>p1; polinom p2(4,-19,1,19,0); cout<<"P1(x)="<>PolinomlP1(x) este nul!"; else cout<<"\n\t\t->>Polinomul nu este nul!"; if (p2.operator !()==0) cout<<"\n\t\t->>PolinomlP1(x) este nul!"; else cout<<"\n\t\t->>Polinomul nu este nul!"; cout<<"\n# Suma \n\t->>S(X)=P1(X)+P2(X)="; r=p1+p2; cout<>D(X)=P1(X)-P2(X)="; r=p1-p2; cout<>P(X)=P1(X)*P2(X)="; r=p1*p2; cout<>C(X)=P1(X)/P2(X)="; r=p1/p2; cout<>R(X)=P1(X)+P2(X)="; r=p1-p2; cout<>a polinomului P1(X)"; r=--p1; cout<>a polinomului P2(X)"; r=--p2; cout<>a polinomului P1(X)"; r=++p1; cout<>a polinomului P2(X)"; r=++p2; cout<>Introduceti punctul: "; cin>>pct; cout<<"\n\t->>P1("<>Introduceti coeficentul noului element:"; cin>>e.coef; cout<<"\n\t->>Introduceti gradul noului element:"; cin>>e.grad; r=p1+e; cout<<"\n\t->>P1(X)="<>Introduceti gradul elementului ce urmeaza a fi eliminat:"; cin>>elim; r=p1-elim; cout<<"\n\t->>P1(X)="<>Introduceti limita inferioara:"; cin>>a; cout<<"\n\t->>Introduceti limita superioara:"; cin>>b; rez=p2.integ(a,b); cout<>Introduceti punctul:"; cin>>pct; rez=p2.deriv(pct); cout<>cmMdc = "; r=p1.cmMdc(p2); cout<>cmmmc = "; r=p1.cmmmc(p2); cout<>Introduceti limita inferioara:"; cin>>a; cout<<"\n\t->>Introduceti limita superioara:"; cin>>b; rez=p2.rad(a,b); cout<<"\n\t->>Radacina este:"<