こんにちは、ECF Techブログ担当の平良です。
本記事は「基本情報技術者試験 科目B対策講座」の一部です。講座記事のすべてをご覧になりたい方は、下のリンクからご確認ください。

本章では、擬似言語を読み解く上でのプログラミング基礎知識を確認できる練習問題を掲載しています。学習の一助にお役立てください。
2-1 変数と関数
2-1-1 変数の利用(1)
問題
[出典:基本情報技術者試験 科目B サンプル問題 問1]
次の記述中のに入れる正しい答えを、解答群の中から選びなさい。
プログラムを実行すると、""と出力される。
〔プログラム〕
整数型: x ← 1 整数型: y ← 2 整数型: z ← 3 x ← y y ← z z ← x yの値 と zの値 をこの順にコンマ区切りで出力する
〔解答群〕
ア 1, 2 イ 1, 3 ウ 2, 1 エ 2, 3 オ 3, 1 カ 3, 2
基礎知識
変数は値の入れ物です。変数の使い方は次の3ステップが基本です。
- 変数の宣言:変数を準備することです。
- 値の代入:変数に値を入れることです。
- 値の参照:変数に代入されている値を利用することです。
ヒント1
整数型: x ← 1
は変数の宣言と代入を同時に行っています。x ← y
は、変数xの値を変数yに代入することを表しています。- 変数に値を代入すると、元の値は上書きされて無くなります。
解答解説
〔解答〕
カ
〔解説〕
- 3つの変数の初期状態は、
x = 1
、y = 2
、z = 3
です。 x ← y
で、変数xの値は2
になります。y ← z
で、変数yの値は3
になります。z ← x
において、変数xはすでに2
ですので、変数zにも2
が代入されます。
最後に変数yとzの値を表示します。結果は3, 2
となり、答えはカとなります。
2-1-2 変数の利用(2)
問題
[オリジナル問題]
次のプログラムの出力結果を答えてください。
(※解答群はありません)
〔プログラム〕
整数型: x ← 2 整数型: y ← 4 整数型: z ← 6 x ← z y ← x z ← y zの値を出力する
ヒント1
考え方は2-1-1と同様です。
解答解説
〔解答〕
6
〔解説〕
- 3つの変数の初期状態は、
x = 2
、y = 4
、z = 6
です。 x ← z
で、変数xの値は6
になります。y ← x
で、変数xはすでに6
ですので、変数yの値は6
になります。z ← y
で、変数yはすでに6
ですので、変数zにも6
が代入されます。
正解は6です。
2-1-3 値の入れ替え(1)
問題
[オリジナル問題]
変数xとyの値を入れ替えるプログラムです。プログラム中の空欄①を埋め、出力結果のとおりになるようにしてください。
〔プログラム〕
整数型: x ← 3 整数型: y ← 5 整数型: work work ← y ① x ← work xの値 と yの値 をこの順にコンマ区切りで出力する
〔出力結果〕
5, 3
ヒント1
変数は値を代入すると元の値を上書きしてしまうため、次のような入れ替えはできません。
x ← y y ← x
そのため、2つの変数間の値を入れ替えるには、退避用の変数を用意します。
解答解説
〔解答〕
①:x ← y
〔解説〕
プログラム中には、退避用の変数workが宣言されています。変数workを使い、次の手順で値を入れ替えます。
- 変数xの値を変数workに代入
- 変数yの値を変数xに代入
- 変数workの値を変数yに代入
したがって、空欄①はx ← y
となります。
このような値の入れ替え処理はスワップと呼ばれています。値の並び替えなどでよく用いられる方法です。
2-1-4 値の入れ替え(2)
問題
[出典:平成22年春期 ITパスポート試験 問53]
変数AとBに格納されているデータを入れ替えたい。データを一時的に格納するための変数をTMP とすると、データが正しく入れ替わる手順はどれか。ここで“x←y”は、yのデータでxの内容を置き換えることを表す。
ヒント1
考え方は2-1-3と同様です。
解答解説
〔解答〕
イ
〔解説〕
誤りの選択肢の理由を確認してみましょう。
- ア:TMPに退避した値を使っていません。
- ウ:2番目の処理でAを退避せずにBを代入しているため、Aの値が消失します。
- エ:TMPに退避した値を使っていません。
2-1-5 関数(1)
問題
[オリジナル問題]
出力結果のとおりとなるように、プログラム中の空欄を埋めてください。答えは解答群の中から選んでください。
〔プログラム〕
〇proc1() "A" を出力する 〇proc2(文字型: str) 引数 str の値を出力する 〇文字型: proc3() return "C" ① ","を出力する ② ","を出力する ③
〔出力結果〕
A,B,C
〔解答群〕
ア proc1() イ proc2() ウ proc3()
エ proc1("A") オ proc2("B") カ proc3("C")
キ proc1()の戻り値を出力
ク proc2()の戻り値を出力
ケ proc3()の戻り値を出力
基礎知識
- 関数は、他のプログラムから利用する(呼び出す)ための処理のまとまりです。
- 引数は関数を呼び出す際に、値を渡すことができる変数の一種です。
- 戻り値は、呼び出した関数から返される値です。
return 値
と記述することで、値
を返すことができます。
ヒント1
- 関数 proc1 は引数も戻り値も無い関数です。
- 関数 proc2 は引数を持つ関数です。
- 関数 proc3 は戻り値を返す関数です。
解答解説
〔解答〕
①:ア
②:オ
③:ケ
〔解説〕
空欄①
関数proc1の宣言部分は〇proc1()
のようになっており、引数も戻り値も持たない関数であることがわかります。呼び出しの際はproc1()
と記述します。
空欄②
関数proc2の宣言部分はproc2(文字型: str)
のようになっており、引数を持つ関数であることがわかります。proc2では引数strの値をそのまま出力していますので、proc2("B")
とすることで、B
を出力することができます。
空欄③
関数proc3の宣言部分は文字型: proc3()
のようになっており、文字型の値を返す関数であることがわかります。proc3は戻り値として"C"
を返していますので、戻り値を出力すればC
を出力することができます。したがって、ケが正解となります。
2-1-6 関数(2)
問題
[出典:基本情報技術者試験 科目B 令和5年 問2]
次の記述中のに入れる正しい答えを、解答群の中から選べ。
次のプログラムにおいて、手続 proc2 を呼び出すと、の順に出力される。
〔プログラム〕
〇proc1() "A" を出力する proc3() 〇proc2() proc3() "B" を出力する proc1() 〇proc3() "C" を出力する
〔解答群〕
ア "A","B","B","C" イ "A","C"
ウ "A","C","B","C" エ "B","A","B","C"
オ "B","C","B","A" カ "C","B"
キ "C","B","A" ク "C","B","A","C"
ヒント1
最初に呼び出された手続proc2内で、proc3を呼び出していますので、proc3の処理を先に実行し、終わったらproc2の続きの処理を行います。序盤の処理の動作順は下のとおりです。
proc2()の呼び出し
proc3()の呼び出し
"C" を出力する
"B" を出力する
...以降省略
解答解説
〔解答〕
ク
〔解説〕
呼び出し順をすべて記述すると次のとおりとなります。
proc2()の呼び出し
proc3()の呼び出し
"C" を出力する
"B" を出力する
proc1()の呼び出し
"A" を出力する
proc3()の呼び出し
"C" を出力する
出力部分を上から順番に読むと、C,B,A,C
となります。
2-2 制御構文
2-2-1 if文
問題
[オリジナル問題]
次のプログラムの出力結果を答えてください。
〔プログラム〕
整数型: x ← 4 整数型: y if (x ≧ 5) y ← 10 else y ← 20 yの値 を出力
基礎知識
選択処理の構文(if文)は次のようになります。
if (条件式1) 処理1 elseif (条件式2) 処理2 else 処理3 endif
構文の意味は次のとおりです。
- 条件式1が真なら、処理1を実行
- 条件式1が真でなく、条件式2が真なら処理2を実行
- いずれの条件式も偽なら、処理3を実行
ヒント1
if文の条件式x ≧ 5
は、変数xが5以上ならと読むことができます。
解答解説
〔解答〕
20
〔解説〕
プログラム中の分岐処理は次のとおりです。
if (x ≧ 5) y ← 10 else y ← 20
xが5以上ならyに10
が代入され、xが5未満ならyに20
が代入されます。
変数xには最初に4
が代入されているため、x ≧ 5
の条件式は偽です。したがってelse側の処理が行われ、yには20
が代入され、その次の行で出力されます。
2-2-2 fizzBuzz問題
問題
[出典:基本情報技術者試験 科目B サンプル問題 問2]
次のプログラム中の【 a 】~【 c 】に入れる正しい答えの組合せを、解答群の中から選べ。
関数 fizzBuzzは、引数で与えられた値が、3で割り切れて5で割り切れない場合は“3で割り切れる”を、5で割り切れて3で割り切れない場合は“5で割り切れる”を、3と5で割り切れる場合は“3と5で割り切れる”を返す。それ以外の場合は“3でも5でも割り切れない”を返す。
〔プログラム〕
〇文字列型:fizzBuzz(整数型:num) 文字列型:result if (num が 【 a 】で割り切れる) result ← "【 a 】で割り切れる" elseif (num が【 b 】で割り切れる) result ← "【 b 】で割り切れる" elseif (num が【 c 】で割り切れる) result ← "【 c 】で割り切れる" else result ← ”3でも5でも割り切れない” endif return result
〔解答群〕
a | b | c | |
---|---|---|---|
ア | 3 | 3と5 | 5 |
イ | 3 | 5 | 3と5 |
ウ | 3と5 | 3 | 5 |
エ | 5 | 3 | 3と5 |
オ | 5 | 3と5 | 5 |
ヒント1
if文は一連の条件式のいずれかが真になった時点でセットになっている処理を実行し、後続の条件式や処理を行いません。したがって判定の順番が重要です。
ヒント2
たとえば空欄a,bを下のようにしてしまうと、引数 num が15
の場合に 「3で割り切れる」が表示されてしまい、「3と5で割り切れる」が表示できません。
if (num が 3 で割り切れる) result ← "3で割り切れる" elseif (num が 3と5 で割り切れる) result ← "3と5で割り切れる"
解答解説
〔解答〕
ウ
〔解説〕
ポイントは、"3と5で割り切れる"を最初の条件に持ってきているかどうかです。この条件を満たしている選択肢はウしかありませんので、正解はウとなります。
なお、“3で割り切れる”と“5で割り切れる”の条件式の順番は順不同で構いません。
2-2-3 値を比較する関数
問題
[オリジナル問題]
引数で指定された2つの値 x と y のうち、大きい方を戻り値として返す関数maxを作成します。プログラム中の空欄を埋めてください。
〔プログラム〕
〇整数型: max(整数型: x, 整数型: y) if ( ① ) return x else return y endif
ヒント1
空欄①部分の条件式が真の場合、xを戻り値として返しています(return x
)。つまり、xの方が大きいと判定されていることになります。
解答解説
〔解答〕
①:x>y
空欄①ではxがyより大きいことを判定する必要がありますので、x>y
となります。
2-2-4 while文
問題
[オリジナル問題]
1から5までの値を順に出力するプログラムを作成します。プログラム中の空欄①を埋めてください。
プログラム
整数型 : i ← 1 while (i≦5) iを出力 ① endwhile
基礎知識
前判定くり返し処理の構文(while文)は次のようになります。
while (条件式) 処理 endwhile
条件式が真の間、処理をくり返します。
ヒント1
プログラム例ではwhile文内でiを出力しています。これにより1~5までの値を出力します。したがって空欄①の部分で、iの値が増加する必要があります。
解答解説
〔解答〕
①:i ← i + 1
〔解説〕
くり返しのたびに変数iを1ずつ増加させる必要があります。したがって、空欄①はi ← i + 1
となります。while文内の処理は、5回実行されます。
2-2-5 合計を求める(1)
問題
[オリジナル問題]
1から5までの値を合計し、結果を出力するプログラムを作成します。プログラム中の空欄①を埋めてください。
プログラム
整数型 : i ← 1 整数型 : sum ← 0 /* 合計を保持する */ while (i≦5) ① i ← i + 1 endwhile
考え方
iの値は例題1と同様、1~5まで1ずつ変化します。これらの値を変数sumに次々と足しこんでいきましょう。
解答解説
〔解答〕
①:sum ← sum + i
〔解説〕
合計を求めるための基本的な処理となります。変数sumに変数iの値を次々と足して行くので、sum ← sum + i
となります。
2-2-6 合計を求める(2)
問題
[オリジナル問題]
1から10までの値のうち偶数のみを合計し、結果を出力するプログラムを作成します。プログラム中の空欄①を埋めてください。
〔プログラム〕
整数型 : i ← ① 整数型 : sum ← 0 /* 合計を保持する */ while ( ② ) sum ← sum + i ③ endwhile
考え方
2-2-5の考え方が基本となります。下の3点を考えてみましょう。
- 変数iはいくつから始めるのか?
- 変数iはいくつまで増えるのか?
- 変数iはいくつずつ増やすのか?
解答解説
〔解答〕
①:2
②:i≦10
③:i←i+2
〔解説〕
1~10までの間の偶数なので、2,4,6,8,10の値を加算する必要があります。
(空欄①について)
while文に入るとすぐさまiの値をsumに加算していますので、変数iの初期値は2である必要があります。
(空欄②について)
偶数だけを足せばよいので、変数iを2から始めて、ループのたびに値が2ずつ増えるようにします。i←i+2
とすることで実現できます。
(空欄③について)
最終的に10までをsumに加算したいので、変数iは10まで変化する必要があります。i≦10
とすることで実現できます。
2-2-7 合計を求める関数
問題
[オリジナル問題]
1から引数で指定された値までの整数をすべて加算し、その結果を返す関数sumを作成します。プログラム中の空欄①②を埋めてください。
プログラム
〇整数型: sum(整数型: n) 整数型: i 整数型: ret ← 0 for (i を 1 から ① まで 1 ずつ増やす) ② endfor return ret
基礎知識
くり返し処理(for文)は次のように記述し、くり返し処理を行います。
for (i を 1 から 10 まで 1 ずつ増やす) 処理
上記の場合、処理部分を10回実行します。また、処理部分で変数iを参照できます。
考え方
1~nまでをすべて加算し、その結果を返します。加算結果は変数retに保持します。合計の考え方は、2-2-5を参考にしましょう。
解答解説
〔解答〕
①:n
②:ret ← ret + i
〔解説〕
1~nまでを加算したいので、空欄①はn
が入ります。変数retに値を次々と加算したいので、空欄②はret ← ret + i
となります。
2-2-8 二重ループ
問題
[オリジナル]
次のプログラムを実行します。出力結果内の空欄①~④を答えてください。
〔プログラム〕
整数型 : i, j for (i を 1 から 3 まで 1 ずつ増やす) for (j を 1 から 3 まで 1 ずつ増やす) (i✕j)の結果を、末尾に空白をつけて出力 endfor 改行を出力 endfor
〔出力結果〕
1 2 3 2 ① ② 3 ③ ④
ヒント1
プログラムは下図のように、外側ループの中に内側ループを持つ二重ループになっています。
どちらのforループも変数を「1 から 3 まで 1 ずつ増やす」となっていますので3回行われます。内側ループは外側ループ1回につき3回行われます。
解答解説
〔解答〕
①:4
②:6
③:6
④:9
〔解説〕
二重ループ部分は、下図のように外側ループが3回実行され、外側ループ1回につき内側ループが3回実行されます。したがって、i✕j
の部分は9回実行されることになります。i✕j
は下図右の表のように変化します。
内側ループでi✕j
を3回出力するたびに次の処理で改行が行われるので、出力結果全体は次のようになります。
1 2 3 2 4 6 3 6 9
おわりに
今回は以上となります。最後までご活用いただき、ありがとうございました。次章では配列を扱うプログラムを取り上げます。引き続き、どうぞよろしくお願いいたします。
[PR]
