Forum: D Programlama Dili RSS
Girişten tek tek sayı okumak
Sayfa:  1  2  sonraki 
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Girişten tek tek sayı okumak
Girişten sayıları okuyan bu sınıfın D sürümünü yapmaya çalışıyorum.

http://introcs.cs.princeton.edu/java/stdlib/StdIn.java.html

Bunu kullanan örnek şu şekilde:

        while (!StdIn.isEmpty()) {
            int p = StdIn.readInt();
            int q = StdIn.readInt();
            /*  ... */
        }

Şimdi burada dikkat ederseniz, giriş boş olmadığı sürece girişten okuyor. Aynı zamanda readInt()'de sadece bir tane tamsayı döndürüyor.

Programı kullanırken de java programadı < giriş.txt şeklinde girişten verileri okuyor. Örnek bir giriş dosyası da bu şekilde:

10
4 3
3 8
6 5
9 4
2 1
8 9
5 0
7 2
6 1
1 0
6 7

D ile bu şekilde bir Giriş sınıfı yazsak buradaki bilgilere göre bir kuyruk mu kullanmamız gerekir.

import std.stdio;
 
class BB
{
    private:
        int[] no;
        int[] boyut;
        int kaçTane;
        
    public:
        this(int N)
        {
            assert(N >= 0);
            kaçTane = N;
            no = new int[N];
            boyut = new int[N];
            for (int i = 0; i < N; ++i) {
                no[i] = i;
                boyut[i] = i;
            }
        }
}
void main()
{
    BB bb = new BB(10);    
}

Bir de örneğin bu sınıfta no = new int[N];'in esprisi nedir.
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tabi bu kodu incelediğimde aslında bu sınıfın java.util.Scanner sınıfını saran basit bir sınıf olduğunu gördüm.

Ama scanner sınıfı oldukça yetenekli. Örneğin girişten bilgi okuyabiliyor:

     Scanner sc = new Scanner(System.in);
     int i = sc.nextInt()

Ya da bir dosyadan da okuyabiliyor.

      Scanner sc = new Scanner(new File("myNumbers"));
      while (sc.hasNextLong()) {
          long aLong = sc.nextLong();
      }

İşin ilginci karışık olarak dosya içinde bulunan sayısal ve dizgi değerlerini ayırt edebiliyor.

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close();

Çıktısı:
     1
     2
     red
     blue

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Sca…

Ya da hiç bu sınıfla uğraşmadan bildiğimiz readf ile dosyadan okutsamıydık.

Sanırım benden önce başka birisi de böyle bir girişimde bulunmuş.
acehreli (Moderatör) #3
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ı
(Aşağıdakileri senin yanıtını görmeden yazmışım.)

erdem:
Girişten sayıları okuyan bu sınıfın D sürümünü yapmaya çalışıyorum.

http://introcs.cs.princeton.edu/java/stdlib/StdIn.java.html

Önce hatırlıyorum: Standart giriş bir karakter akımıdır. (Senin bunları bildiğinden neredeyse eminim ama yine de duramadım ve yazdım. :))

O sınıf asıl işlerini java.util.Scanner'a yaptırıyor. Scanner (galiba) düzenli ifadelerden anlayan bir akım ayrıştırıcıymış.

Phobos'ta bu kavramlara yakın olarak std.format ve bir de emekliye ayrılacak olan std.cstream var. (std.format.formattedRead'i aşağıda kullandım.) Bunlara ek olarak, aralık kavramını destekleyen bir çatı düşünülüyor ama temeli karakterlere (ve hatta UTF-8 kodlarına) dayandığı için bunun tam olarak çözülebileceğini sanmıyorum.

Örneğin, int okunmasını istediğimizde girişte "ab" varsa hata kabul edilir ama "1abc" varsa 1 int olarak okunur.

Akımlarda okuma ve yazma birbirinin karşıtı da olamaz. İki int'i 10 ve 20 olarak yazsak okurken 1020 diye tek int olarak okumak zorundayızdır.

Bu tür garipliklerin bir örneği, gösterdiğin sınıfın da içine düştüğü "true", "1", "false", ve "0" dizgilerinin bool değerler olarak kabul edilmeleridir. Ya o 1 ve 0 yanlışlık sonucu araya girmiş int iseler? Yani, program içinde sıfır olmayan değerler true anlamına geliyorlar ama dosyaya 42 diye yazılmış iseler true diye okunamıyorlar. Çelişkili.

Umarım bunlar karakter akımlarının güçlüklerini göstermeye yetiyordur.

Bunu kullanan örnek şu şekilde:
        while (!StdIn.isEmpty()) {
            int p = StdIn.readInt();
            int q = StdIn.readInt();
            /*  ... */
        }

Şimdi burada dikkat ederseniz, giriş boş olmadığı sürece girişten okuyor. Aynı zamanda readInt()'de sadece bir tane tamsayı döndürüyor.

Programların standart girişlerine bağlı olan karakter akımlarının kaynağının durumu program tarafından bilinemez. Örneğin "daha 5 karakter" kaldı gibi bir bilgiyi program edinemez. Bunun nedeni, standart girişin (çoğu durumda olduğu gibi) konsola da bağlı olabileceğidir. Konsolda oturan kişinin de girişi hemen mi sonlandıracağı yoksa daha on sayfa yazdıktan sonra mı kapatacağı bilinemez.

Programı kullanırken de java programadı < giriş.txt şeklinde girişten verileri okuyor.

O durum biraz daha iyi gibi görünebilir çünkü giriş bir dosyaya bağlı. Ama yine de yeterli değildir çünkü program yine de bir karakter akımı olarak görmek zorundadır. Programın girişinde "sana 100 karakter veriyoruz" diye bir arayüz yoktur.

Ek olarak, konsol durumundaki klavyenin iç karakter belleği de dahil olmak üzere arada birden fazla ara bellek bulunabilir. Bunlar etkinlik adına bilgiyi programa belirli büyüklükteki parçalar halinde veriyor olabilirler. Örneğin bazı katmanlar ancak satır sonu karakteri gördükçe bilgiyi satır satır aktarırlar.

İşte o yüzden girişin sonuna gelinip gelinmediği ancak ve ancak girişten karakter okumaya çalıştıktan sonra ve o okuma başarısızlıkla sonuçlanmışsa ve o başarısızlık bir hata nedeniyle değil ise anlaşılabilir.

Yeni başlayanların (ve deneyimlilerin de :)) içine düştükleri bir hata:

import std.stdio;
 
void main()
{
    auto dosya = File("deneme_dosyasi");
 
    while (!dosya.eof) {
        int i;
        dosya.readf(" %s", &i);
        writeln("okudum: ", i);
    }
}

deneme_dosyasi'nın içinde "1 2 3" satırı bulunduğunu düşünelim. Ama sonda bir tane de boş satır olsun. Nasıl olsa o satırı yazıp sonunda Enter'a basmak ve kaydetmek yaygın bir davranıştır. Öyle yapıldığında program dört int okur (!): 1, 2, 3, ve 0. :p

Doğrusu, readf ile int okumaya yeltendikten sonra kaç dönüşümün başarılı olduğuna bakmaktır:

        immutable dönüşümAdedi = dosya.readf(" %s", &i);
        if (dönüşümAdedi == 1) {
            writeln("okudum: ", i);
        }

Veya eof tekrar denetlenebilir:

        if (!dosya.eof) {
            writeln("okudum: ", i);
        }

Bütün bunlara bakarak, Scanner'ın girişin boş olup olmadığı kavramı için girişten önceden karakterler toplamış olduğunu ve isEmpty() kavramı için elinde karakter bulunup bulunmadığına baktığını düşünebiliriz.

Örnek bir giriş dosyası da bu şekilde:

10
4 3
3 8
6 5
9 4
2 1
8 9
5 0
7 2
6 1
1 0
6 7

D ile bu şekilde bir Giriş sınıfı yazsak buradaki bilgilere göre bir kuyruk mu kullanmamız gerekir.

Olur ama şart değil. Tabii ki okudukça dizinin sonuna eklenebilir. Dikkat edersen onlar da bu sınıfa readInts() diye bir işlev eklemişler. O işlev girişin geri kalanını int'ler olarak okuyor. Ne yazık ki, readInts() de girişten okumanın güçlüğünün başka bir göstergesi: Yani bir dizi int ancak en sonda gelebiliyor. :( (Arada okumaya kalksak kendisinden sonra gelen ve olasılıkla diziye ait olmayan int'leri veya int olabilecek karakterleri de okurdu.)

Bir de örneğin bu sınıfta no = new int[N];'in esprisi nedir.

no'yu istersen boş olarak oluşturup okunan int'leri onun sonuna ~= ile de ekleyebilirsin. Öyle yaptığında dizi büyüdükçe yeni yer ayrılması ve elemanların kopyalanmaları gerekecektir. Eğer baştan kaç tane olduğunu bilirsen 'new int[N]' ile hepsi için o kadarlık yer ayırıyorsun. Ama aslında N adetlik gerçek bir dizi oluşuyor. Yani bütün elemanları yasaldır. Eğer bütün amaç bellekte yeni yer(ler) ayrılmasını önlemek ise std.array.reserve ile N adetlik yer de ayrılabilirdi. (Veya geçende de konuştuğumuz gibi, std.array.Appender da kullanılabilirdi.)

Ama şunu da düşünmek gerek: bütün int'leri okuyup bir diziye yerleştirmek şart mı? Yani o int'leri ancak ondan sonra mı kullanacağız? Eğer şart değilse, yani int'ler okundukça işlenebiliyorlarsa bu işi tembel olarak da halledebiliriz. byLine() File'ın içeriğini satır satır gösterir.

Ama dikkat: hızlı olsun diye hep içinde tuttuğu aynı string'i kullanır. Yani 'satır'ı doğrudan bir diziye yerleştiremezsiniz. satır.dup (veya satır.idup) ile kopyasını almak gerekir.

Benim aşağıda satırın kopyasına ihtiyacım yok:

import std.stdio;
import std.format;
import std.array;
 
void main()
{
    foreach (satır; stdin.byLine()) {
        while (!satır.empty) {
            int p;
            int q;
 
            immutable dönüşümAdedi = formattedRead(satır, " %s %s", &p, &q);
 
            if (dönüşümAdedi != 2) {
                writefln("Çift int bulamadım. :(");
 
            } else {
                writefln("p: %s, q: %s", p, q);
            }
        }
    }
}

Son olarak, bu Java sınıfının bir benzerini ddio.d ismiyle yazmaya başlamıştık. Forumda aratabilirsin. O sınıfın temeli şuradaki sayıOku() işlevine dayanıyor:

  http://www.ddili.org/ders/d/islevler.html

Ali
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu konuda şu başlıkta şöyle bir döngü kurmuştum:
    char oku;
    while (true) {
        write("=: ");
        do {
            readf("%s", &oku);
            // enter(10)'a basılana kadar okumaya devam et...
        } while (oku!=10);
    }
Belki işe yarar çünkü proje kimsenin ilgisini çekmemişe benziyordu. Bu başlığı da silip atsak mı?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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ı
Salih Dinçer:
Bu başlığı da silip atsak mı?

İlgi çekmediği konusuna kesinlikle katılmıyorum. Forumlar kalıcıdır. Bugün hiçbir kimsenin ilgisini çekmese bile yazıldığı an birisinin ilgisini çekmiştir ve gelecekte sonsuz sayıda kişinin ilgisini çekebilir.

Hiç kimsenin ilgisini çekmemiş bile olsa, hayır, silmeyelim.

Ali
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ali bey açıklamalar çok yardımcı oldu teşekkürler. Şimdi örnekleri inceliyorum.

Bu arada dikkat ediyormusunuz bilmiyorum konular çok ilginç noktalara gidiyor.

Salih'cim ben de tüm mesajların yararlı olduğunu düşünüyorum. Ama hepimizin ilgisini çeken farklı konular olduğu için açıkçası bazen ben bazı mesajları es geçiyorum. Okuyorum mesajları ama ilgimi çekmezse satır satır derlemiyorum  :blush:

Ama diğer taraftan senin yazdığın programların çoğunu deniyorum. Hatta geçenlerde @Kadir Can'ın kulakları çınlasın. Yazdığı Huffman algoritmasıyla ilgili bir program vardı. Ben de daha önceden bu algoritmayı bilmiyordum.

Haftasonu çalışıp öğrendim :)
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Programı yazdım:

import std.stdio;
import std.format;
import std.array;
import std.conv;
 
class BB
{
    int bağ[];
    int uzunluk[];
    int kaçTane;
    
    public:
        this(int N)
        {
            assert(N >= 0);
            kaçTane = N;
            bağ = new int[N];
            uzunluk = new int[N];
            for (int i = 0; i < N; ++i) {
                bağ[i] = i;
                uzunluk[i] = 1;
            }
        }
        
        int bul(int p)
        {
            assert(p >= 0 && p < bağ.length);
            while (p != bağ[p])
                p = bağ[p];
            return p;
        }
        
        int say() 
        {
            return kaçTane;
        }
 
        bool bağlıMı(int p, int q)
        {
            return bul(p) == bul(q);
        }
            
        void bağla(int p, int q)
        {
            int i = bul(p);
            int j = bul(q);
            if (i == j) return;
            
            if (uzunluk[i] < uzunluk[j]) { bağ[i] = j; uzunluk[j] += uzunluk[i]; }
            else                         { bağ[j] = i; uzunluk[i] += uzunluk[j]; }
            --kaçTane;
        }    
}
void main()
{
    int N;
    readf(" %s", &N);
    BB sayılar = new BB(N);
    
    foreach (satır; stdin.byLine()) {
        while(!satır.empty) {
            int p;
            int q;
            immutable okunanSayılar = formattedRead(satır, " %s %s", &p, &q);
            
            if (okunanSayılar != 2) {
                writeln("Çift int bulamadım");
            } else {
                if (sayılar.bağlıMı(p, q)) continue;
                sayılar.bağla(p, q);
                writefln("%s %s", p, q);
            }
        }
    }
    
    write(sayılar.say(), " tane bagli kume");
}

Şöyle çalışıyor:

  • Girişten nesne sayısını N oku
  • Tekrarla:
    • Girişten bir çift tamsayı oku
    • Eğer bağlı değillerse bağla ve bağlı çiftleri ekrana yaz.

Örneğin giriş dosyamız şu şekilde olsun:

10
4 3
3 8
6 5
9 4
2 1
8 9
5 0
7 2
6 1
1 0
6 7


Bu durumda zaten birbirine bağlı olan yeşille gösterilen kısımları ekrana yazmıyoruz.

Bunu grafiksel olarak gösterirsek programın çalışması şu şekilde:

[Resim: http://algs4.cs.princeton.edu/15uf/images/dynamic-connectivity-tiny.png]

Programın en sonunda da birbirine bağlı küme sayısını yazdırıyoruz. Bu durumda 2 olmuş oluyor:

{0 1 2 5 6 7} ve {3 4 8 9}

Programı çalıştırmak için program < giriş.txt yazmanız yeterli.
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-09-18, 07:25.
Değişiklik nedeni: programı çalıştırma seçeneğini ekledim
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ı
Bu problemi hatırlıyorum. :) Kitap bu bağlama problemini önce bir güzel böyle yaptırır. Sonra bunun ne kadar yavaş bir algoritma olduğunu gösterir. Hızlı algoritmayı görünce öğrencinin ağzı açık kalır ve algoritmaların ne kadar önemli olduklarını anlamış olur. :)

Ali
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Denemek için içerisinde 11 bağlantı olan küçük metin dosyasını, içerisinde 900 bağlantı bulunan orta büyüklükteki metin dosyasını ve içerisinde milyonlarca bağlantı bulunan bu dosyayı kullanarak Java ve D test sonuçlarını karşılaştırdım.

Java sonuçları:

real    0m48.481s
user    0m25.698s
sys    0m13.109s


D bir kaç saniye ile öne geçti ;)

599490 768644
394023 336525
203886 174275
6 bileşen

real    0m41.939s
user    0m18.021s
sys    0m11.749s


Geçen süreyi hesaplamak için time komutunu kullandım:

time ./test < largeUF.txt
acehreli (Moderatör) #10
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ı
dmd'ye -O -release -inline seçeneklerini vermeyi hatırladın, değil mi? Duyduğuma göre gdc daha hızlı programlar üretiyormuş.

Ama hız yarıya bile inse algoritmaların getirebileceği kazançlar (veya kayıplar ;))  yanında hiç önemi kalmıyor.

Ali
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bir saniye farketti ;)

Evet haklısınız.

Bu arada ben çok yavaş gidiyorum. Satır satır bazen ne yaptığını anlamaya çalışıyorum. Zaten geç kalmışım. Finaller başlamış bile. Ama önemli değil sonra tekrar alırım.

Bu arada Algorithms kitabını henüz incelemediyseniz D Programlama Dili kitabını çıkartmadan önce incelemenizi tavsiye ederim. Hem içerik hem sunuş biçimi gayet güzel. Bir de internet üzerinden derslerle birleşince harika olmuş. Örneğin ufak bir grafik kütüphanesi yazmışlar. Böylece öğrenciler sıralama algoritmalarının sonuçlarını ve nasıl çalıştığını grafiksel olarak görme imkanı buluyorlar.

Demek istediğim böylece ilginç fikirler oluşabilir.
Avatar
Salih Dinçer #12
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Arkadaşlar bu algoritmanın gerçek hayatta faydası nedir?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #13
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ı
Problem şu: Bir elektronik paneli var. (Aslında "board"un Türkçe'si ne ise ondan. İşin garibi, panel de Türkçe sayılmaz.:)) Bu panelin üzerinde numaralı noktalar var.

Dosyanın her satırı, iki nokta arasında bağlantı (örneğin, lehim) olduğunu belirtiyor. Erdem'in gösterdiği resimdeki her kırmızı bağlantı öyle bir bağlantı: 4-3, 3-8, vs.

Amaç, daha önceden aralarında bağlantı olmayan noktalar arasında ilk defa öğrenilmiş bir bağlantı görüldüğünde bunu çıkışa yazdırmak. Ama daha önce öğrenilen bilgilere göre zaten bağlantı varsa bunu yazdırmamak.

Örneğin, 8-9 bilgisi okunduğunda çıktıya 8-9 yazdırılmıyor çünkü onların arasında zaten şu yolla bir bağlantı daha önceki bilgilerden biliniyor: 8-3-4-9. (Soldaki gri renkli bilgiler yazdırılmayan satırlar.)

Bu algoritmanın esas güzelliği, hepimizin de böyle yazabileceği bu çözümün aslında en yavaşlardan birisi olması! :) Erdem daha iyi yöntemler gösterecektir.

Ali
erdem (Moderatör) #14
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Aslında Salihcim bu algoritma tam senlik :)

Gerçek hayattaki kullanım alanlarına gelince dijital fotoğrafçılık, bir ağdaki bilgisayarlar, sosyal ağlar ve Ali beyin de bahsettiği gibi elektronik. Hatta fizikte Hoshen-Kopelman Algoritmasında bir maddenin geçirgenliğinin tespitinde ve elektriksel iletkenliğin modellenmesinde kullanılıyor.

[Resim: http://www.erdem.tk/resim/resim/hoshen1.png]

Örneğin yukarıdaki matriste yalıtkan alanlar 0 ile bakırdan yapılmış kısımlar 1 ile gösterilmiş olsun. Hoshen-Kopelman algoritmasını uyguluyoruz ve sonuç.

[Resim: http://www.erdem.tk/resim/resim/hoshen2.png]

Eagle benzeri programlarla baskılı devre kartı oluştururken buna benzer şekiller ortaya çıktığını görmüşsündür.

Bu anlattıklarım biraz kabaca özeti olmuş oldu. Pratikte uygulama konuları çok ilginç..

Ali beyin de bahsettiği gibi bu yavaş çalışan yöntemlerden bir tanesi. Hatta bu veri sayısı milyarlara çıkınca 30 yıl falan sürebiliyormuş. Evladiyelik! :) Sen çalıştır torunun sonuçlarını görsün.

Ama diğer taraftan dengeli ağaç gibi veri yapıları kullanarak çok hızlı çalışması sağlanabiliyor. Yanlış algoritma kullanarak  süper bilgisayarla 10 yılda çözülebilecek bir problemi, kişisel bilgisayarınızda doğru bir algoritma kullanarak çok kısa bir sürede çözmek mümkün. Böylede ilginç bir şey var.

Tabi oyunlardan hiç bahsetmiyorum bile.

[Resim: http://erdem.tk/resim/resim/adim1.png]

Beyazlara dikkat.
[Resim: http://erdem.tk/resim/resim/adim2.png]

Artık bundan bir Pacman [Tetris demek istemiştim] mı yaparsın başka bir oyun mu yaparsın sana kalmış :)

Bir de bol bol D reklamı yapıyorum.

https://github.com/erdemoncel/algoritmalar

Olur ya belki hocalardan bir tanesi merak eder bakar sonra D ile de uygulamalar çok rahatmış. Bir sonraki kitabımı D ile yazayım diye düşünür :)
Bu mesaj 3 defa değişti; son değiştiren: erdem; zaman: 2016-02-18, 22:30.
Değişiklik nedeni: Tetris demek istemiştim
erdem (Moderatör) #15
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #7
erdem on 2012-09-18, 07:14:
Bunu grafiksel olarak gösterirsek programın çalışması şu şekilde:

Tabi aslında o grafik genel olarak bağlama işleminin nasıl yapılması gerektiğini gösteriyor. Ama benim yazdığım programın nasıl çalıştığını grafiksel olarak göstermiyor. Yukarıda yazdığım örneği grafiksel olarak gösterirsek:

    6      4
   /|\    /|\
  2 0 5  8 3 9
 / \
7   1

bağlama işlemlerinin sonunda bu şekilde iki tane ağaç oluşuyor. En sonunda değişkenleri yazdırırsanız da şu değerleri görebilirsiniz.
bag[]      : 6 2 6 4 4 6 6 2 4 4
buyukluk[] : 1 1 3 1 4 1 6 1 1 1
Program iki tane ağacı karşılaştırıyor. Her zaman küçük olan ağacı büyük olan ağacın altına ekliyor.
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-09-20, 09:45.
Değişiklik nedeni: kod etiketi ekledim
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  sonraki 
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-21, 19:26:47 (UTC -08:00)