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:
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)