二次元配列の行ごとの合計|擬似言語のトレース解説と練習問題
関数 rowSum は、二次元配列 m の行ごとの合計を求め、その並びを配列で返す。m[r, c] は r 行目の c 列目の要素を表す。配列の要素番号は 1 から始まる。
プログラム
| 1 | ○整数型の配列: rowSum(整数型の二次元配列: m) |
| 2 | 整数型の配列: out ← {} |
| 3 | 整数型: r, c, sum |
| 4 | for (r を 1 から mの行数 まで 1 ずつ増やす) |
| 5 | sum ← 0 |
| 6 | for (c を 1 から mの列数 まで 1 ずつ増やす) |
| 7 | sum ← sum + m[r, c] |
| 8 | endfor |
| 9 | outの末尾に sum を追加する |
| 10 | endfor |
| 11 | return out |
何をしているか
外側の繰返しで行を、内側の繰返しで列を進め、行ごとに要素を合計します。行が変わるたびに合計を 0 に戻し、1行分が終わったら結果の配列の末尾に追加します。
トレースのコツ
m[r, c]は「r 行目の c 列目」です。行が先、列が後です。- 内側の繰返しが1周するあいだ、
rは変わりません。cだけが 1 から列数まで進みます。 sum ← 0がどこにあるかが要点です。外側の繰返しの中にあるので、行ごとに合計がやり直されます。
よくある間違い
- 行と列を逆に読む。
{{1, 2, 3}, {4, 5, 6}}は2行3列で、m[2, 1]は 4 です。 - 足し込みの回数を「行数 + 列数」と数える。正しくは「行数 × 列数」です。
sumを 0 に戻すのを忘れ、前の行の合計に足し続けてしまう。
例題:rowSum({{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}) を最後まで追う
上のプログラムを rowSum({{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。
| # | 行 | したこと | m | out | r | c | sum |
|---|---|---|---|---|---|---|---|
| 1 | 2 | 宣言 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | — | — | — |
| 2 | 3 | 宣言 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 未設定 | 未設定 | 未設定 |
| 3 | 4 | 繰返しの初期化 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 未設定 | 未設定 |
| 4 | 4 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 未設定 | 未設定 |
| 5 | 5 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 未設定 | 0 |
| 6 | 6 | 繰返しの初期化 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 1 | 0 |
| 7 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 1 | 0 |
| 8 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 1 | 2 |
| 9 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 2 | 2 |
| 10 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 2 | 2 |
| 11 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 2 | 5 |
| 12 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 3 | 5 |
| 13 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 3 | 5 |
| 14 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 3 | 10 |
| 15 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 4 | 10 |
| 16 | 6 | 条件判定(偽) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {} | 1 | 4 | 10 |
| 17 | 9 | 追加 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 1 | 4 | 10 |
| 18 | 4 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 4 | 10 |
| 19 | 4 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 4 | 10 |
| 20 | 5 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 4 | 0 |
| 21 | 6 | 繰返しの初期化 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 1 | 0 |
| 22 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 1 | 0 |
| 23 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 1 | 1 |
| 24 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 2 | 1 |
| 25 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 2 | 1 |
| 26 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 2 | 3 |
| 27 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 3 | 3 |
| 28 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 3 | 3 |
| 29 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 3 | 9 |
| 30 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 4 | 9 |
| 31 | 6 | 条件判定(偽) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10} | 2 | 4 | 9 |
| 32 | 9 | 追加 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 2 | 4 | 9 |
| 33 | 4 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 4 | 9 |
| 34 | 4 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 4 | 9 |
| 35 | 5 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 4 | 0 |
| 36 | 6 | 繰返しの初期化 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 1 | 0 |
| 37 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 1 | 0 |
| 38 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 1 | 9 |
| 39 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 2 | 9 |
| 40 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 2 | 9 |
| 41 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 2 | 14 |
| 42 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 3 | 14 |
| 43 | 6 | 条件判定(真) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 3 | 14 |
| 44 | 7 | 代入 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 3 | 23 |
| 45 | 6 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 4 | 23 |
| 46 | 6 | 条件判定(偽) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9} | 3 | 4 | 23 |
| 47 | 9 | 追加 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9, 23} | 3 | 4 | 23 |
| 48 | 4 | 繰返しの更新 | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9, 23} | 4 | 4 | 23 |
| 49 | 4 | 条件判定(偽) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9, 23} | 4 | 4 | 23 |
| 50 | 11 | 戻る({10, 9, 23}) | {{2, 3, 5}, {1, 2, 6}, {9, 5, 9}} | {10, 9, 23} | 4 | 4 | 23 |
この例題で問われること
問 rowSum({{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}) を呼び出したときの戻り値はどれか。
答え {10, 9, 23}
- 戻り値になる out は、{} → {10} → {10, 9} → {10, 9, 23} と変わります。
- 11行目で返す時点の値 {10, 9, 23} が答えです。
問 7行目を6回目に実行した直後の、変数 sum の値はどれか。
答え 9
- 7行目は全部で9回実行されます。
- 実行した直後の sum は、順に 2 → 5 → 10 → 1 → 3 → 9 → 9 → 14 → 23 です。
- 6回目の直後なので、答えは 9 です。
問 7行目が実行される回数はどれか。
答え 9
- 7行目が実行されるのは、6行目の条件が真になったときだけです。
- 6行目の条件は12回評価され、真になるのは9回です。したがって 7行目は9回実行されます。
練習問題 標準(5問)
本試験と同じくらいの量。レベル:基礎
- 問題01 rowSum({{4, 5, 5}, {9, 6, 3}})
- 問題02 rowSum({{4, 7, 9}, {5, 2, 5}})
- 問題03 rowSum({{1, 2}, {1, 6}})
- 問題04 rowSum({{3, 6, 9}, {2, 5, 1}})
- 問題05 rowSum({{5, 1}, {4, 3}})
もっと解く(追加の10問)
- 問題06 rowSum({{8, 3, 3}, {3, 1, 5}})
- 問題07 rowSum({{5, 4}, {8, 6}})
- 問題08 rowSum({{2, 2}, {5, 8}})
- 問題09 rowSum({{3, 8, 9}, {2, 8, 8}})
- 問題10 rowSum({{8, 1}, {5, 8}})
- 問題11 rowSum({{9, 5}, {8, 8}})
- 問題12 rowSum({{5, 1}, {8, 9}})
- 問題13 rowSum({{8, 7, 8}, {5, 6, 8}})
- 問題14 rowSum({{2, 5}, {7, 9}})
- 問題15 rowSum({{5, 9}, {5, 6}})
練習問題 じっくり(10問)
長めのトレースで力をつける。レベル:中級
- 問題01 rowSum({{6, 3, 9}, {8, 6, 1}, {3, 4, 1}, {3, 9, 8}})
- 問題02 rowSum({{7, 3, 3}, {4, 3, 7}, {3, 6, 9}})
- 問題03 rowSum({{4, 8}, {2, 6}, {1, 3}, {5, 6}})
- 問題04 rowSum({{9, 3}, {9, 1}, {3, 3}})
- 問題05 rowSum({{6, 1, 8}, {5, 5, 8}, {1, 8, 5}})
- 問題06 rowSum({{5, 7, 9}, {7, 9, 9}, {2, 7, 3}, {5, 4, 7}})
- 問題07 rowSum({{5, 5, 1}, {9, 1, 3}, {7, 3, 4}, {6, 5, 1}})
- 問題08 rowSum({{9, 1}, {7, 6}, {8, 9}, {3, 2}})
- 問題09 rowSum({{7, 5, 7}, {8, 9, 3}, {6, 2, 1}, {4, 8, 8}})
- 問題10 rowSum({{7, 4, 6}, {6, 1, 4}, {9, 7, 4}, {1, 6, 9}})
もっと解く(追加の20問)
- 問題11 rowSum({{8, 8}, {7, 7}, {1, 8}})
- 問題12 rowSum({{1, 9}, {3, 1}, {4, 9}})
- 問題13 rowSum({{2, 1}, {4, 2}, {8, 3}})
- 問題14 rowSum({{3, 7, 4}, {9, 1, 3}, {3, 9, 9}, {2, 3, 5}})
- 問題15 rowSum({{3, 5, 3}, {5, 2, 3}, {3, 5, 7}})
- 問題16 rowSum({{8, 7}, {9, 2}, {6, 6}, {4, 9}})
- 問題17 rowSum({{9, 5, 8}, {2, 8, 9}, {6, 1, 3}})
- 問題18 rowSum({{1, 2}, {9, 5}, {3, 9}})
- 問題19 rowSum({{2, 9, 6}, {1, 1, 1}, {9, 9, 4}})
- 問題20 rowSum({{1, 8}, {9, 6}, {9, 9}})
- 問題21 rowSum({{6, 9, 2}, {8, 8, 6}, {6, 7, 5}, {6, 1, 1}})
- 問題22 rowSum({{1, 5}, {7, 1}, {7, 6}, {6, 3}})
- 問題23 rowSum({{9, 1, 8}, {4, 3, 6}, {4, 7, 7}, {2, 2, 4}})
- 問題24 rowSum({{4, 4}, {3, 9}, {1, 8}})
- 問題25 rowSum({{1, 5, 8}, {2, 2, 6}, {5, 1, 2}})
- 問題26 rowSum({{4, 4}, {3, 7}, {3, 4}})
- 問題27 rowSum({{9, 2, 1}, {7, 6, 5}, {7, 5, 1}})
- 問題28 rowSum({{9, 6}, {8, 3}, {6, 6}})
- 問題29 rowSum({{2, 3}, {4, 8}, {7, 8}})
- 問題30 rowSum({{8, 1}, {7, 9}, {5, 3}, {2, 6}})