Recursion yönetmini kullanarak neler yapılabileceğini göstermek amacıyla
Kod: Tümünü seç
12
-------- + 6
13 + 1
------
28
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
Kod: Tümünü seç
TExpression = class
public
function Evaluate:Real;virtual;abstract;
end;
Kod: Tümünü seç
TSingleExpression = class(TExpression)
private
FValue : Real;
public
function Evaluate: Real;override;
constructor Create(AValue : Real);
end;
Toplama işlemi için TAdditionExpression adıyla bir class daha tanımlıyoruz:
Kod: Tümünü seç
TAdditionExpression = class(TExpression)
protected
FLeft : TExpression;
FRight: TExpression;
public
function Evaluate: Real;override;
constructor Create(Left,Right:TExpression);
destructor Destroy;override;
end;
Bölme işlemi de toplama işleminden çok farklı olmadığı için
Kod: Tümünü seç
TDivisionExpression = class(TAdditionExpression)
public
function Evaluate: Real;override;
end;
Program şöyle bir algoritma izleyecek:
Kod: Tümünü seç
function Parse(Lines: TstringList):Texpression;
basla
// bölme işlemi için
eger <<herhangi bir satir bölme çizgisiyse>> 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 <<herhangi bir sütun sadece ‘+’ karakterinden oluşuyorsa>> 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 <<tek satırsa>> basla
Result := TSingleExpression.Create(Deger)
bitir;
// hiçbir koşula düşmediyse
Hata;
bitir;
Kod: Tümünü seç
var
Exp : TExpression;
begin
Exp:=Parse(memo1.lines);
ShowMessage(FloatToStr(Exp.Evaluate));
End;
Örnek Kod ve Uygulama burada
Anlaşılmayan veya benim bahsetmediğim noktaları sorabilirsiniz.
NOT : Biliyorum böyle bir uygulama ticari anlamda kimsenin işine yaramaz, am en azından basit bir hesaplama işlemini yaptırabilmenin yolunu anlattığı için faydalı olabilir.
İbrahim DURSUN , Mart 2005