İşlem Parseleme*

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

İşlem Parseleme*

Mesaj gönderen qamyoncu »

Merhabalar..

Projemizin içinde topla,çıkar,çarp,böl fonksiyonlarının olduğunu varsayalım. Hepsine double girdi olup yine double tek çıktı olsun:
-Topla(a,b:double):double;
-Çıkar(a,b:double):double;
-Çarp(a,b:double):double;
-Böl(a,b:double):double;

Edit'imin içine girdiğim veriye göre bu işlemleri yaptırıyorum.

Örneğin, sadece "Topla(5,3)" (5+3=8) dediğimde bunu algılatabiliyorum programıma (strtofloat dönüşümlerini varsaymayınız):

Kod: Tümünü seç

if copy(edit1.text,1,6)='Topla(' then
 topla( copy( edit1.text,7,ansipos(edit1.text,',') - 7 ) , copy( edit1.text,ansipos(edit1.text,',' ) , ansipos( edit1.text,')' ) - ansipos( edit1.text,',' ) - 1 );

Ancak "Çıkar(Topla(5,3),2)" ((5+3)-2=6) dediğimde sorun çıkacaktır. Bu şekilde içiçe işlemlerde nasıl bir yol izleyebilirim acaba?
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: İşlem Parseleme*

Mesaj gönderen sabanakman »

Özyinelemeli fonksiyon tasarlayarak halledebilirsin. Eğer fonksiyon değer hesaplarken ilgili sayı değeri yerine işlemle karşılaşıyorsa sadece o işlemi çözecek şekilde bir çağrım yapılmalıdır. Örneğine göre "Çıkar(Topla(5,3),2)" bilgisi gönderildiğinde içeride "Topla(5,3)" işlemi için tekrar kendisini çağıracak, oradan gelen çözümü sonuç üretmede kullanacak bir kod ile çözebilirsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: İşlem Parseleme*

Mesaj gönderen qamyoncu »

45 dakikadır üstünde uğraşıyorum ancak yanlış bir yöntem izliyorum sanırım. Bir kaç basit örnek gösterebilirmisiniz bu konuda?
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: İşlem Parseleme*

Mesaj gönderen qamyoncu »

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,strutils;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private

    function icindebul(ara,metin:string):integer;
    function topla(s:string):double;
    function cikar(s:string):double;
    function islemyap(s:string):double;

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


function TForm1.icindebul(ara, metin: string): integer;
var
i:integer;
begin
  if length(metin)<length(ara) then
    begin
      result:=1050;
      exit;
    end;

  for i:=1 to length(metin)-length(ara)+1 do
    begin
      if copy(metin,length(metin)-length(ara)+1-i,length(ara))=ara then
        begin
          if length(metin)=length(ara) then
            result:=0
          else
            result:=i;
          exit;
        end;
    end;
    result:=1050;
end;

function TForm1.islemyap(s: string): double;
var
t,c:integer;
q:string;
begin
  result:=1050E22;
  t:=icindebul('TOPLA(',s);
  c:=icindebul('çıKAR(',s);
  if (t=1050) and (c=1050) then
    begin
      result:=strtofloat(s);
      exit;
    end;

  if (c<t) and (c>0) then
    begin
      q:=copy(s,length(s)-c-6+1,c+6);
      q:=copy(q,1,ansipos(')',q));
      q:=ansireplacestr(s,copy(q,length(q)-6-c+1,6+c),floattostr(cikar(copy(q,length(q)-6-c+1,6+c))));
      result:=islemyap(q);
    end;

  if (t<c) and (t>0) then
    begin
      q:=copy(s,length(s)-t-6+1,t+6);
      q:=copy(q,1,ansipos(')',q));
      q:=ansireplacestr(s,copy(q,length(q)-6-t+1,6+t),floattostr(topla(copy(q,length(q)-6-t+1,6+t))));
      result:=islemyap(q);
    end;
end;

function TForm1.cikar(s: string): double;
var
i,j,k:integer;
s1,s2:double;
begin
i:=ansipos('(',s);
j:=ansipos(',',s);
k:=ansipos(')',s);
s1:=strtofloat(copy(s,i+1,j-i-1));
s2:=strtofloat(copy(s,j+1,k-j-1));
result:=s1-s2;
end;

function TForm1.topla(s:string): double;
var
i,j,k:integer;
s1,s2:double;
begin
i:=ansipos('(',s);
j:=ansipos(',',s);
k:=ansipos(')',s);
s1:=strtofloat(copy(s,i+1,j-i-1));
s2:=strtofloat(copy(s,j+1,k-j-1));
result:=s1+s2;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if key=#13 then
    memo1.lines.add(floattostr(islemyap(uppercase(edit1.text))));
end;


end.
Böyle bir şeyler yaptım. Gayet iyi çalışıyor. Ancak yine de farklı bir yol öneriniz varsa memnuniyet ile ilgilenirim.. :)
En son qamyoncu tarafından 08 Haz 2009 07:02 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: İşlem Parseleme*

Mesaj gönderen Battosai »

Daha çok uğraşacaksın zira istediğin şey basit değil...
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: İşlem Parseleme*

Mesaj gönderen qamyoncu »

Haklısınız. TParser diye bir unit var elimde. Matematiksel toplam çarpım vs vs her şeyi yapıyor. Ancak mantığı önemliydi benim için. Ordan anlamaya çalıştım ama fazla karıştırmışlar pek fikir sahibi olamadım.. Kendim uğraşınca daha iyi oldu. Umarım sorun çıkartmaz.
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Cevapla