Forum: Ders Arası RSS
Şablonlar ile yığın sınıfı
Sayfa:  1  2  3  4  sonraki 
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Şablonlar ile yığın sınıfı
Bir süredir şablonlara karşı müthiş bir ilgi duyuyorum. Daha öncesinde hiç kullanmadım. İlk C++ ile tanıdım ama hepsi o kadar daha sonra C#'ın generic programlama (http://www.asp.net.tr/Makale/897-C--Generic--programlama-G…) yaklaşımı ile biraz daha yakından ilgilenme fırsatım oldu. Şimdilerde ise D dilinin sağladığı olanak olarak ilgimi çekiyor. Özellikle şablonlar hakkında şuradaki yazıdan (http://www.bilisim-kulubu.com/sozluk/sozluk.php?e=generics) sonra daha yakından incelemeye ve öğrenmeye karar vardim.

Bu sebeple şablon olarak hazırlanmış bir yığın sınıfı yazmaya çalışıyorum. Gerçi tam kodlamayı yaptım dersaneye bir göz atayım dedim. Ali'nin yazdığı ve aynı mantıkta olan yiğin sınıfını gördüm. Eklesem mi diye düşünürken belki üzerinde farklı konularda bilgi paylaşımı olur düşüncesi ile kodu ekliyorum.

import std.stdio;
import std.exception;
 
class Yigin(T) 
{
    private int konum;
    private T[] yigin;
 
    public this(int kapasite) 
    {
        enforce(kapasite >=0, "Yigin buyuklugu negatif olamaz!");
        yigin.length = kapasite;
        konum = -1;
    }
 
    public void Push(T)(T deger)
    {
        if (konum == yigin.length)
        {
            throw new Exception("Yigin dolu");
        }
 
        konum++;
        yigin[konum] = deger;
    }
 
    public T Pop()
    {
        if (konum == -1)
        {
            throw new Exception("Yigin bos");
        }
 
        return yigin[konum--];
    }
}
 
void main()
{
    Yigin!(string) stack = new Yigin!(string)(10);
 
    stack.Push("ben");
    stack.Push("bir");
    stack.Push("D");
    stack.Push("Dili");
    stack.Push("yigin");
    stack.Push("sinifiyim");
 
    for (int i = 0; i < 6; ++i)
    {
        writeln("Deger : ", stack.Pop());
    }
}
https://github.com/zafer06 - depo
Kadir Can #2
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Eline sağlık zafer, güzel kodlar.
Böyle bir yapıyla foreach kullanmak iyi olurdu.Son giren ilk çıkar(LIFO) yapısını koruyarak;
 
import std.stdio;
import std.exception;
 
class Yigin(T) 
{
    private int konum;
    private T[] yigin;
 
    public this(int kapasite) 
    {
        enforce(kapasite >=0, "Yigin buyuklugu negatif olamaz!");
        yigin.length = kapasite;
        konum = -1;
    }
 
 
    public void Push(T)(T deger)
    {
        if (konum == yigin.length)
        {
            throw new Exception("Yigin dolu");
        }
 
        konum++;
        yigin[konum] = deger;
    }
 
    public T Pop()
    {
        if (konum == -1)
        {
            throw new Exception("Yigin bos");
        }
 
        return yigin[konum--];
    }
 
    int opApply(int delegate(ref T) islemler)
    {
        int sonuc;
        for(int i = yigin.length - 1; i >= 0; --i){
            if( yigin[i] != null ){
               sonuc = islemler(yigin[i]);
            }
        }
        return sonuc;
    }
}
 
void main()
{
    Yigin!(string) stack = new Yigin!(string)(10);
 
    stack.Push("ben");
    stack.Push("bir");
    stack.Push("D");
    stack.Push("Dili");
    stack.Push("yigin");
    stack.Push("sinifiyim");
 
    foreach (eleman; stack)
    {
        writeln("Deger : ", eleman);
    }
}
Ayrıca tasarım açısından üye işlevlerde hata atma kısmı in bloklarına alınsa daha düzenli olabilir ama sanırım bu blokları kullanmayı pek sevmiyorsun. :)
canalpay (Moderatör) #3
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ayrıca tasarım açısından üye işlevlerde hata atma kısmı in bloklarına alınsa daha düzenli olabilir ama sanırım bu blokları kullanmayı pek sevmiyorsun. :)

