Algoritmalar: İfade (Expression) hesaplama

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Algoritmalar: İfade (Expression) hesaplama

Mesaj gönderen t-hex »

Merhaba,

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

Kod: Tümünü seç

     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

Kod: Tümünü seç

  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

Kod: Tümünü seç

  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:

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;
 
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

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;
Hesaplama işlemi aşağıdaki kodla yapılabilecek

Kod: Tümünü seç

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.

Ö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
En son t-hex tarafından 12 Oca 2009 10:25 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Hocam bununla compiler yapalım biz. :) Örnek için teşekkürler.
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

:) compiler olmaz heralde. ama ben bunu birçok uygulamada ufak tefek hesaplama işlerinin gerektiği yerlerde kullanıyorum, tabi bu örneği değilde bildiğimiz tek satırlık ifadeleri hesaplayan halini..
aslında bu yöntem en iyi c# ve java gibi dillerde iyi çalışır çünkü orda garbage collection var, delphideki halinde ifade hatalı olduğunda bi ton memory leak olabilir diye düşünüyorum
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: Algoritmalar: İfade (Expression) hesaplama

Mesaj gönderen qamyoncu »

Hepinize teşekkür ederim.. verdiğiniz 2-3 kaynak ile işimi halletmekle kalmadım geniş bir bilgi sahibi de oldum.. tekrar sağolun..:)

Saygılar. .
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Cevapla