tad Polinomios poo

Maria GE
25 de Abril del 2004
Tengo q implementar el tad polinomios en free pascal (q se parece mucho al delphi)orientado a objetos me pregunto si algien podria ayudarme, mas o menos lo he construido pero me da errores de ejecucion. Gracias.

//{$APPTYPE GUI}
{$MODE DELPHI}
program polinomio;

//interface
type
ptpolinomio=^polinom;
telemento=class
private
coefic:real;
exponen:integer;
public
constructor create(c:real;e:integer);
end;
polinom=record
info:telemento;
sig:ptpolinomio;
end;
tpolinomio=class
private
ident:string;
p:ptpolinomio;
public
constructor create(id:string);//override;
constructor create(pol:tpolinomio);//override;
function existePoli(id:string):boolean;
procedure escribePoli(var poli:string);
procedure simplificaPoli;
procedure insertaOrden(term:telemento);
procedure InsertaMonomio(c:integer;e:integer);
function BorraMonomio(c:integer;e:integer):boolean;
function EvaluaPoli(v:real):real;
end;
{
//procedure insertaOrden(var p:tpolinomio;term:elemento);
//procedure simplificaPoli(p:tpolinomio);
//procedure escribePoli(p:tpolinomio);
procedure pidePoli(var p:tpolinomio);
procedure sumaPoli(p1,p2:tpolinomio;var suma:tpolinomio);
procedure simplificaPoli(p:tpolinomio);
//procedure insertaOrden(var p:tpolinomio;term:telemento);
procedure restaPoli(p1,p2:tpolinomio;var resta:tpolinomio);
function potencia(base:real;exp:integer):real;
function EvaluaPoli(p:tpolinomio;v:real):real;
procedure MultiPoli(p1,p2:tpolinomio;var mul:tpolinomio);
//procedure InsertaMonomio(var p:tpolinomio;c:integer;e:integer);
//function BorraMonomio(var p:tpolinomio;c:integer;e:integer):boolean;
procedure copiaPoli(p:tpolinomio;var nuevo:tpolinomio);
procedure DividePoli(divid,divis:tpolinomio;var cociente,resto:tpolinomio);
procedure derivaPoli(p:tpolinomio;var deri:tpolinomio);
//procedure CreaPolinomio(var p:tpolinomio);
implementation}

var
p1,p2,p3,p4:tpolinomio;
val:string;



function potencia(base:real;exp:integer):real;
begin
if (exp=0)
then potencia:=1
else if (exp>0)
then potencia:=base*potencia(base,exp-1)
else if (exp<0)
then potencia:=1/base+potencia(base,exp+1);
end;

constructor telemento.create(c:real;e:integer);
begin
writeln('Creando');
inherited Create;

writeln('Creando');

coefic:=c;
exponen:=e;
writeln('Creando');

end;

constructor tpolinomio.create(id:string);//override;
begin
inherited Create;

ident:=id;
p:=nil;
end;

function tpolinomio.existePoli(id:string):boolean;
begin
existePoli:=(id=ident);
end;

procedure tpolinomio.escribePoli(var poli:string);
var vc,ve:string;
begin
poli:='';
if (p<>nil)
then
begin
str(p^.info.coefic,vc);
str(p^.info.exponen,ve);
if (p^.info.exponen<>0)
then poli:=poli+vc+'*X**'+ve
else poli:=poli+vc;
p:=p^.sig;
end;
while(p<>nil) do
begin
str(p^.info.coefic,vc);
str(p^.info.exponen,ve);
if (p^.info.coefic>0)
then if (p^.info.exponen<>0)
then poli:=poli+'+'+vc+'*X**'+ve
else poli:=poli+'+'+vc;
p:=p^.sig;
end;
end;

procedure tpolinomio.simplificaPoli;
var ant:ptpolinomio;
begin
if (p<>nil)
then
begin
ant:=p;
p:=p^.sig;
while (p<>nil) do
begin
if (ant^.info.exponen=p^.info.exponen)
then
begin
ant^.info.coefic:=ant^.info.coefic+p^.info.coefic;
ant^.sig:=p^.sig;
dispose(p);
p:=ant^.sig;
end
else
begin
ant:=p;
p:=p^.sig;
end;
end;
end;
end;

constructor tpolinomio.create(pol:tpolinomio);//override;
begin
inherited create;

