擬似言語の答えが合わないときの直し方|値がずれた場所の探し方
自分でトレースしたのに、答えが選択肢のどれとも合わない。
もう一度やり直しても同じ値になって、手が止まっていませんか?
擬似言語の演習を続けていると、必ずこの場面に出会います。コードは読めているつもりなのに、出てきた答えだけが違うのです。
でも大丈夫です。値がずれる場所は、思っているほど多くありません。探す順番を決めておけば、たいてい数分で見つかります。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務で不具合を調べるときも、コードを頭から読み直すことはまずしません。値がおかしくなった地点を挟み込んで、範囲を狭めていきます。
試験の擬似言語でも、やることは同じです。犯人を当てにいくのではなく、現場を絞り込むと考えてください。
この記事では、答えが合わないときに、ずれた場所を見つけるまでの手順をお伝えします。科目B全体の中での位置づけを先に確かめたい人は、親記事から読むと流れがつかみやすくなります。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
答えが合わないときにやってはいけないこと¶
手順に入る前に、避けたい行動を1つだけ確認しておきましょう。ここで時間を溶かしてしまう人が多いからです。
それは、1行目から全部読み直すことです。気持ちは分かるのですが、同じ読み方をもう一度なぞるだけなので、同じ答えに戻ってきます。
読み直しが効かないのは、間違いが読解ではなく手の動きのほうにあるからです。追い方の癖は、読み直しでは変わりません。
もう一つ避けたいのが、選択肢から逆算して自分の値を合わせにいくことです。正解にはたどり着けても、どこがずれていたのかが分からないまま残ります。
本番では答えを教えてくれません。だから練習の段階では、ずれた行を特定するところまでを1セットにしておきたいのです。
直す前に、ずれの種類を分けておく¶
ずれには2種類あります。ここを混ぜると、直し方の見当が付かなくなります。
1つ目は、コードの読み取りを間違えた場合です。条件や範囲を実際とは違う意味で受け取っています。
2つ目は、読み取りは合っていて、書き写しや計算を間違えた場合です。トレース表の1マスだけが違う、という形で現れます。
どちらなのかは、次の見分け方で切り分けられます。表の左から順に確かめてください。
| ずれの種類 | 現れ方 | 最初に見る場所 |
|---|---|---|
| 読み取りのずれ | 途中から値の動き方そのものが違う | 条件式とループの範囲 |
| 書き写しのずれ | 1か所だけ数字が違い、そこから後ろが崩れる | トレース表の該当行 |
読み取りのずれは、コードを見直します。書き写しのずれは、表を見直します。見る対象が違うので、最初にここを分けておくと速いのです。
値がずれる場所は4か所に集まる¶
ここからが本題です。科目Bの問題でずれが起きる場所は、経験上4つに集中しています。
まず全体像を見てください。上から順に確かめるだけで、多くの場合は見つかります。
| 順番 | 確かめる場所 | よくあるずれ |
|---|---|---|
| 1 | 初期値 | 0から始めるか、最初の要素から始めるか |
| 2 | ループの範囲 | 1からか2からか、要素数までか要素数−1までか |
| 3 | 条件式 | 等号を含むかどうか |
| 4 | 配列の添字 | 見ている要素が1つ前後にずれる |
この4つを順に潰していきます。一つずつ見ていきましょう。
初期値の置き方でずれる¶
いちばん多いのが初期値です。合計を求めるなら0から、最大値を求めるなら先頭の要素から始めるのが基本になります。
最大値を0から始めてしまうと、配列に負の数が入ったときに答えが変わります。逆に合計を先頭の要素から始めると、1つ分を二重に数えてしまいます。
初期値は宣言の行にさらっと書かれているので、読み飛ばしやすい場所でもあります。答えが合わないときは、まずここを指で押さえて確かめてください。
ループの回り始めと終わりでずれる¶
次に見るのがループの範囲です。1から始まるのか2から始まるのか、要素数までなのか要素数から1を引いた値までなのかで、回る回数が変わります。
隣り合う要素を比べる処理では、最後の要素で範囲外に出ないように、上限が1つ手前になっていることがよくあります。この形は並べ替えや探索でよく出てきます。
ループの回数そのものが怪しいときは、回数だけを数える練習をしておくと安定します。
【関連記事】科目Bの繰返し問題が解けない人へ|ループ回数を追うコツ
条件式の等号の有無でずれる¶
3つ目が条件式です。> と ≧ の違いは、同じ値が並んだときにだけ表に出ます。
配列に同じ値が2つ入っている問題は、この差を試すために作られていると思ってよいくらいです。答えが1つだけずれているときは、まずここを疑ってください。
見分け方は単純で、等しいときにどちらへ進むかを声に出して確かめるだけです。等しいときは条件を満たさない、と言い切れれば読み取れています。
配列の添字が1つ前後にずれる¶
4つ目が添字です。data[i] と data[i + 1] のどちらを見ているかを取り違えると、値が1つずつずれていきます。
このずれは厄介で、途中までは正しい値が出ます。最後の1回か2回で急に合わなくなるので、終盤で答えが割れたときは添字を疑うのが近道です。
添字の数え方そのものが不安な場合は、こちらで土台を固めておくと後が楽になります。
【関連記事】擬似言語の配列と添字がわからない人へ|要素数・二次元配列の読み方を解説
ずれた行を挟み込んで探す手順¶
場所の候補が分かったら、次は探し方です。全部の行を見直すのではなく、範囲を半分ずつ狭めます。
実務で不具合を追うときにも使う考え方で、擬似言語のように短いコードならすぐ終わります。
期待する値を先に書いてから追う¶
最初にやるのは、途中の地点で変数がいくつになっているはずかを、自分で決めることです。追ってから考えるのではなく、先に書いておきます。
たとえばループが4回回る処理なら、2回目が終わった時点での値を先に書き出します。そのうえで実際に追って、一致するかどうかを見ます。
一致していれば、ずれは後半にあります。一致していなければ、前半にあります。これだけで探す範囲が半分になります。
半分の地点だけ確かめる¶
範囲が半分になったら、そのまた半分を確かめます。4回のループなら、2回目、3回目、と絞っていく形です。
ループが10回、20回と長い問題でも、3回か4回の確認でずれた回にたどり着けます。全部を丁寧に追い直すより、ずっと速いのです。
それでも見つからないときは問題文に戻る¶
4つの候補を全部確かめても合わないことがあります。そのときはコードではなく、問題文の条件を読み落としている可能性が高いです。
科目Bの問題文には、配列の要素は1から数える、与えられる値は1以上である、といった前提が一文だけ添えられていることがあります。この一文を飛ばすと、正しく追っても答えが合いません。
問題文に戻るのは遠回りに見えますが、条件を取り違えたまま20分追い続けるより早く終わります。
この追い方を支えるのがトレース表です。書き方そのものに不安が残っている場合は、先に整えておくと切り分けが効きます。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
例題でずれを探してみる¶
言葉だけでは分かりにくいので、1問やってみましょう。配列の中でいちばん大きい値の位置を返す処理です。
試験の書き方に合わせた自作のコードを用意しました。読んでから、自分でも追ってみてください。
○整数型: 最大値の位置(整数型の配列: data)
整数型: i
整数型: maxIdx ← 1
for (i を 2 から data の要素数 まで 1 ずつ増やす)
if (data[i] > data[maxIdx])
maxIdx ← i
endif
endfor
return maxIdx
data が {4, 9, 9, 2} のときを追ってみます。ここで答えが2になるか3になるかで、読み取りの正確さが分かれます。
| i | data[i] | data[maxIdx] | 条件を満たすか | maxIdxの値 |
|---|---|---|---|---|
| 開始前 | ― | ― | ― | 1 |
| 2 | 9 | 4 | はい | 2 |
| 3 | 9 | 9 | いいえ | 2 |
| 4 | 2 | 9 | いいえ | 2 |
答えは2です。3を選んでしまった人は、i が3のところで条件を満たすと読んだはずです。
9と9は等しいので、> では条件を満たしません。ここが ≧ だったなら、答えは3に変わります。
つまりこの問題のずれは、条件式の等号という3番目の候補に当たります。表のどこで値が分かれたかを見れば、原因の行まで一直線でたどれます。
ずれを見つけたら、変えて確かめる¶
見つけただけで終わらせると、同じ場所でまたつまずきます。おすすめは、その1か所を変えて追い直すことです。
いまの例なら、> を ≧ にして同じ配列を追ってみてください。答えが3に変わる瞬間を自分の手で見ると、記憶の残り方が変わります。
初期値も同じです。maxIdx ← 1 を maxIdx ← 2 にすると、どこから答えが崩れるのかが分かります。
シミュレーターで答え合わせをする¶
紙で追った結果に自信が持てないときは、実際に動かして確かめるのがいちばん早い方法です。
Giji Academy の擬似言語シミュレーターなら、書いたコードを1行ずつ実行して、変数の値が変わっていく様子を画面で追えます。
無料で使えるので、自分のトレース表と画面の値を並べて見比べてください。最初にずれた行が、そのまま自分の弱点の記録になります。
同じずれを繰り返さないための記録¶
ずれを見つけたあとに、もう一手間だけかけておきましょう。ここをやるかどうかで、次の1週間の伸びが変わります。
やることは単純で、どの候補でずれたのかを一言だけ書き留めます。初期値、範囲、等号、添字のどれだったか、それだけで構いません。
3週間も続けると、自分がどこで転ぶかがはっきりしてきます。私の場合は実務でも、同じ種類の見落としを繰り返す癖があると気づいてから、確認の順番を変えて減らしてきました。
試験勉強でも同じで、癖が分かれば見直しの1回目でそこを見るようになります。記録は、その順番を作るための材料です。
記録は4行の正の字で足りる¶
凝ったノートは要りません。初期値、範囲、等号、添字の4行を書いて、ずれるたびに線を1本足すだけです。
線が集中した行が、あなたの本番での要注意ポイントになります。試験直前に見返すのは、この紙1枚で十分です。
書き留めるときは、どの問題で起きたかまでは残さなくて構いません。大事なのは回数の偏りで、問題ごとの事情ではないからです。
見直しの時間を最初から確保しておく¶
本番では、ずれに気づいても直す時間がなければ点になりません。1問あたりにかけられる時間の中に、確認の時間を最初から入れておきます。
時間の配り方そのものに不安がある場合は、こちらの記事で目安を確かめておくと計画が立てやすくなります。
【関連記事】基本情報 科目Bの時間配分|1問にかけられる時間と見直しの順番
見直しでよく見つかる間違いの型は、別の記事にまとめてあります。あわせて読んでおくと、探す精度が上がります。
【関連記事】擬似言語でケアレスミスが多い人へ|よくある間違いと確認方法
まとめ¶
答えが合わないのは、才能の問題ではありません。値がずれる場所が決まっているのに、探す順番を決めていないだけです。
今日お伝えした手順を振り返っておきましょう。
| 手順 | やること |
|---|---|
| 1 | 読み取りのずれか、書き写しのずれかを分ける |
| 2 | 初期値・範囲・等号・添字の順に確かめる |
| 3 | 途中の地点で挟み込み、範囲を半分ずつ狭める |
| 4 | ずれた場所を変えて追い直す |
| 5 | どの候補でずれたかを1行で記録する |
この5つを回していれば、同じ問題で2度悩むことはだんだん減っていきます。
答えが合わない時間は、気持ちのよいものではありません。それでも、ずれた行を自分で見つけられた経験は、本番で大きな支えになります。
正解できた問題より、直した問題のほうが記憶に残ります。つまずいた1問は、それだけで復習の材料になっているということです。
まずは手元の1問で、初期値の行に指を置くところから始めてみてください。