配列

  1. import std.stdio;
    import std.algorithm;
    
    void main() {
        write("How many values will be entered? ");
        int count;
        readf(" %s", &count);
    
        double[] values;
        values.length = count;
    
        // カウンタは通常'i'と名付けられる
        int i;
        while (i < count) {
            write("Value ", i, ": ");
            readf(" %s", &values[i]);
            ++i;
        }
    
        writeln("In sorted order:");
        sort(values);
    
        i = 0;
        while (i < count) {
            write(values[i], " ");
            ++i;
        }
        writeln();
    
        writeln("In reverse order:");
        reverse(values);
    
        i = 0;
        while (i < count) {
            write(values[i], " ");
            ++i;
        }
        writeln();
    }
    D
    arrays.solution.1
  2. 説明はコードコメントとして含まれている:
    import std.stdio;
    import std.algorithm;
    
    void main() {
        // 入力から読み込まれる値の数がわからないため、
        // 動的配列を使用する
        int[] odds;
        int[] evens;
    
        writeln("Please enter integers (-1 to terminate):");
    
        while (true) {
    
            // 値を読み込む
            int value;
            readf(" %s", &value);
    
            // 特別な値-1はループを中断する
            if (value == -1) {
                break;
            }
    
            // 値が奇数か偶数かに応じて、対応する配列に追加する。
            // 2で割った余りがなければ、
            // その値は偶数である。
            if ((value % 2) == 0) {
                evens ~= value;
    
            } else {
                odds ~= value;
            }
        }
    
        // 奇数と偶数の配列は別々にソートされる
        sort(odds);
        sort(evens);
    
        // 2つの配列を結合して新しい配列を作成する
        int[] result;
        result = odds ~ evens;
    
        writeln("First the odds then the evens, sorted:");
    
        // ループで配列の要素を表示する
        int i;
        while (i < result.length) {
            write(result[i], " ");
            ++i;
        }
    
        writeln();
    }
    D
    arrays.solution.2
  3. このプログラムには3つの間違い(バグ)がある。最初の2つはwhileループにある。両方のループ条件では、<演算子の代わりに<=演算子が使われている。その結果、プログラムは無効なインデックスを使用し、配列の一部ではない要素にアクセスしようとしている。

    3つ目のミスは自分でデバッグした方が良いので、まず前の2つのバグを修正してからプログラムを実行してみて。プログラムが結果を表示しないことに気づくはずだ。次の段落を読む前に、残りの問題を解決できるだろうか?

    最初のwhileループが終了したときのiの値は5であり、その値によって2番目のループの論理式がfalseとなり、2番目のループが実行されなくなっている。解決策は、2番目のwhileループの前に、iを0にリセットすることだ。例えば、次のような文を使用する。i = 0;