Koda bakmadim ancak hatalar icin enforce ve throw kullanildigina gore kullanici kaynakli hata olabilir. sozlesmeli programlama yaparsak dmdye verecegimiz komut ile bu hatalari bakmayi istemeden iptal edebiliriz. Onun icin inde olmamali.

foreach ise stack.Pop uye islevini kullanmak icin kullanmamis.
zafer #4
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
Kadir Can:
Eline sağlık zafer, güzel kodlar.
Böyle bir yapıyla foreach kullanmak iyi olurdu.Son giren ilk çıkar(LIFO) yapısını koruyarak;

Teşekkürler Kadir, aslına bakarsan öncelikli amacım şablon sınıfına yoğunlaşmaktı. Bu sebeple diğer olanakları biraz göz ardı ettim.

Güvenlik konusunda ise (in blokları) bu konuda sunum yapmış birisi olarak :) çok abartılmamalı diye düşünüyorum. Eminim hepimizin evinin giriş kapısında iki veya üç kilit var ancak on tane kilit olan bir kapı ben hiç görmedim. Yinede yazdığın gibi belki sözleşmeli programlama ile ilgili bazı olanaklardan faydalanılabilir. Örneğin invariant olanağını gerçeklemeye ne dersin ?

Ayrıca bu kodu eklerken bunun üzerine bir iki şey yazarız diye düşünmüştüm. Ancak Kadir'in opApply gerçeklemesi gerçekten çok hoşuma gitti. Eline sağlık Kadir çok güzel olmuş.

Ben opApply içindeki if kontolünden kurtulmak için kodu şöyle düzenlemeye çalıştım. Birde siz bakın nasıl olmuş, bir eksik veya hata var mı? Ne dersiniz ?

    int opApply(int delegate(ref T) islemler)
    {
        int sonuc;
        for(int i = konum; i >= 0; --i)
        {
            sonuc = islemler(yigin[i]);
        }
        return sonuc;
    }

canalpay:
foreach ise stack.Pop uye islevini kullanmak icin kullanmamis.

Can, aslında hem evet, hem hayır :) önce bende foreach düşündüm ama dediğim gibi hem şablon olanağına odaklandığım için, hemde kodlar mümkün olduğunca sade olsun diye for döngüsünü kullandım. for'u özlemişim bu arada uzun zamandır neredeyse hiç kullanmamıştım :)

Son olarak Kadir'den aldığım şevk ile bende foreach olanağını gerçeklemek için sınıf üzerinde aralık yapısını kodlamaya karar verdim. Biraz uğraştıktan sonra şöyle bişey oldu. Eğer hata yoksa ilk aralık gerçeklememi yazmış oldum :)

import std.stdio;
import std.exception;
 
class Yigin(T) 
{
    private int konum;
    private int bas;
 
    private T[] yigin;
 
    public this(int kapasite) 
    {
        enforce(kapasite >=0, "Yigin buyuklugu negatif olamaz!");
        yigin.length = kapasite;
        konum = -1;
    }
 
    public void Push(T)(T deger)
    {
        if (konum == yigin.length)
        {
            throw new Exception("Yigin dolu");
        }
 
        konum++;
        yigin[konum] = deger;
    }
 
    public T Pop()
    {
        if (konum == -1)
        {
            throw new Exception("Yigin bos");
        }
 
        return yigin[konum--];
    }
 
    bool empty() const
    {
        // Aralıktaki eleman mevcudunu denetler. 
        // true ise eleman bitmiştir.
        return (konum < 0);
    }
 
    void popFront()
    {
        // Bir sonrakine geçmek, mevcut eleman
        // sıramızda her defasında sondan bir tane
        // dışarı çıkarmak
        --konum;
    }
 
    string front() const
    {
        // ilgili konumdaki elemanı bize verir
        return yigin[konum];
    }
}
 
