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 următoarele date:

Int nr_var

Numărul de nedeterminate ale polinomului

Int nr_elem

Numărul de elemente
Nu se citeşte, ci este iniţializat în funcţie de elementele introduse

Float *coef

Coeficienţii polinomului (nu exista coeficienţi de valoare 0 ·)

Int *gr[30]

Vector de pointeri spre întregi reprezentând pentru fiecare coeficient puterile corespunzătoare fiecărei 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 permisă modificarea lor decât prin funcţiile clasei. Tot privată este şi funcţia ‘pos’ pentru că nu trebuie să fie vizibilă din exterior.

Operaţiile efectuate asupra polinoamelor:

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:

 

 

 

 

 

Observaţie:
Datele se consideră introduse corect.


Sursa programului:

M12t2.h

class poli{   private:int nr_var;        //nr de variabile
int nr_elem;       //nr de elemente
float *coef;       //coeficientii polinomului
int *gr[30];       //gradele corespunzatoare
private:int pos(int *,int);//caut un anumit termen si returnez pozitia
//dupa conventia clasica (0..n daca a fost
//gasit, sau -1 daca nu)
public:poli();                 //constructor
void init();            //citire de la tastatura
void af();              //afisare
void af_t();         //afisare trunchiata
void add_sub(poli&,poli&,int op);  //op=1 adunare, op=-1 scadere
void mul(poli&,poli&);  //inmultire
void deriv(int);        //derivare in raport cu o variabila
void prim(int);         //calculeaza o primitiva in raport cu o
//variabila

          void operator=(poli&);  //fac atribuire
~poli();                //destructor
};

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{ coef=0; nr_var=0;nr_elem=0;
memset(gr,0,sizeof(gr));
}

poli::~poli()
{
delete []coef;
for (int i=0;i<nr_elem;i++) delete[]gr[i];
nr_elem=0;
nr_var=0;
}

void poli::operator=(poli &p)
{
if (coef==p.coef) return;
this->~poli(); //il fac nul
nr_var=p.nr_var;
nr_elem=p.nr_elem;
coef=new float[p.nr_elem];
for (int i=0;i<nr_elem;i++) {
coef[i]=p.coef[i];
for (int j=0;j<nr_var;j++) {gr[i]=new int[p.nr_var];
gr[i][j]=p.gr[i][j];
}
}
}

void poli::init()
{
window(1,13,80,25);
textcolor(7);
clrscr();

 int ok;
this->~poli(); //apelez destructorul
cprintf("Nr de variabile:");cscanf("%d",&nr_var);X
coef=new float[30];
float c;
int i=-1;
do {
cprintf("Coeficientul:");ok=cscanf("%f",&c);X
if (ok)
if (fabs(c)<eps) cprintf("Coeficientul fiind 0 nu mai trebuie sa "
"introduceti si gradele...\a\n\r");
else { coef[++i]=c;
gr[i]=new int[nr_var];
for (int j=1;j<=nr_var;j++){
cprintf(" Gradul variabilei %d:",j);
cscanf("%d",&gr[i][j-1]);X
}
}
}while (ok);
nr_elem=i+1;
}

void poli::af()
{
window(1,13,80,25);
textcolor(7);
clrscr();
if (!nr_elem) {cprintf("Polinom nul");return;}
for (int i=0;i<nr_elem;i++)
{
cprintf("%+5.2f ",coef[i]);
for (int j=0;j<nr_var;j++)
if (gr[i][j]!=0)
if (gr[i][j]!=1) cprintf("x%d^%d ",j+1,gr[i][j]);
else cprintf("x%d ",j+1 );
}
cprintf("\n\r%d element%c, %d variabile...\n",nr_elem,nr_elem!=1?'e':' ',nr_var);
}

void poli::af_t()
{
int nr_char=0;
if (!nr_elem) {cprintf("Polinom nul");return;}
for (int i=0;i<nr_elem;i++)
{
nr_char+=cprintf("%+5.2f ",coef[i]);
for (int j=0;j<nr_var;j++)
if (gr[i][j]!=0)
if (gr[i][j]!=1) nr_char+=cprintf("x%d^%d ",j+1,gr[i][j]);
else nr_char+=cprintf("x%d ",j+1 );
if ((55-nr_char)<nr_var*10) {cprintf("...");break;}
}
}

