DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on • Updated on

4章9

配列の各要素の加算のプロセスを視覚化してみましょう。配列 array は以下のようになっています:

int[][] array = { {1, 2}, {2, 3, 4} };
Enter fullscreen mode Exit fullscreen mode

この配列を行と列に分けて表すと次のようになります:

[1行目] 1  2
[2行目] 2  3  4
Enter fullscreen mode Exit fullscreen mode

プログラムが合計を計算する際の流れは以下の通りです:

  1. 最初の行(i = 0)を見ると、内側のループは j = 0 から始まります。この行には2つの要素があるので、両方の要素を合計に加えます。

    • array[0][0] の値は 1
    • array[0][1] の値は 2
    • この時点での合計は 1 + 2 = 3
  2. 次に2行目(i = 1)を見ると、内側のループは j = 1 から始まります。この行には3つの要素がありますが、最初の要素 array[1][0] はスキップされます。

    • array[1][1] の値は 3
    • array[1][2] の値は 4
    • この時点での合計に先ほどの合計 3 を加えると、3 + 3 + 4 = 10 となります。

したがって、このプログラムは配列の各行に対して、その行のインデックス(i)と同じかそれより大きい列インデックス(j)の要素のみを合計しています。これにより、次の要素が合計されます:

  • 1行目から:1, 2
  • 2行目から:3, 4(注:2行目の最初の要素(値は2)は j = i の条件によりスキップされます)

この説明と数値を基にして、合計が 10 になることが理解いただけたでしょうか。

array[1][0] がスキップされる理由

array[1][0] がスキップされる理由は、内側のループの開始条件が int j = i; となっているためです。これは i の値がループの開始インデックスとして使用されていることを意味します。各行について、内側のループはその行のインデックス番号 i の値から開始し、その行の長さまで続きます。

具体的な例として2行目を見てみましょう(i = 1 の場合):

  • 配列の2行目は {2, 3, 4} です。
  • 内側のループは int j = i; で開始されるため、j の初期値は 1 です。
  • このため、j = 0 のときの要素 array[1][0] はループの範囲に含まれず、合計には加算されません。
  • ループは array[1][1] から始まり(j = 1)、array[1][2] で終わります(j = 2)。

この規則に従って、1行目では j0 から始まるため、2つの要素(array[0][0]array[0][1])が合計に含まれます。2行目では j1 から始まるため、最初の要素はスキップされ、次の2つの要素(array[1][1]array[1][2])だけが合計に含まれます。

このロジックに基づいて、合計が計算されると、以下の要素が加算されます:

  • array[0][0](値は 1)
  • array[0][1](値は 2)
  • array[1][1](値は 3)
  • array[1][2](値は 4)

これらの値を合計すると、1 + 2 + 3 + 4 = 10 となります。

スクリーンショット 2024-01-23 10.10.14.png

変数 total の値

変数 total の値は、選択された要素の値を足し合わせた数です。このプログラムでは、2次元配列の特定の要素のみが合計に加算されます。

配列とループの条件に基づいて、次の要素が total に加えられます:

最初の行(array[0])からは、array[0][0](値は 1)と array[0][1](値は 2)が加算されます。
二番目の行(array[1])からは、array[1][1](値は 3)と array[1][2](値は 4)が加算されます。ただし、array[1][0](値は 2)はループの開始条件 int j = i; によりスキップされます。
これらの値を合計すると、1 + 2 + 3 + 4 = 10 になり、これが変数 total の最終的な値となります。この値はプログラムの最後にコンソールに出力されます。

total += array[i][j]; という式

total += array[i][j]; という式は、Javaにおける「合計計算」を行うためのものです。この式を分解して説明します:

  1. array[i][j]:

    • array は2次元整数配列です。
    • ij はそれぞれ、配列の行と列のインデックスを表します。
    • array[i][j] は、配列の i 行目の j 列目にある値を指します。
  2. total += ...:

    • total は、これまでの配列要素の合計値を保持する変数です。
    • += は、右側の値(この場合は array[i][j])を左側の変数(total)に加える演算子です。つまり、total = total + array[i][j]; と同じ意味です。

したがって、total += array[i][j]; という式は、「配列の i 行目の j 列目にある要素の値を現在の total の値に加える」という意味になります。

例えば、配列の最初の要素 (array[0][0] が 1) の場合、total += array[0][0];total = total + 1; と同じで、total の値が 1 増加します。

プログラムがこの行を何度も実行することで、total には配列の特定の要素の値が順に加算され、最終的な合計が計算されます。

補足

上記のコードは2次元配列の各要素の合計を計算し、その結果を出力します。配列は{{1, 2}, {2, 3, 4}}で初期化されており、合計すると1+2+2+3+4 = 12になります。

次に、A、B、Dの各選択肢を内側のforループに適用した場合を考えます。

  • A選択肢: int j = 0; j < array[i].length; j++
    • これはC選択肢と同じで、配列の各要素を正しく合計し、出力は12になります。
  • B選択肢: int j = 0; j < array[j].length; j++
    • この条件は実行時にエラーを引き起こします。変数jは内側のforループの制御変数であり、そのループの開始時には0に設定されているため、array[j]を評価しようとした時にarray[0]を指すことになります。しかし、i1の時にはarray[1]の長さをjで比較しようとするため、実行時エラー(ArrayIndexOutOfBoundsException)が発生します。
  • D選択肢: int j = i; j < array[j].length; j++
    • この条件でも実行時エラーが発生する可能性があります。i1の時、j1から始まるため、array[1].length3ですが、jの値が2になるとarray[2]を参照しようとし、配列の範囲外を参照するためエラーになります。

正しい答えはC選択肢ですが、A選択肢も同じ結果になり、B選択肢とD選択肢は実行時エラーを引き起こす可能性が高いです。

Top comments (0)