void main()
{
    Yigin!(string) stack = new Yigin!(string)(10);
 
    stack.Push("ben");
    stack.Push("bir");
    stack.Push("D");
    stack.Push("Dili");
    stack.Push("yigin");
    stack.Push("sinifiyim");
 
    foreach (kelime; stack)
    {
        writeln("Deger : ", kelime);   
    }
}
https://github.com/zafer06 - depo
acehreli (Moderatör) #5
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ı
Karışık olarak notlarım:

  • Yığın (veya bazen "yığıt"?) yapısı geleneksel olarak yalnızca üstteki elemana erişim sağladığı için foreach ile kullanılmasa da eksikliği çekilmez herhalde.

  • opApply() içinde islemler()'in döndürdüğü değere bakmayı unutuyorsunuz. O değer sıfırdan farklı ise bizim kullanıcımız kendi foreach döngüsü içindeyken 'break' demiş demektir. Ona saygı göstermeli ve sonuç sıfırdan farklı olduğunda biz de opApply()'dan çıkmalıyız.

  • Başkalarının da söylediği gibi, Zafer'in 'in' bloklarını kullanmıyor olması doğru. Aslında Push()'ta ve Pop()'ta da enforce kullanabilir. (Ama sunumunu yapmış birisi olarak istediği yöntemi de seçebilir. ;))

  • Benim de son zamanlarda farkına vardığım bir konu var: Topluluklarla aralıkları birbirlerinden ayrı tutmak gerek. Eğer Yığın bir topluluksa, foreach onun üzerinde değil, onun bir aralığı üzerinde ilerlemelidir. Yoksa ilerledikçe topluluğu tüketmiş oluruz.

Bunun örneğini biraz olsun dilimlerde görüyoruz. Dilim üzerinde foreach ile ilerlendiğinde asıl elemanlar kaybolmazlar, o dilimin eriştirdiği eleman adedi azalır. Oysa Yığın'da ilerlendikçe elemanlar asıl topluluktan eksiliyorlar.

Doğrusunu isterseniz Yığın gibi bir yapıda bunun bir çözümü de olmamalı. Eğer Yığın yukarıda dediğim gibi hep en üsttekine eriştiren bir topluluk ise zaten üzerinde ilerlemek tanım gereği eleman kaybettirmelidir.

Neyse... Bu son söylediğim madde aklımızda bir iz bıraksın yeter. Yığın için yapacak bir şey yok gibi...

Ali
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Çok güzel bir örnek...

Öyle ki bir elektronikçi olarak Zafer'i kıskandım şimdi! Çünkü benim yapmam gerekirdi...:)

Neyse önemli olan bu ilk giren son çıkar yapısını kodlamak ve kimin yaptığından çok D'de bunu temsil edebilmek. Gerçekten çok hoş ve sade bir örnek. Gerçi empty() hiç kullanılmamış, örneğin şu şekilde de tüm işlevler kullanılmış olabilir:
    with(stack) {
        Push("start");
        Push("1"); Push("2"); Push("3");
        do {
            Pop.writeln;
        } while(!empty);
    }
Çıktısı:
3
2
1
start

Bir de sade anlam yerine isEmpty() olsa sanki daha anlamlı olacak. Çünkü ismine bakınca bunun ne işe yaradığı tam anlaşılmıyor ve biraz daha anlam katmak gerekiyor. Belki de tamamen Türkçe'ye çevirip push yerine yolla, pop yerine getir ve empty yerine de boş_mu kullanabiliriz, ne dersiniz?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Kadir Can #7
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
Doyurucu bilgiler için teşekkürler.Özellikle veri yapılarında sıkıntım var, D.ershane bittikten sonra çalışmam gerek.
in ile ilgili bir sorum var, eğer hata düzeltilemeyecek seviyede değilse assert() veya enforce() yerine hata atmak daha faydalı sanırım.Peki, o zaman assert() ve enforce() kullanmak çok da mantıklı gelmiyor, çünkü madem hata atıp uyarıda bulunabileceksek, ayrıca o hataları yakalayıp sorunu programı kesmeden düzeltebileceksek programı bir anda bitirmenin gereği var mı?Çok zorunlu durumlar dışında hata atmak daha kullanışlı oluyor sanırım.
Açıkçası kafam karıştı.Belki de bu mesajdaki düşüncelerimle doğru olanı yakaladım.Siz ne düşünüyorsunuz?
acehreli (Moderatör) #8
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ı
Kadir Can:
eğer hata düzeltilemeyecek seviyede değilse assert() veya enforce() yerine hata atmak daha faydalı sanırım.

Oradaki birden fazla olumsuz anlam benim anlamamı güçleştiriyor. :) Ayrıca hem assert() hem de enforce() hata attıkları için onların "yerine hata atmak" demen kafamı karıştırıyor.

