»
Y
A
N
M
E
N
Ü
«
Expression Evaluation
ibrahim dursun @ 17 Kasım 2005 20:28

Merhaba,

Recursion yöntemini kullanarak neler yapılabileceğini göstermek amacıyla

   12
-------- + 6
 13 + 1
 ------
   28

gibi ifadeleri (Expression) hesaplayan örnek bir program yazalım dedim.

Program bölme ve toplama işlemlerini tanıyabilecek. Bölme için gerekli çizgiler ‘-‘ karakteri kullanılarak çizilecek.

İfadeler ya bölme ya toplama işlemi olacak o yüzden şöyle bir class hiyerarşisi oluşturuyoruz.

İlk olarak bütün ifadelerin hesaplama yapan bir metodu olmalı ve bu metod Real bir değer döndürmeli. O yüzden TExpression diye abstract bir class tanımlıyoruz ve içine Evaluate metodunu yazıyoruz.

TExpression =  class
public
  function Evaluate:Real;virtual;abstract;
end;

Tek başına yazılmış bir sayı da bir çeşit ifade olduğu için TExpression classından TSingleExpression adında bir class türetiyoruz

TSingleExpression = class(TExpression)
private
  FValue : Real;
public
  function Evaluate: Real;override;
  constructor Create(AValue : Real);
end;

Bu classın Evaluate metodu çalışıtırıldığında Fvalue alanındaki değeri döndürecek.

Toplama işlemi için TAdditionExpression adıyla bir class daha tanımlıyoruz:

TAdditionExpression = class(TExpression)
protected
  FLeft : TExpression;
  FRight: TExpression;
public
  function Evaluate: Real;override;
  constructor Create(Left,Right:TExpression);
  destructor Destroy;override;
end;

Bu classın evaluate metoduda Fleft ve Fright alanlarındaki Expression classlarının evaluate metodlarını çalıştırıp çıkan sonucu toplayarak döndürecek

Bölme işlemi de toplama işleminden çok farklı olmadığı için

TDivisionExpression = class(TAdditionExpression)
public
  function Evaluate: Real;override;
end;

Program şöyle bir algoritma izleyecek:

function Parse(Lines: TstringList):Texpression;
basla
  // bölme işlemi için
  eger <> basla
     <<İfadeyi o satırdan Sag ve Sol olamk üzere ikiye ayır>>
     Expr1 = parse(Sag);
     Expr2 = parse(Sol);
     Result := TDivisionExpression.Create(Expr1,Expr2);
     Exit;
  bitir;
  // toplama işlemi için
  eger <> basla
     <<İfadeyi o sütundan Ust ve Alt olam üzere ikiye ayır>>
     Expr1 = parse(Ust);
     Expr2 = parse(Alt);
     Result := TAdditionExpression.Create(Expr1,Expr2);
     Exit;
  bitir;
  // sayılar için
  eger <> basla
     Result := TSingleExpression.Create(Deger)
  bitir;
  // hiçbir koşula düşmediyse
  Hata;
bitir;

Hesaplama işlemi aşağıdaki kodla yapılabilecek

var
  Exp : TExpression;
begin
Exp:=Parse(memo1.lines);
ShowMessage(FloatToStr(Exp.Evaluate));
End;

Metod çalıştırıldığında recursive olarak İfade Ağacı (Expression Tree) oluşturulacak.

Kaynak Kod: memoevaluate.rar Çalıştırılabilir Dosya : memoevaluate.exe.rar


Bir yorum bırakın

»  Substance: WordPress   »  Style: Ahren Ahimsa