条件に合う要素の合計|擬似言語のトレース解説と練習問題

レベル:入門 / タグ:for・if・配列・mod

関数 calc は、配列 data の要素のうち k の倍数だけを合計して返す。配列の要素番号は 1 から始まる。

プログラム

1○整数型: calc(整数型の配列: data, 整数型: k)
2 整数型: sum ← 0
3 整数型: i
4 for (i を 1 から dataの要素数 まで 1 ずつ増やす)
5 if (data[i] mod k = 0)
6 sum ← sum + data[i]
7 endif
8 endfor
9 return sum

何をしているか

配列を先頭から順に見て、条件に合う要素だけを合計に足します。「繰返しの中に選択がある」形は、科目Bのほとんどのプログラムの土台です。

トレースのコツ

  • 表の列は i、data[i]、条件の真偽、sum の4つにすると迷いません。
  • 条件が偽の回は sum が変わりません。変わらない回も1行として書き、飛ばさないのがコツです。
  • mod は余りです。「k で割り切れる」は「余りが 0」と読み替えます。

よくある間違い

  • 要素番号 i と、要素の値 data[i] を取り違える。条件に使われているのがどちらかを最初に確かめます。
  • 条件が真になった回数と、繰返しの回数を混同する。繰返しは要素数ぶん、足し込みは条件が真の回だけです。
  • 最後の要素を見落とす。「まで」は終わりの値を含みます。

例題:calc({9, 12, 12, 1, 7, 9}, 4) を最後まで追う

上のプログラムを calc({9, 12, 12, 1, 7, 9}, 4) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したことdataksumi
12宣言{9, 12, 12, 1, 7, 9}40—
23宣言{9, 12, 12, 1, 7, 9}40未設定
34繰返しの初期化{9, 12, 12, 1, 7, 9}401
44条件判定(真){9, 12, 12, 1, 7, 9}401
55条件判定(偽){9, 12, 12, 1, 7, 9}401
64繰返しの更新{9, 12, 12, 1, 7, 9}402
74条件判定(真){9, 12, 12, 1, 7, 9}402
85条件判定(真){9, 12, 12, 1, 7, 9}402
96代入{9, 12, 12, 1, 7, 9}4122
104繰返しの更新{9, 12, 12, 1, 7, 9}4123
114条件判定(真){9, 12, 12, 1, 7, 9}4123
125条件判定(真){9, 12, 12, 1, 7, 9}4123
136代入{9, 12, 12, 1, 7, 9}4243
144繰返しの更新{9, 12, 12, 1, 7, 9}4244
154条件判定(真){9, 12, 12, 1, 7, 9}4244
165条件判定(偽){9, 12, 12, 1, 7, 9}4244
174繰返しの更新{9, 12, 12, 1, 7, 9}4245
184条件判定(真){9, 12, 12, 1, 7, 9}4245
195条件判定(偽){9, 12, 12, 1, 7, 9}4245
204繰返しの更新{9, 12, 12, 1, 7, 9}4246
214条件判定(真){9, 12, 12, 1, 7, 9}4246
225条件判定(偽){9, 12, 12, 1, 7, 9}4246
234繰返しの更新{9, 12, 12, 1, 7, 9}4247
244条件判定(偽){9, 12, 12, 1, 7, 9}4247
259戻る(24){9, 12, 12, 1, 7, 9}4247

この例題で問われること

問 calc({9, 12, 12, 1, 7, 9}, 4) を呼び出したときの戻り値はどれか。

答え 24

  • 戻り値になる sum は、0 → 12 → 24 と変わります。
  • 9行目で返す時点の値 24 が答えです。

問 6行目を1回目に実行した直後の、変数 sum の値はどれか。

答え 12

  • 6行目は全部で2回実行されます。
  • 実行した直後の sum は、順に 12 → 24 です。
  • 1回目の直後なので、答えは 12 です。

問 6行目が実行される回数はどれか。

答え 2

  • 6行目が実行されるのは、5行目の条件が真になったときだけです。
  • 5行目の条件は6回評価され、真になるのは2回です。したがって 6行目は2回実行されます。

練習問題 標準(5問)

本試験と同じくらいの量。レベル:入門

  1. 問題01 calc({2, 3, 9, 8}, 2)
  2. 問題02 calc({6, 7, 7}, 3)
  3. 問題03 calc({8, 1, 2, 6}, 2)
  4. 問題04 calc({6, 2, 3}, 3)
  5. 問題05 calc({8, 9, 6}, 3)
もっと解く(追加の10問)
  1. 問題06 calc({7, 3, 9}, 3)
  2. 問題07 calc({3, 9, 8}, 2)
  3. 問題08 calc({4, 9, 9}, 2)
  4. 問題09 calc({7, 9, 9, 6}, 3)
  5. 問題10 calc({2, 3, 9, 9}, 3)
  6. 問題11 calc({6, 8, 6, 1}, 2)
  7. 問題12 calc({7, 5, 8, 6}, 2)
  8. 問題13 calc({6, 5, 8, 8}, 2)
  9. 問題14 calc({7, 8, 2, 8}, 2)
  10. 問題15 calc({5, 4, 6}, 2)

練習問題 じっくり(10問)

長めのトレースで力をつける。レベル:入門

  1. 問題01 calc({9, 6, 6, 8, 6}, 2)
  2. 問題02 calc({4, 9, 3, 1}, 3)
  3. 問題03 calc({5, 2, 1, 12, 3, 9}, 3)
  4. 問題04 calc({4, 12, 7, 12, 8, 8}, 2)
  5. 問題05 calc({2, 8, 1, 5, 1, 12}, 4)
  6. 問題06 calc({12, 10, 6, 4, 4, 12}, 4)
  7. 問題07 calc({1, 11, 4, 6, 7}, 2)
  8. 問題08 calc({12, 12, 6, 2, 4, 2}, 3)
  9. 問題09 calc({6, 3, 5, 5}, 3)
  10. 問題10 calc({4, 11, 10, 5, 4}, 2)
もっと解く(追加の20問)
  1. 問題11 calc({6, 12, 3, 4, 12}, 3)
  2. 問題12 calc({2, 6, 7, 9, 12, 2}, 3)
  3. 問題13 calc({8, 10, 10, 5, 10, 1}, 2)
  4. 問題14 calc({10, 5, 7, 4}, 2)
  5. 問題15 calc({10, 12, 4, 2, 7}, 2)
  6. 問題16 calc({3, 1, 4, 9, 6, 3}, 3)
  7. 問題17 calc({2, 12, 12, 12, 7}, 3)
  8. 問題18 calc({2, 4, 7, 4, 6}, 2)
  9. 問題19 calc({6, 11, 10, 10, 5, 8}, 2)
  10. 問題20 calc({7, 12, 10, 2}, 2)
  11. 問題21 calc({9, 6, 3, 6, 10}, 2)
  12. 問題22 calc({1, 8, 12, 3, 11, 8}, 3)
  13. 問題23 calc({10, 12, 1, 6}, 3)
  14. 問題24 calc({12, 12, 7, 9, 4}, 3)
  15. 問題25 calc({12, 10, 6, 7, 10}, 2)
  16. 問題26 calc({9, 4, 2, 9, 9, 11}, 3)
  17. 問題27 calc({6, 9, 3, 11, 2}, 2)
  18. 問題28 calc({6, 12, 8, 3, 3}, 2)
  19. 問題29 calc({2, 8, 7, 4, 10}, 4)
  20. 問題30 calc({11, 8, 8, 11, 11, 12}, 2)

ほかのアルゴリズム