Forum: Ders Arası RSS
Şablonlar ile yığın sınıfı
Sayfa:  önceki  1  2  3  4 
Avatar
Salih Dinçer #46
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7173
Ali hocam anlayamıyorum...:)

Doğru gitmeyen bir şeyler var. Bunu aynı yapı üzerinden işlemeye devam edelim mi?

acehreli:
struct SayıDizisi
{
    int baş;
    int son;
 
    this(int baş, int son)
    {
        this.baş = baş;
        this.son = son;
    }
 
    int opApply(int delegate(int sayı) işlem) const
    {
        /*
         * Üzerinde konuşurken dışarıdaki foreach ile karışmasın diye bunu for
         * ile gerçekleştirmeye karar verdim. Burada foreach de olabilirdi:
         *
         *   foreach (sayı; baş .. son) {
         *       işlem(sayı);
         *   }
         */
        for (int sayı = baş; sayı != son; ++sayı) {
            immutable break_mi = işlem(sayı);
 
            if (break_mi) {
                return break_mi;
            }
        }
        return 0;
    }
}
Önce bu yapının döndürdüğü aralığı biraz genişlettim. Ayrıca derleyicinin foreach() döngüsünü dönüştürdüğü benzeriyle birlikte çalıştırdım. Ayrıca kesme (immutable) isminde bir sabit değişken tanımladım...

Evet, (sayı%2) koşul ifadesi gerçekten de 2'ye ulaştığında yapı döngüsünde return'e sebep oluyor. Ama bu ifadesinin anlamı 2'ye bölünebilen ilk sayı da 0 döndür demek değil mi? O yüzden kesme değişkenine ne yazarsam yazayım, 0 hariç 1 sayısını kalansız bölemediği anda (ikinci dönüşte) break yapıyor. Bu baş etmemiz gereken ilk sorun ki çözümü kolay: (sayı%2 == 0)
import std.stdio;
 
void main(){
    auto dizi = SayıDizisi(0, 30);
    immutable kesme = 10;
 
    foreach(sayı; dizi) {
        sayı.write(" ");
        if(sayı % kesme) break;
    } // Aşağıdaki ile aynı...
 
    writeln;
 
    dizi.opApply(
        (int sayı) {
            sayı.write(" ");
            if(sayı >= kesme) return 1;
            return 0;
        }
    );
    writeln;
}
opApply uygulamasının benzerinde ise (sayı >= kesme) ifadesi sanki istediğimiz gibi çalışıyor. Çünkü bu kodun çıktısı aşağıdaki çıktı oluyor. Ancak dikkat! Biz burada return kullandık ve hala break olup olmadığını tespit edebildiğimizi zannetmiyorum...:(

Çıktısı:
0 1
0 1 2 3 4 5 6 7 8 9 10


Karışık veya henüz hakim olamadığım bir alan! O yüzden Ali hocamın parmaklarına bakıyorum şu an...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #47
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Tamam, sorun kalmadı çünkü yukarıda verdiğim cevaba rağmen sorunu görememişim!

Biz 0'a takılmaktayız ve koşul ifadesi (sayı % kesme == 0) şeklinde olacak. Ben de break'i yakalayamadığımız yönünde şiddetli bir azap çekmek üzereydim...:)
    auto dizi = SayıDizisi(1, 30);
    immutable kesme = 10;
    
    foreach(sayı; dizi) {
        sayı.write(" ");
        if(sayı % kesme == 0) break;
    }
Yukarıdaki kodlar çalışıyor çünkü aralığı 1-30 arasında kurdum. O yüzden 10'a bölümde kesme (kırılma) olmakta.

Teşekkürler, faydalı bir muhabbet oldu...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-08-01, 14:05.
acehreli (Moderatör) #48
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ı
Yanıtlanan mesaj #46
Salih Dinçer:
Önce bu yapının döndürdüğü aralığı biraz genişlettim. Ayrıca derleyicinin foreach() döngüsünü dönüştürdüğü benzeriyle birlikte çalıştırdım. Ayrıca kesme (immutable) isminde bir sabit değişken tanımladım...