Peki, o zaman assert() ve enforce() kullanmak çok da mantıklı gelmiyor, çünkü madem hata atıp uyarıda bulunabileceksek, ayrıca o hataları yakalayıp sorunu programı kesmeden düzeltebileceksek programı bir anda bitirmenin gereği var mı?

Eğer patlayan assert() ise evet, programı hemen sonlandırmak gerekir çünkü programladığımızı sandığımız mantığın dışında hareket etmektedir. İşte bu yüzden assert() Assert veya ondan türemiş olan bir hata atar. Assert'ün veya ondan türemiş olan bir hatanın yakalanması ise hiç önerilmez. Hatta D bu tür bir hata atıldığında yığıtın temizliği konusunda da hiçbir garanti getirmez. Durum çok kötüdür ve bu yüzden işlemlerin hemen sonlanmaları şarttır.

Eğer patlayan enforce() ise, zaten programı sonlandırmıyoruz; bir hata atıyoruz. Bizi çağıran düzeylerdeki bir kod o hatayı yakalayabilir ve gereken önlemi alabilir. Zaten enforce()'un etkisi şundan başka bir şey değil:

if (!koşul) {
    throw new Exception(/* ... */);
}

Görüldüğü gibi, enforce() Exception türünde bir hata atar. Assert'ün tersine, bu tür hatalar yakalanabilirler.

Benim izlediğim ilkeler:

in bloğunda assert'ler: Bu programın, modülün, sınıfın, vs. mantığı ile ilgili olan doğruları denetlemek için.

İşlev içinde enforce'lar: Bu işlevi çağıran kullanıcıların gönderdikleri parametreleri denetlemek için.

