配列
-
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();
}
- 説明はコードコメントとして含まれている:
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();
}
- このプログラムには3つの間違い(バグ)がある。最初の2つは
while
ループにある。両方のループ条件では、<
演算子の代わりに<=
演算子が使われている。その結果、プログラムは無効なインデックスを使用し、配列の一部ではない要素にアクセスしようとしている。3つ目のミスは自分でデバッグした方が良いので、まず前の2つのバグを修正してからプログラムを実行してみて。プログラムが結果を表示しないことに気づくはずだ。次の段落を読む前に、残りの問題を解決できるだろうか?
最初の
while
ループが終了したときのi
の値は5であり、その値によって2番目のループの論理式がfalse
となり、2番目のループが実行されなくなっている。解決策は、2番目のwhile
ループの前に、i
を0にリセットすることだ。例えば、次のような文を使用する。i = 0;