ITパスポート過去問 令和4年度(2022年)問96
関数calcXと関数calcYは,引数inDataを用いて計算を行い,その結果を戻り値とする。関数calcXをcalcX(1)として呼び出すと,関数calcXの変数numの値が,1→3→7→13と変化し,戻り値は13となった。関数calcYをcalcY(1)として呼び出すと,関数calcYの変数numの値が,1→5→13→25と変化し,戻り値は25となった。プログラム中のa,bに入れる字句の適切な組合せはどれか。


選択肢
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
calcX(1)のnumの変化(1→3→7→13)から、for文の各繰り返しで実行されている代入式aを特定します。次に、そのaをcalcY(1)にも適用し、numの変化(1→5→13→25)を満たすためにfor文の制御変数iがどの値を取る必要があるかを逆算して、for文の条件bを特定します。aがnum + 2×i、bがiを2から6まで2ずつ増やすの組合せが条件を満たします。
Point
この問題は、プログラムを上から順に実行したときの変数の値の変化を追跡し、代入式と繰り返し条件を推定する力を確認するものです。
解くために必要な知識
この問題を解くには、for文の繰返し回数と、ループ内の代入による変数の更新を、順に計算して確認できることが必要です。
用語の整理
| 用語 | 意味 |
|---|---|
| 引数 inData | 関数に渡される入力値です。最初にnumへ代入されます。 |
| 戻り値 | 関数が最後にreturnで返す値です。 |
| 変数 num | ループ内の計算結果で更新され、最終的に戻り値になります。 |
| 変数 i | for文のループ変数です。指定された範囲で増加します。 |
| for文 | iの開始値、終了値、増分を決めて、繰返し処理を行う構文です。 |
for文の読み取り方
iが取りうる値を列挙する
for(iを開始値から終了値まで増分で増やす)と書かれている場合、iは次のように変化します。
-
例1:iを1から3まで1ずつ増やす
- i = 1, 2, 3
-
例2:iを2から6まで2ずつ増やす
- i = 2, 4, 6
-
例3:iを1から7まで3ずつ増やす
- i = 1, 4, 7
ループ内の代入は逐次反映する
ループ内で num ← 式 を実行すると、次の繰返しでは更新後のnumを使って式を計算します。
トレースのやり方
表で「iの値」と「更新後のnum」を並べる
この問題のようにnumの変化が与えられている場合は、次の手順が有効です。
-
iの値を列挙する
-
各回の計算で、更新後のnumを計算する
-
与えられた変化(例:1→3→7→13)と一致するか確認する
問題の解法手順
解く手順
1. calcXの結果からaを確定する
calcX(1)は、最初にnum=1です。for文は「iを1から3まで1ずつ増やす」なので、iは1,2,3の順に3回実行されます。
候補のaを当てはめて、numの変化が1→3→7→13になるかを確認します。
| i | a = 2×num + i の場合のnum | a = num + 2×i の場合のnum |
|---|---|---|
| 1 | 2×1+1=3 | 1+2×1=3 |
| 2 | 2×3+2=8(不一致) | 3+2×2=7 |
| 3 | 以降も不一致 | 7+2×3=13 |
このため、aはnum + 2×iです。
2. calcYの結果からbを確定する
calcY(1)も最初にnum=1です。numが1→5→13→25と3回変化しているので、for文は3回実行されます。ここでもaはnum + 2×iを使います。
bの候補ごとに、iの取り方とnumの変化を確認します。
| bの候補 | iの値 | 1回目のnum | 2回目のnum | 3回目のnum |
|---|---|---|---|---|
| iを1から7まで3ずつ増やす | 1,4,7 | 1+2×1=3(不一致) | - | - |
| iを2から6まで2ずつ増やす | 2,4,6 | 1+2×2=5 | 5+2×4=13 | 13+2×6=25 |
よって、bは「iを2から6まで2ずつ増やす」です。
3. 組合せを選ぶ
a=num + 2×i、b=iを2から6まで2ずつ増やすなので、「エ」を選びます。
選択肢ごとの解説
- ア:不正解
aが2×num+iなので、calcXでi=2のときnum=2×3+2=8となり、必要な7と一致しません。したがって不適切です。
- イ:不正解
aが2×num+iなので、calcXでi=2のときnum=2×3+2=8となり、必要な7と一致しません。したがって不適切です。
- ウ:不正解
aがnum+2×iなのでcalcXは一致します。しかしbがiを1から7まで3ずつ増やす(i=1,4,7)になり、calcYの1回目がnum=1+2×1=3となって必要な5と一致しません。したがって不適切です。
- エ:正解
aをnum+2×i、bをiを2から6まで2ずつ増やす(i=2,4,6)とすると、calcXは1→3→7→13、calcYは1→5→13→25となり、どちらも条件に一致します。したがって適切です。
まとめ
calcX(1)のnumの変化(1→3→7→13)から、for文の各繰り返しで実行されている代入式aを特定します。次に、そのaをcalcY(1)にも適用し、numの変化(1→5→13→25)を満たすためにfor文の制御変数iがどの値を取る必要があるかを逆算して、for文の条件bを特定します。aがnum + 2×i、bがiを2から6まで2ずつ増やすの組合せが条件を満たします。
テクノロジ系 > 基礎理論 > アルゴリズムとプログラミング
aが2×num+iなので、calcXでi=2のときnum=2×3+2=8となり、必要な7と一致しません。したがって不適切です。
aが2×num+iなので、calcXでi=2のときnum=2×3+2=8となり、必要な7と一致しません。したがって不適切です。
aがnum+2×iなのでcalcXは一致します。しかしbがiを1から7まで3ずつ増やす(i=1,4,7)になり、calcYの1回目がnum=1+2×1=3となって必要な5と一致しません。したがって不適切です。
aをnum+2×i、bをiを2から6まで2ずつ増やす(i=2,4,6)とすると、calcXは1→3→7→13、calcYは1→5→13→25となり、どちらも条件に一致します。したがって適切です。