Ali
Kadir Can #9
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler, işte şimdi her şey oturdu. :)
İlk alıntıda hata programın hemen sonlanmasını gerektirmeyecekse assert() ile tutmayacağımız bir hata atmak yerine  tutacağımız hata atmanın( Orada enforce()'un da Exception türünden hata attığını gözden kaçırmışım.) daha faydalı olacağından bahsetmiştim.
Avatar
Salih Dinçer #10
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #6
Az önce aşağıdaki kodun istediğimiz zaman hata döndürmediğini, yukarıdaki bir sınıftan core.exception'a takılıp "Range violation" hatasını verdiğini farkettim:
    public void Push(T)(T deger)
    {
        if (konum == yigin.length)
        {
            throw new Exception("Yigin dolu");
        }
        
        konum++;
        yigin[konum] = deger;
    }
Yığın boş olduğunda sorun yok ve hatayı yakalayabiliyorum. Sanki büyük eşit (>=) yapılırsa sorun düzeliyor. Bir de buna şu şekilde try/catch kümesi eklersek harika olabilir.
    try {
        with(stack) do Pop.write(", "); while(!empty);
        stack.Pop.writeln; // boşalmış yığından hata döndürecek...
    }
    catch (Exception hata) {
        writeln("Sorun var:", hata);
    }
Dip Not: Yukarıda verdiğim kodu tek satırda kısalttığım için kusura bakmayın. Tekrar olmasın dedim bir de her zaman ki alışkanlığım işte...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #11
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Dolu dolu bilgi var, nereden başlayacağımı bilemiyorum doğrusu, en iyisi en baştan başlamak sanırım.

acehreli:
Aslında Push()'ta ve Pop()'ta da enforce kullanabilir.

Ali haklısın amacım sadece daha fazla olanağı bir arada gösterebilmekti.


acehreli:
Eğer Yığın bir topluluksa, foreach onun üzerinde değil, onun bir aralığı üzerinde ilerlemelidir.

Bu maddeyi biraz daha açmanın çok faydalı olacagını düşünüyorum. Aralıklarla yeni yeni ilgenen biri olarak foreach üzerinde ilerlemek ile aralık üzerinde ilerlemek arasındaki farkı anlamadım?

Salih Dinçer:
Öyle ki bir elektronikçi olarak Zafer'i kıskandım şimdi! Çünkü benim yapmam gerekirdi...:)

Salih aramızda ayrı gayrı yok, senden daha güzel örnekler bekliyoruz. empty() konusuna gelince aslında o empty() metodu halka açık kullanım için tasarlanmadı. O empty() metodu aralık olanağını gerçekleştirmek için kullanılan empty, popFront, front üçlemesinin bir parçası ve bu şekilde kullanım tehlikeli çünkü yıgını bitiriyor.

Aslında şöyle bir bakıyorum da bu örnek bize erişim belirteçlerinin ne kadar değerli olduğunu bir kez daha gösteriyor. Erişim belirteçlerini kullanarak olası bir çok hatayı baştan önleyebilecegimiz gibi terside mümkün tabi.

Ben yigin sınıfını başka bir module taşıyıp erişim belirtecini private olarak işaretledim. Bu erişimi kısıtladı ve dışarıdan kullanımı iptal etti ancak bu yapı aralık olanağınında erişimini engelledi. Buna nasıl çözüm bulabilirim?

Error: class yigin.Yigin!(string).Yigin member empty is not accessible

Son olarak Kadir'e söylemiştim ama sanırım pek ilgisini çekmedi. Sözleşmeli programlamanın invariant() olanağını bu sınıfta gerçekleştirmeye çalıştım. Yalnız bunu yaparken şöyle bir olay ile karşılaştım. invariant() bloğunda kullandığım assert() ifadesinde aşağıdaki yazımı bir türlü çalıştıramadım.

assert(konum < yigin.length);

Sonunda çözümü şu şekilde gerçekleştirdim. Ancak neden çalışmadığını anlayamadım. Siz ne dersiniz?

int yiginKapasitesi = yigin.length;
assert(konum < yiginKapasitesi);

Ayrıca Salih'in belirttigi "Yigin dolu" hatasını düzelttim. Salih'e teşekkürler.

import std.stdio;
import std.exception;
 
class Yigin(T) 
{
    private int konum;
 
    private T[] yigin;
 
    public this(int kapasite) 
    {
        enforce(kapasite >=0, "Yigin buyuklugu negatif olamaz!");
        yigin.length = kapasite;
        konum = -1;
    }
 
    invariant()
    {
        int yiginKapasitesi = yigin.length;
        assert(konum < yiginKapasitesi);
    }
 
    public void Push(T)(T deger)
    {
        if (konum < yigin.length)
        {
            throw new Exception("Yigin dolu");
        }
 
        konum++;
        yigin[konum] = deger;
    }
 
    public T Pop()
    {
        if (konum == -1)
        {
            throw new Exception("Yigin bos");
        }
 
        return yigin[konum--];
    }
 
    bool empty() const
    {
        // Aralıktaki eleman mevcudunu denetler. 
        // true ise eleman bitmiştir.
        return (konum < 0);
    }
 
    void popFront()
    {
        // Bir sonrakine geçmek, mevcut eleman
        // sıramızda her defasında sondan bir tane
        // dışarı çıkarmak
        --konum;
    }
 
    string front() const
    {
        // ilgili konumdaki elemanı bize verir
        return yigin[konum];
    }
}
 
void main()
{
    Yigin!(string) stack = new Yigin!(string)(10);
 
    stack.Push("ben");
    stack.Push("bir");
    stack.Push("D");
    stack.Push("Dili");
    stack.Push("yigin");
    stack.Push("sinifiyim");
 
    foreach (kelime; stack)
    {
        writeln("Deger : ", kelime);   
    }
    
}
https://github.com/zafer06 - depo
Kadir Can #12
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben onu tamamen unutmuşum.Artık telafi edecek bir kod yazmam gerekir. :)
Push() işlevi hatalı gibi geldi.konum sürekli yigin.length'ten küçük olmalı, yoksa farklı bir şey mi var?
zafer #13
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kadir Can:
Ben onu tamamen unutmuşum.Artık telafi edecek bir kod yazmam gerekir. :)

Sorun değil Kadir, ben eklemiş oldum. Telafisini bekliyoruz artık. ;) Küçük bir öneri belki Yıgın sınıfına Clear() isimli bir metot ekleyerek kullanıcı istediginde mevcut yıgını temizlemesini sağlayabiliriz.

Kadir Can:
Push() işlevi hatalı gibi geldi.konum sürekli yigin.length'ten küçük olmalı, yoksa farklı bir şey mi var?

Ben bir hata göremiyorum ama istersen birlikte tekrar bakalım;

    public void Push(T)(T deger)
    {
        if (konum < yigin.length)
        {
            throw new Exception("Yigin dolu");
        }
 
        konum++;
        yigin[konum] = deger;
    }

