Sunteți pe pagina 1din 6

/*LP10.

- Polinoame reprezentate ca liste nlnuite Structura de baz va fi un polinom (grad i coeficieni): - Creare 1p, - Inserare 1p, - tergerea unui polinom 1p; - Citire 0.5p, - Afiare 0.5p; - Operaii ntre dou polinoame: - Adunare 1p. - Scdere 1p. - nmulire 1p - mprire 1p*/ #include <iostream> #include <Windows.h> #include <cstdio> #define eroare "Eroare! Cel putin unul dintre polinoame nu a fost initializa t sau a fost sters in prealabil!\nOptiune:" using namespace std; struct pol {int grad, coef; pol *urm;}; void creare(int &n, int &m, pol *&prim, pol *&prim1, bool &valid){ // ?? if(valid==false){ cout<<"Crearea polinomului 1:\n"; cout<<"Grad = "; cin>>n; prim = new pol; prim->grad=n; cout<<"\nCrearea polinomului 2:\n"; cout<<"Grad = "; cin>>m; prim1 = new pol; prim1->grad=m; valid = true; cout<<"Creare finalizata! Optiune:"; } else cout<<"Polinoamene sunt deja create!\nOptiune:"; } void inserare(pol *&p, pol *&prim, pol *&ultim, int grad){ p=new pol; p->grad=grad; cout<<"Coef="; cin>>p->coef; p->urm=NULL; ultim->urm=p; ultim=p; } void citire(pol *&prim, pol *&ultim, int n, bool valid){ pol *p; if(valid == true){ prim = new pol; prim->grad=n; cout<<"Coef="; cin>>prim->coef ; prim->urm=NULL; ultim=prim; for(int i=n-1;i>=0;i--) inserare(p, prim, ultim, i); cout<<"Citire incheiata. Optiune: "; } else cout<<"Polinoamele nu au fost create.\nApelati creare introduca nd 1\n"; } void afisare(pol *prim, pol *ultim, bool v=false){ pol *p; if(v == true){ if(prim->coef > 1) cout<<prim->coef<<"X^"<<prim->grad; else if(prim->coef == -1) cout<<"-X^"<<prim->grad; else if(prim->coef == 1) cout<<"X^"<<prim->grad; else if(prim->coef ==0) ; else if(prim->coef * (-1) > 1) cout<<prim ->coef<<"X^"<<prim->grad; else cout<<prim->coef<<"X^"<<prim->grad;

