ITパスポートの過去問
令和4年度
テクノロジ系 問96

このページは閲覧用ページです。
履歴を残すには、 「新しく出題する(ここをクリック)」 をご利用ください。

問題

令和4年度 ITパスポート試験 テクノロジ系 問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に入れる字句の適切な組合せはどれか。

〔プログラム 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

次の問題へ

正解!素晴らしいです

残念...

この過去問の解説 (3件)

01

4が正解です。

aの箇所では1、2で「2 × num + i」、3、4で「num + 2 × i」の処理が行われています。

結果はそれぞれ、

「2 × num + i」

i = 1 2×1 + 1 = 3

i = 2 2×3 + 2 = 8

i = 3 2×8 + 3 = 19

「num + 2 × i」

i = 1 1 + 2×1 = 3

i = 2 3 + 2×2 = 7

i = 3 7 + 2×3 = 13

となり、aは「num + 2 × i」が正しいため、3または4のどちらかが正解ということになります。

続いて、bの処理は3が「iを1から7まで3ずつ増やす」、4が「iを2から6まで2ずつ増やす」となっています。

結果はそれぞれ、

「iを1から7まで3ずつ増やす」

i = 1 1 + 2×1 = 3

i = 4 3 + 2×4 = 11

i = 7 11 + 2×7 = 25

「iを2から6まで2ずつ増やす」

i = 2 1 + 2×2 = 5

i = 4 5 + 2×4 = 13

i = 6 13 + 2×6 = 25

となり、bは「iを2から6まで2ずつ増やす」が正しいことが分かり、正解は4となります。

参考になった数10

02

まずプログラム1の各変数の推移を確認します。

 i  num 演算結果のnum

 1  1   3

 2  3   7

 3  7   13

上記の演算結果が成り立つための式は、i×2+num になります。

次にプログラム2の i の変化を考えます。

 i  num 演算結果のnum

 ?   1   5

 ?   5   13

 ?   13  25

3回の処理のそれぞれを i を a として解きます。

 a×2+1=5

 2a=4

 a=2 

よって、numが1の場合の i は2になります。

 a×2+5=13

 2a=8

 a = 4

よって、numが5の場合の i は4になります。

 a×2+13=25

 2a=12

 a = 6

よって、numが13の場合の i は6になります。

これにより、iは2から2ずつ増加(2、4、6)ということがわかります。

そのため、4が正解です。

参考になった数5

03

このようなプログラムの実行結果を問う問題では、実際に値を代入してトレースをします。

いくつか専門用語の説明をしておきます。

引数(ひきすう)・・・計算に使う値のことです。例えば足し算をするプログラムに対して漠然と「足し算をしなさい」といっても、足す値と足される値がないと実行できません。設問ではcalcXの引数として1が設定されており、引数を代入する変数がinDataです。

実際のプログラミング言語でも、関数を定義するときは()括弧の中に引数を受け取る変数とデータ型(整数や文字列など)を定義する場合がほとんどです。

戻り値・・・関数の実行結果です。ある関数によって計算された結果を、別の関数で使う場合にはこの戻り値を使います。C言語やJavaでは、設問のようなreturn文が使われます。

for文・・・繰り返し処理をするためのコードです。多くのプログラミング言語では設問のように、処理を繰り返す条件を括弧の中に書きます。条件は、(初期値;条件式;増分)のようにセミコロンで区切る場合がほとんどです。

例) メッセージを3回繰り返すC言語コード

for(i = 1;i<=3;i++){

  printf(“繰り返し処理です。¥n”);

}

では、inDataの値を1として計算していきましょう。

プログラム1について

/*2 × num + iの場合*/

num1を代入

2 × 1 = 3

num3になる

iを1増やして2になる

2 × 3 + 2 = 8

num8になる

iを1増やして3

2 × 8 + 3 = 19

num19になる

i3なので繰り返し処理を終了

/*num + 2 × iの場合*/

num1を代入

1 + 2 × 1 = 3

num3になる

iを1増やして2になる

3 + 2 × 2 = 7

num7になる

iを1増やして3になる

7 + 2 × 3 = 13

num13になる

i3なので繰り返し処理を終了

変数numの値が設問の通り1 → 3 → 7 → 13と変化しているのは選択肢3及び4の「num + 2 × i」です。プログラム2の空欄aにはこの式を採用します。

選択肢3と4の「b」について、プログラム2を検証します。

プログラム2について

/*iを1から7まで3ずつ増やす場合*/

num1を代入

iの初期値を1に設定

1 + 2 × 1 = 3 ← ここがnum + 2 × i

num3になる

iの値を3増やして4

3 + 2 × 4 = 11

num11になる

iの値を3増やして7

11 + 2 × 7 = 25

num25になる。

i7なので繰り返し処理を終了

/*iを2から6まで2ずつ増やす場合*/

num1を代入

iの初期値を2に設定

1 + 2 × 2 = 5 ← ここがnum + 2 × i

num5になる

iの値を2増やして4

5 + 2 × 4 = 13

num13になる

iの値を2増やして6

13 + 2 × 6 = 25

num25になる

i6なので繰り返し処理を終了

変数numの値が設問の通り1 → 5 → 13 → 25と変化しているのは選択肢4です。よって正解は4となります。

参考になった数1