Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Классы,Обьекты, Виртуальные функции, Не высчитывает производную 
:(
    Опции темы
Neox_GeForce
Дата 30.11.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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.




--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.