Talihsiz bir isim olmuş ama sonundaki "me" olumsuzluk anlamında değil herhalde. Benim koşulumu neden beğenmedin? Bir sayının tek olup olmadığını anlamak için % işleci kullanılır ya... Bizim türümüzden bir nesneyi kendi foreach döngüsünde kullanmak isteyen programcı "tek sayı olduğunda yeter" demek istiyor. Şu değil midir:

        if (sayı % 2) {
            break;
        }

İstersek daha açık olarak ((sayı % 2) != 0) da yazabilirdik ama tabii ki '== 0' ters olurdu.

Senin kafanı karıştırmış olmalıyım. Aslında çok basit: programcı tek sayı olunca döngüyü kırmak istiyor.

Evet, (sayı%2) koşul ifadesi gerçekten de 2'ye ulaştığında yapı döngüsünde return'e sebep oluyor. Ama bu ifadesinin anlamı 2'ye bölünebilen ilk sayı da 0 döndür demek değil mi?

Kullanıcının if ifadesine yazdığı koşulun işlem()'in döndürdüğü değerle ilgisi yok. Kural şu:

  • foreach'in içinde break'e rastlanmışsa işlem() sıfırdan farklı değer döndürür.

  • Değilse sıfır döndürür.

    dizi.opApply(
        (int sayı) {
            sayı.write(" ");
            if(sayı >= kesme) return 1;
            return 0;
        }
    );
}

dizi.opApply() açılımın yaparken opApply()'a gönderilen temsilcinin kullanıcının ortamına erişemediğini söylemek aklıma bile gelmemiş. 'kesme' gibi yerel bir değişken orada görülemez.

Benim (ve derleyicinin) yaptığım çok daha basit bir şeydi: Dikkat edersen 'break' yerine 'return 1;' yazdım. if ile bir ilgisi yok. 'break' yerine körlemesine 'return 1' geldiğini düşün.

Karışık veya henüz hakim olamadığım bir alan!

Olay gerçekten çok basit: opApply() tanımladın ve içeride kendi döngün içinde ilerliyorsun. Kullanıcının 'break' isteğini nasıl sağlayacaksın? Çözüm: işlem()'in dönüş değeri sıfırdan farklıysa kullanıcı 'break' istemiş demektir. Hemen döngüden çıkıyoruz.

Ali
acehreli (Moderatör) #49
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ı
acehreli:
dizi.opApply() açılımın yaparken opApply()'a gönderilen temsilcinin kullanıcının ortamına erişemediğini söylemek aklıma bile gelmemiş.

O söylediğim yanlış. Tabii ki kullanıcının temsilcisi kullanıcının ortamına erişebilir.

'kesme' gibi yerel bir değişken orada görülemez.

'kesme' kendisi opApply() içindeyken görülemez ve görülmüyor da zaten. Temsilci içinden ise görülebilir ("ona erişilebilir" anlamında).

Ali
Avatar
Salih Dinçer #50
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #48
acehreli:
Talihsiz bir isim olmuş ama sonundaki "me" olumsuzluk anlamında değil herhalde. Benim koşulumu neden beğenmedin?
...
Senin kafanı karıştırmış olmalıyım. Aslında çok basit: programcı tek sayı olunca döngüyü kırmak istiyor.
Hayır beğenmemekten çok, farklı bir çıktı alamadığımı ve doğru çalışmadığını fark ettim. Meğerse 2'ye kalansız bölünebilen bir sayıda break yapmak istemişsin. Ben ise daha çok anlayabilmek için bu sihirli sayıyı değiştirip 3, 4, 5 yapmak istedim ve farklı bir sonla karşılaşmadım. Ama aralığı 0'dan değil de 1'den başlatınca ve ifadeyi değiştirince farklı aralıklarda break yapılabildiğini hemen sonraki iletide (herhalde bu ikinci iletimi görmedin?) gösterdim. Sanki bu haliye daha güzel, en azından benim için...:)