p:=pol.p;
end;

procedure tpolinomio.insertaOrden(term:telemento);
var
encontrado:boolean;
nuevo,aux,anterior:ptpolinomio;
begin
writeln('Entroooooooooooooooooo');
new(nuevo);writeln('Paso?');
nuevo^.info.create(term.coefic,term.exponen); writeln('Si');
aux:=p; writeln('Si',aux=nil,p=nil,p^.info.exponen);
encontrado:=false;
while ((aux<>nil) and (not encontrado)) do
begin
write('Si');
writeln(aux^.info.exponen);
writeln(term.exponen);
if (aux^.info.exponen>term.exponen)
then
begin writeln('No');
anterior:=aux;
aux:=aux^.sig;
end
else encontrado:=true;
end;
if(aux=p)
then
begin
nuevo^.sig:=p;
p:=nuevo;
end
else
begin
nuevo^.sig:=aux;
anterior^.sig:=nuevo;
end;
simplificaPoli;
end;

procedure tpolinomio.InsertaMonomio(c:integer;e:integer);
var
term:telemento;
begin
term.coefic:=c;
term.exponen:=e;
InsertaOrden(term);
end;

function tpolinomio.BorraMonomio(c:integer;e:integer):boolean;
var
esta:boolean;
aux:ptpolinomio;
resta:ptpolinomio;
term:telemento;
begin
esta:=false;
aux:=p;
term.coefic:=-c;
term.exponen:=e;
while ((aux<>nil) and (not esta)) do
begin
if ((aux^.info.coefic=-term.coefic) and (aux^.info.exponen=term.exponen))
then begin insertaOrden(term); p:=resta; esta:=true; end;
aux:=aux^.sig;
end;
BorraMonomio:=esta;
end;

function tpolinomio.EvaluaPoli(v:real):real;
var ev:real;
begin
ev:=0;
while(p<>nil) do
begin
ev:=ev+p^.info.coefic*potencia(v,p^.info.exponen);
writeln('Evaluacion: ',ev,' ',p^.info.coefic,'*',potencia(v,p^.info.exponen),' ',v,' ',p^.info.exponen);
p:=p^.sig;
end;
EvaluaPoli:=ev;
end;
{procedure simplificaPoli(p:tpolinomio);
var ant:tpolinomio;
begin
if (p<>nil)
then
begin
ant:=p;
p:=p^.sig;
while (p<>nil) do
begin
if (ant^.info.exponen=p^.info.exponen)
then
begin
ant^.info.coefic:=ant^.info.coefic+p^.info.coefic;
ant^.sig:=p^.sig;
dispose(p);
p:=ant^.sig;
end
else
begin
ant:=p;
p:=p^.sig;
end;
end;
end;
end;}

{procedure insertaOrden(var p:tpolinomio;term:telemento);
var
encontrado:boolean;
nuevo,aux,anterior:tpolinomio;
begin
new(nuevo);
nuevo^.info:=term;
aux:=p;
encontrado:=false;
while ((aux<>nil) and (not encontrado)) do
if (aux^.info.exponen>term.exponen)
then
begin
anterior:=aux;
aux:=aux^.sig;
end
else encontrado:=true;
if(aux=p)
then
begin
nuevo^.sig:=p;
p:=nuevo;
end
else
begin
nuevo^.sig:=aux;
anterior^.sig:=nuevo;
end;
simplificaPoli(p);
end;
}

{procedure escribePoli(p:tpolinomio);
begin
if (p<>nil)
then
begin
if (p^.info.exponen<>0)
then write(p^.info.coefic:2,'*X**',p^.info.exponen:2)
else write(p^.info.coefic:2);
p:=p^.sig;
end;
while(p<>nil) do
begin
if (p^.info.coefic>0)
then if (p^.info.exponen<>0)
then write('+',p^.info.coefic:2,'*X**',p^.info.exponen:2)
else write('+',p^.info.coefic:2);
p:=p^.sig;
end;
end;}

procedure pidePoli(var pol:tpolinomio);
var
coef:real;
exp:integer;
termino:telemento;
begin
//pol.create('Nombre');
write('Introduzca el coeficiente del primer termino (0 para terminar):');
readln(coef);
while (coef<>0) do
begin
write('Introduzca el exponente: ');
readln(exp);
writeln('Crear');
//termino.coefic:=coef;
//termino.exponen:=exp;
termino.create(coef,exp);
writeln('Creado');
pol.insertaOrden(termino);
write('Introduzca el coeficiente del siguiente termino (0 para terminar): ');
readln(exp);
end;
pol.simplificaPoli;
end;

