Опытный
 
Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина
Репутация: нет Всего: нет
|
Почему то не высчитывает производную, первую и вторую. Помогите пожалуйста! Добавлено через 2 минуты и 14 секунд| Код | unit Unit9;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type PTElement=^TElement; PPlus=^Plus; PMinus=^Minus; PMult=^Mult; PDivide=^Divide; PReal=^Real; PVariable=^Variable;
TElement=object protected left,right:PTElement; constructor Create(l,r:PTElement); public destructor Erase; function rezult:double; virtual; function copy:PTElement; virtual; function differ:PTElement; virtuaL; procedure set_var(float:double); virtual; end;
Real=object(TElement) private f:double; public constructor Create(float:double); function rezult:double; virtual; function copy:PTElement; virtual; function differ:PTElement; virtual; end;
Variable=object(TElement) private f:double; public constructor Create(float:double); function rezult:double; virtual; function copy:PTElement; virtual; function differ:PTElement; virtual; procedure set_var(float:double); virtual; end;
Plus=object(TElement) public constructor Create(l,r:PTElement); function rezult:double; virtual; function copy:PTElement; virtual; function differ:PTElement; virtual; end;
Minus=object(TElement) public constructor Create(l,r:PTElement); function rezult:double; virtual; function copy:PTElement; virtual; function differ:PTElement; virtual; end;
Mult=object(TElement) public constructor Create(l,r:PTElement); function rezult:double; virtual; function copy:PTElement; virtual; function differ:PTElement; virtual; end;
Divide=object(TElement) public constructor Create(l,r:PTElement); function rezult:double; virtual; function copy:PTElement; virtual; function differ:PTElement; virtual; end; TForm1 = class(TForm) GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; Button1: TButton; Button2: TButton; ComboBox1: TComboBox; Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Label2: TLabel; Label3: TLabel; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; procedure Button1Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
constructor TElement.Create(l,r:PTElement); begin left:=l; right:=r; end; destructor TElement.Erase; begin Dispose(left); Dispose(right); end; function Telement.rezult:double; begin end; function TElement.copy:PTElement; begin copy:=nil; end; function TElement.differ:PTElement; begin differ:=nil; end; procedure TElement.set_var(float:double); begin if left<>nil then left^.set_var(float); if right<>nil then right^.set_var(float); end;
constructor Real.Create(float:double); begin inherited Create(nil,nil); f:=float; end; function Real.rezult:double; begin rezult:=f; end; function Real.copy:PTElement; var PtrReal:PReal; begin New(PtrReal,Create(f)); copy:=PtrReal; end; function Real.differ:PTElement; var PtrReal:PReal; begin New(PtrReal,Create(0)); differ:=PtrReal; end;
constructor Variable.Create(float:double); begin inherited Create(nil,nil); f:=float; end; function Variable.rezult:double; begin rezult:=f; end; function Variable.copy:PTElement; var PtrVariable:PVariable; begin New(PtrVariable,Create(f)); copy:=PtrVariable; end; function Variable.differ:PTElement; var PtrVariable:PReal; begin New(PtrVariable,Create(1.0)); differ:=PtrVariable; end; procedure Variable.set_var(float:double); begin f:=float; end;
constructor Plus.Create(l,r:PTElement); begin inherited Create(l,r); end; function Plus.rezult:double; begin rezult:=left^.rezult+right^.rezult; end; function Plus.copy:PTElement; var PtrPlus:PPlus; begin New(PtrPlus,Create(left^.copy,right^.copy)); copy:=PtrPlus; end; function Plus.differ:PTElement; var PtrPlus:PPlus; begin New(PtrPlus,Create(left^.differ,right^.differ)); differ:=PtrPlus; end;
constructor Minus.Create(l,r:PTElement); begin inherited Create(l,r); end; function Minus.rezult:double; begin rezult:=left^.rezult-right^.rezult; end; function Minus.copy:PTElement; var PtrMinus:PMinus; begin New(PtrMinus,Create(left^.copy,right^.copy)); copy:=PtrMinus; end; function Minus.differ:PTElement; var PtrMinus:PMinus; begin New(PtrMinus,Create(left^.differ,right^.differ)); differ:=PtrMinus; end;
constructor Mult.Create(l,r:PTElement); begin inherited Create(l,r); end; function Mult.rezult:double; begin rezult:=left^.rezult*right^.rezult; end; function Mult.copy:PTElement; var PtrMult:PMult; begin New(PtrMult,Create(left^.copy,right^.copy)); copy:=PtrMult; end; function Mult.differ:PTElement; var PtrMult1,PtrMult2:PMult; PtrPlus:PPlus; begin New(PtrMult1,Create(left^.differ,right^.differ)); New(PtrMult2,Create(left^.copy,right^.copy)); New(PtrPlus,Create(PtrMult1,PtrMult2)); differ:=PtrPlus; end;
constructor Divide.Create(l,r:PTElement); begin inherited Create(l,r); end; function Divide.rezult:double; begin rezult:=left^.rezult/right^.rezult; end; function Divide.copy:PTElement; var PtrDivide:PDivide; begin New(PtrDivide,Create(left^.copy,right^.copy)); copy:=PtrDivide; end; function Divide.differ:PTElement; var PtrMult1,PtrMult2,PtrMult3:PMult; PtrMinus:PMinus; PtrDivide:PDivide; begin New(PtrMult1,Create(left^.differ,right^.differ)); New(PtrMult2,Create(left^.copy,right^.copy)); New(PtrMult3,Create(left^.copy,right^.copy)); New(PtrMinus,Create(PtrMult1,PtrMult2)); New(PtrDivide,Create(PtrMinus,PtrMult3)); differ:=PtrDivide; end;
function PosFromEnd(sub,s:string):integer; var i,l:integer; p:string; begin l:=Length(s); SetLength(p,l); for i:=1 to l do p[l-i+1]:=s[i]; if Pos(sub,p)>0 then PosFromEnd:=l-Pos(sub,p)+1 else PosFromEnd:=0; end;
function form(s:string):PTElement; var PtrPlus:PPlus; PtrMinus:PMinus; PtrMult:PMult; PtrDivide:PDivide; PtrReal:PReal; PtrVariable:PVariable; p,l:integer; s1,s2:string; begin l:=Length(s); if PosFromEnd('+',s)>1 then begin p:=PosFromEnd('+',s); s1:=Copy(s,1,p-1); s2:=Copy(s,p+1,l-p); New(PtrPlus,Create(form(s1),form(s2))); form:=PtrPlus; end else if PosFromEnd('-',s)>1 then begin p:=PosFromEnd('-',s); s1:=Copy(s,1,p-1); s2:=Copy(s,p+1,l-p); New(PtrMinus,Create(form(s1),form(s2))); form:=PtrMinus; end else if PosFromEnd('*',s)>1 then begin p:=PosFromEnd('*',s); s1:=Copy(s,1,p-1); s2:=Copy(s,p+1,l-p); New(PtrMult,Create(form(s1),form(s2))); form:=PtrMult; end else if PosFromEnd('/',s)>1 then begin p:=PosFromEnd('/',s); s1:=Copy(s,1,p-1); s2:=Copy(s,p+1,l-p); New(PtrDivide,Create(form(s1),form(s2))); form:=PtrDivide; end else if s='x' then begin New(PtrVariable,Create(0)); form:=PtrVariable; end else begin New(PtrReal,Create(StrToFloat(s))); form:=PtrReal; end; end; {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var dec:integer; x,f,f1,f2,f3:PTElement; float:double; begin dec:=StrToInt(ComboBox1.Text); x:=form(Edit1.Text); f:=form(Edit2.Text); f1:=f^.differ; f2:=f1^.differ;
float:=x^.rezult; f^.set_var(float); f1^.set_var(float); f2^.set_var(float); Edit3.Text:=FloatToStrF(x^.rezult,ffFixed,25,dec); Edit4.Text:=FloatToStrF(f^.rezult,ffFixed,25,dec); Edit5.Text:=FloatToStrF(f1^.rezult,ffFixed,25,dec); Edit6.Text:=FloatToStrF(f2^.rezult,ffFixed,25,dec); end;
procedure TForm1.ComboBox1Change(Sender: TObject); begin if ComboBox1.Text<>'' then Button1Click(Button1); end;
procedure TForm1.Button2Click(Sender: TObject); begin Close(); end;
end.
|
--------------------
 Челябинские программисты настолько суровы, что обходятся без компиляторов. Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
|