ITパスポートのプログラミング問題を解いてみよう

プログラミング

鳴り物入りでスタートしたITパスポートのプログラミング&アルゴリズム問題ですが、令和4年の公開問題では、疑似言語で2問、フローチャートで1問の出題数でした。これくらいの問題数なら、すっぱりあきらめてもよさそうですね!(以上)。

というのはもちろん冗談です。とはいえ、どうしても苦手という場合は勉強も後回しになっても致し方ないですし、試験中も時間をかけ過ぎて最後の問題までたどりつけなかった、という事態だけは避けたいところです。むしろ、時間のかかる問題は後回しにしたほうがいいでしょう(点数配分は同じですからね)。

まじめな意見として、プログラミング問題が解けると確実な得点源になるという強みがあります。用語や知識を問われる問題では、記憶があいまいだと最後は運頼みです。その点、プログラミング問題は答えが明確に決まります。「アかイのどっちかなんだよな~」と悩む時間こそ後回しにして、先にプログラミング問題を解ききってしまいましょう!

早く解くためのテクニック

テクニックと呼べるものではありませんが、ITパスポート試験の解答の選択肢は4つしかありませんので、解答の選択肢を全部あてはめてみるのが、苦手な人にとっては手っ取り早いかと思います。

ただ、そのためにも擬似言語がある程度“読める”ようにならないといけません。これは慣れです。擬似言語の書式に関する知識があれば万全ですが、ITパスポート試験くらいの文量であれば、なんとなく日本語や英語の意味から流れが読めるかと思います。怖がらず、じっくり眺めて慣れていってください。

ここでは、令和4年の公開問題から、擬似言語で出題された2問(問78と問96)を取り上げて解説しようと思います。さて、どっちから手をつけましょうか?

  • プログラムの行数が少なくて読みやすいなぁ…
  • 選択肢が実質2択だなぁ…

ということで、問96からいきましょう。試験本番でも自分なりに見極めて、早く解けそうな問題からやっつけていきましょう!

令和4年度公開の問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

ア 【空欄a】2×num+i 【空欄b】iを1から7まで3ずつ増やす
イ 【空欄a】2×num+i 【空欄b】iを2から6まで2ずつ増やす
ウ 【空欄a】num+2×i 【空欄b】iを1から7まで3ずつ増やす
エ 【空欄a】num+2×i 【空欄b】iを2から6まで2ずつ増やす

関数とはなにか

「関数calcXをcalcX(1)として呼び出す」と「変数numの値が、1→3→7→13と変化」するわけですが、慣れていないとこの時点で目を背けたくなります。そもそも関数という響きからして数学っぽくて嫌になります。そこで、いくぶん身近なExcelのsum関数で例えてみましょう。

Excelのsum関数は、与えられた引数をすべて足す関数です。例えば、「sum関数に1と2と3を渡すと6が返ってくる」わけです。これを試験の問題文っぽく書くと、こんな感じになります。

「関数sumをsum(1、2、3)として呼び出すと、変数numの値が6になる」

さらに、sum関数をプログラムっぽく書くとこんな感じになります(簡単に説明するために、3つの数字の足し算しかできないsum関数になっています)。

〔プログラム〕
○整数型:sum(整数型:a, b, c)
 整数型:num
 num ← a+b+c
 return num

このプログラムが何をやっているかというと、まさにここでsum関数がやることを決めているわけです(関数を定義する、という言い方をします)。ここで例えば「num ← a+b+c」の行が「num ← a+b」となっていると、最初の2つの数字しか足さないポンコツsum関数が出来上がります。単純な例ですが、これがプログラムのバグというやつです。

実務では、プログラムの中で使い回したい処理をこうやって関数として定義しておきますが、ITパスポートの試験問題では分量の制約もありますので、基本的には関数の中で何をやっているのかを考えさせる問題がほとんどです。

ちなみに、試験の擬似言語では、関数の定義のスタート地点に「○」印がついていてわかりやすくなっています。慣れないうちはこれを目印にするといいでしょう。

※「○」印がないパターンもありますが、その場合は上記のプログラムの2行目から始まっているのと同じことです。関数として定義せず、その場限りの使い捨ての処理を行っている,というイメージです。

解説

以上を踏まえて問題の解説に移ります。空欄aについては、プログラム1だけで考えられます。

「calcX(1)として呼び出す」というのは、プログラム1の1行目にある「○整数型:calcX(整数型:inData)」という部分にあてはめて考えるといいでしょう。

calcX(1)→calcX(整数型:inData)

つまり、inDataの値として1が渡されています。これが3行目の「num ← inData」でnumに代入されます。だからnumの値の変化は1からスタートしているわけです。

次にfor文でループします。条件は「iを1から3まで1ずつ増やす」なので、要するに3回ループする間に、空欄aの計算式によって変数numの値が1→3→7→13と変化するわけです。あとは、空欄aの選択肢にある2つの計算式に値を入れて、どちらがそのような変化を見せるか、確認するだけです。

・1巡目(num=1、i=1)
 2×num+i=3 (選択肢アイ)
 num+2×i=3 (選択肢ウエ)

1巡目はどちらも3という正しい計算結果が得られました。これでは区別がつかないので、2巡目も計算する必要があります。

この空欄aの計算結果をnumに代入するので、numの値が3に上書きされて2回目のループに突入します。このとき、for文の条件に従ってiの値も1から1増えて2となります。

・2巡目(num=3、i=2)
 2×num+i=8
 num+2×i=7

numの値は1→3→7…と変化するはずなので、この時点で正解はウかエに絞れました。

空欄bについても同様に選択肢の条件をあてはめて計算していきます。なお、プログラム2は関数calcYについてなので、変数numの値が1→5→13→25と変化する選択肢を見つける必要があります。

・プログラム2の1巡目
 num+2×i=3(num=1、i=1からの場合
 num+2×i=5(num=1、i=2からの場合

したがって、正解はエです。

裏ワザ

プログラム1と2をよ~く見比べてください。両者の違いは空欄bの部分だけなのです。さらに、calcX(1)とcalcY(1)の変化を比較しているので、inDataに渡す最初の値(=1)も同じです。つまり、変数numの値は空欄bの違いによって、プログラム1では1→3→7→13、プログラム2では1→5→13→25と変化するわけです。

空欄bの選択肢を確認すると、「iを1から~」と「iを2から~」の2択です。ここで「iを1から~」が正解だとすると、1巡目はプログラム1と2でnum=1、i=1というまったく同じ値で空欄aの計算をすることになるので、どちらも最初は同じ値に変化しなければいけません。ところが、プログラム1と2は「1→3」「1→5」と違う値に変化するのですから、この時点で「iを1から~」となっている選択肢アとウは不正解だとわかります。

なお、空欄aについては、さきほどの解説のように値を入れて確認する必要があります。

長くなってしまったので、問78についてはページをあらためて解説いたします。
つづきはこちら

\おすすめ/技術評論社ITパスポート本はこちら

苦手ジャンルなど、テーマ別に過去問を解きたい

ITパスポート試験によくでる問題集

新刊

試験形式で問題を一通り解きたい、数をこなしたい

ITパスポートパーフェクトラーニング過去問題集

よかったらシェアしてね!
  • URLをコピーしました!