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