Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 3/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
if & case
#1
Merak ettim siz nasıl kullanıyorsunuz ?

   
  
 if (Kod = 1) or (Kod  = 6) then
        // bla bla bla

  case Kod of
     1,6 :  // bla bla bla
   end;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#2
Merhaba,
Nasıl kullanımından ziyade, hangi senaryoda (algoritma/kontrol) hangi yöntemin kullanılması gerektiğidir.
Bu şekilde sade bir yapı için genellikle if kullanırım.
İşin özündeki akışı, bir alt katmanda gerçekleştiğinden Low Level'e hakim arkadaşlarımız, detaylı açıklamada bulunursa biz de aydınlanmış oluruz.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
Ben ifdeki değerim integer ise ve veya kullanımım 2 veya daha fazla ise case kullanıyorum nedense bana daha kullanışlı veya güvenli gibi geliyor
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#4
Alternatif:
if Kod in [1, 6] then
...
There's no place like 127.0.0.1
WWW
Cevapla
#5
(06-12-2017, Saat: 09:41)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerak ettim siz nasıl kullanıyorsunuz ?

   
  
 if (Kod = 1) or (Kod  = 6) then
        // bla bla bla

  case Police.TarifeKodu_X_i of
     1,6 :  // bla bla bla
   end;


Merhaba,

Yukarıdaki örnek özelinde aşağıdaki gibi de kullanabilirsin;

if (Kod in [1,5,3]) then falan.open; 

------------------------------------------

Konuyu biraz genişletmek adına ben ek bir açılım getirmek istiyorum;

Hepimizin bildiği üzere programlama dillerinin çoğunda kullanılan "Karar Verme Yapıları" içinde yer alan "IF" ve "CASE" gibi komutlar, özü itibariyle belirtilen koşul veya şartın "doğru olup olmadığına" bakar. Yani sonuç olarak koşulun veya şartın "kendisinin" sonucunun "TRUE" veya "FALSE" olma durumu söz konusudur.

Vakti zamanında bazı karmaşık String birleştirme işlemlerinde kodu nasıl daha okunaklı hale getirebiliriz gibi bir arayış içerisindeyken keşfettiğim, sonrasında da sadece ihtiyacım olan veri tiplerine özel sürümlerini ürettiğim (overload), satır içinde doğrudan kullanılabilen bir "IIF" komutum var. Mevcut yazılarımda karşılaşmışsınızdır.

Bunun dışında bir küme elemanın mevcudiyetinin sorgulanmasının gerektiği durumlarda da ayrı bir fonksiyon kullanıyorum.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol / Neyi bilmediğimiz hakkında hiçbir fikrimiz yok (EM)
Cevapla
#6
Merhaba,

Kimse IF ve CASE arasındaki en önemli farktan bahsetmemiş. Dikkat ederseniz CASE ifadesi her veri tipi için çalışmaz. Çalışabilmesi için temelde tam sayı olması ve derleme sırasında değerinin belli olması lazım. Çünkü CASE ifadesi tamamen optimize etmeye yönelik bir ifadedir. Derleyici, CASE ifadesini gördüğü zaman, karşılaştırmalar için bir ikili ağaç yapısı oluşturur ve arama işlemini bu ağaç üzerinden yapar. Basit bir örnek üzerinden aradaki ciddi hız farkı daha kolay anlaşılır:


  if Gun = 1 then
    ShowMessage('Pazartesi'))
  else if Gun = 2 then
    ShowMessage('Salı'))
  else if Gun = 3 then
    ShowMessage('Çarşamba'))
  else if Gun = 4 then
    ShowMessage('Perşembe'))
  else if Gun = 5 then
    ShowMessage('Cuma'))
  else if Gun = 6 then
    ShowMessage('Cumartesi'))
  else if Gun = 7 then
    ShowMessage('Pazar'))
  else
    ShowMessage('Geçersiz gün');


Yukarıda Gün = 7 ise ekrana Pazar yazana kadar tam 7 kere if kontorlü yapılacak. Şimdi de derleyicinin nasıl bir ağaç oluşturduğuna bakalım:

                  4
          2             6
      1      3      5      7

Umarım anlaşılmıştır, ama mantık basit. Küçük olanlar sola, büyük olanlar sağa dağıtılıyor. Şimdi 7 için kaç kere if yazacağız ona bakalım:
if Gun = 4 then 
  ShowMessage('Perşembe')
else if Gun > 4 then  
begin
  if Gun = 6 then 
     ShowMessage('Cumartesi')
  else if Gun > 6 then
  begin
    if Gun = 7 then
      ShowMessage('Pazar');
  end;
end;

