Polinoame



Algebra polinoamelor incomplete de mai multe nedeterminate, implementare dinamica


Structuri de date:


Pentru implementarea unui polinom incomplet de mai mult nedeterminate am definit o clasa 'poli' cu urmatoarele date:




Int nr_var

Numarul de nedeterminate ale polinomului

Int nr_elem

Numarul de elemente

Nu se citeste, ci este initializat in functie de elementele introduse

Float *coef

Coeficientii polinomului (nu exista coeficienti de valoare 0

Int *gr[30]

Vector de pointeri spre intregi reprezentand pentru fiecare coeficient puterile corespunzatoare fiecarei nedeterminate

Ex: Pentru polinomul P(x,y,z)=x2y +1

Gr[0][0]=2, Gr[0][1]=1, Gr[0][0]=0

Gr[1][0]=0, Gr[0][1]=0, Gr[0][0]=0



Toate datele de mai sus sunt private pentru a nu fi permisa modificarea lor decat prin functiile clasei. Tot privata este si functia 'pos' pentru ca nu trebuie sa fie vizibila din exterior.


Operatiile efectuate asupra polinoamelor:

Adunare

Scadere

Inmultirea a 2 polinoame

Calculul derivatei in raport cu o variabila specificata prin indice

Calculul primitivei in raport cu o variabila specificata prin indice


class poli;



Prezentarea programului:


poli();

constructorul clasei

initializeaza polinomul ca polinom nul

nu poate fi decat public


void init();

functie publica ce initializeaza polinomul cu valori citite de la tastatura

polinomul se considera introdus corect, adica nu trebuie introduse aceleasi secvente de puteri (Ex: P(x)=5x+2+3 )

se citesc coeficienti pana cand nu se mai introduce unul valid (in mod normal asta s-ar face frumos cu CTRL-Z, dar din pacate cscanf()-ul nu il recunoaste)


void af();

functie publica pentru afisarea caracteristicilor (polinomul efectiv, numarul de variabile, numarul de elemente)


void af_t();

functie publica pentru afisarea in tabelul celor 10 vectori din programul demonstrativ

in mod normal nu ar avea ce cauta in biblioteca


void add_sub(poli&,poli&,int op);

functie publica pentru adunare/scadere; op=1 pentru adunare, op=-1 pentru scadere

functia este comuna pentru micsorarea codului

am ales parametrii adrese, nu pentru a-i modifica ci pentru a nu lucra cu copii ale lor (nu avea nici un rost)

sunt permise si apelari de genul: p.add(p1,p) sau chiar p.add(p,p)


void mul(poli&,poli&);

functie publica pentru inmultire

aceleasi observatii ca la functia add_sub()


void deriv(int);

functie publica pentru derivare in raport cu o variabila

indicele variabilei este minim 1 si maxim nr_var


void prim(int);

functie publica pentru aflarea unei primitive in raport cu o variabila

indicele variabilei este minim 1 si maxim nr_var


void operator=(poli&);

redefinirea operatorului de atribuire (copiez varorile)

desi nu-l folosesc in programul demostrativ, trebuie redefinit pentru ca in interiorul clasei sunt adrese si prin atribuirea implicita s-ar face si atribuire de adrese.


~poli();

destructorul clasei


Observatie:

Datele se considera introduse corect.

Sursa programului:


M12t2.h


class poli;


M12t2p14.cpp


#include <stdio.h>#include <conio.h>#include <math.h>#include <alloc.h>#include <mem.h>#include 'm12t2.h'#define X cprintf('n');#define eps 1.e-6poli::poli() //initializez un obiect nou


poli::~poli()



void poli::operator=(poli &p)


}



void poli::init()


}

}while (ok);

nr_elem=i+1;



void poli::af()


for (int i=0;i<nr_elem;i++)


cprintf('nr%d element%c, %d variabilen',nr_elem,nr_elem!=1?'e':' ',nr_var);



void poli::af_t()


for (int i=0;i<nr_elem;i++)


}



int poli::pos(int *p,int dim)


else }

for (j=nr_var;j<dim;j++)

if (p[j])


if (!bad) return i;

}

return -1;



void poli::add_sub(poli &p1,poli &p2,int op)


}

else

}

for (i=0;i<p2.nr_elem;i++)

if (!mrk[i])

}

else

}

else

if (p2.nr_elem) //p1 vid,p2 nu


}


else


_nr_elem=j+1;


this->~poli(); //distrug obiectul, creand unul nou corect,nu

//modificandu-l pe cel vechi

coef=c;

for (i=0;i<_nr_elem;i++) gr[i]=g[i];

nr_elem=_nr_elem;

nr_var=_nr_var;



void poli::mul(poli &p1,poli &p2)



float *c;

int *g[30];

int _nr_var,_nr_elem,i,j,k=-1,p,*aux;


if (p1.nr_var>p2.nr_var) _nr_var=p1.nr_var;

else _nr_var=p2.nr_var;


c=new float[30];


if (p1.nr_elem&&p2.nr_elem) //daca ambii sunt nevizi

{

aux=new int[_nr_var];


for (i=0;i<p1.nr_elem;i++)

for (j=0;j<p2.nr_elem;j++)


{

float rez=p1.coef[i]*p2.coef[j];

memset(aux,0,_nr_var*2);

for (int l=0;l<p1.nr_var;l++) aux[l]+=p1.gr[i][l];

for (l=0;l<p2.nr_var;l++) aux[l]+=p2.gr[j][l];


// aici caut sa vad daca a mai exista vreun termen cu aceleasi puteri


p=-1;

for (int k1=0;k1<k+1;k1++)

{

int bad=0;

for (int k2=0;k2<_nr_var;k2++)

if (aux[k2]!=g[k1][k2])

if (!bad)

}


if (p==-1)

else c[p]+=rez;

}

}

else


_nr_elem=k+1;


this->~poli();


coef=c;

for (i=0;i<_nr_elem;i++) gr[i]=g[i];

nr_elem=_nr_elem;

nr_var=_nr_var;




void poli::deriv(int p)


}

}

else


int _nr_var=nr_var;

this->~poli();


coef=c;

nr_elem=k+1;

for (i=0;i<nr_elem;i++) gr[i]=g[i];

nr_var=_nr_var;



void poli::prim(int p)




main.cpp - programul demonstrativ


#include <stdio.h>

#include <conio.h>

#include 'm12t2.h'


poli v[10];


void fix()



gotoxy(34,1);

cprintf('%s','Situatia polinoamelor');


gotoxy(1,12);

for (i=1;i<=79;i++) putchar('A');

gotoxy(15,12);putchar('Á');


window(16,2,18,12);

textcolor(2);

for (i=1;i<=10;i++) cprintf('%2d:',i);



void toate()




void in()



void afis()



void ad()



void sc()



void inm()




void drv()



void prm()



void st()



void about()




void operatii()


c=getch();

}



void main(void)






ceea ce intelege float-ul ca 'valoare 0'