int poli::pos(int *p,int dim)
{
for (int i=0;i<nr_elem;i++)
{
int bad=0;
for (int j=0;j<nr_var;j++)
if (j<dim){ if (p[j]!=gr[i][j]) {bad=1;break;}}
else { if (gr[i][j]) {bad=1;break;}}
for (j=nr_var;j<dim;j++)
if (p[j]) {bad=1;break;}

  if (!bad) return i;
}
return -1;
}

void poli::add_sub(poli &p1,poli &p2,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,j=-1;
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) //daca p1 nu e vid
if (p2.nr_elem) //daca p2 nu e vid
{
unsigned char *mrk=new unsigned char [p2.nr_elem]; //vector de marcaje
memset(mrk,0,p2.nr_elem);
for (i=0;i<p1.nr_elem;i++)
{
int k=p2.pos(p1.gr[i],p1.nr_var);
if (k!=-1)
{
mrk[k]=1;
float rez=p1.coef[i]+p2.coef[k]*op;
if (!(fabs(rez)<eps)){
c[++j]=rez;
g[j]=new int[_nr_var];
memset(g[j],0,_nr_var*2);
memcpy(g[j],p1.gr[i],p1.nr_var*2);
}
}
else{
c[++j]=p1.coef[i];
g[j]=new int[_nr_var];
memset(g[j],0,_nr_var*2);
memcpy(g[j],p1.gr[i],p1.nr_var*2);
}
}
for (i=0;i<p2.nr_elem;i++)
if (!mrk[i]){
c[++j]=p2.coef[i]*op;
g[j]=new int[_nr_var];
memset(g[j],0,_nr_var*2);
memcpy(g[j],p2.gr[i],p2.nr_var*2);
}
}
else { //p1 nu e vid, p2 e vid
for (i=0;i<p1.nr_elem;i++)
{
c[++j]=p1.coef[i];
g[j]=new int[_nr_var];
memset(g[j],0,_nr_var*2);
memcpy(g[j],p1.gr[i],p1.nr_var*2);
}
}
else
if (p2.nr_elem) //p1 vid,p2 nu
{
for (i=0;i<p2.nr_elem;i++)
{
c[++j]=p2.coef[i]*op;
g[j]=new int[_nr_var];
memset(g[j],0,_nr_var*2);
memcpy(g[j],p2.gr[i],p2.nr_var*2);
}
}

  else { //p1 e vid, p2 e vid
delete []c;
}

 _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]) {bad=1;break;}
if (!bad) {p=i;break;}
}

   if (p==-1){ c[++k]=rez;
g[k]=new int[_nr_var];
memset(g[k],0,_nr_var*2);
memcpy(g[k],aux,_nr_var*2);
}
else c[p]+=rez;
}
}
else { delete []c;
}

 _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)
{

 float *c;
int *g[30];
int i,k=-1;

 c=new float[30];

 if (nr_elem) //daca e nevid
{
for (i=0;i<nr_elem;i++)
{
if (gr[i][p-1])
{ c[++k]=coef[i]*gr[i][p-1];
g[k]=new int[nr_var];
memset(g[k],0,nr_var*2);
memcpy(g[k],gr[i],nr_var*2);
g[k][p-1]-=1;
}
}
}
else { delete []c;
}

 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)
{
if (nr_elem) //daca e nevid
for (int i=0;i<nr_elem;i++)
{
coef[i]/=gr[i][p-1]+1;
gr[i][p-1]++;
}
}

main.cpp – programul demonstrativ

#include <stdio.h>
#include <conio.h>
#include "m12t2.h"

poli v[10];

