前回の記事(擬似言語②)はこちら
■
また、ITパスポートの擬似言語を初回から勉強したい方はこちら↓
■
今回は擬似言語第3回として、令和3年の擬似言語サンプル問題その2を解いていきます。
擬似言語の問題を解くにあたって、5つの重要なポイントがあります。これらのポイントを理解することで、今回の問題だけでなく、他の擬似言語の問題にも応用が可能です。よく理解して擬似言語を得意分野にしましょう。
なお、テキストより動画で学習したい方は、下記のYouTube動画をご覧ください。
目次
ITパスポート令和3年擬似言語サンプル問題2
以下、問題文を掲載します。
手続printStars は,“ ☆ ” と“ ★ ” を交互に,引数num で指定された数だけ出力する。プログラム中のa,b に入れる字句の適切な組合せはどれか。ここで,引数num の値が0 以下のときは,何も出力しない。
[プログラム]
001 ○ printStars( 整数型: num) /* 手続の宣言 */
002 整数型:cnt ← 0 /* 出力した数を初期化する */
003 文字列型:starColor ← “SC1” /* 最初は“☆”を出力させる */
004 【a】
005 if (starColor が “SC1” と等しい)
006 ” ☆ ” を出力する
007 starColor ← “SC2”
008 else
009 ” ★ ” を出力する
010 starColor ← “SC1”
011 endif
012 cnt ← cnt + 1
013 【b】
※プログラム文には、私のほうで便宜的に行番号(001~013)を割り振っています。
擬似言語サンプル問題2の冒頭文~4行目までをチェック
それでは、ITパスポート試験令和3年の擬似言語サンプル問題2を見ていきましょう。擬似言語の問題は一般的に、3つのブロックに分かれます。1番目は冒頭文、次にプログラム本文、そして解答選択肢です。まず冒頭文から見ていきましょう。
手続printStarsは白星と黒星を交互に引数numで指定された数だけ出力するプログラムです。引数numの値がゼロ以下のときは何も出力しません。この冒頭文の目的、意図や概要をしっかり押さえることがポイントの1番目です。
冒頭文をしっかり読んで問題の意図、目的と概要を押さえましょう。それでは1行ずつ解説に入ります。
1行目には、手続(関数)を宣言する時に使われる記号「〇」が冒頭についています。今回はprintStarsという手続があります。この手続は、星を印刷するものです。また、numという整数型の引数を取ります。
2行目では整数型cntを宣言し、0を代入しています。このcntは、出力した数を数える変数です。
3行目では文字列型starColorに”SC1″を代入しています。このSC1は、コメントを参考にすると「☆(白星)を出力するためのフラグ」と考えられます。
手続名、関数名、変数名、コメントから様々なヒントを得ることができます。たとえば、printStarsという名前から、星を印刷することが分かります。また、cnt(カウント)は何かを数える変数です。コメントでは、手続きの宣言や、変数の初期化に関する情報が得られます。
starColor変数に”SC1″を代入することで、最初は☆を出力することが理解できます。これらの情報を整理することで、問題を解くのが容易になります。
4行目は空欄aのため、いったんスルーしましょう。
if文の制御構造
5行目から始まるif文は、11行目のendifまで続きます。if文は、選択(条件分岐)の制御構造を持ち、特定の条件を満たした場合にのみ特定の処理を実行するために使用されます。
【if文の構造】
if(条件式1)
処理1
elseif(条件式2)
処理2
else
処理3
endif
if文の基本的な構造は、条件式を満たす場合に処理1を実行し、その後endifでif文を終了します。条件式1を満たさないが条件式2を満たす場合は、処理2を実行し、endifでif文を終了します。条件式1と条件式2の両方を満たさない場合は、処理3を実施し、endifでif文を抜けます。
今度は流れ図(フローチャート)でもif文の制御構造を確認しておきましょう。
if文の流れは、条件式1を満たす場合は処理1を行い、終了します。条件式1が満たされない場合は、条件式2をチェックし、満たされる場合は処理2を実施してif文を抜けます。条件式1も条件式2も満たさない場合は、処理3を実施し、if文を終了します。if文はさらに多くの複数の条件式を持つことも可能です。
また、if文ではelseifやelseを省略することも可能です。これにより、プログラムの記述がシンプルになります。この場合、条件式1を満たせば処理1を実行し、条件式1を満たさなければ何もせずにif文を抜けます。
if(条件式1)
処理1
endif
5行目以降のプログラム文の確認
続いて、プログラム文の確認に戻ります。if文の条件式に注目しましょう。starColorが”SC1″と等しい場合は、☆を出力し、starColorに”SC2″という文字列を代入します。
starColorが”SC1″と等しくない場合、つまりSC1ではない場合はelse以降を実行し、★を出力し、starColorに”SC1″を代入します。
最後にcntにcnt + 1を代入し、カウントアップします。これにより、最初に0だったcntが1に変わります。このようにして一つずつカウントアップするプログラムが構築されています。
さて、空欄aとbに入るものは何でしょうか?
while文とdo~while文について
選択肢の内容を見てみると、while文やdo-while文が候補としてあります。while文は、まず条件を満たすかどうかを判断し(前判定)、条件を満たせば処理を行います。一方で、do-while文は、最初に処理を実行し(後判定)、その後条件を満たすかどうかを判断します。
while文とdo-while文の大きな違いは、while文が最初に条件を判断するのに対し、do-while文は必ず最初に処理を実行する点です。do-while文では、条件を満たさなくても最初の一回は処理を実行し、その後条件をチェックします。
これにより、if文、while文、do-while文の基本的な使い方や違いが理解できます。
今回の問題は、do-while文が不適切であることが分かります。do-while文は後判定の構造を持ち、条件式の評価が後に行われるため、numの値が0でも白星の出力を実行してしまいます。これは冒頭文の「numの値が0以下の時は何も出力しない」という条件と矛盾します。
実際のプログラム文で確認すると、starColorに”SC1″が代入され、if文の条件により白星が出力されます。do-while文を使用すると、このif文は問答無用で実行され、白星が出力されてしまいます。これは、numが0の場合にも白星を出力してしまうため、プログラムの仕様に反します。
以上より、選択肢アとイは不適切です。
つづいて、選択肢ウとエのどちらが正しいかを見極めましょう。ウとエは、while文の条件式が、変数cntがnum以下か、numより小さい(未満)かで異なります。今回も、引数numが0だった場合を考えてみましょう。この場合、2行目で変数cntは0で初期化されています。
もし選択肢ウの「while(cntがnum以下)」を選択すると、numが0の場合にも条件を満たし、6行目の白星が出力されてしまいます。これは、冒頭文の条件「numが0以下の時は何も出力しない」に反しています。
一方で選択肢エの場合、「while(cntがnumより小さい)」となります。この場合、cntが0で、引数numも0であるため、「0が0より小さい」という条件は満たされず、白星の出力は行われません。これは問題の要件を満たしています。
以上より、正解は選択肢エとなります。この問題を解く上で、簡単な数字を変数に入れて考えることで、適切な回答にたどり着くことが分かります。
擬似言語の解き方5つのポイント
擬似言語の解き方のポイントを振り返ると、以下のようになります。
- 冒頭文をしっかり読んで、問題の意図、目的と概要を押さえる。
- 関数名や変数名、コメントからヒントを得る。
- 選択肢の内容から方向性を絞る。
- コアとなるアルゴリズムに目星を付ける。
- 簡単な数字を入れて、プログラム文を読んでみる(トレース)。
このように、問題を解きながらポイントを意識し、実力をつけていくことが重要です。皆さんも是非、問題を繰り返し解き、擬似言語の理解を深めてください。お疲れ様でした!
■
次回は、令和5年公開問題 問60~整列(バブルソート)の問題を解いていきます。