Beğenmediğin kesme sabiti ise o an aklıma gelen, xSay, kSay, ySay da olabilecek herhangi bir şey olabilir. Çünkü her iki opApply uygulamasındaki ifadeleri değiştirmem gerekiyordu. Yoksa opApply içinde görünüp görünmemesi ile ilgilenmiyorum. O bana özel bir kolaylıktı, belki de paylaşmamalıydım...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #51
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #49
acehreli:
acehreli:
dizi.opApply() açılımın yaparken opApply()'a gönderilen temsilcinin kullanıcının ortamına erişemediğini söylemek aklıma bile gelmemiş.

O söylediğim yanlış. Tabii ki kullanıcının temsilcisi kullanıcının ortamına erişebilir.
Sanırım bu çok önemli değil çünkü biz daha çok foreach() döngüsü kolaylığı ile ilgileniyoruz. Sonuçta bu bir kolaylık ve basit bir şekilde (empty, popFront, front işlevlerini tanımlamadan) kullanabilmek çok güzel. Ancak önceki iletilerimde de ifade etmek istediğim gibi farklı çıktılar (öğrenciye değerleri değiştirme imkanı tanımak) gerekiyor. Örneğin artık şu şekilde istediğimiz yerde break yaptırabiliyoruz; güzel değil mi?
import std.stdio;
 
void main(){
    auto dizi = SayıDizisi(1, 31);
    string döngü = "bitti"; // Eğer bu değişken değişmezse sorun var!
 
    foreach (sayı; dizi) {
        if(sayı % 13 == 0) {
            döngü = "kesildi";
            break;
        }
        sayı.write(" ");
    }
    writefln("\n\t-%s-", döngü);
}/* Çıktısı:
1 2 3 4 5 6 7 8 9 10 11 12 
    -kesildi-
*/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #52
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ı
Yanıtlanan mesaj #50
Salih Dinçer:
break yapılabildiğini hemen sonraki iletide (herhalde bu ikinci iletimi görmedin?) gösterdim.

Mesajımı yazarken göndermişsin. Sonradan gördüm. :)

Ali
zafer #53
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7171
Salih Dinçer:
Şimdi ilgili dersi işlerken, Zafer'in başlattığı bu başlıktan çok faydalandım, teşekkürler Zafer.

Faydalanmana çok sevindim Salih. Bu forumdaki bir çok konu çok güzel bilgiler içeriyor. Umarım bunların değerini anlayıp faydalanan daha çok kişi olur.

Salih Dinçer:
Zafer dahil katılım sağlarsa çok sevinirim...

Doğrusu bu konuya yazmayacağımı söylemiştim. Genellikle söylediğim sözleri yapma taraftarıyımdır. Ancak davete icabet etmemek olmaz diyerek bir şeyler eklemek istedim.

Ali zaten konuyu detaylıca açıklamış bende onunla aynı fikirdeyim. Yani yığın yapısından bir eleman aldığımda doğal olarak o elemanın yığından çıkarılmış olmasını beklerim. Bu doğal yaklaşından dolayı mevcut yığın sınıfı aralık entegrasyonu doğru olarak görünüyor. Ancak farklı durumlar için aralık entegrasyonu yaparken Ali'nin bahsetttiği önlemleri almak gerekir.

Son olarak tıpkı yığından bir eleman çıkardığımda doğal olarak bunun yığın yapısındanda çıkarılmasını beklediğim gibi, bir sınıf tasarlarken bu sınıfın tüm üyelerini private olarak işaretleyebilmeyi beklerim. Oysa aralık gerçeklemesinde empty(), front() gibi işlemleri private olarak işaretleme imkanı yoktur. İşte aralıklara benim itirazım tam olarak bu noktadadır. Bence bu metotlarda private olarak işaretlenebilmelidir. Ancak o zaman aralıklar sınıflarla tam olarak uyumlu olacaktır. Aksi takdirde durum açıktır aralıklar sınıf tanımının gereklerini tam olarak yerine getirmemektedir.

