関数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に入れる字句の適切な組合せはどれか。 〔プログラム 1〕 ○整数型: calcX(整数型: inData) 整数型: num, i num ← inData for (i を 1 から 3 まで 1 ずつ増やす) num ← a endfor return num 〔プログラム 2〕 ○整数型: calcY(整数型: inData) 整数型: num, i num ← inData for ( b ) num ← a endfor return num
令和4年度 ITパスポート試験 問96
この問題の解説と、これまでの解答の記録です。
問 96
不正解ア
a が 2×num+i だが、これを calcX に当てると i=1 で 2×1+1=3 は合うものの、i=2 で 2×3+2=8 となり必要な 7 に一致しない。a の式が誤りで、変化列 1→3→7→13 を再現できない。
不正解イ
a が 2×num+i でアと同じく calcX を再現できない(i=2 で 8 になり 7 にならない)。b の範囲は正しいが、a が誤っているため組合せとして不適切。
不正解ウ
a=num+2×i は正しいが、b が「i を 1 から 7 まで 3 ずつ増やす」だと i=1,4,7 の 3 回となり、初回 i=1 で 1+2×1=3 となって必要な 5 に一致せず、calcY の 1→5→13→25 を再現できない。b が誤り。
- エ
正解 まず a を calcX で決める。calcX(1) は num を 1 から始め、for でループ変数 i を 1→2→3 と 3 回動かす。a に num+2×i を当てはめると、i=1 で 1+2×1=3、i=2 で 3+2×2=7、i=3 で 7+2×3=13 となり、変化列 1→3→7→13 と戻り値 13 に一致する。よって a=num+2×i。次に b を calcY で決める。calcY も同じ a=num+2×i を使い、num を 1→5→13→25 と 3 回で変えるので、ループも 3 回でなければならない。b が「i を 2 から 6 まで 2 ずつ増やす」なら i=2,4,6 の 3 回で、i=2 で 1+2×2=5、i=4 で 5+2×4=13、i=6 で 13+2×6=25 となり一致する。したがって a=num+2×i、b=「i を 2 から 6 まで 2 ずつ増やす」の組合せ エ が正しい。
- for ループのトレース: 初期値 num にループ本体の代入式を i の各値で反復適用し、与えられた変化列と戻り値に一致する式(a)とループ範囲(b)を逆算して選ぶ。
- 擬似言語の for「i を ○ から △ まで □ ずつ増やす」の読み方: i の系列と反復回数を正しく数える(例: 2 から 6 まで 2 ずつ→i=2,4,6 の 3 回)。