科目Bの擬似言語問題の解き方|コードを読む順番を例題で解説
擬似言語のコードは読めているのに、答えの選択肢を選べない。
科目Bの擬似言語問題を、上から一行ずつ順番に読んでいませんか?
一行ずつの意味は分かる。それなのに最後まで読み終えると、結局何を聞かれていたのかがぼやけている。
この感覚には覚えがある人が多いはずです。原因は文法の理解不足ではありません。
コードを読む順番が決まっていないだけです。順番を先に決めてしまえば、同じ問題でも見る場所がぐっと減ります。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。他人の書いたコードを読む機会は毎日のようにありますが、先頭から順に読むことはほとんどありません。
先に知りたいことを決めて、その値が通る場所だけを見にいきます。科目Bの擬似言語問題も、同じ読み方でそのまま解けます。
この記事では例題を1本だけ使って、読む順番を最初から最後まで実演していきます。
科目Bで擬似言語の問題はどれくらい出るのか¶
まず、対策する量の見当を付けておきましょう。読む順番の話は、そのあとで具体的に入ります。
科目Bは全20問を100分で解く試験です。内訳は次のようになっています。
| 分野 | 出題数 | 中身 |
|---|---|---|
| プログラミング・アルゴリズム | 16問 | 擬似言語で書かれたコードを読む問題 |
| 情報セキュリティ | 4問 | 用語や事例を読んで判断する問題 |
20問のうち16問が擬似言語です。つまり科目Bの手応えは、擬似言語のコードを読む速さでほぼ決まります。
そして1問あたりに使える時間は、単純に割れば5分ほどしかありません。この5分に読み直しの時間は含まれていないと考えてください。
だからこそ、読む順番を決めておく価値があります。科目B全体の仕組みから確認しておきたい人は、先にこちらを読むと土台が固まります。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
擬似言語は読むための言語だと考える¶
擬似言語は、実際に動かして開発するための言語ではありません。人に処理の手順を伝えるために作られた書き方です。
だから覚えることは多くありません。代入の矢印、for、if、配列の添字。この程度がひととおり分かれば、あとは読み方の問題になります。
文法そのものに不安が残っている段階なら、先に全体像をつかんでおくと安心です。
【関連記事】擬似言語とは?IT初心者にもわかる意味・書き方・プログラミングとの違いをやさしく解説
例題で読む順番を実演する¶
ここからは1本の例題を使います。試験でよく見る形に寄せて、私が書いたものです。
配列を前から見ていって、基準を初めて超えた位置を返す処理を考えます。
○整数型: 初めて超えた位置(整数型の配列: 記録, 整数型: 基準)
整数型: i
for (i を 1 から 記録の要素数 まで 1 ずつ増やす)
if (記録[i] > 基準)
return i
endif
endfor
return 0
8行の短いコードですが、科目Bで問われる要素はだいたい詰まっています。設問は、記録が12、30、45、28で基準が25のとき、返される値はいくつか、としましょう。
このコードを上から順に読んではいけません。見る順番は次の4か所です。
| 順番 | 見る場所 | そこで分かること |
|---|---|---|
| 1 | 1行目と2行目の宣言 | 登場する値の数と型 |
| 2 | returnの行 | 答えの単位 |
| 3 | forの行 | 何回まわるか |
| 4 | ifの中身 | どこで結果が決まるか |
この順で見ると、コード全体を丁寧に読む前に答えの形が決まります。順に説明していきます。
段1:この設問は何を聞いているのかを決める¶
最初にやるのは、コードを読むことではありません。答えの単位を確定させることです。
答えの単位とは、個数なのか、位置なのか、値そのものなのか、という区別です。ここが決まらないまま追い始めると、正しく数えていても選択肢を選べません。
設問文はコードより先に読む¶
問題は、説明文、擬似言語のコード、設問文という並びで載っていることが多いです。並び順に読む必要はありません。
先に設問文まで飛ばして読んでから、コードに戻ってください。何を聞かれているかを知った状態なら、見るべき行が最初から絞れます。
今回の設問は返される値を聞いています。だから追うのは戻り値だけで、途中のiがどう動いたかは答えそのものではありません。
実務でも、不具合を調べるときにログを全部読むことはしません。知りたい値が通る場所だけを見にいきます。
答えの単位を余白に一言メモする¶
設問文を読んだら、答えの単位を問題用紙の余白に一言だけ書いておくのがおすすめです。位置、個数、といった短い言葉で構いません。
追っている途中で目的を見失っても、そのメモを見れば戻ってこられます。数秒の手間で読み直しを一度防げるなら、十分に元は取れます。
段2:コードは決まった4か所から見る¶
答えの単位が決まったら、コードに移ります。ここでも上から順には読みません。
宣言と戻り値を先に見る¶
1行目と2行目が宣言です。受け取るのは記録という配列と基準という整数、内部で使うのはiだけだと分かります。
追う値は3つしかありません。この数が先に分かると、トレース表に何列必要かがその場で決まります。
次にreturnの行を探します。このコードにはreturnが2つあり、returnしているのはどちらもiか0です。
つまり返るのは位置であって、記録に入っていた値そのものではありません。ここを読み違えると、30や45といった値の選択肢を選んでしまいます。
宣言の型も見落とさないでください。整数型と書いてあれば小数は登場しないと分かり、割り算がからむ設問でも迷いが減ります。
ループの骨格だけを先に見る¶
3か所目はforの行です。ここでは中身をいったん無視して、繰返しの形だけを見ます。
先ほどのコードから、中身を消して骨格だけにするとこうなります。
○整数型: 初めて超えた位置(...)
for (i を 1 から 記録の要素数 まで 1 ずつ増やす)
if (...)
return i
endif
endfor
return 0
この形を見た時点で、大事なことが2つ分かります。繰返しは要素数と同じ回数まわること、そして条件に合えば途中で抜けることです。
途中にreturnがあるループは、最後までまわらない可能性があります。ここを見落とすと、4回分きっちり数えてしまって答えを外します。
最後のreturn 0は、一度も条件に合わなかったときに通る行です。見つからなかった場合の答えが0だと、コードを追う前に分かります。
探索の形をした処理は科目Bで繰り返し出てきます。見分け方を整理しておきたい人は、こちらもあわせてどうぞ。
【関連記事】擬似言語の線形探索と二分探索の違いとは?科目Bで差がつく探索の読み方
最後にifの中身を読む¶
4か所目でようやく条件式に目を落とします。ここが結果を決める場所です。
条件は記録[i] > 基準で、超えるという書き方になっています。以上ではありません。
もし基準とちょうど同じ値が配列に入っていたら、この違いで答えが変わります。不等号は指で押さえて確かめる価値があります。
段3:トレース表で値の動きを追う¶
読む場所が決まったので、いよいよ値を入れます。頭の中で数えないことが、この段の唯一のルールです。
記録が12、30、45、28で基準が25のとき、繰返しごとの状態は次のようになります。
| 繰返し | i | 記録[i] | 基準を超えたか | 動き |
|---|---|---|---|---|
| 1回目 | 1 | 12 | いいえ | 次へ進む |
| 2回目 | 2 | 30 | はい | 2を返して終了 |
| 3回目 | 3 | 45 | — | 実行されない |
| 4回目 | 4 | 28 | — | 実行されない |
答えは2です。45という大きな値が後ろにありますが、そこまで到達しません。
3回目と4回目の行に線を引いてあるのが、この表の要点です。途中で抜けるループを表に書くときは、実行されない行も書いて消すと見落としが減ります。
もう1つ確かめてほしいのは、返しているのが位置だという点です。値を答える問題なら30が正解になりますが、この設問では違います。
表の書き方そのものを固めたい人は、手順を分解したこちらから練習するのが近道です。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
列は書き始める前に決める¶
トレース表がうまく書けない人の多くは、書きながら列を増やしています。それだと途中で表が崩れます。
段2で宣言を見たときに、列はもう決まっているはずです。今回ならiと記録[i]、それに判定結果を足した3列で足ります。
判定結果の列は省きたくなりますが、残しておいてください。あとで選択肢を確かめるとき、どこで抜けたのかを見返せるのが効いてきます。
段4:間違いやすい選択肢を見分ける¶
答えが出たら、そのまま選んで終わりにはしません。近い値の選択肢が必ず並んでいるからです。
出題する側は、途中でつまずいた人がたどり着く値を選択肢にしています。今回のコードで作れる誤答を表にまとめました。
| 誤答 | どこで生まれるか | 見分け方 |
|---|---|---|
| 30 | 位置ではなく値を答えている | returnの行をもう一度読む |
| 3 | 添字を0から数えている | 擬似言語の配列は1から数える |
| 4 | 途中で抜けることを見落とした | ループ内のreturnを探す |
| 0 | 条件に合う値が無いと思い込んだ | 1周目から順に判定を書く |
この4つで、擬似言語問題の誤答のかなりの部分が説明できます。答えを出したあと、右の列を上から当てはめるだけでも精度が上がります。
とくに添字の数え違いには注意してください。擬似言語の配列は1から数えるのが基本で、0から数える言語に慣れているほど引っかかります。
添字の数え方に不安が残る人は、こちらで確認しておくと安心です。
【関連記事】擬似言語の配列と添字がわからない人へ|要素数・二次元配列の読み方を解説
選択肢を逆にコードへ入れて確かめる¶
空欄補充の型なら、もう1つ使える手があります。残った選択肢を空欄に入れて動かしてみることです。
全部を試す必要はありません。境目にあたる値を1つ選んで、その1回だけ通せば十分に見分けが付きます。
今回のコードなら、基準とちょうど同じ25を配列に入れて試すのが効きます。超えると以上のどちらが入るかは、この1回で決まります。
問題文の読み取りから答えを出すまでの流れを、もう一度まとめて確認したい人はこちらもどうぞ。
【関連記事】基本情報 科目Bの問題はどう解く?問題文から答えを出すまでの手順
段5:シミュレーターで実際に動かす¶
最後の段は、試験当日ではなく勉強中にやることです。ここを入れるかどうかで伸び方が変わります。
自分の書いたトレース表と、実際にコードを動かした結果を突き合わせてください。合っていれば読み方が固まった証拠になります。
Giji Academy の擬似言語シミュレーターなら、一行ずつ進めながら変数が変わる瞬間を画面で追えます。紙の表と画面の値がずれた行が、そのままあなたの弱点です。
ずれる場所には癖があります。繰返しの最後の1周だったり、条件式の境目だったり、人によってほぼ決まっています。
その1か所を潰すだけで、同じ型の問題がまとめて解けるようになります。問題数をやみくもに増やすより、ずっと効率がいいはずです。
動かすときは、配列の中身を自分で変えてみるのも効きます。基準を超える値を1つも入れない配列にすれば、return 0を通る道が目で確かめられます。
答え合わせのときは、正解したかどうかより、どの行でずれたかを記録しておいてください。数週間ためると、自分が繰り返し間違える場所がはっきり見えてきます。
まとめ¶
最後に、擬似言語問題を読む順番を振り返っておきます。
始まりは設問文です。答えの単位が位置なのか値なのかを決めてから、コードに移ります。
コードは宣言、戻り値、ループの骨格、分岐の中身という順で見ます。この4か所を押さえた時点で、答えの形はもう決まっています。
そのうえでトレース表を書きます。途中で抜けるループは、実行されない行も書いて消しておくと安全です。
答えが出たら、位置と値の取り違えや添字のずれを当てはめて確かめます。そして勉強中は、動かして答え合わせをするところまでを1セットにしてください。
この順番は、慣れれば意識しなくても手が動くようになります。今日はまず1問だけ、returnの行から探す練習をしてみましょう。