Görüşlerimin daha iyi anlaşılabilmesi için bir kez daha net bir şekilde yazmak istedim. Tabi ki dili geliştirenler böyle uygun görmüşse benim diyebilecek bir şeyim yok. Bu bir eleştiridir, tıpkı diğer dillerdeki eksik yönlerin eleştirisi gibi ;)
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #54
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aralıklar ile ilgili işlevlerin private olmasını istemeni şimdi daha iyi anlıyorum. Ancak bu durumda üye dışından bir foreach() döngüsü ile kullanamayacağımız anlamına geliyor. Şimdi bu durumda derleyici ne yapsın istiyorsun? Kuralı bir seferlik bozsun mu yoksa tamamen dışa kapalı mı olsun?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #55
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Zafercim bu arada aklıma gelmişken eğer birim testleri ile konferansta anlattığın sunumları mail adresime gönderebilirsen sevinirim.

[Resim: http://ehobi.org/eposta.gif]

Hatta başta Ali bey olmak üzere konferansta sunum yapan tüm arkadaşlar anlattıkları konularla ilgili sunumları e-posta adresime gönderebilirlerse sevinirim.

Hazır böyle biraz vakit varken sakin kafayla anlatılan konuların tekrar üzerinden geçeyim :-)
acehreli (Moderatör) #56
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ı
Benim sunumları çoktan sunum sayfasına koymam gerekiyordu. Tembellik... Yapacağım... :(

Ali
zafer #57
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #54
Salih Dinçer:
Şimdi bu durumda derleyici ne yapsın istiyorsun? Kuralı bir seferlik bozsun mu yoksa tamamen dışa kapalı mı olsun?

Salih sabah sabah beni güldürdün :) Allahta seni güldürsün. Ben derleyiciden bir şey yapmasını istemiyorum. O zaten kendisine öğretileni harfiyen yapıyor ;) D dili konusundada herhangi bir söz söyleyecek durumda değilim. Ben sadece dikkatimi çeken bir konu hakkındaki fikrimi paylaştım. Sonuçta dili geliştirenler böyle uygun görmüşse bize tabi ki bu şekilde kullanmak kalıyor. Ya da D dilini geliştirenler gibi şimdiden yola çıkıp kendi istedigimiz özelliklere sahip bir dil geliştirmeye başlamak ;)

Diğer taraftan şu düşünceninde kabul edilebilir olduğunu düşünüyorum. Neticede aralık işlemleri sınıfa dışırıdan erişen bir metoda hizmet vermekteler dolayısıyla daha öncede söylendiği gibi böyle bir tanım yapıldığında doğal olarak bu metodların public olması gerekeceği için sabit olarak public olmaları gayet mantıklı görünüyor.

Sonuçta bu tartışma bizi çok daha farklı yerlere götüreceği için ben kısaca "lafı bırak, iş yap" diyerek kodlamaya devam diyorum :)

Erdemcim, sevgili kardeşim bir ara atla gelde bir bardak çay içelim, sana özel sunumu tekrar yapayım. Ben sunumları yayınlaması için Ali'ye göndermiştim ama sanırım biraz tembellik yapmış, biz Ali'nin tembel halinide seviyoruz ama öyle değil mi? ;) Ben sunumun bir kopyasını sana iletirim.
https://github.com/zafer06 - depo
erdem (Moderatör) #58
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tamam Zafercim. Eğer Ramazan'dan sonra bir gün bir fırsat olursa neden olmasın  :-)  

Bu arada sunum için teşekkürler.

Evet Ali beyin her halini seviyoruz  :-p
acehreli (Moderatör) #59
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ı
Ben kafaca bir yaz tatiline girdim galiba. :) İngilizceleştirme konusunda da çok yavaşladım. Şu sıralar elim değmiyor. Aslında 4-5 bölüme küçük ama önemli ekler yaptım ama onları da daha siteye koymuyorum. Örneğin, sırada Erdem'in sorusuyla hatırladığımız 'static opCall' var.

Ali
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:
Sayfa:  önceki  1  2  3  4 
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-22, 04:58:36 (UTC -08:00)