Sunteți pe pagina 1din 9

Algebra polinoamelor incomplete de mai multe nedeterminate,

implementare dinamic
Structuri de date:
Pentru implementarea unui polinom incomplet de mai mult nedeterminate am definit o clas
poli cu urmtoarele date:
Int nr_var Numrul de nedeterminate ale polinomului
Int nr_elem Numrul de elemente
Nu se citete, ci este iniializat n funcie de elementele introduse
!
Int "gr#$%&
'ector de pointeri spre ntregi reprezent(nd pentru fiecare coeficient puterile
corespunztoare fiecrei nedeterminate
)*: Pentru polinomul P+*,,,z-.*
/
, 0!
1r#%&#%&./, 1r#%&#!&.!, 1r#%&#%&.%
1r#!&#%&.%, 1r#%&#!&.%, 1r#%&#%&.%
2oate datele de mai sus sunt private pentru a nu fi permis modificarea lor dec(t prin funciile
clasei3 2ot privat este i funcia pos pentru c nu trebuie s fie vizibil din e*terior3
4peraiile efectuate asupra polinoamelor:
5 Adunare
5 Scdere
5 6nmulirea a / polinoame
5 7alculul derivatei n raport cu o variabil specificat prin indice
5 7alculul primitivei n raport cu o variabil specificat prin indice
class poli{ private:int nr_var; int nr_elem; float *coef;
int *gr[30]; private:int pos(int *,int);
public:poli();
void init();
void af();
void af_t();
void add_sub(poli,poli,int op);
void mul(poli,poli);
void deriv(int);
void prim(int);

void operator!(poli);
"poli();
#;
Prezentarea programului:
!3 poli+-8
9 constructorul clasei
9 iniializeaz polinomul ca polinom nul
9 nu poate fi dec(t public
/3 void init+-8
9 funcie public ce iniializeaz polinomul cu valori citite de la tastatur
9 polinomul se consider introdus corect, adic nu trebuie introduse aceleai secvene de puteri
+)*: P+*-.:*0/0$ -
! ceea ce nelege float-ul ca ;valoare %<
9 !=> 9
9 se citesc coeficieni p(n c(nd nu se mai introduce unul valid +n mod normal asta s9ar face
frumos cu 72?@9A, dar din pcate cscanf+-9ul nu l recunoate-
$3 void af+-8
9 funcie public pentru afiarea caracteristicilor +polinomul efectiv, numrul de variabile,
numrul de elemente-
B3 void af_t+-8
9 funcie public pentru afiarea n tabelul celor !% vectori din programul demonstrativ
9 n mod normal nu ar avea ce cuta n bibliotec
:3 void add_sub+poliC,poliC,int op-8
9 funcie public pentru adunare=scdere8 op.! pentru adunare, op.9! pentru scdere
9 funcia este comun pentru micorarea codului
9 am ales parametrii adrese, nu pentru a9i modifica ci pentru a nu lucra cu copii ale lor +nu avea
nici un rost-
9 sunt permise i apelri de genul: p.add(p1,p) sau cDiar p.add(p,p)
E3 void mul+poliC,poliC-8
9 funcie public pentru nmulire
9 aceleai observaii ca la funcia add_sub+-
F3 void deriv+int-8
9 funcie public pentru derivare n raport cu o variabil
9 indicele variabilei este minim ! i ma*im nr_var
G3 void prim+int-8
9 funcie public pentru aflarea unei primitive n raport cu o variabil
9 indicele variabilei este minim ! i ma*im nr_var
>3 void operator.+poliC-8
9 redefinirea operatorului de atribuire +copiez varorile-
9 dei nu9l folosesc n programul demostrativ, trebuie redefinit pentru c n interiorul clasei sunt
adrese i prin atribuirea implicit s9ar face i atribuire de adreseH
!%3 Ipoli+-8
9 destructorul clasei
4bservaie:
Jatele se consider introduse corect3
9 /=> 9
Sursa programului:
K!/t/3D
class poli{ private:int nr_var; $$nr de variabile
int nr_elem; $$nr de elemente
float *coef; $$coeficientii polinomului
int *gr[30]; $$gradele corespun%atoare
private:int pos(int *,int);$$caut un anumit termen si returne% po%itia
$$dupa conventia clasica (0&&n daca a fost
$$gasit, sau '( daca nu)
public:poli(); $$constructor
void init(); $$citire de la tastatura
void af(); $$afisare
void af_t(); $$afisare trunc)iata
void add_sub(poli,poli,int op); $$op!( adunare, op!'( scadere
void mul(poli,poli); $$inmultire
void deriv(int); $$derivare in raport cu o variabila
void prim(int); $$calculea%a o primitiva in raport cu o
$$variabila
void operator!(poli); $$fac atribuire
"poli(); $$destructor
#;
K!/t/p!B3cpp
*include +stdio&),*include +conio&),*include +mat)&),*include +alloc&),*include
+mem&),*include -m(.t.&)-*define / cprintf(-0n-);*define eps (&e'1poli::poli()
$$initiali%e% un obiect nou{ coef!0; nr_var!0;nr_elem!0;
memset(gr,0,si%eof(gr));
#
poli::"poli()
{
delete []coef;
for (int i!0;i+nr_elem;i22) delete[]gr[i];
nr_elem!0;
nr_var!0;
#
void poli::operator!(poli p)
{
if (coef!!p&coef) return;
t)is',"poli(); $$il fac nul
nr_var!p&nr_var;
nr_elem!p&nr_elem;
coef!ne3 float[p&nr_elem];
for (int i!0;i+nr_elem;i22) {
coef[i]!p&coef[i];
for (int 4!0;4+nr_var;422) {gr[i]!ne3 int[p&nr_var];
gr[i][4]!p&gr[i][4];
#
#
#
void poli::init()
{
3indo3((,(3,50,.6);
te7tcolor(8);
clrscr();
int o9;
t)is',"poli(); $$apele% destructorul
cprintf(-:r de variabile:-);cscanf(-;d-,nr_var);/
coef!ne3 float[30];
float c;
int i!'(;
do {
cprintf(-<oeficientul:-);o9!cscanf(-;f-,c);/
if (o9)
if (fabs(c)+eps) cprintf(-<oeficientul fiind 0 nu mai trebuie sa -
-introduceti si gradele&&&0a0n0r-);
9 $=> 9
else { coef[22i]!c;
gr[i]!ne3 int[nr_var];
for (int 4!(;4+!nr_var;422){
cprintf(- =radul variabilei ;d:-,4);
cscanf(-;d-,gr[i][4'(]);/
#
#
#3)ile (o9);
nr_elem!i2(;
#
void poli::af()
{
3indo3((,(3,50,.6);
te7tcolor(8);
clrscr();
if (>nr_elem) {cprintf(-?olinom nul-);return;#
for (int i!0;i+nr_elem;i22)
{
cprintf(-;26&.f -,coef[i]);
for (int 4!0;4+nr_var;422)
if (gr[i][4]>!0)
if (gr[i][4]>!() cprintf(-7;d@;d -,42(,gr[i][4]);
else cprintf(-7;d -,42( );
#
cprintf(-0n0r;d element;c, ;d variabile&&&0n-,nr_elem,nr_elem>!(ABeB:B B,nr_var);
#
void poli::af_t()
{
int nr_c)ar!0;
if (>nr_elem) {cprintf(-?olinom nul-);return;#
for (int i!0;i+nr_elem;i22)
{
nr_c)ar2!cprintf(-;26&.f -,coef[i]);
for (int 4!0;4+nr_var;422)
if (gr[i][4]>!0)
if (gr[i][4]>!() nr_c)ar2!cprintf(-7;d@;d -,42(,gr[i][4]);
else nr_c)ar2!cprintf(-7;d -,42( );
if ((66'nr_c)ar)+nr_var*(0) {cprintf(-&&&-);brea9;#
#
#
int poli::pos(int *p,int dim)
{
for (int i!0;i+nr_elem;i22)
{
int bad!0;
for (int 4!0;4+nr_var;422)
if (4+dim){ if (p[4]>!gr[i][4]) {bad!(;brea9;##
else { if (gr[i][4]) {bad!(;brea9;##
for (4!nr_var;4+dim;422)
if (p[4]) {bad!(;brea9;#
if (>bad) return i;
#
return '(;
#
void poli::add_sub(poli p(,poli p.,int op)
{
float *c;
int *g[30];
int _nr_var; $$nr de variabile va fi dat de valoarea cea mai
$$mare
int _nr_elem,i,4!'(;
if (p(&nr_var,p.&nr_var) _nr_var!p(&nr_var;
else _nr_var!p.&nr_var;
c!ne3 float[30];
if (p(&nr_elem) $$daca p( nu e vid
if (p.&nr_elem) $$daca p. nu e vid
{
9 B=> 9
unsigned c)ar *mr9!ne3 unsigned c)ar [p.&nr_elem]; $$vector de marca4e
memset(mr9,0,p.&nr_elem);
for (i!0;i+p(&nr_elem;i22)
{
int 9!p.&pos(p(&gr[i],p(&nr_var);
if (9>!'()
{
mr9[9]!(;
float re%!p(&coef[i]2p.&coef[9]*op;
if (>(fabs(re%)+eps)){
c[224]!re%;
g[4]!ne3 int[_nr_var];
memset(g[4],0,_nr_var*.);
memcpC(g[4],p(&gr[i],p(&nr_var*.);
#
#
else{
c[224]!p(&coef[i];
g[4]!ne3 int[_nr_var];
memset(g[4],0,_nr_var*.);
memcpC(g[4],p(&gr[i],p(&nr_var*.);
#
#
for (i!0;i+p.&nr_elem;i22)
if (>mr9[i]){
c[224]!p.&coef[i]*op;
g[4]!ne3 int[_nr_var];
memset(g[4],0,_nr_var*.);
memcpC(g[4],p.&gr[i],p.&nr_var*.);
#
#
else { $$p( nu e vid, p. e vid
for (i!0;i+p(&nr_elem;i22)
{
c[224]!p(&coef[i];
g[4]!ne3 int[_nr_var];
memset(g[4],0,_nr_var*.);
memcpC(g[4],p(&gr[i],p(&nr_var*.);
#
#
else
if (p.&nr_elem) $$p( vid,p. nu
{
for (i!0;i+p.&nr_elem;i22)
{
c[224]!p.&coef[i]*op;
g[4]!ne3 int[_nr_var];
memset(g[4],0,_nr_var*.);
memcpC(g[4],p.&gr[i],p.&nr_var*.);
#
#
else { $$p( e vid, p. e vid
delete []c;
#
_nr_elem!42(;
t)is',"poli(); $$distrug obiectul, creand unul nou corect,nu
$$modificandu'l pe cel vec)i
coef!c;
for (i!0;i+_nr_elem;i22) gr[i]!g[i];
nr_elem!_nr_elem;
nr_var!_nr_var;
#
void poli::mul(poli p(,poli p.)
{
float *c;
int *g[30];
int _nr_var,_nr_elem,i,4,9!'(,p,*au7;
if (p(&nr_var,p.&nr_var) _nr_var!p(&nr_var;
else _nr_var!p.&nr_var;
9 :=> 9
c!ne3 float[30];
if (p(&nr_elemp.&nr_elem) $$daca ambii sunt nevi%i
{
au7!ne3 int[_nr_var];
for (i!0;i+p(&nr_elem;i22)
for (4!0;4+p.&nr_elem;422)
{
float re%!p(&coef[i]*p.&coef[4];
memset(au7,0,_nr_var*.);
for (int l!0;l+p(&nr_var;l22) au7[l]2!p(&gr[i][l];
for (l!0;l+p.&nr_var;l22) au7[l]2!p.&gr[4][l];
$$ aici caut sa vad daca a mai e7ista vreun termen cu aceleasi puteri
p!'(;
for (int 9(!0;9(+92(;9(22)
{
int bad!0;
for (int 9.!0;9.+_nr_var;9.22)
if (au7[9.]>!g[9(][9.]) {bad!(;brea9;#
if (>bad) {p!i;brea9;#
#
if (p!!'(){ c[229]!re%;
g[9]!ne3 int[_nr_var];
memset(g[9],0,_nr_var*.);
memcpC(g[9],au7,_nr_var*.);
#
else c[p]2!re%;
#
#
else { delete []c;
#
_nr_elem!92(;
t)is',"poli();
coef!c;
for (i!0;i+_nr_elem;i22) gr[i]!g[i];
nr_elem!_nr_elem;
nr_var!_nr_var;
#
void poli::deriv(int p)
{
float *c;
int *g[30];
int i,9!'(;
c!ne3 float[30];
if (nr_elem) $$daca e nevid
{
for (i!0;i+nr_elem;i22)
{
if (gr[i][p'(])
{ c[229]!coef[i]*gr[i][p'(];
g[9]!ne3 int[nr_var];
memset(g[9],0,nr_var*.);
memcpC(g[9],gr[i],nr_var*.);
g[9][p'(]'!(;
#
#
#
else { delete []c;
#
9 E=> 9
int _nr_var!nr_var;
t)is',"poli();
coef!c;
nr_elem!92(;
for (i!0;i+nr_elem;i22) gr[i]!g[i];
nr_var!_nr_var;
#
void poli::prim(int p)
{
if (nr_elem) $$daca e nevid
for (int i!0;i+nr_elem;i22)
{
coef[i]$!gr[i][p'(]2(;
gr[i][p'(]22;
#
#
main3cpp L programul demonstrativ
*include +stdio&),
*include +conio&),
*include -m(.t.&)-
poli v[(0];
void fi7()
{
te7tcolor(8);
cprintf(-DEF=FGH0n0r-);
te7tcolor(();
cprintf(-(&Hnitiali%are0n0r-);
cprintf(-.&Dfisare0n0r-);
cprintf(-3&Ddunare0n0r-);
cprintf(-I&Jcadere0n0r-);
cprintf(-6&Hnmultire0n0r-);
cprintf(-1&Kerivare0n0r-);
cprintf(-8&?rimitiva0n0r-);
cprintf(-5&Jtergere0n0r-);
cprintf(-L&Kespre0n0r-);
cprintf(-M&Hesire-);
te7tcolor(8);
for (int i!(;i+!(.;i22){goto7C((6,i);putc)ar(BNB);#
goto7C(3I,();
cprintf(-;s-,-&&&Jituatia polinoamelor&&&-);
goto7C((,(.);
for (i!(;i+!8L;i22) putc)ar(BOB);
goto7C((6,(.);putc)ar(BPB);
3indo3((1,.,(5,(.);
te7tcolor(.);
for (i!(;i+!(0;i22) cprintf(-;.d:-,i);
#
void toate()
{
3indo3((L,.,50,(();
te7tcolor(.);
clrscr();
for (int i!(;i+!(0;i22){
goto7C((,i);v[i'(]&af_t();
#
#
void in()
{
3indo3((,(3,50,.6);
clrscr();
9 F=> 9
int p;
cprintf(-Hnitiali%are&&&0n0r-);
cprintf(-Hntroduceti indicele polinomului0n0r-);
scanf(-;d-,p);
v[p'(]&init();
v[p'(]&af();
toate();
#
void afis()
{
3indo3((,(3,50,.6);
clrscr();
int p;
cprintf(-Dfisare&&&0n0r-);
cprintf(-Hntroduceti indicele polinomului0n0r-);
scanf(-;d-,p);
v[p'(]&af();
toate();
#
void ad()
{
3indo3((,(3,50,.6);
clrscr();
int p(,p.,p;
cprintf(-Je aduna ?( cu ?., iar re%ultatul se depune in ?30n0r-);
cprintf(-Hntroduceti cei 3 indici (separati prin J?DGHQ):0n0r-);
scanf(-;d ;d ;d-,p(,p.,p);
v[p'(]&add_sub(v[p('(],v[p.'(],();
v[p'(]&af();
toate();
#
void sc()
{
3indo3((,(3,50,.6);
clrscr();
int p(,p.,p;
cprintf(-Je scade din ?( ?., iar re%ultatul se depune in ?30n0r-);
cprintf(-Hntroduceti cei 3 indici (separati prin J?DGHQ):0n0r-);
scanf(-;d ;d ;d-,p(,p.,p);
v[p'(]&add_sub(v[p('(],v[p.'(],'();
v[p'(]&af();
toate();
#
void inm()
{
3indo3((,(3,50,.6);
clrscr();
int p(,p.,p;
cprintf(-Je inmulteste ?( cu ?., iar re%ultatul se depune in ?30n0r-);
cprintf(-Hntroduceti cei 3 indici (separati prin J?DGHQ):0n0r-);
scanf(-;d ;d ;d-,p(,p.,p);
v[p'(]&mul(v[p('(],v[p.'(]);
v[p'(]&af();
toate();
#
void drv()
{
3indo3((,(3,50,.6);
clrscr();
int p,var;
cprintf(-Kerivare&&&0n0r-);
cprintf(-Hntroduceti indicele polinomului:0n0r-);scanf(-;d-,p);
cprintf(-Hntroduceti indicele variabilei:0n0r-);scanf(-;d-,var);
9 G=> 9
v[p'(]&deriv(var);
v[p'(]&af();
toate();
#
void prm()
{
3indo3((,(3,50,.6);
clrscr();
int p,var;
cprintf(-?rimitiva&&&0n0r-);
cprintf(-Hntroduceti indicele polinomului:0n0r-);scanf(-;d-,p);
cprintf(-Hntroduceti indicele variabilei:0n0r-);scanf(-;d-,var);
v[p'(]&prim(var);
v[p'(]&af();
toate();
#
void st()
{
3indo3((,(3,50,.6);
clrscr();
int p;
cprintf(-Jtergere&&&0n0r-);
cprintf(-Hntroduceti indicele polinomului:0n0r-);scanf(-;d-,p);
v[p'(]&"poli();
toate();
#
void about()
{
3indo3((,(3,50,.6);
clrscr();
cprintf(-Rusaloiu'Flefteri Saluca0n0r-);
cprintf(-3(. <T0n0r-);
cprintf(-miercuri .8&0(&(LLL0n0r-);
#
void operatii()
{
3indo3((,(3,50,.6);
c)ar c!getc)();
toate();
te7tcolor(8);
3)ile (c>!BMB){
s3itc) (c){
case B(B:in();brea9;
case B.B:afis();brea9;
case B3B:ad();brea9;
case BIB:sc();brea9;
case B6B:inm();brea9;
case B1B:drv();brea9;
case B8B:prm();brea9;
case B5B:st();brea9;
case BLB:about();brea9;
#
c!getc)();
#
#
void main(void)
{
clrscr();
fi7();
operatii();
#
9 >=> 9

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