Çoklu if string karşılaştırmasına çözüm

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Çoklu if string karşılaştırmasına çözüm

Mesaj gönderen Lord_Ares »

Merhaba,
Elimde 70 adet string bilgi var. Karşılaştırma yapıp dönen sonuca göre değer atamam gerekiyor. Fakat bunu if döngüsü ile yaptığımda kod uzayıp gidiyor.
Case of yapısıda bildiğim kadarıyla stringlerde kullanılamıyor. Peki böyle çoklu if karşılaştırmalarında kullanılan başka bir yöntem var mı ? Bunu merak edip öğrenmek istedim. Paylaşımlarınız için şimdiden teşekkürler. Örnek olarak aşağıdaki şekilde bir karşılaştırma için 70 adet if kullandım . İşin kötü tarafı bir okadar daha Else için kullanacak olmam :))) yani gecici='otcm16-1' eşit değilse gecici de ki değeri aldığın gibi yaz demem gerekiyor.


Örnek:

Kod: Tümünü seç

             if gecici='otcm16-1' then begin tahminturu:='İyms'; tahmini:='0-0';  end;
             if gecici='otcm13-1' then begin tahminturu:='İyms'; tahmini:='0-1';  end;
             if gecici='otcm19-1' then begin tahminturu:='İyms'; tahmini:='0-2';  end;
             if gecici='otcm15-1' then begin tahminturu:='İyms'; tahmini:='1-0';  end;
             if gecici='otcm12-1' then begin tahminturu:='İyms'; tahmini:='1-1';  end;
             if gecici='otcm18-1' then begin tahminturu:='İyms'; tahmini:='1-2';  end;
             if gecici='otcm17-1' then begin tahminturu:='İyms'; tahmini:='2-0';  end;
             if gecici='otcm14-1' then begin tahminturu:='İyms'; tahmini:='2-1';  end;
             if gecici='otcm20-1' then begin tahminturu:='İyms'; tahmini:='2-2';  end;


Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Çoklu if string karşılaştırmasına çözüm

Mesaj gönderen mrmarman »

Problemi biliyorsan çözümü basittir derler.
Parse işlemlerinde ben de benzer durumlarla karşılaşıyorum ve basit bir çözümüm var. TStringList kullanıyorum. INDEX'i bana IF halini veriyor.

Tüm alternatifleri bir TStringList'e koyup CASE 'e dönüştürebilirsin. Senin örneğin ile aşağıdaki şekilde ifade edebilirim.

Kod: Tümünü seç

Var gecici,
    tahminturu,
    tahmini     : String;
begin
  Gecici := 'otcm17-1';
  With TStringList.Create do begin
    AddStrings( [ 'otcm16-1-1', 'otcm13-1', 'otcm19-1', 'otcm15-1', 'otcm12-1', 'otcm18-1', 'otcm17-1', 'otcm14-1', 'otcm20-1' ] );
    case IndexOf( Gecici ) of
    0: begin tahminturu:='İyms'; tahmini:='0-0';  end;
    1: begin tahminturu:='İyms'; tahmini:='0-1';  end;
    2: begin tahminturu:='İyms'; tahmini:='0-2';  end;
    3: begin tahminturu:='İyms'; tahmini:='1-0';  end;
    4: begin tahminturu:='İyms'; tahmini:='1-1';  end;
    5: begin tahminturu:='İyms'; tahmini:='1-2';  end;
    6: begin tahminturu:='İyms'; tahmini:='2-0';  end;
    7: begin tahminturu:='İyms'; tahmini:='2-1';  end;
    8: begin tahminturu:='İyms'; tahmini:='2-2';  end;
    end;
    free;
  end;
  ShowMessage(tahminturu + ' - ' + tahmini);
end;
Resim
Resim ....Resim
Kullanıcı avatarı
badkursat
Üye
Mesajlar: 84
Kayıt: 03 Mar 2014 08:58

Re: Çoklu if string karşılaştırmasına çözüm

Mesaj gönderen badkursat »

Muhharem hocamın yöntemi bence makul olan ama alternatif olarak şöyle bir şey deneyebilirsin. Elinde bir veri kümesi olduğunu varsayarak bunları bir class haline getirerek bir Liste içine alabilirsin. Örneğin:

Kod: Tümünü seç

  TahminTurleri = (ttIyms,ttBaskabisi);
  
  TMyItem = class
  public
    constructor Create;virtual;
    destructor Destroy;virtual;
  published
    property Tahmini    : string read FTahmini write FTahmini;
    property TahminTuru : TahminTurleri read FTahminTuru write FTahminTuru;
  end;
bu class itemların olduğunu düşünelim sonrasında bu itemlerı bir listeye alırsak

Kod: Tümünü seç

  TMyList = class(Tlist)
    private
      FSelected : TMyItem;
      FOnAdd: TNotifyEvent;
    protected
      function GetItem(Index: Integer): TMyItem;
      procedure SetItem(Index: Integer; AObject: TMyItem);

      procedure DoAdd(Sender:TObject);
    public
      constructor Create;
      destructor Destroy;

      function Add(AObject: TMyItem): Integer;
      function Remove(AObject: TMyItem): Integer;
      function IndexOf(AObject: TMyItem): Integer;overload;
      function IndexOf(Name:string): Integer;overload;
      procedure Insert(Index: Integer; AObject: TMyItem);
      property Items[Index: Integer]: TMyItem read GetItem write SetItem; default;

      function Select(index:Integer):TMyItem;
      function IsEmpty:Boolean;

      function FindByTahmini(Name:string):TMyItem;
    published
      property OnAdd : TNotifyEvent read FOnAdd write FOnAdd;
      property Selected :TMyItem read FSelected;
  end;
Bütün operasyonlarını kontrol edebilirsin. Tabi yapacağın işlem çok basit birşey ise uğramaya değmez bu yöntem. Sadece fikir vermesi açısından değerlendirebilirsin.
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Çoklu if string karşılaştırmasına çözüm

Mesaj gönderen ikra »

Kod: Tümünü seç

function CaseOfString(s: string; a: array of string): Integer;
begin
  Result := 0;
  while (Result < Length(a)) and (a[Result] <> s) do
    Inc(Result);
  if a[Result] <> s then
    Result := -1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  case CaseOfString(Edit1.Text, ['Badkursat', 'Mrmarman', 'Lord-ares', 'Ikra']) of
    0: Label1.Caption := 'Badkursat';
    1: Label1.Caption := 'Mrmarman';
    2: Label1.Caption := 'Lord-ares!';
    3: Label1.Caption := 'Ikra';
    else
      Label1.Caption := 'isim bulunamadi';
  end;
end;
kıdemsiz üye
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: Çoklu if string karşılaştırmasına çözüm

Mesaj gönderen PROGRAMADOR »

Merhaba,
Stringler için case of kullanabilirsiniz. Önemli olan yöntemini bulmak. Örneğin stringe sayısal karşılık gelen bir algoritma işinizi görecektir.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Çoklu if string karşılaştırmasına çözüm

Mesaj gönderen Lord_Ares »

Arkadaşlar fikirleriniz ve öğrettikleriniz için hepinize tek tek çok teşekkürler. Emeğinize sağlık.
Cevapla