Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Классы,Обьекты, Виртуальные функции


Автор: Neox_GeForce 30.11.2007, 00:53
Почему то не  высчитывает производную, первую и вторую. Помогите пожалуйста!

Добавлено через 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.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)