if(prim->urm!=NULL) for(p=prim->urm;p->urm!=NULL;p=p->urm) if(p->coef !=0) if(p->coef == 1){ cout<<"+X"; if(p->grad>1) cout<<"^"<<p->grad; } else if(p->coef == -1) {cout<<"-X"; if(p->grad>1) cout<<"^"<<p->grad; } else {printf("%+dX",p->coef); if(p->grad>1) cout<<"^"<<p->grad; } if(ultim->coef != 0) printf("%+d", ultim->coef); cout<<"\n\nAfisare finalizata. Optiune:"; } else cout<<"Afisarea nu se poate realiza deoarece nu ati introdus un polinom\nOptiune:"; } void stergere(pol *&pr, int k){ pol *p; if(pr!=NULL){ while(pr){ p=pr; pr=pr->urm; delete p ; //eliberam memoria ocupata de nodul indic at de pointerul p } cout<<"Polinomul "<<k<<" a fost sters. Optiune:"; } else cout<<"Polinomul nu exista, deci nu poate fi sters.\nOptiune:"; } void adaugare(int x, pol *&prim, int n) //completeaza polinoamele cu 0 pentr u echilibrarea gradelor. { pol *p; while(x>0){ p = new pol; p->grad = n-x+1; p->coef = 0; p->urm=prim; prim=p; x--; } } void aduna(int gradul, pol *&sp, pol *&us, pol *prim, pol *prim1){ pol *t, *p, *q; sp->grad = gradul; sp->coef = prim->coef + prim1->coef; sp->urm=NULL; us=sp; for(p=prim->urm, q=prim1->urm;p!=NULL;p=p->urm, q=q->urm){ t = new pol; t->grad = p->grad; t->coef = p->coef + q->coef; t->urm=NULL; us->urm=t; us=t; } } void suma(pol *prim, pol *prim1, pol *&sp, pol *&us, int n, int m, bool p1, bool p2, bool &s){ if(p1 && p2){ sp = new pol; s = true; if(n == m) aduna(n, sp, us, prim, prim1); else if(n>m){adaugare(n-m, prim1, n); aduna(n, sp, us, prim, prim1); m = n;} else {adaugare(m-n, prim, m); aduna(m, sp, us, prim

, prim1);n = m;} } else cout<<eroare; } void scade(int gradul, pol *&dp, pol *&du, pol *prim, pol *prim1){ pol *p, *q, *t; dp->grad = gradul; dp->coef = prim->coef - prim1->coef; dp->urm=NULL; du=dp; for(p=prim->urm, q=prim1->urm;p!=NULL;p=p->urm, q=q->urm){ t = new pol; t->grad = p->grad; t->coef = p->coef - q->coef; t->urm=NULL; du->urm=t; du=t; } } void diferenta(pol *prim, pol *prim1, pol *&dp, pol *&du, int n, int m, bool p1, bool p2, bool &d){ if(p1 && p2){ dp = new pol; d = true; if(n == m) scade(n, dp, du, prim, prim1); else if(n>m){adaugare(n-m, prim1, n); scade(n, dp, du, prim, prim1); m = n;} else {adaugare(m-n, prim, m); scade(m, dp, du, prim , prim1); n = m;} pol *p = NULL; int z=1; for(pol *p = dp;p!=NULL; p=p->urm) if(p->coef != 0) z = 0; if(z == 1) cout<<0; } else cout<<eroare; } void produs(pol *prim, pol *prim1, pol *&pp, pol *&pu, bool p1, bool p2, boo l &prod){ pol *t, *p, *q; int c = 0, g = 0; if(p1 && p2){ pp = new pol; prod = true; pp->grad = prim->grad + prim1->grad; pp->coef = prim->coef * prim1->coef; pp->urm=NULL; pu=pp; for(p=prim;p!=NULL;p=p->urm) for(q = prim1; q!=NULL; q=q->urm){ c = p->coef * q->coef; g = p->grad + q->gra d; pol * qq; int ok=0; for(qq = pp; qq!=NULL; qq=qq->urm) if(qq->grad == g) { qq->coef+=c; ok=1; } if(ok==0){ t=new pol; t->grad = g; t->coef = c; t->urm=NULL; pu->urm=t; pu=t; } } pp->coef = pp->coef - prim->coef * prim1->coef; while(pp->coef == 0){ // elimina 0-urile din fata polinomulu i [ele vor exista daca se face suma sau diferenta inainte. p = pp; pp=pp->urm; delete p;

} } else cout<<eroare; } void text(){ cout<<"MENIU:\n"; cout<<"\tCreare:\n\n"; cout<<"Creare polinoame -> 1\n"; cout<<"Sterge primul -> 2\n"; cout<<"Sterge al doilea -> 3\n"; cout<<"\tCitire:\n\n"; cout<<"Citire polinom 1 -> 4\n"; cout<<"Citire polinom 2 -> 5\n"; cout<<"\tAfisare:\n\n"; cout<<"Afisare polinom 1 -> 6\n"; cout<<"Afisare polinom 2 -> 7\n"; cout<<"\tOperatii:\n\n"; cout<<"Suma -> 8\n"; cout<<"Diferenta -> 9\n"; cout<<"Produsul -> 10\n"; cout<<"Catul -> 11\n"; cout<<"\tExit:\n\n"; cout<<"Pentru a revedea meniul, introduceti 15\n"; cout<<"Iesire -> 0\n"; cout<<"Optiune: "; } void impartire(pol *prim, pol *prim1, pol *&pc, pol *&uc, pol *&pr, pol *&ur , bool p1, bool p2, bool &cat){ pol *ptr, *utr, *p; bool vr = false; ptr = new pol; utr = new pol; ptr = utr = NULL; if(p1 && p2){ pc = new pol; pr = new pol; cat = true; if(prim->grad >= prim1->grad){ cout<<"Impartim primul polinom la al doilea:\n"; pc->coef = prim->coef / prim1->coef; pc->grad = prim->grad - prim1->grad; pc->urm=NULL; uc=pc; produs(pc, prim1, ptr, utr, true, true, vr); diferenta(prim, ptr, pr, ur, prim->grad, ptr->grad, true, true, vr); prim = pr; p = pc->urm; while(pr->grad>prim1->grad){ p->coef = prim->coef / prim1->coef; p->grad = prim->grad - prim1->grad; produs(pc, prim1, ptr, utr, true, true, vr); diferenta(prim, ptr, pr, ur, prim->grad, ptr ->grad, true, true, vr); prim = pr; p=p->urm; } } else{ cout<<"Impartim al doilea polinom la primul:\n"; //algoritm de impartire } } else cout<<eroare; } void st(pol *prim1, pol *ultim1, int k, bool &pv){ char a;

cout<<"\t\nSunteti pe cale de a lansa procedura de stergere a polinomulu i "<<k<<". Continuati? (y/n)\n"; do{ cin>>a; if(a == 'y'){stergere(prim1,k); pv = false; return;} if(a == 'n') {cout<<"Stergere abandonata. Optiune: ";return; } if(a!='n' || a!='y') cout<<"Invalid! Alegeti y sau n\n"; } while(a!='y' || a!='n'); } void intro(){ cout<<"\n\n\n\n\n\n\n\ TEMA 1 - Lab POO\n"; cout<<"\n\n\n "; system("PAUSE"); system("CLS"); } int main() {// declarare date pol *prim, *ultim, *prim1, *ultim1, *dp, *du, *pp, *pu, *sp, *us; pol *pc, *uc, *pr, *ur; bool valid = false, p1 = false, p2 = false; bool s = false, d = false, prod = false, cat = false; // initializare date prim = ultim = prim1 = ultim1 = NULL; int n=0, m=0, x=1; intro(); // meniu text(); while(x!=0){ cin>>x; switch(x){ case 1:{cout<<"\tCrearea polinoamelor:\n"; creare(n, m, prim , prim1, valid);} break; case 2:{st(prim, ultim, 1, p1); } break; case 3:{st(prim1, ultim1,2, p2); } break; case 4:{ cout<<"\tCitirea primului polinom:\n"; citire(prim, ultim, n, valid); p1 = true; } break; case 5:{ cout<<"Citirea polinomului 2:\n"; citire(prim1, ultim1, m, valid); p2 = true; } break; case 6:{ cout<<"Polinomul 1: "; afisare(prim, ultim, p1); } break; case 7:{ cout<<"Polinomul 2: "; afisare(prim1, ultim1, p2); } break; case 8:{ cout<<"Suma polinoamelor: "; suma(prim, prim1, sp, us, n, m, p1, p2, s); if(s && p1 && p2) afisare(sp, us, s); } break; case 9:{ cout<<"Diferenta polinoamelor: ";

diferenta(prim, prim1, dp, du, n, m, p1, p2, d); if(d && p1 && p2) afisare(dp, du, d); } break; case 10:{ cout<<"Produsul polinoamelor: "; produs(prim, prim1, pp, pu, p1, p2, prod); if(prod && p1 && p2) afisare(pp, pu, prod); } break; case 11:{cout<<"Catul celor doua polinoame este:\n"; impartire(prim, prim1, pc, uc, pr, ur, p1, p2, cat); } break; case 15:{text();} break; default:{ if(x!=0) {cout<<"Optiune invlida\n"; text(); } else {cout<<"\nGoodbye!"; Sleep(300);} } } } return 0; }

S-ar putea să vă placă și