集計処理

for文を使った配列の集計は少し複雑であるため、もう少しだけ補足してみます。その前に簡単にfor文の形式をおさらいしておきましょう。

for (int i = 0; i < (繰り返し回数); i++) {
    <命令>
}

この繰り返しがよくわからなくなった場合、次のように繰り返しを展開してやると「どのような順番で命令が処理されていくか」ということが分かりやすくなります。ただし、「<命令>」と「i++;」はfor文に指定した「繰り返し回数」だけ繰り返されることになります。

int i = 0;
<命令>
i++;
<命令>
i++;

<命令>
i++;

今回の例に使用した、配列の要素を集計するプログラムも先ほどと同様に展開してみましょう。まずは展開前のプログラムです。

int total = 0;
for (int i = 0; i < values.length; i++) {
    total = total + values[i];
}
JOptionPane.showMessageDialog(null, "合計は" + total);

これを展開すると、次のようなプログラムになります。

int total = 0;
int i = 0;
total = total + values[i];
i++;
total = total + values[i];
i++;
total = total + values[i];
i++;
total = total + values[i];
i++;
total = total + values[i];
i++;
JOptionPane.showMessageDialog(null, "合計は" + total);

集計を行うプログラムで重要なのは、「集計の途中結果を記憶させている変数」です。今回は「total」という変数を途中結果の計算に使っています。これが繰り返しの中でどのように変化していくかを考えるのが、配列の集計プログラムを書く際のポイントになります。

集計を行うプログラムがわかりにくい場合には、命令が1つずつ処理されていくことを追跡する流れを表にまとめる、「実行トレース (execution trace)」というものを作成すると見通しがよくなります。


実行トレースを作成するポイントは、次の3点です

  1. 繰り返し付近で処理されるすべての命令を縦に列挙する
  2. 繰り返しに出現するすべての変数を横に列挙する
  3. 各命令を処理すると、それぞれの変数がどのように変化するかをまとめる

今回の例はExcelというソフトウェアを使って書きましたが、実際には紙とペンを使って書いてもかまいません。とにかく、すべての命令とすべての状態を列挙してみることが大切です。実行トレースを使ってもわからない場合には、展開したプログラムを印刷して、下記のように「変数の現在の値」をメモしていくといいかもしれません。代入の左側に出てきた場合には、(古い値→新しい値)のように新旧の値を書いています。

int total(?→0) = 0;
int i(?→0) = 0;
total(0→10) = total(0) + values[i](10);
i(0→1)++;
total(10→30) = total(10) + values[i](20);
i(1→2)++;
total(30→60) = total(30) + values[i](30);
i(2→3)++;
total(60→100) = total(60) + values[i](40);
i(3→4)++;
total(100→150) = total(100) + values[i](50);
i(4→5)++;
JOptionPane.showMessageDialog(null, "合計は" + total(150));