【2023新試験】基本情報技術者試験 サンプル問題解説
2023年4月から基本情報技術者試験の出題範囲が変更になります。
科目B試験の出題割合は「アルゴリズムとプログラミング」は8割、「情報セキュリティ」が2割になる予定です。
アルゴリズムとプログラミングは下記のカテゴリが出題されます。
- プログラムの基本要素
- データ構造及びアルゴリズム
- プログラミングの諸分野への適用
分野 | 説明 |
---|---|
プログラミング全般に関すること | 実装するプログラムの要求仕様(入出力,処理,データ構造,アルゴリズムほか)の把握,使用するプログラム言語の仕様に基づくプログラムの実装,既存のプログラムの解読及び変更,処理の流れや変数の変化の想定,プログラムのテスト,処理の誤りの特定(デバッグ)及び修正方法の検討 など |
プログラムの処理の実装基本要素に関すること | 型,変数,配列,代入,算術演算,比較演算,論理演算,選択処理,繰返し処理,手続・関数の呼出し など |
データ構造及びアルゴリズムに関すること | 再帰,スタック,キュー,木構造,グラフ,連結リスト,整列,文字列処理 など |
プログラミングの諸分野への適用に関すること | 数理・データサイエンス・AI などの分野を題材としたプログラムなど |
情報セキュリティの確保に関すること | 情報セキュリティ要求事項の提示(物理的及び環境的セキュリティ,技術的及び運用のセキュリティ),マルウェアからの保護,バックアップ,ログ取得及び監視,情報の転送における情報セキュリティの維持,脆弱性管理,利用者アクセスの管理,運用状況の点検 など |
これに向けて、IPAでは変更部分のサンプル問題が掲載されています。
従来の過去問では対策できない範囲ですので、今回はサンプル問題を用いて解説及び試験対策をしていきます。
その他サンプル問題の解説
【試験対策】基本情報技術者試験 新方式解説
【2023新試験】基本情報技術者試験 サンプル問題(科目A試験)
設問を解く前に
疑似言語では処理の記述方法が独特で、「〇」や「:」などの記号を用いて処理を表現します。
どの記号が何の処理を示しているか把握しておかないと設問が正しく理解できません。
まずは下記の表をしっかり頭に入れておきます。これはサンプル問題の後ろのページに記載されている公式な説明。
記述形式 | 説明 |
---|---|
○手続名又は関数名 | 手続又は関数を宣言する。 |
型名: 変数名 | 変数を宣言する。 |
/* 注釈 */ // 注釈 | 注釈を記述する。 |
変数名 ← 式 | 変数に式の値を代入する。 |
手続名又は関数名(引数, …) | 手続又は関数を呼び出し,引数を受け渡す。 |
if (条件式 1) 処理 1 elseif (条件式 2) 処理 2 elseif (条件式 n) 処理 n else 処理 n + 1 endif | 選択処理を示す。 条件式を上から評価し,最初に真になった条件式に対 応する処理を実行する。以降の条件式は評価せず,対応 する処理も実行しない。どの条件式も真にならないと きは,処理 n + 1 を実行する。 各処理は,0 以上の文の集まりである。 elseif と処理の組みは,複数記述することがあり,省 略することもある。 else と処理 n + 1 の組みは一つだけ記述し,省略する こともある。 |
while (条件式) 処理 endwhile | 前判定繰返し処理を示す。 条件式が真の間,処理を繰返し実行する。 処理は,0 以上の文の集まりである。 |
do 処理 while (条件式) | 後判定繰返し処理を示す。 処理を実行し,条件式が真の間,処理を繰返し実行す る。 処理は,0 以上の文の集まりである。 |
for (制御記述) 処理 endfor | 繰返し処理を示す。 制御記述の内容に基づいて,処理を繰返し実行する。 処理は,0 以上の文の集まりである。 |
上の表は正しいのですが、いまいち内容が掴みにくいのでサンプルを付けながらかみ砕いでご説明します。
記述形式 | サンプルコード | 解説 |
---|---|---|
○手続名又は関数名 | 〇export(整数型:number) 整数型:ret ret ← number + 1 return ret | サンプルではexportという名称の関数を定義しています。 引数でnumberという整数型の値を受け取って、1を足してretに代入するというものです。 〇からreturnまでが一つのかたまりです。 |
型名: 変数名 | 整数型:ret | 関数のサンプルで既に記載していますが、変数の宣言です。 処理で使う「箱」を先に準備しておくイメージですね。 |
/* 注釈 */ // 注釈 | /* これはテストコードです */ // サンプル問題 | 注釈を記述します。注釈ですので、処理には関係なくコメントなどが記述できます。 |
変数名 ← 式 | ret ← number + 1 | 定義済みの変数に式や値を代入します。 |
手続名又は関数名(引数, …) | 〇export(整数型:number) 整数型:ret ret ← number + 1 return ret 整数型:temp 整数型:result temp ← 10 result ← export(temp) | 手続又は関数を呼び出し,引数を受け渡します。 export関数を上の方で宣言して、太字にした部分で呼び出しています。 関数の呼び出し後は呼び出された関数の内部の処理が実行されます。 |
if (条件式 1) 処理 1 elseif (条件式 2) 処理 2 elseif (条件式 n) 処理 n else 処理 n + 1 endif | 整数型:temp 文字列:ret temp ← 1 if(temp が 0) ret ← 0が入っています else if(temp が 1) ret ← 1が入っています else ret ← その他の値が入っています endif | if文は上から順番に条件式を確認していき、条件が合致していた場合に中の処理が実行されます。 どれかの条件に一致した場合にはそれ以外の処理は実行されません。 どの条件にも合致しなかった場合はelseの中の処理が実行されます。 elseの条件式については記載がなくても問題ございません。 |
while (条件式) 処理 endwhile | 整数型:temp temp ← 1 while(temp が5より小さい) temp ← temp + 1 endwhile | 条件式に合致するまで中の処理を繰り返します。 whileは最初に条件式の判定が行われるため、サンプルの場合は temp=2 temp=3 temp=4 ここまで繰り返し処理を終えます。 |
do 処理 while (条件式) | 整数型:temp temp ← 1 do temp ← temp + 1 while(temp が5より小さい) | 条件式に合致するまで中の処理を繰り返します。 doは処理後にに条件式の判定が行われるため、サンプルの場合は temp=2 temp=3 temp=4 temp=5 ここまで繰り返し処理を終えます。 |
for (制御記述) 処理 endfor | 整数型:temp for(tempを1から3まで増やす) tempを出力 endfor | 制御記述の条件が完了するまで繰り返し処理を行います。 サンプルコードですと、1~3まで出力して繰り返し処理を終了します。 |
おすすめ参考書
いわるゆ猫本。こちらはイラストが多くとても見やすいので、初学者の方に特にお勧めです。
広い試験範囲をこの本でしっかりカバーしてから問題集などに取り組むと理解が進むと思います。
私は応用情報技術者試験までこのシリーズにお世話になりました。
プログラムの基本要素 問1
基本的なプログラムについて、疑似言語を利用した出題です。
解答群
ア (age が 4 以上) and (age が 9 より小さい)
イ (age が 4 と等しい) or (age が 9 と等しい)
ウ (age が 4 より大きい) and (age が 9 以下)
エ age が 4 以上
オ age が 4 より大きい
カ age が 9 以下
キ age が 9 より小さい
解答
カ
解説
さっそく「〇」が登場しています。これは関数ですので、プログラムの全体構成は下記の通りになります。
if文が並んでいるので条件式に合致した場合に中の処理が実行されます。
問題文に戻って条件を確認します。こういう時は表にすると分かりやすいです。
年齢 | 入場料 |
---|---|
3歳以下 | 100円 |
4歳~9歳 | 300円 |
10歳以上 | 500円 |
まず条件に入れるべきは真ん中の「4歳~9歳」であることが分かります。
では解答群のなかで4歳~9歳が対象となる条件を探します。ポイントは「~より大きい・小さい」と「~以上・以下」です。
「~より大きい・小さい」は~よりの部分の数字は含みません。
「~以上・以下」は~の部分の数字は含みます。
整理すると解答群はこのようになります。
4歳から9歳という条件を満たしているのは「カ」だけですね。
プログラムの基本要素 問2
こちらも疑似言語を利用した出題です
解答群
a | b | |
---|---|---|
ア | array の要素数 - left | array[left] |
イ | array の要素数 - left | array[right] |
ウ | array の要素数 - left + 1 | array[left] |
エ | array の要素数 - left + 1 | array[right] |
解答
ウ
解説
配列には1から5の値が設定されています。
配列要素の並び順を逆にするということなので、下記のように箱が5つ並んでいるイメージです。
これを1つずつ内側に移動しながら処理を繰り返していきます。「要素数÷2の商」すなわち真ん中かその手前に来たら処理終了です。
まずは最初にaに入れる値を考えます。rightにはその名の通り、入れ替える「右側の箱」を代入する必要があります。数字は『5』ですね。
では5を作り出すにはどうすればいいか考えるために、現在変数に入っている値を整理してみます。
arrayの要素数:5
left:1
「右側の箱」を示す5を作るには、arrayの要素数 - left +1という計算式が必要になります。これであれば、leftが一つ進んで2になった時も右側の箱も1つ進んで4になりますね。
次にbに入れる値を考えます。箱の中身を入れ替えるのでarray[right]とarray[left]を入れ替えればいいのですが、array[right]にarray[left]の値を代入した時点で値が更新されてしまいますので、一度tmp(temporaryの略でよく使う)に代入します。
元々入れたかったのはarray[left]ですので、tmpの値を代入する必要があります。
よって答えはウになります。
プログラムの基本要素 問3
データ構造及びアルゴリズムの問題です。短方向リストのイメージがつかめないと少し難しい気がします。
アルゴリズムについて問われている通り、一つ一つコードを追っていく必要があります。
解答群
a | b | |
---|---|---|
ア | 未定義 | curr |
イ | 未定義 | curr.next |
ウ | 未定義 | listHead |
エ | 未定義でない | curr |
オ | 未定義でない | curr.next |
カ | 未定義でない | listHead |
解答
ア
解説
単方向リストでデータを保持しているので、各箱で持っているデータは「自分に格納された文字列」と「次のリストの参照先」になります。
listHeadは先頭のデータの参照先なので、空であればいま登録しているデータが先頭ということになり自分の参照先を登録します。
なのでaは「未定義」が入ります。
listHeadが未定義でなければすでにリストは存在していることになるので、登録したいデータは『一番最後に箱を追加して登録する』必要があります。while分で処理している内容は「一つ一つりリストを辿っていき、次が無かったら繰り返し処理を終了する」というものなので、この繰り返しを抜けた後にその次の箱(一番最後)にデータを登録します。
登録すべきデータはcurrに代入されているので、これをprev.nextに代入する必要があります。
ちなみに curr は current(現在登録しようとしているデータ)という意味の略だと思われます。