Forum: Ders Arası RSS
İlginç for() döngüsü örnekleri...
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: İlginç for() döngüsü örnekleri...
Merhaba,

Bildiğiniz ilginç örnekler var mı?

Teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
D'de for'un yazım kurallarına göre iki değil, yalnızca tek noktalı virgül gerekiyor. O aklıma geldi:

import std.stdio;
 
void main()
{
    int i;
 
    for ({
              int k;
              writeln("Burada istediğim deyimler olabilir");
 
              foreach (j; 0 .. 5) {
                  writeln("İlkleme bölgesi ", j);
                  k += j;
              }
 
              double l = 4.5;
         }
 
         i < 4// <-- işte tek noktalı virgül
 
         ++i) {
 
        writeln("  for'un içi ", i);
        writeln("  k ve l burada görünüyor: ", k, ' ', l);
    }
}

Çıktısı:

Burada istediğim deyimler olabilir
İlkleme bölgesi 0
İlkleme bölgesi 1
İlkleme bölgesi 2
İlkleme bölgesi 3
İlkleme bölgesi 4
  for'un içi 0
  k ve l burada görünüyor: 10 4.5
  for'un içi 1
  k ve l burada görünüyor: 10 4.5
  for'un içi 2
  k ve l burada görünüyor: 10 4.5
  for'un içi 3
  k ve l burada görünüyor: 10 4.5


Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ooo, bu çok sağlamdı! Parmaklarım titreyerek yazıyorum ki böyle kapsamlı bir şey beklemiyordum desem yeridir...:)

En güzeli de güzel parantezlere rağmen küme dışında da değişkenlerin etkin olması. Bunu açıkçası bilmiyordum, çok faydası oldu. Teşekkür ederim. Benim de tek türetebildiğim örnek şu şekilde:
    int derece = 3, hız, x;
    for(if(derece > 0 && derece < 30)
        hız = 2; else hız = 10;
        derece < 100;
        derece++, x = derece % hız ? 0 : derece++) {
        derece.write("\t");
    }
Elbette çok saçma, hatta okunabilirliliği yüksek olan bir benzeri yapılabileceği kanaatindeyim. Çünkü 2 + 1 ile üç farklı koşul kullandım. Tam bir karmaşalar zinciri gibi ve herhalde hiç kimse beğenmeyecektir. Öyle ki iki noktalı virgüle if()'den dolayı zorunlu olarak bir tane daha ekledim. Gerçi güzel parantezler ile tıpkı Ali hocamın örneğine benzer kapatabilirdim. Özetle, son bölümdeki virgülü de sayarsak da etti mi üç buçuk virgül...:)

Offf, karmaşa üstü karmaşa! Peki ne yapar bu parça? Kısaca başlangıç ısısına göre kendi hızını belirler. Eğer 30 dereceden düşük ısılarsa fazladan bir kere daha (toplamda ise ikişer ikişer) sayı artar. Tersi bir koşulda ise teker teker artmanın yanında her 10 derecede iki artar. Evet, çok saçma ve de daha güzel bir benzeri yapılabilirdi.

İş olsun işte...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali hocamdan öğrendiğim, şu kümeleme olanağını paylaştığım örneğe uyguladım ve bir gerçeğin farkına vardım. Aslında for() döngüsünün ilk bölümünü istersek dışına da alabiliriz. Bu durumda ikisi arasında tek fark olacaktır; o da tanımlanan değişken veya değişkenlerin küme sonunda ölmesidir. Bunları şu örnekte denedim:
import core.stdc.stdio: printf;
 
void main(string[] param)
{
//* code-toggle-on/off
    for({
          int derece = 3, hız, x;
          if(derece > 0 && derece < 30)
          hız = 2; else hız = 10;
        }
        derece < 100;
        derece++, x = derece % hız ? 0 : derece++) {
        printf("%d\t", derece);
    }
/*/
    int derece = 3, hız, x;
    if(derece > 0 && derece < 30)
    {
       hız = 2;
    } else {
       hız = 10;
    }
    for(;derece < 100; derece++) {
        //x = derece % hız ? 0 : derece++;
        if(derece % hız == 0) derece++;
        printf("%d\t", derece);
    }//*/
}
Her iki kod parçası da Linux32'de 1924 byte object code üretiyor. Hatta ikinci kodda, gövdeye aldığım şu üçlü koşulu değiştirdiğimde bir değişkenden avantaj ediyorsunuz ki kod 1916 byte'a düşüyor! Demek ki hiç okunabilirliği azaltmadan geleneksel şekilde yazım belki daha çok esneklik getirilebilir.

Siz ne dersiniz arkadaşlar? Ali hocam ile dialog yapıyormuş gibi geçmese ne iyi olurdu...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 04:12:35 (UTC -08:00)