procedure sumaPoli(pol1,pol2:tpolinomio;var suma:tpolinomio);
var
term:telemento;
p1,p2:ptpolinomio;
begin
p1:=pol1.p;
p2:=pol2.p;
suma:=nil;
while ((p1<>nil) and (p2<>nil)) do
begin
if (p1^.info.exponen>p2^.info.exponen)
then
begin
suma.insertaOrden(p1^.info);
p1:=p1^.sig;
end
else if (p1^.info.exponen<p2^.info.exponen)
then
begin
suma.insertaOrden(p1^.info);
p2:=p2^.sig;
end
else
begin
term.exponen:=p1^.info.exponen;
term.coefic:=p1^.info.coefic+p2^.info.coefic;
suma.insertaOrden(term);
p1:=p1^.sig;
p2:=p2^.sig;
end;
end;
while(p1<>nil) do
begin
suma.insertaOrden(p1^.info);
p1:=p1^.sig;
end;
while(p2<>nil) do
begin
suma.insertaOrden(p2^.info);
p2:=p2^.sig;
end;
end;

procedure restaPoli(pol1,pol2:tpolinomio;var resta:tpolinomio);
var
term:telemento;
p1,p2:ptpolinomio;
begin
p1:=pol1.p;
p2:=pol2.p;
resta:=nil;
while ((p1<>nil) and (p2<>nil)) do
begin
if (p1^.info.exponen>p2^.info.exponen)
then
begin
resta.insertaOrden(p1^.info);
p1:=p1^.sig;
end
else if (p1^.info.exponen<p2^.info.exponen) then
begin
term.exponen:=p2^.info.exponen;
term.coefic:=-p2^.info.coefic;
resta.insertaOrden(term);
p2:=p2^.sig;
end
else
begin
term.exponen:=p1^.info.exponen;
term.coefic:=p1^.info.coefic-p2^.info.coefic;
resta.insertaOrden(term);
p1:=p1^.sig;
p2:=p2^.sig;
end;
end;
while(p1<>nil) do
begin
resta.insertaOrden(p1^.info);
p1:=p1^.sig;
end;
while(p2<>nil) do
begin
term.exponen:=p2^.info.exponen;
term.coefic:=-p2^.info.coefic;
resta.insertaOrden(term);
p2:=p2^.sig;
end;
end;

{function EvaluaPoli(p:tpolinomio;v:real):real;
var ev:real;
begin
ev:=0;
while(p<>nil) do
begin
ev:=ev+p^.info.coefic*potencia(v,p^.info.exponen);
writeln('Evaluacion: ',ev,' ',p^.info.coefic,'*',potencia(v,p^.info.exponen),' ',v,' ',p^.info.exponen);
p:=p^.sig;
end;
EvaluaPoli:=ev;
end;}

procedure MultiPoli(pol1,pol2:tpolinomio;var mul:tpolinomio);
var
p1,p2,aux:ptpolinomio;
term:telemento;
begin
p1:=pol1.p;
p2:=pol2.p;
mul:=nil;
while(p1<>nil) do
begin
aux:=p2;
while(aux<>nil) do
begin
term.exponen:=p1^.info.exponen+aux^.info.exponen;
term.coefic:=p1^.info.coefic*aux^.info.coefic;
mul.insertaOrden(term);
aux:=aux^.sig;
end;
p1:=p1^.sig;
end
end;
{
procedure InsertaMonomio(var p:tpolinomio;c:integer;e:integer);
var
term:telemento;
begin
term.coefic:=c;
term.exponen:=e;
InsertaOrden(p,term);
end;

function BorraMonomio(var p:tpolinomio;c:integer;e:integer):boolean;
var
esta:boolean;
nuevo,aux:tpolinomio;
resta:tpolinomio;
term:telemento;
begin
esta:=false;
nuevo:=nil;
aux:=p;
term.coefic:=c;
term.exponen:=e;
insertaOrden(nuevo,term);
while ((aux<>nil) and (not esta)) do
begin
if ((aux^.info.coefic=term.coefic) and (aux^.info.exponen=term.exponen))
then begin restaPoli(p,nuevo,resta); p:=resta; esta:=true; end;
aux:=aux^.sig;
end;
BorraMonomio:=esta;
end;}