void fix()
{
textcolor(7);
cprintf("ALEGETI\n\r");
textcolor(1);
cprintf("1.Initializare\n\r");
cprintf("2.Afisare\n\r");
cprintf("3.Adunare\n\r");
cprintf("4.Scadere\n\r");
cprintf("5.Inmultire\n\r");
cprintf("6.Derivare\n\r");
cprintf("7.Primitiva\n\r");
cprintf("8.Stergere\n\r");
cprintf("9.Despre\n\r");
cprintf("Q.Iesire");
textcolor(7);
for (int i=1;i<=12;i++){gotoxy(15,i);putchar('ł');}

 gotoxy(34,1);
cprintf("%s","...Situatia polinoamelor...");

 gotoxy(1,12);
for (i=1;i<=79;i++) putchar('Ä');
gotoxy(15,12);putchar('Á');

 window(16,2,18,12);
textcolor(2);
for (i=1;i<=10;i++) cprintf("%2d:",i);
}

void toate()
{
window(19,2,80,11);
textcolor(2);
clrscr();
for (int i=1;i<=10;i++){
gotoxy(1,i);v[i-1].af_t();
}
}

void in()
{
window(1,13,80,25);
clrscr();

 int p;
cprintf("Initializare...\n\r");
cprintf("Introduceti indicele polinomului\n\r");
scanf("%d",&p);
v[p-1].init();
v[p-1].af();
toate();
}

void afis()
{
window(1,13,80,25);
clrscr();

 int p;
cprintf("Afisare...\n\r");
cprintf("Introduceti indicele polinomului\n\r");
scanf("%d",&p);
v[p-1].af();
toate();
}

void ad()
{
window(1,13,80,25);
clrscr();

 int p1,p2,p;
cprintf("Se aduna P1 cu P2, iar rezultatul se depune in P3\n\r");
cprintf("Introduceti cei 3 indici (separati prin SPATIU):\n\r");
scanf("%d %d %d",&p1,&p2,&p);
v[p-1].add_sub(v[p1-1],v[p2-1],1);
v[p-1].af();
toate();
}

void sc()
{
window(1,13,80,25);
clrscr();

 int p1,p2,p;
cprintf("Se scade din P1 P2, iar rezultatul se depune in P3\n\r");
cprintf("Introduceti cei 3 indici (separati prin SPATIU):\n\r");
scanf("%d %d %d",&p1,&p2,&p);
v[p-1].add_sub(v[p1-1],v[p2-1],-1);
v[p-1].af();
toate();
}

void inm()
{
window(1,13,80,25);
clrscr();

 int p1,p2,p;
cprintf("Se inmulteste P1 cu P2, iar rezultatul se depune in P3\n\r");
cprintf("Introduceti cei 3 indici (separati prin SPATIU):\n\r");
scanf("%d %d %d",&p1,&p2,&p);
v[p-1].mul(v[p1-1],v[p2-1]);
v[p-1].af();
toate();
}

 

void drv()
{
window(1,13,80,25);
clrscr();

 int p,var;
cprintf("Derivare...\n\r");
cprintf("Introduceti indicele polinomului:\n\r");scanf("%d",&p);
cprintf("Introduceti indicele variabilei:\n\r");scanf("%d",&var);
v[p-1].deriv(var);
v[p-1].af();
toate();
}

void prm()
{
window(1,13,80,25);
clrscr();

 int p,var;
cprintf("Primitiva...\n\r");
cprintf("Introduceti indicele polinomului:\n\r");scanf("%d",&p);
cprintf("Introduceti indicele variabilei:\n\r");scanf("%d",&var);
v[p-1].prim(var);
v[p-1].af();
toate();
}

void st()
{
window(1,13,80,25);
clrscr();

 int p;
cprintf("Stergere...\n\r");
cprintf("Introduceti indicele polinomului:\n\r");scanf("%d",&p);
v[p-1].~poli();
toate();
}

void about()
{
window(1,13,80,25);
clrscr();

 cprintf("Musaloiu-Elefteri Raluca\n\r");
cprintf("312 CB\n\r");
cprintf("miercuri 27.01.1999\n\r");
}

 

void operatii()
{
window(1,13,80,25);
char c=getch();
toate();
textcolor(7);
while (c!='Q'){
switch (c){
case '1':in();break;
case '2':afis();break;
case '3':ad();break;
case '4':sc();break;
case '5':inm();break;
case '6':drv();break;
case '7':prm();break;
case '8':st();break;
case '9':about();break;
}
c=getch();
}
}

void main(void)
{
clrscr();
fix();
operatii();
}

Cele mai ok referate!
www.referateok.ro