Evet, konum degişkeni burada Yıgın sınıfının üye degişkeni ve görevi yıgın üzerinde bulunulan konumu göstermek. Yıgın yapısı için biz bir dizi kullandık, dizimiz sıfırdan başlıyor ve kullanıcının girdigi değer kadar bir büyüklüğe sahip. Örneğin kullanıcı on elemanlı bir yıgın oluşturmak isterse bizim yıgın dizimiz en fazla on elemanlı oluyor.

Bu duruma göre konum degişkeni yıgın dizisi üzerindekl geçerli konumları göstermesi gerekiyorsa her zaman yigin dizisini boyutundan küçük olmak zorunda.
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #14
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #11
zafer:
Salih aramızda ayrı gayrı yok, senden daha güzel örnekler bekliyoruz. empty() konusuna gelince aslında o empty() metodu halka açık kullanım için tasarlanmadı. O empty() metodu aralık olanağını gerçekleştirmek için kullanılan empty, popFront, front üçlemesinin bir parçası ve bu şekilde kullanım tehlikeli çünkü yıgını bitiriyor.
Estağfirullah, aslında bugün senin kodu görmeseydim nasıl bir kod yazardım diye kendi kendime düşündüm. Aşağıdaki gibi bir örnek hazırladım ama hiç aralık işlevlerini dahil etmedim. Henüz aralıklara yeteri kadar hakim değilim ama kesinlikle çok faydalılar. Eğer tamamen anlamayı başarırsam asal sayılarda çok işe yarayacağını düşünüyorum. Sanırım TÜTEV'deki etkinlikte özel olarak, aralıklardan söz etmedik öyle değil mi?
import std.exception, std.stdio;
 
class Yığıt (T){
    private size_t konum;
    private T[] bellek;
    
    void yolla(T veri) {
        konum++;
        bellek ~= veri;
    }
    T getir() {
        if(konum) konum--;
        else throw new Exception("HATA(1): YIĞIN BOŞ");
        return bellek[konum];
    }
    bool temizle() {
        konum = 0;
        bellek = bellek[0..0];
        return true;
    }
    bool halaDolu_mu() {
        return konum > 0;
    }
}
void main() {
    with(new Yığıt!int) {
        for(int i; i < 10; i++) yolla(i); // 0'dan 10'a yığına yolla
        konum.writeln("\n^---Yüklenen veri adeti / türü --->", typeid(bellek));
        if(temizle) goto atla;
        do getir.write(", "); while(halaDolu_mu);
        writeln("\n");
    }
atla:
    with(new Yığıt!char) {
        for(char i=65; i < 91; i++) yolla(i); // A'dan Z'ye yığına yolla
        konum.writeln("\n^---Yüklenen veri adeti / türü --->", typeid(bellek));
        do getir.write(", "); while(halaDolu_mu);
        //getir.writeln("\n"); // Taşma durumunda hata verecek...
    }
}
zafer:
Ben yigin sınıfını başka bir module taşıyıp erişim belirtecini private olarak işaretledim. Bu erişimi kısıtladı ve dışarıdan kullanımı iptal etti ancak bu yapı aralık olanağınında erişimini engelledi. Buna nasıl çözüm bulabilirim?
Bu arada aklıma gelmişken, ben de private ile ilgili olarak çok ilginç bir sorun ile karşılaştım! Çünkü public gibi davranıyor. Bunu yukarıda denediğim örnekte de görebilirsiniz. Zafer'in kodunda ise Push'lardan sonra şu satırı eklemeniz yeterli:
    stack.konum.writeln;
Herhalde benim DMD'de bir sorun var. Sizde de böyle bir sorun oluyor mu, yoksa ben bir şeylerimi karıştırdım?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
canalpay (Moderatör) #15
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok fazla kod ve yazı yazılmış okuyamadım :-)

Bu arada aklıma gelmişken, ben de private ile ilgili olarak çok ilginç bir sorun ile karşılaştım! Çünkü public gibi davranıyor. Bunu yukarıda denediğim örnekte de görebilirsiniz. Zafer'in kodunda ise Push'lardan sonra şu satırı eklemeniz yeterli:
    stack.konum.writeln;
Herhalde benim DMD'de bir sorun var. Sizde de böyle bir sorun oluyor mu, yoksa ben bir şeylerimi karıştırdım?


Bir yıl önce dmd'nin bilinen hatalarından biri idi. Şimdi ne oldu bilmiyorum ancak anlaşılan devam ediyor :-)
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:  1  2  3  4  sonraki 
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, 00:31:22 (UTC -08:00)