Yukarıda sistem anlaşılsın diye özellikle basit yazdım (ve else kısımlarını kaldırdım). Sadece 7 tane seçeneğin olduğu bir karşılaştırmada bile IF sayısını azalttık. Her ne kadar benim verdiğim örnek birebir olmasa da temel mantık bunun üzerine kurulu. Tabii kodun okunabilirliği ve sonradan ekle/çıkar işlemlerinin kolaylığı ek avantajları.

Bu yüzden eğer CASE yapısını kullanma imkanınız varsa CASE kullanın.

İyi çalışmalar
Cevapla
#7
Pek anladığımı söyleyemem,
Alıntı:Yukarıda Gün = 7 ise ekrana Pazar yazana kadar tam 7 kere if kontorlü yapılacak.

Peki case nasıl çalışıyor ?
Aşağıdaki yapıda aslında yine arka planda if else mantığı çalışıyor olabilir mi ?

case Kod of
     1: 'Pazartesi';
    2: 'Salı';
    3: 'Çarşamba';
          .
          .
          .
          .

end;

Alıntı: derleme sırasında değerinin belli olması lazım. 

Birde bunu anlayamadım, if kullanırken de Kod'un değeri belli Case kullanırken de.

biraz kafam karıştı
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#8
Micro C de ufak bir deneme yaptım sonuçlar şu şekilde:
Sonuçlar karşılaştırılan verilerin aynı olması veya olmaması durumuna göre değişkenlik gösteriyor.

Bu teste aşağıdaki kod örneği kullanıldı.

   if (a==3) b = 2;
  if (a==2) b = 3;
  
  switch(a)
  {
   case 3: b = 2; break;
   case 2: b = 3; break;
  }
  

Aynı işi yapan IF li blok min:10 max 11 cpu çevrim zamanı
Case li yapı min:9 max:12 cpu çevrim zamanı


....................    if (a==3) b = 2; // min:10 max:11 çevrim
0012:  MOVF   21,W 
0013:  SUBLW  03
0014:  BTFSS  03.2
0015:  GOTO   018
0016:  MOVLW  02
0017:  MOVWF  22
....................    if (a==2) b = 3; 
0018:  MOVF   21,W
0019:  SUBLW  02
001A:  BTFSS  03.2
001B:  GOTO   01E
001C:  MOVLW  03
001D:  MOVWF  22
....................    
....................    switch(a)  //min:9  max:12 cpu çevriminde işlem sonuçlandırılıyor
001E:  MOVF   21,W
001F:  XORLW  03
0020:  BTFSC  03.2
0021:  GOTO   026
0022:  XORLW  01
0023:  BTFSC  03.2
0024:  GOTO   029
0025:  GOTO   02C
....................    {
....................     case 3: b = 2; break;
0026:  MOVLW  02
0027:  MOVWF  22
0028:  GOTO   02C
....................     case 2: b = 3; break;
0029:  MOVLW  03
002A:  MOVWF  22
002B:  GOTO   02C
....................    }
}
002C:  SLEEP
Cevapla
#9
CASE ifadesinin becerisi az sayıdaki olasılıkta ortaya çıkmaz. Aşağıdaki basit örneği Delphi'de çalıştırın ve aradaki farkı görün (Build Configuration = RELEASE olsun):

procedure TForm1.Button2Click(Sender: TObject);
var
 I, X: Integer;
 TickCount: Integer;
 Gun: Integer;
begin
 TickCount := GetTickCount;

 for I := 1 to 10000000 do
 begin
   Gun := Random(6) + 1;
   case Gun of
   1: X := 1;
   2: X := 2;
   3: X := 3;
   4: X := 4;
   5: X := 5;
   6: X := 6;
   7: X := 7;
   else
     X := 8;
   end;
 end;
 ShowMessage(IntToStr(GetTickCount - TickCount));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I, X: Integer;
  TickCount: Integer;
  Gun: Integer;
begin
  TickCount := GetTickCount;

  for I := 1 to 10000000 do
  begin
    Gun := Random(6) + 1;
    if Gun = 1 then
      X := 1
    else if Gun = 2 then
      X := 2
    else if Gun = 3 then
      X := 3
    else if Gun = 4 then
      X := 4
    else if Gun = 5 then
      X := 5
    else if Gun = 6 then
      X := 6
    else if Gun = 7 then
      X := 7
    else
      X := 8;
  end;

  ShowMessage(IntToStr(GetTickCount - TickCount));
end;


Cevapla
#10
Değerler bu şekilde,
case : 31
case : 31
case : 31
case : 15
case : 32
case : 16
if : 94
if : 94
if : 94
if : 94
if : 94
if : 94
if : 94
if : 93
if : 94
if : 94

Buradan şunu anlıyorum, eğer mümkünse case kullanmak daha iyi.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  PopupMenunun Case Bloğunda checked olayının çözğmlenmesi AbdullahB 5 452 15-05-2017, Saat: 13:13
Son Yorum: frmman
  Case Of (iki int arası) yhackup 14 850 25-03-2017, Saat: 12:46
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi