D Programlama Dili - Çözümler

Diziler

  1. import std.stdio;
    import std.algorithm;
    
    void main() {
        write("Kaç sayı var? ");
        int adet;
        readf(" %s", &adet);
    
        double[] sayılar;
        sayılar.length = adet;
    
        int sayaç;
        while (sayaç < adet) {
            write("Sayı ", sayaç, ": ");
            readf(" %s", &sayılar[sayaç]);
            ++sayaç;
        }
    
        writeln("Sıralı olarak:");
        sort(sayılar);
    
        sayaç = 0;
        while (sayaç < adet) {
            write(sayılar[sayaç], " ");
            ++sayaç;
        }
        writeln();
    
        writeln("Ters sırada:");
        reverse(sayılar);
    
        sayaç = 0;
        while (sayaç < adet) {
            write(sayılar[sayaç], " ");
            ++sayaç;
        }
        writeln();
    }
    
  2. Açıklamalar kodun içinde:
    import std.stdio;
    import std.algorithm;
    
    void main() {
        // Kaç tane sayı geleceğini baştan bilmediğimiz için
        // dinamik diziler kullanıyoruz
        int[] tekler;
        int[] çiftler;
    
        writeln("Lütfen tamsayılar girin (sonlandırmak için -1)");
    
        while (true) {
    
            // Sayıyı okuyoruz
            int sayı;
            readf(" %s", &sayı);
    
            // Sayı özellikle -1 olduğunda döngüden çıkıyoruz
            if (sayı == -1) {
                break;
            }
    
            // Tek veya çift olması durumuna göre farklı dizinin
            // sonuna yerleştiriyoruz; ikiye bölümünden kalan 0
            // ise çifttir, değilse tektir
            if ((sayı % 2) == 0) {
                çiftler ~= sayı;
    
            } else {
                tekler ~= sayı;
            }
        }
    
        // Önce tekleri ve çiftleri ayrı ayrı sıralıyoruz
        sort(tekler);
        sort(çiftler);
    
        // Ondan sonra birleştiriyoruz
        int[] sonuç;
        sonuç = tekler ~ çiftler;
    
        writeln("Önce tekler, sonra çiftler; sıralı olarak:");
    
        // Daha önce gördüğümüz gibi bir döngü kurarak dizinin
        // bütün elemanlarını çıkışa yazdırıyoruz
        int i;
        while (i < sonuç.length) {
            write(sonuç[i], " ");
            ++i;
        }
    
        writeln();
    }
    
  3. Bu programda üç hata var. İki hata while döngüleriyle ilgili: her ikisinde de < işleci yerine <= kullanılmış. O yüzden program yasal olmayan bir indeks kullanarak dizinin dışına taşıyor.

    Üçüncü hatayı kendiniz uğraşarak gidermeniz önemli olduğundan çözümü hemen vermek istemiyorum. Yukarıdaki iki hatayı giderdikten sonra programı tekrar derleyin ve neden sonucu yazdırmadığını bir sonraki paragrafı okumadan kendiniz çözmeye çalışın.

    i sayacı hâlâ bir önceki döngüden çıkıldığındaki değerinde olduğundan, ikinci while döngüsünün koşulu hiçbir zaman sağlanmaz ve ikinci döngü bir kere bile tekrarlanmaz. Çözüm olarak ikinci döngüden önce bir i = 0; ifadesi yazmanız gerekir.