旧制度の午前・午後と、2023年度以降の科目A・科目Bの公開問題を区別しています。現在の試験対策では現行シラバスと科目Bの形式を確認してください。公開問題は本試験の全出題を網羅する資料ではありません。
2019年度 秋期 午後の概要
テレワークの導入に伴うネットワーク構成とパケットフィルタリング
情報セキュリティ · ファイアウォール / パケットフィルタリング / VPN / VDI / ネットワークプレフィクス
テレワーク導入に伴うファイアウォール(FW)のパケットフィルタリング設定に関する次の記述を読み、各設問に答えよ。 ソフトウェア開発会社A社ではテレワークを導入し、シンクライアント端末からVPN経由で接続後、画面転送型の仮想デスクトップ(VDI)を利用して業務を行うこととした。 ・事務室ネットワーク: 192.168.0.0/24(事務PC) ・開発室ネットワーク: 192.168.1.0/24(開発PC) ・VPNクライアント割当IPアドレス: 192.168.16.0/24 ・事務VM割当IPアドレス: 192.168.64.0/24 ・開発VM割当IPアドレス: 192.168.65.0/24 ・開発サーバ群: 192.168.128.0/20 ・VDIサーバ群: 192.168.64.0/20 ・プロキシサーバ: 203.0.113.20(サーバ室セグメント 203.0.113.0/24) ・VPNサーバ: 203.0.113.10(同上) 【表1の初期ルール案(抜粋)】 ルール6: 送信元「192.168.1.0/24」宛先「192.168.128.0/20」サービス「HTTPS, SSH」動作「許可」 ルール7: 送信元「192.168.64.0/23」宛先「192.168.128.0/20」サービス「HTTPS, SSH」動作「許可」 ルール8: 送信元「全て」宛先「全て」サービス「全て」動作「拒否」 [設問1] 表1のルール案ではルール7の送信元条件に誤りがあり、[ a ]ことが分かった。開発サーバへのアクセスを正しく制限するため、送信元を[ b ]に変更した。 [設問2] シンクライアント端末から開発サーバにアクセスするときの接続経路として適切なものを選べ。 [設問3] 社内の事務PC及び開発PCからも仮想マシンを利用したいという要望が出た。この要望に応えるため、表1のルール案に必要な変更として適切なものを選べ。
- 設問1 a ア
- 開発PCから開発サーバにアクセスできない
- 設問1 a イ
- 開発VMから開発サーバにアクセスできない
- 設問1 a ウ
- 事務PCから開発サーバにアクセスできる
- 設問1 a エ
- 事務VMから開発サーバにアクセスできる
- 設問1 b ア
- 192.168.0.0/24
- 設問1 b イ
- 192.168.1.0/24
- 設問1 b ウ
- 192.168.16.0/24
- 設問1 b エ
- 192.168.64.0/24
- 設問1 b オ
- 192.168.65.0/24
- 設問1 b カ
- 192.168.128.0/20
- 設問1 b キ
- 192.168.128.0/24
- 設問1 b ク
- 203.0.113.0/24
- 設問1 b ケ
- インターネット
- 設問2 ア
- シンクライアント端末 → VDI サーバ → VPN サーバ → 開発 PC → 開発サーバ
- 設問2 イ
- シンクライアント端末 → VDI サーバ → VPN サーバ → 開発 VM → 開発サーバ
- 設問2 ウ
- シンクライアント端末 → VDI サーバ → 開発 VM → 開発 PC → 開発サーバ
- 設問2 エ
- シンクライアント端末 → VPN サーバ → VDI サーバ → 開発 PC → 開発サーバ
- 設問2 オ
- シンクライアント端末 → VPN サーバ → VDI サーバ → 開発 VM → 開発サーバ
- 設問2 カ
- シンクライアント端末 → VPN サーバ → 開発 PC → 開発 VM → 開発サーバ
- 設問3 ア
- 変更する必要はない。
- 設問3 イ
- ルール番号3と4の間に、送信元を192.168.0.0/23、宛先を192.168.64.0/20、サービスをVDI、及び動作を許可とするルールを新たに挿入する必要がある。
- 設問3 ウ
- ルール番号3と4の間に、送信元を192.168.64.0/23、宛先を192.168.0.0/23、サービスをVDI、及び動作を許可とするルールを新たに挿入する必要がある。
- 設問3 エ
- ルール番号3と4の間に、送信元をインターネット、宛先を192.168.64.0/20、サービスをVDI、及び動作を許可とするルールを新たに挿入する必要がある。
解答・解説を表示
解答
設問1 a: エ, 設問1 b: オ, 設問2: オ, 設問3: イ
解説
まず要点:IPアドレスは「/23」のような長さ(プレフィクス長)によって、まとめて表せる範囲が決まります。その範囲にどの機器が入るかを正しく確かめ、必要な通信だけを許可する許可リスト方式でルールを作ります。範囲を広げすぎると、本来つないではいけない機器まで通してしまいます。
解き方
- マスク長/23の範囲(192.168.64.0〜192.168.65.255)を計算し、事務VMと開発VMのどちらが入るかを見て、問題点と正しい送信元を導きます。
- 端末からVPNサーバ、VDIサーバの順にたどり、開発VMにログインして、そのVMから目的のサーバへアクセスする流れを整理します。
- 事務PCと開発PCのアドレスをまとめた範囲を求め、VDIサーバへのアクセスを許可するルールを考えます。
小問ごとの答え
- 小問 設問1 a:エ
- ルール7の送信元「192.168.64.0/23」は192.168.64.0/24(事務VM)と192.168.65.0/24(開発VM)の両方を含んでいるため、本来アクセスを許可してはならない事務VMから開発サーバにアクセスできる状態になってしまいます。
- 小問 設問1 b:オ
- 開発サーバへのアクセスが許可されるべき仮想環境は開発VMのみであるため、送信元は開発VMのネットワークである「192.168.65.0/24」に設定する必要があります。
- 小問 設問2:オ
- 利用者はまずVPNクライアントでVPNサーバへ接続し、次にVDIクライアントでVDIサーバに接続して割り当てられた「開発VM」にログインします。開発サーバへアクセスして処理を行うのはその「開発VM」です。
- 小問 設問3:イ
- 社内の事務PC(192.168.0.0/24)および開発PC(192.168.1.0/24)をまとめたネットワーク範囲は「192.168.0.0/23」です。これらからVDIサーバ群(192.168.64.0/20)へのVDI接続を許可するため、送信元192.168.0.0/23、宛先192.168.64.0/20、サービスVDIを許可するルールを追加します。
覚えるポイント
- CIDRの/23は末尾ビットが0と1の連続する2つの/24サブネットを集約した範囲を表す。
間違えやすいところ
- 192.168.64.0/23には事務VMと開発VMの両方が含まれる点を見落とさないようにしましょう。
出題の前提:令和元年度秋期 基本情報技術者試験 午後 問1
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.5 ↗(www.ipa.go.jp) / 公式問題冊子 p.6 ↗(www.ipa.go.jp) / 公式問題冊子 p.7 ↗(www.ipa.go.jp) / 公式問題冊子 p.8 ↗(www.ipa.go.jp) / 公式問題冊子 p.9 ↗(www.ipa.go.jp)
スレッドを使用した並列実行とアムダールの法則
ソフトウェア · 並列処理 / マルチスレッド / アムダールの法則 / データ依存性
スレッドを使用した並列実行に関する次の記述を読んで、設問1〜3に答えよ。 プログラム全体の実行時間に対する並列実行可能な部分の実行時間の割合を r(0≦r≦1)、スレッドの個数を n(n≧1)とすると、マルチプロセッサシステムにおけるプログラム実行時間の高速化率 E は次式で求められる(アムダールの法則)。 E = 1 / ((1 - r) + r / n) [設問1] プログラムAに対してスレッド数 n=2 を適用すると、高速化率 E は 3/2 になった。この場合、r は [ a ] である。 r が 3/4 であるプログラムBの場合、スレッドの個数を無限に増やしても高速化率の上限は [ b ] である。 [設問2] 配列操作を行うループの並列化において、以下のプログラムをスレッド2つに分割した場合の動作を検討する。 ・プログラム2: i: 1〜100 に対して a[i] ← a[i+1] + b[i] これをスレッド2-1(i1: 1〜50)とスレッド2-2(i2: 51〜100)に分割すると、[ c ] ことがあるので、実行結果が等しくなることを保証できない。 ・プログラム3: i: 2〜101 に対して a[i] ← a[i-1] + b[i] これをスレッド3-1(i1: 2〜51)とスレッド3-2(i2: 52〜101)に分割すると、[ d ] ことがあるので、実行結果が等しくなることを保証できない。 [設問3] プログラム4: i: 1〜10 に対して a[ip[i]] ← b[i] これをスレッド4-1(i1: 1〜5)とスレッド4-2(i2: 6〜10)に分割する。配列 ip の要素番号1〜5の値が [1, 2, 3, 4, 5] であるとき、スレッド並列法を安全に適用できる配列 ip の要素番号6〜10(e)を選べ。
- 設問1 a ア
- 1/6
- 設問1 a イ
- 1/4
- 設問1 a ウ
- 1/3
- 設問1 a エ
- 1/2
- 設問1 a オ
- 2/3
- 設問1 b ア
- 2
- 設問1 b イ
- 3
- 設問1 b ウ
- 4
- 設問1 b エ
- 6
- 設問1 b オ
- 8
- 設問2 c ア
- a[51]の値をスレッド2-1で更新するより先にスレッド2-2で更新する
- 設問2 c イ
- a[51]の値をスレッド2-1で更新するより先にスレッド2-2で参照する
- 設問2 c ウ
- a[51]の値をスレッド2-1で参照するより先にスレッド2-2で更新する
- 設問2 c エ
- a[51]の値をスレッド2-1で参照するより先にスレッド2-2で参照する
- 設問2 d ア
- a[51]の値をスレッド3-1で更新するより先にスレッド3-2で更新する
- 設問2 d イ
- a[51]の値をスレッド3-1で更新するより先にスレッド3-2で参照する
- 設問2 d ウ
- a[51]の値をスレッド3-1で参照するより先にスレッド3-2で更新する
- 設問2 d エ
- a[51]の値をスレッド3-1で参照するより先にスレッド3-2で参照する
- 設問3 e ア
- 1, 2, 8, 9, 10
- 設問3 e イ
- 5, 6, 7, 8, 9
- 設問3 e ウ
- 6, 7, 4, 9, 10
- 設問3 e エ
- 6, 7, 8, 9, 10
解答・解説を表示
解答
設問1 a: オ, 設問1 b: ウ, 設問2 c: ウ, 設問2 d: イ, 設問3 e: エ
解説
まず要点:並列化でどれだけ速くなるかはアムダールの法則(全体のうち並列にできる割合rとスレッド数nで決まる式)で決まります。並列にできない部分が残るほど、速くできる上限は頭打ちになります。また同じデータを複数のスレッドで読み書きすると、順番によって結果が変わるので安全ではありません。
解き方
- アムダールの式にn=2, E=3/2を代入してrを求め、nを無限大にしたときの上限も計算します。
- 順番に実行したときのa[51]の参照と更新の順序を確かめ、並列でどちらが先になると誤るかを特定します。
- 同じ要素への書き込みがぶつからないよう、前半と後半のスレッドで書き込む添字に重なりがない選択肢を選びます。
小問ごとの答え
- 小問 設問1 a:オ
- E = 1 / ((1 - r) + r/2) = 3/2 より、分母は 2/3 です。1 - r/2 = 2/3 となるため、r/2 = 1/3、すなわち r = 2/3 となります。
- 小問 設問1 b:ウ
- スレッド数 n を無限大に近づけると r/n は 0 に収束するため、E の上限値は 1 / (1 - r) となります。r = 3/4 のとき、1 / (1 - 3/4) = 1 / (1/4) = 4 です。
- 小問 設問2 c:ウ
- 逐次実行では i=50 で a[51] の更新前を参照した後に、i=51 で a[51] が更新されます。並列実行するとスレッド2-1での参照より先にスレッド2-2で a[51] が更新されてしまう競合(WAR依存違反)が生じる可能性があります。
- 小問 設問2 d:イ
- プログラム3の逐次実行では i1=51 で a[51] が更新された後に、i2=52 で a[51] が参照されます。並列化するとスレッド3-1での更新より先にスレッド3-2で a[51] が参照されてしまう(RAW依存違反)可能性があります。
- 小問 設問3 e:エ
- スレッド4-1が書き込む配列 a の添字は ip[1〜5] である {1, 2, 3, 4, 5} です。スレッド4-2が同じ要素に書き込むと競合が発生するため、ip[6〜10] は {1, 2, 3, 4, 5} と重複しない値の集合である「6, 7, 8, 9, 10」でなければなりません。
覚えるポイント
- アムダールの法則における最大高速化率の上限は、プロセッサ数を無限大とした極限 1/(1-r) である。
間違えやすいところ
- ループの並列化で、変数の更新と参照のどちらが先であるべきかを取り違えないようにしましょう。
出題の前提:令和元年度秋期 基本情報技術者試験 午後 問2
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.10 ↗(www.ipa.go.jp) / 公式問題冊子 p.11 ↗(www.ipa.go.jp) / 公式問題冊子 p.12 ↗(www.ipa.go.jp) / 公式問題冊子 p.13 ↗(www.ipa.go.jp) / 公式問題冊子 p.14 ↗(www.ipa.go.jp)
書籍及び貸出情報を管理する関係データベースの設計及び運用
データベース · 関係データベース / SQL / 集約関数 / GROUP BYとHAVING / 参照整合性制約 / 主キーと外部キー
資料室の書籍貸出管理データベースに関する問題である。書籍情報表(ISBNコード、書籍名、著者名、出版社名、出版年)と貸出表(貸出番号、ISBNコード、従業員番号、貸出日、返却予定日、返却日)により運用されている。設問1では指定ISBNコードの最新の貸出状態を取得するSQL文の空欄a(CASE式)および空欄b(最新貸出日を特定する副問合せ)を埋める。設問2では指定期間内に4回以上貸し出された書籍を抽出するSQL文の空欄c(条件および集約句)を埋める。設問3では同一ISBNの複数冊所蔵や購入日管理などの要件を満たすために書籍表とラック表を追加した再構築案において、同一書籍の追加購入時にレコード追加が必要な表(空欄d)と、書籍廃棄時に参照整合性制約違反を防ぐ削除手順(空欄e)を問う。
- 設問1 a ア
- 貸出表.返却日 IS NOT NULL THEN '貸出中' ELSE '貸出可'
- 設問1 a イ
- 貸出表.返却日 IS NOT NULL THEN '貸出中' WHEN 貸出表.返却日 IS NULL THEN '貸出可'
- 設問1 a ウ
- 貸出表.返却日 IS NULL THEN '貸出可' ELSE '貸出中'
- 設問1 a エ
- 貸出表.返却日 IS NULL THEN '貸出中' WHEN 貸出表.返却日 IS NOT NULL THEN '貸出可'
- 設問1 b ア
- DISTINCT 貸出表.貸出日
- 設問1 b イ
- MAX(貸出表.貸出日)
- 設問1 b ウ
- MIN(貸出表.貸出日)
- 設問1 b エ
- 貸出表.貸出日
- 設問2 c ア
- AND (貸出表.貸出日 >= '2018-04-01' OR 貸出表.貸出日 <= '2019-03-31') GROUP BY 書籍情報表.ISBNコード, 書籍情報表.書籍名 HAVING COUNT(*) >= 4
- 設問2 c イ
- AND 貸出表.貸出日 BETWEEN '2018-04-01' AND '2019-03-31' GROUP BY 書籍情報表.ISBNコード, 書籍情報表.書籍名 HAVING COUNT(*) >= 4
- 設問2 c ウ
- AND 貸出表.貸出日 >= '2018-04-01' AND 貸出表.貸出日 <= '2019-03-31' AND COUNT(*) >= 4
- 設問2 c エ
- GROUP BY 書籍情報表.ISBNコード, 書籍情報表.書籍名, 貸出表.貸出日 HAVING 貸出表.貸出日 >= '2018-04-01' AND 貸出表.貸出日 <= '2019-03-31' AND COUNT(*) >= 4
- 設問3 d ア
- 書籍表
- 設問3 d イ
- 書籍表及びラック表
- 設問3 d ウ
- 書籍情報表及び書籍表
- 設問3 d エ
- 書籍情報表, 書籍表及びラック表
- 設問3 e ア
- ②→①→③→④
- 設問3 e イ
- ②→①→④→③
- 設問3 e ウ
- ②→③→①→④
- 設問3 e エ
- ②→③→④→①
- 設問3 e オ
- ②→④→①→③
- 設問3 e カ
- ②→④→③→①
解答・解説を表示
解答
設問1 a: エ, 設問1 b: イ, 設問2 c: イ, 設問3 d: ア, 設問3 e: カ
解説
まず要点:データベースでは、値が空っぽ(NULL)かどうかは「IS NULL/IS NOT NULL」で調べます。また、件数を数えるなどまとめた後の条件はWHEREではなくHAVINGに書きます。さらに親子関係のある表は、参照している子の行から先に消さないとエラーになります。
解き方
- 設問1:貸出中は返却日が空、返却済みは返却日が入っていることを確かめ、最新日を出すMAXを選びます。
- 設問2:期間を指定するBETWEEN、書籍ごとのGROUP BY、まとめた後の条件に使うHAVINGを組み立てます。
- 設問3:各表の主キーと外部キーの関係を確かめ、追加購入で増えるのは書籍表だけ、削除は子から親の順と判断します。
小問ごとの答え
- 小問 設問1 a:エ
- 貸出中のレコードは返却日がNULLであり、返却済みのレコードは返却日に日付が設定されます。したがって返却日がNULLのときに'貸出中'、返却日がNOT NULLのときに'貸出可'とする条件分岐が適切です。
- 小問 設問1 b:イ
- 対象書籍の最も新しい貸出レコードを1件に特定する必要があるため、副問合せでは貸出日の最大値を求める集約関数MAX(貸出表.貸出日)を指定します。
- 小問 設問2 c:イ
- 2018年4月1日から2019年3月31日までの期間絞り込みにはBETWEEN句を使用し、書籍ごとに集計するためにGROUP BY句でISBNコードと書籍名を指定し、貸出回数が4回以上という集約条件はHAVING COUNT(*) >= 4で指定します。
- 小問 設問3 d:ア
- 既に所蔵している書籍と同じISBNコードの書籍を追加購入する場合、書籍情報表やラック表には既存のレコードが存在するため追加は不要であり、新たに割り振られた書籍番号と購入日を持つ書籍表にのみレコードを追加します。
- 小問 設問3 e:カ
- 参照整合性制約がある環境でレコードを削除する場合、参照している子表から順に削除する必要があります。まず対象ISBNコードの書籍番号を抽出し(②)、その書籍番号を参照している貸出表のレコードを削除し(④)、次に書籍表のレコードを削除し(③)、最後に親表である書籍情報表のレコードを削除します(①)。
覚えるポイント
- HAVING句はGROUP BYされたグループに対する条件指定に用いる。
- 外部キー参照制約がある場合、削除は子表から親表の順に行う。
間違えやすいところ
- WHEREの中にCOUNTなどの集約関数を直接書いてしまう誤りに注意しましょう。
- 外部キーのある表で、親の行を先に消そうとする誤りに注意しましょう。
出題の前提:令和元年度 秋期 基本情報技術者試験 午後問3
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.15 ↗(www.ipa.go.jp) / 公式問題冊子 p.16 ↗(www.ipa.go.jp) / 公式問題冊子 p.17 ↗(www.ipa.go.jp) / 公式問題冊子 p.18 ↗(www.ipa.go.jp) / 公式問題冊子 p.19 ↗(www.ipa.go.jp)
NATおよびNAT64によるアドレス変換技術
ネットワーク · NAT / NAPT / IPv6 / NAT64 / DNS64 / アドレス変換
LAN内機器とインターネット間、およびIPv6機器とIPv4機器間の通信を実現するアドレス変換技術(NAT、動的NAT、NAT64、DNS64)に関する問題である。設問1では、(1)インターネット公開サーバの設置、(2)LAN内機器からのインターネットアクセス、(3)固定ポートを用いたLAN間相互通信のうち、動的NATが適しているケースを問う。設問2では、DNS64の動作におけるネットワーク種別とIPアドレス(空欄a1〜a3)、および図1に示すIPv6機器(fc00::2)からIPv4機器(192.168.0.2)への通信と返信における各ヘッダのアドレス変換例(空欄b, c, d)を問う。
- 設問1 ア
- (1)だけ
- 設問1 イ
- (1)と(2)
- 設問1 ウ
- (1)と(3)
- 設問1 エ
- (2)だけ
- 設問1 オ
- (2)と(3)
- 設問1 カ
- (3)だけ
- 設問2 a ア
- a1: IPv4, a2: IPv4, a3: IPv6
- 設問2 a イ
- a1: IPv4, a2: IPv6, a3: IPv4
- 設問2 a ウ
- a1: IPv6, a2: IPv4, a3: IPv6
- 設問2 a エ
- a1: IPv6, a2: IPv6, a3: IPv4
- 設問2 b ア
- 192.168.0.0
- 設問2 b イ
- 192.168.0.1
- 設問2 b ウ
- 192.168.0.2
- 設問2 b エ
- 64:ff9b::
- 設問2 b オ
- 64:ff9b::c0a8:1
- 設問2 b カ
- 64:ff9b::c0a8:2
- 設問2 b キ
- fc00::
- 設問2 b ク
- fc00::1
- 設問2 b ケ
- fc00::2
- 設問2 c ア
- 192.168.0.0
- 設問2 c イ
- 192.168.0.1
- 設問2 c ウ
- 192.168.0.2
- 設問2 c エ
- 64:ff9b::
- 設問2 c オ
- 64:ff9b::c0a8:1
- 設問2 c カ
- 64:ff9b::c0a8:2
- 設問2 c キ
- fc00::
- 設問2 c ク
- fc00::1
- 設問2 c ケ
- fc00::2
- 設問2 d ア
- 192.168.0.0
- 設問2 d イ
- 192.168.0.1
- 設問2 d ウ
- 192.168.0.2
- 設問2 d エ
- 64:ff9b::
- 設問2 d オ
- 64:ff9b::c0a8:1
- 設問2 d カ
- 64:ff9b::c0a8:2
- 設問2 d キ
- fc00::
- 設問2 d ク
- fc00::1
- 設問2 d ケ
- fc00::2
解答・解説を表示
解答
設問1: エ, 設問2 a: エ, 設問2 b: ウ, 設問2 c: イ, 設問2 d: カ
解説
まず要点:アドレスを1対1で固定して対応づける静的NATは、外部にサーバを公開するときに向いています。一方、通信のたびにアドレスとポート番号を割り当てる動的NAT(NAPT)は、内側から外へ接続するときに向いています。IPv6とIPv4をつなぐNAT64/DNS64では、DNS64がIPv4アドレスに決まった数字(プレフィクス)を付けてIPv6風のアドレスを作り、NAT64ルータがヘッダを相互に変換します。
解き方
- 設問1:通信を始める向きとポートの条件を確かめ、外からの公開や固定ポートは静的NAT、内側からの普通の通信は動的NATなので(2)だけを選びます。
- 設問2 a:DNS64の置き場所(IPv6網)と、問い合わせ元が求めるIPv6アドレス、元になるIPv4アドレスの関係を整理します。
- 設問2 b〜d:図1の経路に沿って、NAT64ルータによる宛先の変換(b)、送信元の変換(c)、返信時の送信元(d)を順に特定します。
小問ごとの答え
- 小問 設問1:エ
- 動的NATはLAN内から外部への通信発生時に動的にアドレスやポートを割り当てる方式であるため、内側からアクセスを開始する(2)に適しています。外部から接続を受け付ける(1)や固定ポート相互通信を行う(3)には、対応があらかじめ固定された静的NATが必要です。
- 小問 設問2 a:エ
- DNS64はIPv6ネットワークに置かれ、IPv6機器からの問い合わせに対してIPv6アドレス(AAAAレコード)があればそれを返し、無ければIPv4アドレス(Aレコード)を取得してプレフィクスを付加したIPv6アドレスに変換して返します。
- 小問 設問2 b:ウ
- IPv6宛先アドレス64:ff9b::c0a8:2の末尾c0a8:2は16進数で192.168.0.2を表すため、IPv4パケットに変換した際の宛先IPアドレスbは192.168.0.2となります。
- 小問 設問2 c:イ
- NAT64ルータがIPv4ネットワークへパケットを送出する際、送信元IPアドレスcにはNAT64ルータ自身のIPv4アドレスである192.168.0.1が設定されます。
- 小問 設問2 d:カ
- IPv4機器からの返信パケットをIPv6機器へ転送する際、送信元IPアドレスdはIPv4機器のアドレス(192.168.0.2)にプレフィクスを付加した64:ff9b::c0a8:2に変換されます。
覚えるポイント
- 動的NAT(NAPT)は内側から外側へのセッション開始時にポートを動的割り当てする。
- NAT64ではプレフィクス(64:ff9b::/96)にIPv4アドレスの16進数表記を結合してIPv6アドレスを合成する。
間違えやすいところ
- 外から内へ入る公開サーバに動的NATが使えると誤解しないようにしましょう。
- NAT64の変換で、ルータ自身と相手機器のアドレスの変換方向を混同しないようにしましょう。
出題の前提:令和元年度 秋期 基本情報技術者試験 午後問4
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.20 ↗(www.ipa.go.jp) / 公式問題冊子 p.21 ↗(www.ipa.go.jp) / 公式問題冊子 p.22 ↗(www.ipa.go.jp) / 公式問題冊子 p.23 ↗(www.ipa.go.jp)
ストレスチェックの検査支援システムの処理設計とテストデータ選定
ソフトウェア設計 · フローチャート / 条件判定 / ブラックボックステスト / ホワイトボックステスト
労働安全衛生法に基づくストレスチェックの検査支援システムにおいて、質問回答結果から高ストレス者を判別する処理の流れ図を作成する。高ストレス者の判別条件(領域Bが77点以上、または領域Bが63点以上76点以下かつ領域A・Cの和が76点以上)に基づき、図2の流れ図の空欄a〜dを埋めよ。さらに、要件の判別結果を網羅するブラックボックステスト用データ(空欄e)および流れ図の全分岐パスを網羅するホワイトボックステスト用データ(空欄f)を最少件数で選定せよ。
解答・解説を表示
解答
設問1 a: ア, 設問1 b: オ, 設問1 c: ク, 設問1 d: キ, 設問2 e: オ, 設問2 f: ク
解説
まず要点:複数の条件で場合分けする流れ図では、どの条件にも当てはまらない、複数に当てはまる、といったすき間や重なりがないように分けます。テストの作り方も目的で変わり、仕様どおりかを確かめる同値分割(中身を見ずに入出力で確かめる方法)と、処理の分かれ道を全部通すパス網羅(中身の構造を見て確かめる方法)では、必要なテストデータの選び方が違います。
解き方
- 高ストレス者と判定する2つのルールを整理し、領域Bの得点と領域A+Cの得点の境界を正しくつかみます。
- 流れ図の初期値0と更新の1の流れを確かめ、各判定からの分かれ道a〜dを特定します。
- 提示された6つのテストデータについて、各領域の合計点から判定結果と通る道すじを分類します。
- 同値分割の3通りと全パス網羅の4通りを満たす最小の組み合わせをそれぞれ選びます。
小問ごとの答え
- 小問 設問1 a:ア
- 領域Bの合計点が62点以下の場合は高ストレス者の条件を一切満たさないため、和の計算を行わずに判別結果0のまま終了へ分岐します。
- 小問 設問1 b:オ
- 領域Bが「63点以上かつ76点以下」のときは、高ストレス者判別条件②を満たす可能性があるため、領域A及びCの合計点の和を計算する処理へ分岐します。
- 小問 設問1 c:ク
- 領域A及びCの合計点の和が「76点以上」であれば条件②を満たすため、判別結果を1に更新する処理へ進みます。
- 小問 設問1 d:キ
- 領域A及びCの合計点の和が「75点以下」であれば条件②を満たさないため、判別結果を更新せず終了へ分岐します。
- 小問 設問2 e:オ
- 条件①(高ストレス)、条件②(高ストレス)、それ以外(非高ストレス)の3通りを最少3件で網羅するため、データ4(条件①該当)、データ5(それ以外該当)、データ6(条件②該当)の組合せであるオを選択します。
- 小問 設問2 f:ク
- 流れ図の4つの分岐パス(領域B≧77、領域B≦62、Bが63〜76かつA+C≧76、Bが63〜76かつA+C≦75)を通過させるため、データ4(パス1)、データ5(パス2)、データ6(パス3)、データ1(パス4)を含むクを選定します。
覚えるポイント
- 境界値を含むか否か(以上・以下・より大きい・未満)を厳密に区別すること。
- ホワイトボックステストの分岐網羅では、判定ボックスから出るすべての矢印を通過させる必要がある。
間違えやすいところ
- 「63点以上76点以下」の境界を「77点以下」と取り違えないようにしましょう。
- テストデータ選びで、結果の網羅(機能テスト)と道すじの網羅(構造テスト)を混同しないようにしましょう。
出題の前提:問題文に示された厚生労働省のストレスチェック制度実施マニュアルに基づく判別条件およびフローチャート・テスト設計の原則に基づく。
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.24 ↗(www.ipa.go.jp) / 公式問題冊子 p.25 ↗(www.ipa.go.jp) / 公式問題冊子 p.26 ↗(www.ipa.go.jp) / 公式問題冊子 p.27 ↗(www.ipa.go.jp)
結合テスト工程における進捗管理と品質管理(バグ管理図)
プロジェクトマネジメント · バグ管理図 / 進捗管理 / 品質管理 / テスト工程管理 / ソフトウェアレビュー
販売管理システムの結合テスト工程において、バグ管理図を活用して進捗および品質を評価・管理する。テスト期間の60%経過時点における全体の未消化テスト項目数と累積バグ検出数の実績値と計画値の比較(設問1 a, b)、消化済テスト項目数実績値に基づくバグ検出計画値との乖離度評価(設問1 c)、担当者ごとの計画値計算(設問2 d)および進捗遅れの要因に応じた適切な是正措置(設問2 e)、さらに特定担当者の設計誤り多発に対する他機能への波及防止策(設問3 f)を答えよ。
解答・解説を表示
解答
設問1 a: ア, 設問1 b: ア, 設問1 c: エ, 設問2 d: エ, 設問2 e: イ, 設問3 f: イ
解説
まず要点:結合テストでは、こなしたテストの数と見つかったバグの数を、計画や基準値(消化した項目数×バグの標準的な割合)と比べて、品質が安定しているかを判断します。問題が起きたときは、本当の原因(テストデータ作りが足りない、特定の人の設計書が間違っているなど)を見きわめ、そこだけを直す対策を行うことが大切です。
解き方
- 表1と表2から、60%経過時点の実績(消化済み項目、未消化項目、バグ累計)を集めて計算します。
- 計画のグラフ(実線が未消化項目、破線がバグ累計)と実績を比べ、多いか少ないかを判断します。
- 消化済み項目数に標準の0.02を掛けて基準のバグ数を出し、実績との比率を±25%と比べます。
- 全体の計画進捗率から、担当者Bの消化済み計画値を割合で計算します。
- 各担当者の遅れやバグの本当の原因を問題文から読み取り、最も効果的な対策を選びます。
小問ごとの答え
- 小問 設問1 a:ア
- 60%経過時点の消化済テスト項目数実績値の合計は1,750件であり、未消化テスト項目数実績値は3,500-1,750=1,750件となります。これは計画値1,400件より大きいため、実線の折れ線が示す値より大きくなります。
- 小問 設問1 b:ア
- 60%経過時点の累積バグ検出数実績値の合計は4+9+8+11+13=45件です。これは計画値の42件より大きいため、破線の折れ線が示す値より大きくなります。
- 小問 設問1 c:エ
- 消化済実績値1,750件に対するバグ検出計画値は1,750×0.02=35件です。実績値45件は35件の約128.6%であり、許容範囲の125%を超えているため品質に問題があります。
- 小問 設問2 d:エ
- 60%経過時点での全体の消化済計画値は3,500-1,400=2,100件(進捗率60%)です。担当者Bの担当項目数計画値700件に0.6を乗じると420件となります。
- 小問 設問2 e:イ
- Aさんはテスト手順や内容には問題がないものの「テストデータの作成に時間を要している」ことが遅れの原因であるため、要員を追加してデータ作成を支援するのが適切です。
- 小問 設問3 f:イ
- Eさんが担当する機能2で詳細設計書の論理誤りが多発しており、機能2担当者が詳細設計を行った他の未着手機能でも同様の誤りが懸念されるため、その担当者が担当した機能の詳細設計書を再レビューするのが適切です。
覚えるポイント
- バグ管理図において未消化項目数が計画より多いことは、テスト実施の遅れを意味する。
- バグ検出の評価は「消化済テスト項目数実績値×標準値」に対する実績バグ数の比率(品質ゾーン)で行う。
間違えやすいところ
- 未消化と消化済みの項目数を混同し、実績が計画より多いか少ないかの判定を逆にしないようにしましょう。
- バグ計画値を全体の計画(3,500件・42件)で計算してしまい、消化済み実績(1,750件)を使わない誤りに注意しましょう。
出題の前提:問題文に提示されたバグ管理図の定義、標準値(0.02件/項目)、評価基準式および品質判定基準(±25%)に基づく。
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.28 ↗(www.ipa.go.jp) / 公式問題冊子 p.29 ↗(www.ipa.go.jp) / 公式問題冊子 p.30 ↗(www.ipa.go.jp) / 公式問題冊子 p.31 ↗(www.ipa.go.jp) / 公式問題冊子 p.32 ↗(www.ipa.go.jp)
製品別の収益分析と損益分岐点・安全余裕率の計算
経営戦略・企業と法務 · 管理会計 / 損益分岐点分析 / 安全余裕率 / 限界利益率
S社では製品X,製品Y,製品Zを販売しており、収益改善を目的とした分析を行っている。前年度実績では製品Xの売上高は2,200百万円、営業費用は2,100百万円(固定費1,000百万円、変動費1,100百万円)、営業利益率は約5%であった。 設問1:製品Xの営業利益率を他製品の実績を上回る16%にするため、営業費用が前年度と同額の場合に必要な売上高増加額[ a ]百万円と、売上高が同額の場合に必要な営業費用削減額[ b ]百万円を求めよ。 設問2:製品Xの固定費削減により安全余裕率20%を達成するための固定費削減目標額[ c1 ]百万円と、その削減額を製品Zの固定費(人件費)に追加して売上高を1,000百万円とした場合の製品Zの安全余裕率[ c2 ]%の組合せを選べ。 設問3:製品Xで一律12%値引きしていたものを値引きなしとし、同額の売上高2,200百万円を達成した場合の変動費[ d ]百万円と営業利益率[ e ]%を求めよ。
- 設問1 a
- ア: 242, イ: 300, ウ: 352, エ: 400
- 設問1 b
- ア: 231, イ: 252, ウ: 336, エ: 352
- 設問2 c
- ア: c1=120, c2=20 / イ: c1=120, c2=33 / ウ: c1=240, c2=20 / エ: c1=240, c2=33
- 設問3 d
- ア: 880, イ: 968, ウ: 1,100, エ: 1,232, オ: 1,250
- 設問3 e
- ア: 5, イ: 10, ウ: 11, エ: 15
解答・解説を表示
解答
設問1 a: イ, 設問1 b: イ, 設問2 c: ア, 設問3 d: イ, 設問3 e: ウ
解説
まず要点:損益分岐点の分析では、売上高を「売れても売れなくてもかかる固定費」と「売れた分だけ増える変動費」に分けて考えます。売上高から変動費を引いた限界利益が固定費をこえると黒字になります。損益分岐点売上高は「固定費÷限界利益率」、安全余裕率は「(売上高−損益分岐点売上高)÷売上高」で求めます。
解き方
- 設問1:営業利益率=(売上高−営業費用)÷売上高の式を立て、わからない値を逆算します。
- 設問2:安全余裕率の式から目標の損益分岐点売上高と必要な固定費を出し、製品Zは変動費も増えるとして計算します。
- 設問3:値引きなしのときの販売数量の割合を出し、数量に比例する変動費から営業利益と営業利益率を計算します。
小問ごとの答え
- 小問 設問1 a:イ
- 営業費用2,100百万円が一定のとき、目標売上高Sに対する営業利益率は(S - 2,100) / S = 0.16より、0.84S = 2,100となりS = 2,500百万円です。前年度売上高2,200百万円との差は300百万円増加となります。
- 小問 設問1 b:イ
- 売上高2,200百万円が一定のとき、目標営業利益は2,200 × 0.16 = 352百万円です。許容営業費用は2,200 - 352 = 1,848百万円となるため、前年度の2,100百万円から2,100 - 1,848 = 252百万円減らす必要があります。
- 小問 設問2 c:ア
- 製品Xの限界利益率は(2,200-1,100)/2,200=0.5です。安全余裕率20%のとき損益分岐点売上高は2,200×(1-0.20)=1,760百万円となり、必要固定費は1,760×0.5=880百万円なので削減目標c1は1,000-880=120百万円です。製品Zは固定費が280+120=400百万円、売上高1,000百万円時の変動費は500百万円(限界利益率0.5)となるため、損益分岐点売上高は400/0.5=800百万円、安全余裕率c2は(1,000-800)/1,000=20%となります。
- 小問 設問3 d:イ
- 本来の価格に対する値引き率が12%であるため、定価販売時の売上高は2,200 / (1 - 0.12) = 2,500百万円相当です。値引きなしで2,200百万円を達成する場合、販売数量は本来の2,200 / 2,500 = 0.88倍で済みます。変動費は販売数量に比例するため、1,100 × 0.88 = 968百万円となります。
- 小問 設問3 e:ウ
- 売上高2,200百万円、変動費968百万円、固定費1,000百万円のとき、営業費用は968 + 1,000 = 1,968百万円です。営業利益は2,200 - 1,968 = 232百万円となり、営業利益率は232 / 2,200 ≒ 10.55%となり、四捨五入して11%となります。
覚えるポイント
- 安全余裕率=(売上高-損益分岐点売上高)÷売上高=1-損益分岐点比率
- 販売単価が一定の場合、売上高の変動に比例して変動費も増減する
間違えやすいところ
- 製品Zの売上が伸びたとき、変動費も比例して増加することを見落とさないようにしましょう。
- 値引きなしの売上高を計算するとき、定価をもとにした数量の減少率を正しく反映しましょう。
出題の前提:問題文中に示された計算式および管理会計の損益分岐点分析基準に基づく。
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.33 ↗(www.ipa.go.jp) / 公式問題冊子 p.34 ↗(www.ipa.go.jp) / 公式問題冊子 p.35 ↗(www.ipa.go.jp) / 公式問題冊子 p.36 ↗(www.ipa.go.jp) / 公式問題冊子 p.37 ↗(www.ipa.go.jp)
Bitap法による文字列検索アルゴリズム
データ構造及びアルゴリズム · Bitap法 / ビットマスク / ビット演算 / 正規表現
Bitap法を用いて文字列検索を行うプログラムに関する問題である。 設問1:検索文字列Pat[]から文字ごとのビットマスクMask[]を生成する関数GenerateBitMaskについて、初期化値[ b ]、ビットマスク更新時のシフト式[ c ]、およびPat="ACABAB"のときの文字'B'に対するビットマスク[ a ]を求めよ。 設問2:対象文字列Text="AACBBAACABABAB"、Pat="ACABAB"で検索を行う関数BitapMatchをトレースするとき、i=2の行β直後のStatusの値[ d ]、i=9の行βで参照するMask[Index(Text[9])]の値[ e ]、および行β直後のStatusの値[ f ]を求めよ。 設問3:文字クラス'['と']'を用いた正規表現に対応させた拡張関数GenerateBitMaskRegexにおいて、Pat="AC[BA]A[ABC]A"を指定したときのMask[1](文字'A')の値[ g ]と返却値PatLen[ h ]、さらに誤ってPat="AC[B[AB]AC]A"を指定したときのMask[1]の値[ i ]を求めよ。
- 設問1 a
- ア: 0000000000000101, イ: 0000000000101000, ウ: 0001010000000000, エ: 1010000000000000
- 設問1 b
- ア: "0"B, イ: "1"B, ウ: "1"BをPatLenビットだけ論理左シフトした値, エ: "1"Bを(PatLen-1)ビットだけ論理左シフトした値, オ: "1111111111111111"B
- 設問1 c
- ア: "1"Bを(i-1)ビットだけ論理左シフトした値, イ: "1"Bをiビットだけ論理左シフトした値, ウ: "1"Bを(PatLen-1)ビットだけ論理左シフトした値, エ: "1"BをPatLenビットだけ論理左シフトした値, オ: "1"B
- 設問2 d
- ア: "0"B, イ: "1"B, ウ: "10"B, エ: "11"B, オ: "100"B, カ: "101"B, キ: "10101"B
- 設問2 e
- ア: "0"B, イ: "1"B, ウ: "10"B, エ: "11"B, オ: "100"B, カ: "101"B, キ: "10101"B
- 設問2 f
- ア: "0"B, イ: "1"B, ウ: "10"B, エ: "11"B, オ: "100"B, カ: "101"B, キ: "10101"B
- 設問3 g
- ア: "1001101"B, イ: "1010100001"B, ウ: "1011001"B, エ: "101111"B, オ: "110011"B, カ: "111101"B
- 設問3 h
- ア: 4, イ: 6, ウ: 9, エ: 13
- 設問3 i
- ア: "1001101"B, イ: "1010100001"B, ウ: "1011001"B, エ: "101111"B, オ: "110011"B, カ: "111101"B
解答・解説を表示
解答
設問1 a: イ, 設問1 b: ア, 設問1 c: ア, 設問2 d: イ, 設問2 e: キ, 設問2 f: カ, 設問3 g: カ, 設問3 h: イ, 設問3 i: ウ
解説
まず要点:Bitap法は、探したい文字列(パターン)の各文字が何番目にあるかを、0と1の並び(ビットマスク)として先に作っておく検索方法です。本文を1文字ずつ見ながら、ビットをずらす操作と論理演算(ANDやOR)だけで、一致しているかをまとめて更新していきます。そのため速く文字列を探せます。
解き方
- 各文字が出る位置(1文字目から数えてi番目)について、下からiビット目を1にしたビットマスクを先に作ります。
- 本文を見るときは、状態Statusを1ビット左にずらして最下位を1にし、今見ている文字のマスクとANDをとって一致が続く位置を保ちます。
- 正規表現の文字クラス([])では、括弧内の各文字に同じだけずらしたビットを付け、括弧全体で1文字分進むように変数を追跡します。
小問ごとの答え
- 小問 設問1 a:イ
- Pat="ACABAB"において、文字'B'は4文字目と6文字目に現れます。下位から4ビット目(2^3)と6ビット目(2^5)が1となるため、2進数表記で末尾から0000000000101000となります。
- 小問 設問1 b:ア
- ビットマスク配列Mask[]の全要素は、各ビット位置の一致フラグを立てる前にまず全てのビットを0で初期化するため、"0"Bを設定します。
- 小問 設問1 c:ア
- 下位から数えてi番目のビットを1にするには、最下位ビットである"1"Bを(i - 1)ビットだけ論理左シフトする必要があります。
- 小問 設問2 d:イ
- i=1直後のStatus="1"Bです。i=2で行α実行後は(Status<<1)|1="11"Bとなります。Text[2]='A'でありMask['A']="10101"BとのANDを取ることで、行β直後は"11"B & "10101"B = "1"Bとなります。
- 小問 設問2 e:キ
- Text[9]は'A'であるため、参照されるマスクはMask[Index('A')]、すなわち図2より"10101"Bです。
- 小問 設問2 f:カ
- i=8直後のStatus="10"Bより、i=9の行α実行後は("10"B<<1)|1="101"Bとなります。これとMask['A']("10101"B)とのANDをとることで、行β直後のStatusは"101"Bとなります。
- 小問 設問3 g:カ
- 正規表現Pat="AC[BA]A[ABC]A"において、展開後の有効文字位置(PatLen)は1から6です。'A'は1文字目、3文字目([BA]内)、4文字目、5文字目([ABC]内)、6文字目に合致するため、下位から1, 3, 4, 5, 6ビット目が1となり、"111101"Bとなります。
- 小問 設問3 h:イ
- '['と']'で囲まれた文字群は1文字としてカウントされ、外側の通常文字と合わせてパターン長PatLenは6文字分となります。
- 小問 設問3 i:ウ
- Pat="AC[B[AB]AC]A"をトレースすると、2回目の'['でPatLen=4となり、直後の'A'(i=6)でビット4が1、']'通過後の'A'(i=9)でPatLen=5となりビット5が1、最後の'A'(i=12)でPatLen=7となりビット7が1になります。1文字目のビット1と合わせて下位から1, 4, 5, 7ビット目が1となり、"1011001"Bとなります。
覚えるポイント
- Bitap法では下位i番目のビットを立てるために「1を(i-1)ビット論理左シフト」する
- 状態遷移は「(Status << 1 | 1) & Mask[char]」で行われる
間違えやすいところ
- 下からiビット目を立てるとき、ずらす数をiにして最下位ビットの扱いを誤らないようにしましょう。
- 文字クラス内の複数の文字ごとに長さを足してしまい、正規表現の長さを誤らないようにしましょう。
出題の前提:問題文中に定義されたBitap法および擬似言語仕様に基づく。
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.38 ↗(www.ipa.go.jp) / 公式問題冊子 p.39 ↗(www.ipa.go.jp) / 公式問題冊子 p.40 ↗(www.ipa.go.jp) / 公式問題冊子 p.41 ↗(www.ipa.go.jp) / 公式問題冊子 p.42 ↗(www.ipa.go.jp) / 公式問題冊子 p.43 ↗(www.ipa.go.jp) / 公式問題冊子 p.44 ↗(www.ipa.go.jp)
入力ファイルの内容を文字及び16進数で表示するC言語プログラム
ソフトウェア開発 · C言語 / ファイル入出力 / ビット演算 / 境界条件
C言語で書かれた、バイナリファイルの内容を文字及び16進数でダンプ表示する関数 dump(char *filename, long from, long to) に関する設問に答えよ。
- 設問1 a ア
- chr & 0x0F
- 設問1 a イ
- chr & 0xF0
- 設問1 a ウ
- chr && 0x0F
- 設問1 a エ
- chr && 0xF0
- 設問1 b ア
- b1: &&, b2: &&
- 設問1 b イ
- b1: &&, b2: ||
- 設問1 b ウ
- b1: ||, b2: &&
- 設問1 b エ
- b1: ||, b2: ||
- 設問1 c ア
- cnt > from
- 設問1 c イ
- cnt >= from
- 設問1 c ウ
- cnt >= from - 1
- 設問1 d ア
- cnt == WIDTH - 1
- 設問1 d イ
- cnt == WIDTH
- 設問1 d ウ
- cnt == WIDTH + 1
- 設問1 d エ
- pos == WIDTH - 1
- 設問1 d オ
- pos == WIDTH
- 設問1 d カ
- pos == WIDTH + 1
- 設問2 e ア
- END OF DATA ... -1 byte(s)
- 設問2 e イ
- END OF DUMP ... -1 byte(s)
- 設問2 e ウ
- END OF DATA ... 0 byte(s)
- 設問2 e エ
- END OF DUMP ... 0 byte(s)
- 設問2 e オ
- END OF DUMP ... 1 byte(s)
- 設問2 e カ
- END OF DATA ... 1 byte(s)
- 設問2 f ア
- END OF DATA ... -1 byte(s)
- 設問2 f イ
- END OF DUMP ... -1 byte(s)
- 設問2 f ウ
- END OF DATA ... 0 byte(s)
- 設問2 f エ
- END OF DUMP ... 0 byte(s)
- 設問2 f オ
- END OF DUMP ... 1 byte(s)
- 設問2 f カ
- END OF DATA ... 1 byte(s)
解答・解説を表示
解答
設問1 a: ア, 設問1 b: イ, 設問1 c: ア, 設問1 d: オ, 設問2 e: オ, 設問2 f: ウ
解説
まず要点:バイナリファイルの中身を16進数で表示するには、1バイトを上位4ビットと下位4ビットに分け、それぞれを16進数の文字に変換します。1バイトは8ビットで、前半の4ビット(上位)と後半の4ビット(下位)からできています。また、何バイト目かを数えるときの0始まりの位置と、1から数える個数の違い、そして終了の条件(ファイルの終わりか指定位置か)を正しく追うことが大切です。
解き方
- 16進数変換の仕組みを見て、上位桁 (chr >> 4) に対して下位桁を取り出すビットマスクを確かめます。
- while文の継続条件で、ファイル末尾判定 (to < 0) と範囲内判定 (cnt <= to) の && と || を整理します。
- cnt と pos が増えるタイミングを追い、表示を始める条件と行を出力する条件を導きます。
- ケース1とケース2で変数の値の移り変わりを追い、ループを抜けたときの chr から最後の行の出力を求めます。
小問ごとの答え
- 小問 設問1 a:ア
- 下位4ビットを取り出して16進数文字へ変換するため、ビットごとの論理積演算子 & を用いて 0x0F とマスクする chr & 0x0F が正解です。
- 小問 設問1 b:イ
- ファイル終端でなく、かつ「終了位置指定が負(ファイルの末尾まで表示)または現在の読込み位置が終了位置以下」の間ループを継続するため、b1は &&、b2は || となります。
- 小問 設問1 c:ア
- cntは読み込んだ総バイト数を表しており、直前のバイト位置は cnt - 1 です。表示開始位置 from に対し cnt - 1 >= from、すなわち cnt > from が成立するときバッファへ格納します。
- 小問 設問1 d:オ
- 1行の表示幅はWIDTH文字です。posに文字を格納した直後に pos++ されるため、バッファが満杯になった判定は pos == WIDTH となります。
- 小問 設問2 e:オ
- cnt=100で cnt <= to (100 <= 99) が偽となりループを抜けます。このとき chr != EOF であるため else 節に進み、cnt - from = 100 - 99 = 1 より「END OF DUMP ... 1 byte(s)」が表示されます。
- 小問 設問2 f:ウ
- サイズ0のファイルでは最初の fgetc で即座に chr == EOF となり cnt=0 のまま終了します。chr == EOF が成立するため if 節に進み、cnt - from = 0 - 0 = 0 より「END OF DATA ... 0 byte(s)」が表示されます。
覚えるポイント
- C言語のビット演算子 & と論理演算子 && の違いを明確に区別する。
- 0オリジンのインデックスと1から始まるカウンタの境界条件(cnt > from)に注意する。
間違えやすいところ
- ビットを取り出すマスクに、論理積演算子 && とビット積演算子 & を間違えて使ってしまうこと。
- 直前に増やしている pos の比較値を、WIDTH ではなく WIDTH - 1 と勘違いしてしまうこと。
出題の前提:問題文中に示されたC言語プログラム仕様および実行結果の例に基づく。
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.45 ↗(www.ipa.go.jp) / 公式問題冊子 p.46 ↗(www.ipa.go.jp) / 公式問題冊子 p.47 ↗(www.ipa.go.jp) / 公式問題冊子 p.48 ↗(www.ipa.go.jp) / 公式問題冊子 p.49 ↗(www.ipa.go.jp)
弁当販売データの集計と帳票印字を行うCOBOLプログラム
ソフトウェア開発 · COBOL / コントロールブレイク / 順ファイル / 集計処理
スーパーマーケットの弁当販売データ(順ファイル)を読み込み、店舗ごと・弁当種別ごとに販売個数や平均値引率を集計して印字するCOBOLプログラムに関する設問に答えよ。
- 設問1 a ア
- SRT-STOR = CR-STOR AND SRT-CODE = CR-CODE
- 設問1 a イ
- SRT-STOR = CR-STOR OR SRT-CODE = CR-CODE
- 設問1 a ウ
- SRT-STOR NOT = CR-STOR AND SRT-CODE NOT = CR-CODE
- 設問1 a エ
- SRT-STOR NOT = CR-STOR OR SRT-CODE NOT = CR-CODE
- 設問1 b ア
- CR-STOR CR-CODE
- 設問1 b イ
- PRT-SALNO PRT-DSPNO
- 設問1 b ウ
- PRT-STOR PRT-CODE
- 設問1 b エ
- W-DSCT
- 設問1 b オ
- W-SALNO W-DSPNO W-TOTAL
- 設問1 c ア
- ADD 1 TO W-TOTAL
- 設問1 c イ
- ADD SRT-DSCT TO W-TOTAL
- 設問1 c ウ
- MOVE SRT-DSCT TO W-TOTAL
- 設問1 c エ
- MOVE ZERO TO SRT-DSCT
- 設問1 c オ
- MOVE ZERO TO W-DSPNO
- 設問1 d ア
- CR-STOR = ZERO
- 設問1 d イ
- CR-STOR NOT = ZERO
- 設問1 d ウ
- NOT SRT-EOF
- 設問1 d エ
- SRT-EOF
- 設問2 e ア
- 行番号 50 と 51 の間
- 設問2 e イ
- 行番号 53 と 54 の間
- 設問2 e ウ
- 行番号 56 と 57 の間
- 設問2 e エ
- 行番号 59 と 60 の間
- 設問2 f ア
- 1
- 設問2 f イ
- W-DSCT
- 設問2 f ウ
- W-DSPNO
- 設問2 f エ
- W-SALNO
- 設問2 f オ
- W-TOTAL
解答・解説を表示
解答
設問1 a: エ, 設問1 b: オ, 設問1 c: イ, 設問1 d: イ, 設問2 e: ウ, 設問2 f: ア
解説
まず要点:同じキー(店舗番号や弁当種別)ごとに集計するコントロールブレイク処理では、キーの値が変わったら前のグループの集計結果を出し、作業用の変数を初期化してから次の集計を始めます。キーが複数あるときは、どれか1つでも変われば区切りとみなします。まだ1件も処理していないときの判定にも注意が必要です。
解き方
- 並べ替えのキーである店舗番号と弁当種別のどちらかが変わったときに集計行を出す条件(OR条件)を特定します。
- 区切りで初期化すべき集計用作業変数(販売数、廃棄数、値引率合計)を整理します。
- 販売時の値引率合計の計算と、最初の空印字を防ぐ条件(CR-STOR の初期値判定)を確認します。
- 設問2の仕様に沿って、値引率別のカウント処理を販売処理(ELSE節の中)のどこに入れるかを判断します。
小問ごとの答え
- 小問 設問1 a:エ
- 店舗番号または弁当種別のいずれかが変化したときに小計の出力(コントロールブレイク)を行うため、SRT-STOR NOT = CR-STOR OR SRT-CODE NOT = CR-CODE が適切です。
- 小問 設問1 b:オ
- 新しい集計グループが始まるため、集計用のカウンタである販売個数 W-SALNO、廃棄個数 W-DSPNO、値引率合計 W-TOTAL をゼロクリアする必要があります。
- 小問 設問1 c:イ
- 販売された弁当の平均値引率を計算するため、販売時の値引率 SRT-DSCT を累積合計領域 W-TOTAL に加算する ADD SRT-DSCT TO W-TOTAL が正解です。
- 小問 設問1 d:イ
- 先頭レコードの処理前は初期値の ZERO が入っているため、未集計状態での誤印字を防ぐ判定条件として CR-STOR NOT = ZERO が適切です。
- 小問 設問2 e:ウ
- 値引率ごとの個数集計は廃棄(SRT-DSCT = 100)以外の販売レコードが対象となるため、ELSE 節の末尾である行番号 56 と 57 の間に追加します。
- 小問 設問2 f:ア
- 該当する値引率(0%, 20%, 50%)の販売個数を1個ずつカウントするため、ADD 1 TO ... と加算する値は 1 です。
覚えるポイント
- コントロールブレイクでは「キーAが不一致 OR キーBが不一致」でグループの切れ目を判定する。
- 初回データ処理前の空印字を防ぐため、初期値判定(CR-STOR NOT = ZERO)を行うパターンを覚える。
間違えやすいところ
- 複数キーのコントロールブレイクの判定を OR ではなく AND 条件にしてしまうこと。
- 値引率の合計(W-TOTAL)と販売個数のカウントを混同してしまうこと。
出題の前提:問題文中のCOBOLプログラム仕様および販売リスト印字仕様に基づく。
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.50 ↗(www.ipa.go.jp) / 公式問題冊子 p.51 ↗(www.ipa.go.jp) / 公式問題冊子 p.52 ↗(www.ipa.go.jp) / 公式問題冊子 p.53 ↗(www.ipa.go.jp) / 公式問題冊子 p.54 ↗(www.ipa.go.jp) / 公式問題冊子 p.55 ↗(www.ipa.go.jp) / 公式問題冊子 p.56 ↗(www.ipa.go.jp)
通知メッセージ配信システムにおけるスレッド同期とコレクション操作
ソフトウェア開発(Java) · Java / シングルトンパターン / スレッド同期 / Map操作 / ラムダ式
携帯端末へ非同期で通知メッセージを配信するシステムを模したプログラムに関する問題です。Notifierクラスによるシングルトン実装、Mapを用いた端末・未配信メッセージの管理、複数スレッド間でのsynchronizedやwait/notifyAllによる排他・同期制御、およびTesterクラスでの実行動作について、プログラムの空欄補完と動作判定を行います。
解答・解説を表示
解答
設問1 a: イ, 設問1 b: オ, 設問1 c: イ, 設問1 d: オ, 設問1 e: ウ, 設問2: オ
解説
まず要点:Javaのマルチスレッド(複数の処理が同時に動く仕組み)では、複数の処理が共有する Map などへのアクセスを synchronized でロックし、内容が食い違わないようにします。処理の順番を待つ・知らせる仕組みとして wait() と notifyAll() を使います。停止処理で共有データが消された後は、前提が満たされず処理を飛ばす点に注意します。
解き方
- 各クラス(Notifier, MobileDevice, Tester)のフィールドの構成と、キーと値の型の対応を確認します。
- getInstance によるシングルトンの取得、Map への put の引数、メソッドの throws 節、ラムダ式内の変数の参照を特定します。
- shutdown() による内部状態(コレクションのクリアなど)の変化を追い、その後に呼ばれた send メソッドの動きを追跡します。
小問ごとの答え
- 小問 設問1 a:イ
- Notifierクラスはシングルトンパターンを採用しており、クラス初期化時に生成された唯一のインスタンスをprivate static final Notifier INSTANCEに保持しています。getInstance()はこれを返すため、空欄aには「INSTANCE」が入ります。
- 小問 設問1 b:オ
- userMobileDevicesフィールドはMap<String, List<MobileDevice>>型で、利用者名をキー、端末のリストを値として保持します。引数userに対応するリストが存在しない場合に新規作成したdevicesを登録するため、「user, devices」を指定します。
- 小問 設問1 c:イ
- messagesToDeliverフィールドはMap<MobileDevice, List<String>>型で、端末インスタンスをキー、未配信メッセージリストを値として管理します。引数で取得したdeviceに対応する新規リストmessageListを登録するため、「device, messageList」を指定します。
- 小問 設問1 d:オ
- mainメソッド内でInterruptedExceptionを発生させうるThread.sleep()を呼び出しており、try-catchで捕捉していないため、メソッド宣言部にthrows InterruptedExceptionを記述する必要があります。
- 小問 設問1 e:ウ
- createUserMobileDeviceメソッド内のMobileDeviceインスタンス生成時、第2引数のリスナ(ラムダ式)内で端末名を表示するために、メソッド引数として渡された「name」を参照します。
- 小問 設問2:オ
- mainメソッドの/* α */直前でnotifier.shutdown()が実行され、userMobileDevices.clear()によってすべての利用者・端末の登録情報が削除されています。そのため、置換後のnotifier.send("Taro", ...)実行時にcontainsKey("Taro")がfalseとなり、何もしないで終了します。
覚えるポイント
- Map.put(K key, V value)におけるキー型と値型の整合性を常に確認する。
- チェック例外を投げるメソッドを呼び出す際は、try-catchまたはthrows宣言が必須となる。
間違えやすいところ
- createUserMobileDevice の中で device.getName() と書いてしまい、初期化中の自分自身を参照するコンパイルエラーになる誤り。
- shutdown() の後に send を呼ぶと例外が出ると誤解し、containsKey の判定による安全な終了を見落とすこと。
出題の前提:令和元年度秋期 基本情報技術者試験 午後 問11
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.57 ↗(www.ipa.go.jp) / 公式問題冊子 p.58 ↗(www.ipa.go.jp) / 公式問題冊子 p.59 ↗(www.ipa.go.jp) / 公式問題冊子 p.60 ↗(www.ipa.go.jp) / 公式問題冊子 p.61 ↗(www.ipa.go.jp) / 公式問題冊子 p.62 ↗(www.ipa.go.jp) / 公式問題冊子 p.63 ↗(www.ipa.go.jp)
パック10進数の加算副プログラムの実装と制御
ソフトウェア開発(アセンブラ) · CASL II / COMET II / パック10進数 / BCD演算 / ビットシフト
1語16ビットのCOMET IIにおいて、3桁の10進数と最下位4ビットの符号部(正/0は1100=C、負は1101=D)で構成されるパック10進数を加算する副プログラム(ADDP1, ADDP2, ADDP)に関する問題です。各桁の加減算、桁上がり・桁借りの処理、および符号判定による分岐を追跡します(設問2 fは出題不備により正解なし)。
解答・解説を表示
解答
設問1 a: ア, 設問1 b: ア, 設問1 c: イ, 設問2 d: エ, 設問2 e: エ, 設問2 f: 正解なし, 設問3 g: オ, 設問3 h: ウ
解説
まず要点:パック10進数は1語(16ビット)を4ビットずつの4つに分け、上の3つに10進数の各桁(0〜9)を、いちばん下の4ビットに符号(正と0はC、負はD)を入れます。桁ごとの計算では、シフト命令とマスク(論理積)で1桁ずつ取り出し、10進数の補正(10以上なら桁上げ、負なら桁借り)をして元の位置に戻し、論理和でまとめ直します。
解き方
- パック10進数のビット構成(上位12ビットが3桁の10進数、下位4ビットが符号)をつかみます。
- ADDP1のループで、各桁の加算、CPLによる10進補正の判定(JMIによる桁上げの有無の分岐)、シフトによる結果の合成を確認します。
- ADDP2の異符号の減算で、絶対値の比較(CPL後のJPL)とゼロの判定(JZE)を確認します。
- ADDPで、排他的論理和(XOR)と1ビット右シフトによるOFの変化(JOV)を使った符号一致の判定の流れを導きます。
小問ごとの答え
- 小問 設問1 a:ア
- 最下位4ビットの符号部を抽出してRESULTに退避するため、GR1と論理マスク#000Fとの論理積をとる「AND GR1,=#000F」が適切です。
- 小問 設問1 b:ア
- CPL GR1,=10により、各桁の加算結果GR1が10未満の場合はSF=1となり桁上げが不要です。したがって負分岐命令「JMI MERGE」で桁上げ処理をスキップします。
- 小問 設問1 c:イ
- GR3で管理されているビット位置(4, 8, 12)まで計算結果の桁値を戻すため、論理左シフト命令「SLL GR1,0,GR3」を用います。
- 小問 設問2 d:エ
- 符号が異なる場合の減算では、絶対値の大きい方から小さい方を引くため、CPL GR1,GR2の比較結果でGR1 > GR2(SF=0, ZF=0)ならレジスタの入れ替えをスキップしてINIへ飛ぶ「JPL INI」を用います。
- 小問 設問2 e:エ
- SUBL GR1,GR2の減算結果が0の場合(ZF=1)も桁借りは不要であるため、直前のJPL MERGEに続けて「JZE MERGE」で桁借り処理をスキップします。
- 小問 設問2 f:正解なし
- 公式発表の通り、設問2の空欄fについては選択肢に出題の意図を満たす適切な正解が存在しないため、採点対象外(全員正解扱い/正解なし)となっています。
- 小問 設問3 g:オ
- GR1とGR2の符号が等しいか異なるかを判定するため、排他的論理和をとる「XOR GR0,GR2」を実行します。符号ビットが異なれば対応ビットが1になります。
- 小問 設問3 h:ウ
- SRL GR0,1により最下位ビット(異符号なら1、同符号なら0)がシフトアウトされてOFに設定されるため、オーバフロー分岐命令「JOV P2」で異符号処理(ADDP2)へ分岐します。
覚えるポイント
- COMET IIのCPL命令は論理比較であり、レジスタ値と実効アドレスの内容を符号なし整数として比較し、結果に応じてZFとSF(r < 有効アドレスのとき1)を設定する。
- SRL/SLL命令で最後に押し出されたビットはフラグレジスタのOFに設定される。
間違えやすいところ
- CPL後の判定で、GR1 < 10 のときSFが1になるCOMET IIの仕様を忘れ、正の分岐(JPL)と勘違いすること。
- 2数の符号一致の判定に論理積(AND)や論理和(OR)を選び、異符号を見つけるXORの考え方を見落とすこと。
出題の前提:令和元年度秋期 基本情報技術者試験 午後 問12
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.64 ↗(www.ipa.go.jp) / 公式問題冊子 p.65 ↗(www.ipa.go.jp) / 公式問題冊子 p.66 ↗(www.ipa.go.jp) / 公式問題冊子 p.67 ↗(www.ipa.go.jp) / 公式問題冊子 p.68 ↗(www.ipa.go.jp) / 公式問題冊子 p.69 ↗(www.ipa.go.jp)
メロンの仕分と価格計算・大箱割振マクロ
ソフトウェア開発(表計算) · 表計算ソフト / 条件分岐関数 / 検索照合関数 / 数値丸め処理 / 表計算マクロ
収穫したメロンの仕分、販売価格の算出、及び出荷条件に基づく箱詰め割振りマクロの作成に関する問題である。形状と表皮色の評価から等級(優・良・並)を決定する式、単価表を参照して算出価格を求める式、50円単位で切り上げる販売価格の式、並メロンを大箱に割り振るマクロPackingの空欄a〜fに入る適切な字句を答える。
解答・解説を表示
解答
設問1 a: エ, 設問1 b: エ, 設問1 c: ウ, 設問2 d: キ, 設問2 e: キ, 設問2 f: イ
解説
まず要点:表計算の数式では、相対参照・絶対参照・複合参照を使い分け、複数の条件を組み合わせる論理関数は順番に注意して作ります。50円単位などの切り上げは「割って・切り上げて・掛け直す」のが定石です。マクロでは、データを読む行と結果を入れる行の変数を区別し、終了条件や端数の処理を正しく追うことが大切です。
解き方
- 設問1 a:2つの評価のうち低い方を選ぶ規則から、いちばん下の『並』を論理和で判定し、次に『良』を判定する入れ子IF文を導きます。
- 設問1 b:単価表を横方向に探すのに合う水平照合関数を選び、下へコピーしても参照範囲がずれないよう行を固定します。
- 設問1 c:算出価格を50で割り、切り上げ関数で整数にしてから50を掛け直し、50円単位に切り上げます。
- 設問2 d:マクロPackingの中で、集計表の行iのメロン重量を、重量計算表の箱jの合計重量セルに足します。
- 設問2 e:出荷条件の合計重量5kg以上または個数4個の達成を、論理和とCurrentColumnの値で判定する式を組み立てます。
- 設問2 f:出荷されなかった最後の箱を隠すため、列オフセット変数k(0〜5)で行jのA列〜F列にnullを入れます。
小問ごとの答え
- 小問 設問1 a:エ
- 問題文より形状と表皮色の評価のうち低い方がメロンの等級となります。評価の優先順位は並<良<優であるため、いずれか一方でも並であれば等級は並(論理和(C2='並', D2='並')が真)、並でなくいずれか一方が良であれば等級は良(論理和(C2='良', D2='良')が真)、それ以外は優となります。したがってエが正解です。
- 小問 設問1 b:エ
- 単価表の横方向の並びから等級に応じたキログラム当たり単価を検索するため水平照合関数を使用します。式を下方向(F3〜F1001)へ複写するため、単価表の行番号を固定する複合参照「B$1:D$2」を指定し、2行目の単価を取得して完全一致を表す0を指定した「水平照合(E2, 単価表!B$1:D$2, 2, 0)」であるエが正解です。
- 小問 設問1 c:ウ
- 販売価格は算出価格F2を50円単位で切り上げた値です。表計算の切上げ関数は指定桁位置での切上げを行うため、F2を50で除算して小数第1位で切り上げ(桁位置0)、その結果に50を掛けることで50円単位の切り上げを実現します。式は「切上げ(F2 / 50, 0) * 50」となるためウが正解です。
- 小問 設問2 d:キ
- 大箱jの合計重量を表すセル「相対(F1, j, 0)」に、集計表のi番目の並メロンの重量「相対(集計表!B1, i, 0)」を加算して累積更新します。したがって「相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, i, 0)」であるキが正解です。
- 小問 設問2 e:キ
- 大箱の出荷条件は「メロンの合計重量が5kg以上」又は「メロンの個数が4個」です。直前でCurrentColumnに1が加算されているため、現在の箱に入った個数はCurrentColumnとなります。条件を満たしたときに次の箱に進む(jをインクリメントする)ため、「論理和(相対(F1, j, 0) ≧ 5, CurrentColumn = 4)」であるキが正解です。
- 小問 設問2 f:イ
- 全データの処理終了後、最後の箱が出荷条件を満たさず端数となった場合、箱連番・ID1〜4・合計重量が格納された行jの列A〜F(オフセットk=0〜5)の表示を消去して空値にする必要があります。基準セルA1から行方向j、列方向kの位置に空値を代入する「相対(A1, j, k) ← null」であるイが正解です。
覚えるポイント
- 特定単位(N単位)への切り上げ処理は『切上げ(値 / N, 0) * N』で記述します。
- 数式を縦方向に複写する場合、参照先テーブルの行番号に『$』を付けて固定します。
間違えやすいところ
- 『低い方の評価を採用する』条件で、論理積(AND)と論理和(OR)のどちらを使うか混同しやすいこと。
- マクロを追うときに、集計表の行変数iと重量計算表の行変数jを取り違えやすい点に注意が必要です。
出題の前提:基本情報技術者試験 午後問題 表計算ソフトの仕様(関数仕様及びマクロ記述規則)
出典:IPA『2019年度 秋期 午後』
公式問題冊子 p.70 ↗(www.ipa.go.jp) / 公式問題冊子 p.71 ↗(www.ipa.go.jp) / 公式問題冊子 p.72 ↗(www.ipa.go.jp) / 公式問題冊子 p.73 ↗(www.ipa.go.jp) / 公式問題冊子 p.74 ↗(www.ipa.go.jp) / 公式問題冊子 p.75 ↗(www.ipa.go.jp) / 公式問題冊子 p.76 ↗(www.ipa.go.jp)
2019年度 秋期 午後
参照した公式資料
IPAが公開した2019年度 秋期 午後の問題・解答資料です。