procedure copiaPoli(p:ptpolinomio;var nuevo:tpolinomio);
var term:telemento;
begin
nuevo.p:=nil;
while(p<>nil) do
begin
term:=p^.info;
nuevo.insertaOrden(term);
p:=p^.sig;
end;
end;

procedure DividePoli(pdivid,pdivis:tpolinomio;var pcociente,presto:tpolinomio);
var
divid,divis,resto:ptpolinomio;
aux,r:tpolinomio;
term:telemento;
valor:string;
begin
divid:=pdivid.p;
divis:=pdivis.p;
resto:=presto.p;
copiaPoli(divid,presto);
while ((resto<>nil)and(resto^.info.exponen>=divis^.info.exponen))do
begin
term.coefic:=resto^.info.coefic/divis^.info.coefic;
term.exponen:=resto^.info.exponen-divis^.info.exponen;
pcociente.insertaOrden(term);
pcociente.simplificaPoli;
multiPoli(pcociente,pdivis,aux);
restaPoli(presto,aux,r);
presto:=r;
presto.simplificapoli;
writeln('Resto');
presto.escribepoli(valor);
writeln;
writeln('Cociente');
pcociente.escribepoli(valor);
writeln;
end;
end;
{var
aux,aux1,coc,divid:tpolinomio;
term:telemento;
begin
divid:=nil;
coc:=nil;
aux1:=p1;
divis:=p2;
while ((aux1<>nil) and (aux1^.info.exponen>=divis^.info.exponen)) do
begin
divid:=aux1;
term.coefic:=aux1^.info.coefic/divis^.info.coefic;
term.exponen:=aux1^.info.exponen-divis^.info.exponen;
insertaorden(coc,term);
writeln('cociente: ');
escribepoli(coc);
writeln;
MultiPoli(coc,divis,aux);
writeln('MULTIPLICA: ');
escribepoli(aux);
writeln;
restaPoli(divid,aux,aux1);
end;
}

procedure derivaPoli(pol:tpolinomio;var deri:tpolinomio);
var
term:telemento;
p:ptpolinomio;
begin
p:=pol.p;
deri:=nil;
while(p<>nil) do
begin
writeln('Exponente: ',p^.info.exponen);
if (p^.info.exponen<>0)
then
begin
term.coefic:=p^.info.coefic*p^.info.exponen;
term.exponen:=p^.info.exponen-1;
writeln('coef: ',p^.info.coefic,'*',p^.info.exponen,' ',term.coefic,' Exponen: ',term.exponen);
deri.insertaOrden(term);
end;
p:=p^.sig;
end;
end;

procedure CreaPolinomio(var p:tpolinomio);
begin
p.create('nombre');
end;

begin
writeln('Dentro:');
CreaPolinomio(p1);
writeln('Me cago en:');
CreaPolinomio(p2);
CreaPolinomio(p3);
CreaPolinomio(p4);
writeln('LLego?');
pidepoli(p1);
writeln('Si');
pidepoli(p2);
writeln('no');
writeln('p1: ');
p1.escribepoli(val);writeln(val);
writeln;
writeln('Evaluar punto 1 ',p1.evaluapoli(1));
writeln('borrado: ');
//borraMonomio(p1,1,1);
p1.escribepoli(val);writeln(val);
writeln;
writeln('P2: ');
p2.escribepoli(val);writeln(val);
writeln;
sumapoli(p1,p2,p3);
writeln('SUMA: ');
p3.escribepoli(val);writeln(val);
writeln;
restapoli(p1,p2,p3);
writeln('RESTA: ');
p3.escribepoli(val);writeln(val);
writeln;
multipoli(p1,p2,p3);
writeln('MULTIPLICA: ');
p3.escribepoli(val); writeln(val);
writeln;
derivapoli(p1,p3);
writeln('Derivada: ');
p3.escribepoli(val); writeln(val);
writeln;
writeln('Dividir:');
dividepoli(p1,p2,p3,p4);
writeln('Divisor: ');
p3.escribepoli(val); writeln(val);
writeln;
writeln('Resto: ');
p4.escribepoli(val); writeln(val);
writeln;
end.