共通の文章
問1 テレワークの導入に関する次の記述を読んで,設問1~3に答えよ。
ソフトウェア開発会社であるA社では,従業員が働き方を柔軟に選択できるように,場所や時間の制約を受けずに働く勤務形態であるテレワークを導入することにした。
A社には,事務業務だけが行えるPC(以下,事務PCという)と,事務業務及びソフトウェア開発業務が行えるPC(以下,開発PCという)がある。開発部の従業員は開発PCを使用し,開発部以外の従業員は事務PCを使用している。
A社には事務室,開発室及びサーバ室があり,各部屋のネットワークはファイアウォール(以下,A社FWという)を介して接続されている。A社のネットワーク構成を図1に示す。
事務室には,事務PCだけが設置されている。開発室には開発PCだけが設置されており,開発部の従業員だけが入退室できる。サーバ室には,プロキシサーバ1台と,ソフトウェア開発業務に必要なソースコード管理,バグ管理,テストなどに利用するサーバ(以下,開発サーバという)が複数台設置されている。
A社FWでは,開発室のネットワークだけから開発サーバにHTTPS又はSSHでアクセスできるように通信を制限している。また,A社ネットワークからのインターネットのWebサイト閲覧は,事務PC及び開発PCだけからプロキシサーバを経由してできるように通信を制限している。
テレワークで働く従業員は,データを保存できないシンクライアント端末をA社から支給され,遠隔からインターネットを経由してA社のネットワークに接続し,業務を行う。そのために,安全にA社のネットワークに接続するVPN,及び仮想マシンの画面を転送して遠隔から操作できるようにする画面転送型の仮想デスクトップ環境(以下,VDIという)の導入を検討した。テレワーク導入後のA社のネットワーク構成案を図2に示す。
〔A社が検討したテレワークによる業務の開始までの流れ〕
(1) 利用者は,シンクライアント端末のVPNクライアントを起動して,VPNサーバに接続する。
(2) VPNサーバは,VPNクライアントが提示するクライアント証明書を検証する。検証に成功した場合,処理を継続する。
(3) VPNサーバは,利用者を認証する。認証が成功した場合,VPNクライアントに対して,192.168.16.0/24の範囲で使用されていないIPアドレスを一つ選択して割り当てる。
(4) VPNクライアントは,(3)で割り当てられたIPアドレスを使用して,VPNサーバ経由でA社のネットワークに接続する。
(5) 利用者は,シンクライアント端末のVDIクライアントを起動して,VDIサーバに接続する。
(6) VDIサーバは,VPNサーバで認証された利用者が開発部以外の従業員であれば事務業務だけが行える仮想マシン(以下,事務VMという)を,開発部の従業員であれば事務業務及びソフトウェア開発業務が行える仮想マシン(以下,開発VMという)を割り当てる。また,VDIサーバは,事務VMには192.168.64.0/24,開発VMには192.168.65.0/24の範囲で使用されていないIPアドレスを一つ選択して割り当てる。
(7) 利用者は,仮想マシンにログインして業務を開始する。VDIクライアントと仮想マシンとの間では,画面データ,並びにキーボード及びマウスの操作データだけが送受信される。
テレワーク導入後のA社FWに設定するパケットフィルタリングのルール案を表1に示す。
図1
図1 A社のネットワーク構成。A社の枠内にA社FWがあり,インターネットと接続されている。事務室ネットワークは192.168.0.0/24で事務PCを接続する。開発室ネットワークは192.168.1.0/24で開発PCを接続する。サーバ室には,プロキシサーバ(203.0.113.20)が接続された203.0.113.0/24のネットワークと,複数の開発サーバが接続された192.168.128.0/20のネットワークがある。各室のネットワークはA社FWを介して接続される。
図2
図2 テレワーク導入後のA社のネットワーク構成案。シンクライアント端末(VDIクライアント及びVPNクライアントを備える)はインターネット経由でA社FWに接続する。サーバ室には203.0.113.0/24上のVPNサーバ(203.0.113.10)及びプロキシサーバ(203.0.113.20)がある。VPNサーバは192.168.16.0/24にも接続され,その側のアドレスは192.168.16.1。VDIサーバと仮想マシンは192.168.64.0/20に接続される。複数の開発サーバは192.168.128.0/20に接続される。事務室ネットワークは192.168.0.0/24,開発室ネットワークは192.168.1.0/24。各ネットワークはA社FWを介して接続される。
表1
表1 A社FWに設定するパケットフィルタリングのルール案。列はルール番号,送信元,宛先,サービス,動作。ルール1:インターネット→203.0.113.10,VPN,許可。ルール2:203.0.113.20→インターネット,HTTP・HTTPS・DNS,許可。ルール3:192.168.16.0/24→192.168.64.0/20,VDI,許可。ルール4:192.168.0.0/23→203.0.113.20,プロキシ,許可。ルール5:192.168.64.0/23→203.0.113.20,プロキシ,許可。ルール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:ルール番号の小さいものから順に,最初に一致したルールが適用される。
注記2:許可された通信に対する戻りのパケットは,無条件に許可される。
ルール7に関する説明
表1に関連する本文:表1のルール案ではルール番号7の条件に誤りがあり,空欄aの内容であることが分かった。そこで,開発サーバに対するアクセスを正しく制限するために,ルール番号7の条件について,送信元を空欄bに変更した。
設問1・aの解答群
設問1のaに関する解答群:ア 開発PCから開発サーバにアクセスできない。イ 開発VMから開発サーバにアクセスできない。ウ 事務PCから開発サーバにアクセスできる。エ 事務VMから開発サーバにアクセスできる。
設問1・bの解答群
設問1のbに関する解答群:ア 192.168.0.0/24。イ 192.168.1.0/24。ウ 192.168.16.0/24。エ 192.168.64.0/24。オ 192.168.65.0/24。カ 192.168.128.0/20。キ 192.168.128.0/24。ク 203.0.113.0/24。ケ インターネット。
問問1 設問1
ところが,表1のルール案ではルール番号7の条件に誤りがあり,空欄aに該当することが分かった。そこで,開発サーバに対するアクセスを正しく制限するために,ルール番号7の条件について,送信元を空欄bに変更した。本文中の空欄に入れる適切な答えを,解答群の中から選べ。
aに関する解答群
ア 開発PCから開発サーバにアクセスできない
イ 開発VMから開発サーバにアクセスできない
ウ 事務PCから開発サーバにアクセスできる
エ 事務VMから開発サーバにアクセスできる
bに関する解答群
ア 192.168.0.0/24
イ 192.168.1.0/24
ウ 192.168.16.0/24
エ 192.168.64.0/24
オ 192.168.65.0/24
カ 192.168.128.0/20
キ 192.168.128.0/24
ク 203.0.113.0/24
ケ インターネット
- A-ア 開発PCから開発サーバにアクセスできない
- A-イ 開発VMから開発サーバにアクセスできない
- A-ウ 事務PCから開発サーバにアクセスできる
- A-エ 事務VMから開発サーバにアクセスできる
- B-ア 192.168.0.0/24
- B-イ 192.168.1.0/24
- B-ウ 192.168.16.0/24
- B-エ 192.168.64.0/24
- B-オ 192.168.65.0/24
- B-カ 192.168.128.0/20
- B-キ 192.168.128.0/24
- B-ク 203.0.113.0/24
- B-ケ インターネット
出典:令和元年度 秋期 基本情報技術者試験 午後 問1 設問1
問問1 設問2
シンクライアント端末から開発サーバにアクセスするときの接続経路として適切な答えを,解答群の中から選べ。
- ア シンクライアント端末 → VDIサーバ → VPNサーバ → 開発PC → 開発サーバ
- イ シンクライアント端末 → VDIサーバ → VPNサーバ → 開発VM → 開発サーバ
- ウ シンクライアント端末 → VDIサーバ → 開発VM → 開発PC → 開発サーバ
- エ シンクライアント端末 → VPNサーバ → VDIサーバ → 開発PC → 開発サーバ
- オ シンクライアント端末 → VPNサーバ → VDIサーバ → 開発VM → 開発サーバ
- カ シンクライアント端末 → VPNサーバ → 開発PC → 開発VM → 開発サーバ
出典:令和元年度 秋期 基本情報技術者試験 午後 問1 設問2
問問1 設問3
A社がテレワークの検討を進める過程で,「常に同一の業務環境を使用できるように,テレワークで働くときだけでなく,事務PC及び開発PCからも仮想マシンを使用したい」との要望が挙がった。検討した結果,この要望に応えてもセキュリティ上のリスクは変わらないと判断した。また,A社のネットワーク内からアクセスするのでVPNで接続する必要はなく,利用者認証をVPNサーバではなくVDIサーバで行えばよいことを確認した。この要望に応えるとき,表1のルール案に必要な変更として適切な答えを,解答群の中から選べ。ここで,表1のルール番号7の送信元には,設問1で選択した適切な答えが設定されているものとする。
- ア 変更する必要はない。
- イ ルール番号3と4の間に,送信元を192.168.0.0/23,宛先を192.168.64.0/20,サービスをVDI,動作を許可とするルールを新たに挿入する必要がある。
- ウ ルール番号3と4の間に,送信元を192.168.64.0/23,宛先を192.168.0.0/23,サービスをVDI,動作を許可とするルールを新たに挿入する必要がある。
- エ ルール番号3と4の間に,送信元をインターネット,宛先を192.168.64.0/20,サービスをVDI,動作を許可とするルールを新たに挿入する必要がある。
出典:令和元年度 秋期 基本情報技術者試験 午後 問1 設問3
共通の文章
問2 スレッドを使用した並列実行に関する次の記述を読んで,設問1~3に答えよ。
プログラム中の並列実行が可能な部分を取り出し,その部分を分割して複数のスレッドで並列に実行する方法(以下,スレッド並列法という)がある。マルチプロセッサシステムでは,スレッド並列法を適用することによって,プログラムの実行時間を短縮できることがある。
プログラムにおいて,スレッド並列法を適用しないで実行したときの実行時間を,スレッド並列法を適用したときの実行時間で割った値を,プログラム実行時間の高速化率という。
プログラムをスレッド並列法を適用しないで実行したときの,プログラム全体の実行時間に対する,並列実行可能な部分の実行時間の割合を r(0≦r≦1)とする。スレッドの個数を n(n≧1)にして,プログラムにスレッド並列法を適用すると,マルチプロセッサシステムでは,プログラム実行時間の高速化率 E は,次の式で求められる。ここで,各スレッドはそれぞれ異なるプロセッサに割り当てられるものとし,プログラムの実行に使用する全てのプロセッサの性能は同じとする。
この式は,並列実行可能な部分のプログラム実行時間がスレッド並列法の適用によって 1/n になり,その他の部分のプログラム実行時間は変化しないときの高速化率を計算するものである。
高速化率の式
プログラム実行時間の高速化率の式:E = 1 / ((1 − r) + r/n)。ここで r は,並列実行可能な部分の実行時間がプログラム全体の実行時間に占める割合(0≦r≦1),n はスレッド数(n≧1)。並列実行可能な部分の実行時間は並列化によって 1/n になり,その他の部分の実行時間は変わらない。各スレッドは異なるプロセッサに割り当てられ,使用する全プロセッサの性能は同じ。
図1
図1「正しい結果が得られる場合の例」。プログラム1の繰返し処理は「i:1,i≦100,1」で,処理は「a[i] ← b[i] + c[i]」。スレッド1-1は「i₁:1,i₁≦50,1」で「a[i₁] ← b[i₁] + c[i₁]」を実行し,スレッド1-2は「i₂:51,i₂≦100,1」で「a[i₂] ← b[i₂] + c[i₂]」を実行する。プログラムの繰返し範囲を,制御変数 i の範囲を分けて二つのスレッドに割り当てている。
図2
図2「正しい結果が得られない場合の二つの例」。プログラム2の繰返し処理は「i:1,i≦100,1」,処理は「a[i] ← a[i + 1] + b[i]」。スレッド2-1は「i₁:1,i₁≦50,1」,処理は「a[i₁] ← a[i₁ + 1] + b[i₁]」。スレッド2-2は「i₂:51,i₂≦100,1」,処理は「a[i₂] ← a[i₂ + 1] + b[i₂]」。プログラム3の繰返し処理は「i:2,i≦101,1」,処理は「a[i] ← a[i − 1] + b[i]」。スレッド3-1は「i₁:2,i₁≦51,1」,処理は「a[i₁] ← a[i₁ − 1] + b[i₁]」。スレッド3-2は「i₂:52,i₂≦101,1」,処理は「a[i₂] ← a[i₂ − 1] + b[i₂]」。図中の実線の四角はプログラム,破線の四角は繰返しの処理,破線の四角から出る二つの矢印は分割を示す。
図3
図3「プログラム4へのスレッド並列法の適用」。プログラム4の繰返し処理は「i:1,i≦10,1」,処理は「a[ip[i]] ← b[i]」。スレッド4-1は「i₁:1,i₁≦5,1」で「a[ip[i₁]] ← b[i₁]」を実行し,スレッド4-2は「i₂:6,i₂≦10,1」で「a[ip[i₂]] ← b[i₂]」を実行する。図中の実線の四角はプログラム,破線の四角は繰返しの処理,破線の四角から出る二つの矢印は分割を示す。
図4
図4「スレッド並列法を適用できる配列 ip」。要素番号1~10に対し,ip[] の値は要素番号1~5が順に 1,2,3,4,5,要素番号6~10が空欄 e に入る値。
問問2 設問1
プログラム中に並列実行が可能な部分をもつプログラムAに対してスレッドの個数を2にしてスレッド並列法を適用すると,高速化率は3/2になった。この場合,rは[a]である。
rが3/4であるプログラムBの場合,スレッドの個数を増やしても,高速化率の上限は[b]である。
本文中の空欄 a,b に入れる正しい答えを,それぞれ該当する解答群の中から選べ。
aに関する解答群
ア 1/6
イ 1/4
ウ 1/3
エ 1/2
オ 2/3
bに関する解答群
ア 2
イ 3
ウ 4
エ 6
オ 8
- A-ア 1/6
- A-イ 1/4
- A-ウ 1/3
- A-エ 1/2
- A-オ 2/3
- B-ア 2
- B-イ 3
- B-ウ 4
- B-エ 6
- B-オ 8
出典:令和元年度 秋期 基本情報技術者試験 午後 問2 設問1
問問2 設問2
配列の操作を行う繰返しの処理において,図1,図2のように繰返しの範囲を分割して,スレッド並列法を適用することを考える。このとき,操作の内容によって,正しい結果が得られる場合と得られない場合があるので,十分に検討することが必要である。正しい結果が得られる場合の例を図1に示す。図1に示すプログラム1は,制御変数 i の取る範囲を分けることによって繰返し範囲を分割した繰返しの処理を,それぞれ異なるスレッドで実行できる。図1,図2の実線の四角はプログラム,破線の四角は繰返しの処理,破線の四角から出る二つの矢印は分割を示す。正しい結果が得られない場合の二つの例を図2に示す。プログラム2とプログラム3について,空欄 c,d に入れる正しい答えをそれぞれ該当する解答群の中から選べ。
cに関する解答群
ア a[51]の値をスレッド2-1で更新するより先にスレッド2-2で更新する
イ a[51]の値をスレッド2-1で更新するより先にスレッド2-2で参照する
ウ a[51]の値をスレッド2-1で参照するより先にスレッド2-2で更新する
エ a[51]の値をスレッド2-1で参照するより先にスレッド2-2で参照する
dに関する解答群
ア a[51]の値をスレッド3-1で更新するより先にスレッド3-2で更新する
イ a[51]の値をスレッド3-1で更新するより先にスレッド3-2で参照する
ウ a[51]の値をスレッド3-1で参照するより先にスレッド3-2で更新する
エ a[51]の値をスレッド3-1で参照するより先にスレッド3-2で参照する
- C-ア a[51]の値をスレッド2-1で更新するより先にスレッド2-2で更新する
- C-イ a[51]の値をスレッド2-1で更新するより先にスレッド2-2で参照する
- C-ウ a[51]の値をスレッド2-1で参照するより先にスレッド2-2で更新する
- C-エ a[51]の値をスレッド2-1で参照するより先にスレッド2-2で参照する
- D-ア a[51]の値をスレッド3-1で更新するより先にスレッド3-2で更新する
- D-イ a[51]の値をスレッド3-1で更新するより先にスレッド3-2で参照する
- D-ウ a[51]の値をスレッド3-1で参照するより先にスレッド3-2で更新する
- D-エ a[51]の値をスレッド3-1で参照するより先にスレッド3-2で参照する
出典:令和元年度 秋期 基本情報技術者試験 午後 問2 設問2
問問2 設問3
図3に示すプログラム4では,配列 a における更新対象の位置を配列 ip の要素の値で指している。このプログラムでは,配列 ip の要素の値によって,スレッド並列法を適用できる場合とできない場合がある。図4に示す配列 ip であれば,スレッド並列法を適用できる。図4の空欄 e に入れる正しい答えを,解答群の中から選べ。
- ア 1,2,8,9,10
- イ 5,6,7,8,9
- ウ 6,7,4,9,10
- エ 6,7,8,9,10
出典:令和元年度 秋期 基本情報技術者試験 午後 問2 設問3
共通の文章
問3 書籍及び貸出情報を管理する関係データベースの設計及び運用に関する次の記述を読んで,設問1~3に答えよ。
D社の部署である資料室は,業務に関連する書籍を所蔵しており,従業員への貸出しを2015年4月から実施している。
所蔵する書籍を管理するデータベースは,書籍の情報を管理する書籍情報表と貸出状況を管理する貸出表とで構成されている。データベース構成を図1に示す。下線付きの項目は主キーを表し,下破線付きの項目は外部キーを表す。各書籍は1冊しか所蔵していない。
【貸出表に関する説明】
(1) 従業員に書籍を貸し出す際は,一意の貸出番号,貸し出す書籍のISBNコード,従業員番号,貸出日及び返却予定日を設定し,返却日にはNULLを設定したレコードを追加する。
(2) 書籍が返却されたら,対象のレコードの返却日に返却された日付を設定する。
図1 データベース構成
図1 データベース構成。書籍情報表(ISBNコード〔主キー〕,書籍名,著者名,出版社名,出版年)。貸出表(貸出番号〔主キー〕,ISBNコード〔外部キー〕,従業員番号,貸出日,返却予定日,返却日)。
設問1 SQL文
設問1に示されたSQL文:
SELECT 貸出表.ISBNコード,
CASE WHEN [a]
END AS 書籍状態
FROM 貸出表
WHERE 貸出表.ISBNコード = 'ISBN978-4-905318-63-7'
AND 貸出表.貸出日 = (SELECT [b] FROM 貸出表
WHERE 貸出表.ISBNコード = 'ISBN978-4-905318-63-7')
UNION ALL
SELECT DISTINCT 書籍情報表.ISBNコード, '貸出可' AS 書籍状態
FROM 書籍情報表
WHERE 書籍情報表.ISBNコード = 'ISBN978-4-905318-63-7'
AND NOT EXISTS (SELECT 貸出表.ISBNコード FROM 貸出表
WHERE 貸出表.ISBNコード = 'ISBN978-4-905318-63-7')
図2 要望を反映したデータベース構成案
設問3の図2。書籍情報表(ISBNコード〔主キー〕,書籍名,著者名,出版社名,出版年,ラック番号〔外部キー〕)。貸出表(貸出番号〔主キー〕,書籍番号〔外部キー〕,従業員番号,貸出日,返却予定日,返却日)。書籍表(書籍番号〔主キー〕,ISBNコード〔外部キー〕,購入日)。書籍管理ビュー(ISBNコード〔実線の下線〕,所蔵書籍数,貸出中件数)。ラック表(ラック番号〔主キー〕,ラック名)。
設問3 要望に対するデータベース修正内容
図2の構成案に対する修正内容。修正1:要望1に対応するために書籍表を追加して,資料室で所蔵している各書籍に一意の書籍番号を割り振って,それを主キーとした。また,貸出表のISBNコードを書籍番号に変更した。修正2:要望2に対応するために書籍表に購入日を設けた。修正3:要望3に対応するために書籍管理ビューを追加した。修正4:要望4に対応するためにラック表を追加して,書籍情報表に外部キーとしてラック番号を追加した。
問問3 設問1
次のSQL文は,ISBNコードがISBN978-4-905318-63-7の書籍の貸出し状態を表示するSQL文である。ISBNコードで貸出表を検索し,最も新しい貸出日のレコードの返却日にNULLが設定されている場合は,「貸出中」が表示される。また,最も新しい貸出日のレコードの返却日に日付が設定されている場合,及び貸出実績のない書籍の場合は,「貸出可」が表示される。空欄a,bに入れる正しい答えを,解答群の中から選べ。ここで,検索に使用するISBNコードの書籍は必ず所蔵されているものとする。また,返却された書籍はその日のうちに再び貸し出されることはない。
aに関する解答群
ア 貸出表.返却日 IS NOT NULL THEN '貸出中' ELSE '貸出可'
イ 貸出表.返却日 IS NOT NULL THEN '貸出中' WHEN 貸出表.返却日 IS NULL THEN '貸出可'
ウ 貸出表.返却日 IS NULL THEN '貸出可' ELSE '貸出中'
エ 貸出表.返却日 IS NULL THEN '貸出中' WHEN 貸出表.返却日 IS NOT NULL THEN '貸出可'
bに関する解答群
ア DISTINCT 貸出表.貸出日
イ MAX(貸出表.貸出日)
ウ MIN(貸出表.貸出日)
エ 貸出表.貸出日
- A-ア 貸出表.返却日 IS NOT NULL THEN '貸出中' ELSE '貸出可'
- A-イ 貸出表.返却日 IS NOT NULL THEN '貸出中' WHEN 貸出表.返却日 IS NULL THEN '貸出可'
- A-ウ 貸出表.返却日 IS NULL THEN '貸出可' ELSE '貸出中'
- A-エ 貸出表.返却日 IS NULL THEN '貸出中' WHEN 貸出表.返却日 IS NOT NULL THEN '貸出可'
- B-ア DISTINCT 貸出表.貸出日
- B-イ MAX(貸出表.貸出日)
- B-ウ MIN(貸出表.貸出日)
- B-エ 貸出表.貸出日
出典:令和元年度 秋期 基本情報技術者試験 午後 問3 設問1
問問3 設問2
2018年4月1日から2019年3月31日までの間に4回以上貸し出した書籍の一覧を取得することにした。次のSQL文の空欄cに入れる正しい答えを,解答群の中から選べ。
SELECT 書籍情報表.ISBNコード, 書籍情報表.書籍名, COUNT(*) AS 貸出回数
FROM 書籍情報表, 貸出表
WHERE 書籍情報表.ISBNコード = 貸出表.ISBNコード
[c]
- ア AND (貸出表.貸出日 >= '2018-04-01' OR 貸出表.貸出日 <= '2019-03-31')
GROUP BY 書籍情報表.ISBNコード,書籍情報表.書籍名
HAVING COUNT(*) >= 4
- イ AND 貸出表.貸出日 BETWEEN '2018-04-01' AND '2019-03-31'
GROUP BY 書籍情報表.ISBNコード,書籍情報表.書籍名
HAVING COUNT(*) >= 4
- ウ AND 貸出表.貸出日 >= '2018-04-01' AND 貸出表.貸出日 <= '2019-03-31'
AND COUNT(*) >= 4
- エ GROUP BY 書籍情報表.ISBNコード,書籍情報表.書籍名,貸出表.貸出日
HAVING 貸出表.貸出日 >= '2018-04-01' AND 貸出表.貸出日 <= '2019-03-31'
AND COUNT(*) >= 4
出典:令和元年度 秋期 基本情報技術者試験 午後 問3 設問2
問問3 設問3
従業員と資料室担当者の利便性を向上させる目的で,所蔵する書籍を管理するデータベースを再構築することにした。データベースの再構築に当たり,従業員と資料室担当者から要望が出された。次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。
【従業員と資料室担当者からの要望】
要望1 ISBNコードが同じ書籍を複数冊所蔵できるようにしたい。
要望2 書籍の購入日を管理できるようにしたい。
要望3 ISBNコードごとに所蔵する書籍数及び貸出し中の書籍数(以下,貸出中件数という)が分かるようにしたい。
要望4 ISBNコードが同じ書籍は同じラックに保管して,書籍が収納されているラックが分かるようにしたい。
要望を反映したデータベース構成案では,既に所蔵している書籍とISBNコードが同じ書籍を追加購入した場合に,レコードを追加する必要のある表は空欄dである。
また,需要がなくなった書籍を廃棄する場合は,ISBNコードが同じ書籍を全て廃棄する。データベースに対して行う操作は,次の①~④を,空欄eの順序で行う必要がある。
① 書籍情報表の主キーが対象ISBNコードのレコードを削除する。
② 書籍表から対象ISBNコードに対応する書籍番号を抽出する。
③ 書籍表の対象ISBNコードに対応するレコードを削除する。
④ 貸出表の対象書籍番号に対応するレコードを削除する。
dに関する解答群
ア 書籍表
イ 書籍表及びラック表
ウ 書籍情報表及び書籍表
エ 書籍情報表,書籍表及びラック表
eに関する解答群
ア ② → ① → ③ → ④
イ ② → ① → ④ → ③
ウ ② → ③ → ① → ④
エ ② → ③ → ④ → ①
オ ② → ④ → ① → ③
カ ② → ④ → ③ → ①
- D-ア 書籍表
- D-イ 書籍表及びラック表
- D-ウ 書籍情報表及び書籍表
- D-エ 書籍情報表,書籍表及びラック表
- E-ア ② → ① → ③ → ④
- E-イ ② → ① → ④ → ③
- E-ウ ② → ③ → ① → ④
- E-エ ② → ③ → ④ → ①
- E-オ ② → ④ → ① → ③
- E-カ ② → ④ → ③ → ①
出典:令和元年度 秋期 基本情報技術者試験 午後 問3 設問3
共通の文章
問4 NATに関する次の記述を読んで,設問1,2に答えよ。
IPv4のIPアドレスのうち,全世界で重複しないように管理されているグローバルIPアドレスはインターネットへの接続に利用でき,プライベートIPアドレスは社内LANなどの閉じたネットワークだけで利用できる。
プライベートIPアドレスだけが割り当てられている機器(以下,LAN内機器という)とインターネットに接続されている外部の機器(以下,インターネット機器という)とは直接通信することはできないが,例えば,NAT(Network Address Translation)を使うことによって通信することができるようになる。
本問で扱うNATは,NAPT(Network Address Port Translation)とも呼ばれる,ルータが搭載している機能であり,通過するパケットのIPアドレス及びポート番号を書き換えることによって,LAN内機器とインターネット機器との通信を可能にする。
表1に,LAN内機器とインターネット機器との通信の際にルータを通過するパケットの,IPアドレス及びポート番号の書換えの概要を示す。ここで,送信パケットとはLAN内機器がインターネット機器に向けて送信するパケットのことをいい,受信パケットとはルータがインターネット機器から受信するパケットのことをいう。
NATには,静的NATと動的NATがある。
静的NATでは,ルータのグローバルIPアドレス及びルータのポート番号の組みとLAN内機器のIPアドレス及びLAN内機器のポート番号の組みとの対応をあらかじめ定義しておき,その定義に基づいて,送信パケットと受信パケットの書換え対象のIPアドレス及びポート番号を書き換える。
動的NATでは,送信パケットと受信パケットの書換え対象のIPアドレス及びポート番号を,次のように書き換える。
(1) 送信パケットの送信元IPアドレス及び送信元ポート番号の書換え
① 送信パケットの送信元IPアドレス及び送信元ポート番号の,書換え前の組み(LAN内機器のIPアドレス及びLAN内機器のポート番号の組み)と書換え後の組み(ルータのグローバルIPアドレス及びルータのポート番号の組み)とを,関連付けて一定期間記憶する。
② 送信パケットの送信元IPアドレス及び送信元ポート番号の組みを,書換え前の組みとして記憶している間は,関連付けられている書換え後の組みに書き換える。
③ 送信パケットの送信元IPアドレス及び送信元ポート番号の組みを,書換え前の組みとして記憶していないときは,ルータに割り当てられている幾つかのグローバルIPアドレスのうちの一つと,そのIPアドレスで使用されていないポート番号のうちの一つとの組みに書き換える。
(2) 受信パケットの宛先IPアドレス及び宛先ポート番号の書換え
① 受信パケットの宛先IPアドレスと宛先ポート番号の組みが,上記(1)①の書換え後の組みとして記憶されている間は,関連付けられている書換え前の組みに書き換える。
表1
表1「IPアドレス及びポート番号の書換えの概要」。列は「書換え対象」「書換え前」「書換え後」。送信パケット:送信元IPアドレスはLAN内機器のIPアドレスからルータのグローバルIPアドレスへ、送信元ポート番号はLAN内機器のポート番号からルータのポート番号へ書き換える。受信パケット:宛先IPアドレスはルータのグローバルIPアドレスからLAN内機器のIPアドレスへ、宛先ポート番号はルータのポート番号からLAN内機器のポート番号へ書き換える。
図1
図1「NAT64ルータによるIPアドレスとポート番号の変換例」。左からIPv6機器(IPアドレス fc00::2)、NAT64ルータ(IPv6のIPアドレス fc00::1、IPv4のIPアドレス 192.168.0.1)、IPv4機器(IPアドレス 192.168.0.2)。左から右へ送信されるIPv6パケット:宛先IPアドレス 64:ff9b::c0a8:2、宛先ポート番号 80、送信元IPアドレス fc00::2、送信元ポート番号 50000。変換後のIPv4パケット:宛先IPアドレス b、宛先ポート番号 80、送信元IPアドレス c、送信元ポート番号 60000。右からルータへ返るIPv4パケット:宛先IPアドレス c、宛先ポート番号 60000、送信元IPアドレス b、送信元ポート番号 80。変換後に左へ転送されるIPv6パケット:宛先IPアドレス fc00::2、宛先ポート番号 50000、送信元IPアドレス d、送信元ポート番号 80。注記:プレフィックスは,64:ff9b:0:0:0:0 とする。
問問4 設問1
次の(1)~(3)のケースのうち,静的NATよりも動的NATの方が適しているものを,解答群の中から選べ。
(1) インターネット機器からアクセス可能なサーバを,LAN内機器として設置する。
(2) LAN内機器から,インターネット機器にアクセスする。
(3) インターネットを介する異なるLANのLAN内機器同士が,あらかじめ決まった固定のポートを使い,相互に通信する。
- ア (1)だけ
- イ (1)と(2)
- ウ (1)と(3)
- エ (2)だけ
- オ (2)と(3)
- カ (3)だけ
出典:令和元年度 秋期 基本情報技術者試験 午後 問4 設問1
問問4 設問2
次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,a1~a3に入れる答えは,aに関する解答群の中から組合せとして正しいものを選ぶものとする。
IPv6とIPv4とは互換性がないので,IPv6のネットワーク内の機器(以下,IPv6機器という)とIPv4のネットワーク内の機器(以下,IPv4機器という)とは直接通信することができない。IPv6機器からIPv4機器にアクセスする方法の一つに,NATの機能を拡張したNAT64と,DNSの機能を拡張したDNS64との組合せによる方法がある。この方法によるIPv6機器からIPv4機器へのアクセスの流れを次に示す。
(1) IPv6機器は,アクセス先の機器のIPアドレスを,DNS64から入手する。
DNS64は,a1のネットワークに置かれるDNSであり,ホスト名に対応するIPアドレスの問合せに対し,対応するa2アドレスがあればそれを返し,対応するa2アドレスがなく,a3アドレスがあればそれをa2アドレスに変換して返す。ここで,IPv4アドレスのIPv6アドレス表現は,当該IPv4アドレスを示す4バイトの前に,あらかじめ決められた12バイトのプレフィックスを付加したものである。
(2) IPv6機器は,入手したIPアドレスに宛ててIPv6のパケットを送信する。
(3) (2)のパケットがIPv4機器向けならば,当該パケットとその返信パケットは,NAT64の機能をもつルータ(以下,NAT64ルータという)が受信する。
(4) NAT64ルータは,IPv6機器からIPv4機器に向けて送信されたIPv6のパケットをIPv4のパケットに,その返信パケットであるIPv4のパケットをIPv6のパケットに,それぞれ変換し,転送する。このとき,IPアドレス及びポート番号は,動的NATによる書換えの考え方を用いて変換する。NAT64ルータによるIPアドレスとポート番号の変換例を,図1に示す。
aに関する解答群
ア a1=IPv4、a2=IPv4、a3=IPv6
イ a1=IPv4、a2=IPv6、a3=IPv4
ウ a1=IPv6、a2=IPv4、a3=IPv6
エ a1=IPv6、a2=IPv6、a3=IPv4
b、c、dに関する解答群
ア 192.168.0.0
イ 192.168.0.1
ウ 192.168.0.2
エ 64:ff9b::
オ 64:ff9b::c0a8:1
カ 64:ff9b::c0a8:2
キ fc00::
ク fc00::1
ケ fc00::2
- A-ア a1=IPv4、a2=IPv4、a3=IPv6
- A-イ a1=IPv4、a2=IPv6、a3=IPv4
- A-ウ a1=IPv6、a2=IPv4、a3=IPv6
- A-エ a1=IPv6、a2=IPv6、a3=IPv4
- B-ア 192.168.0.0
- B-イ 192.168.0.1
- B-ウ 192.168.0.2
- B-エ 64:ff9b::
- B-オ 64:ff9b::c0a8:1
- B-カ 64:ff9b::c0a8:2
- B-キ fc00::
- B-ク fc00::1
- B-ケ fc00::2
- C-ア 192.168.0.0
- C-イ 192.168.0.1
- C-ウ 192.168.0.2
- C-エ 64:ff9b::
- C-オ 64:ff9b::c0a8:1
- C-カ 64:ff9b::c0a8:2
- C-キ fc00::
- C-ク fc00::1
- C-ケ fc00::2
- D-ア 192.168.0.0
- D-イ 192.168.0.1
- D-ウ 192.168.0.2
- D-エ 64:ff9b::
- D-オ 64:ff9b::c0a8:1
- D-カ 64:ff9b::c0a8:2
- D-キ fc00::
- D-ク fc00::1
- D-ケ fc00::2
出典:令和元年度 秋期 基本情報技術者試験 午後 問4 設問2
共通の文章
問5 ストレスチェックの検査支援を行うシステムに関する次の記述を読んで,設問1,2に答えよ。
K社は,厚生労働省が作成した「労働安全衛生法に基づくストレスチェック制度実施マニュアル(平成28年4月改訂)」を基に,労働者の,職業上の心理的な負担の程度を把握するための検査を支援するシステムを開発している。このシステムは,「職業性ストレス簡易調査票」の質問の全てに回答が入力されると,質問項目の領域ごとに回答の合計点を求めて,高ストレス者を簡易的に判別する。
職業性ストレス簡易調査票の説明
〔職業性ストレス簡易調査票の説明〕(1) 職業性ストレス簡易調査票には,全57項目の質問があり,次の4領域に分類される。領域A:職場における当該労働者の心理的な負担の原因に関する質問(17項目)。領域B:心理的な負担による心身の自覚症状に関する質問(29項目)。領域C:職場における他の労働者による当該労働者への支援に関する質問(9項目)。領域D:仕事及び家庭生活の満足度に関する質問(2項目)。(2) 各質問に対して,四つの選択肢から一つを選択して回答する。各選択肢には,あらかじめ1,2,3,4点のいずれかが割り振られている。領域Aの一部を例に,質問,選択肢,回答例及び回答例での点数を表1に示す。
高ストレス者を判別する方法
高ストレス者を判別する方法:(1) 領域ごとに,質問に対する回答の合計点を求める。(2) 次のいずれかを満たす場合に,高ストレス者と判別する。領域Dの合計点は,高ストレス者の判別には利用しない。① 領域Bの合計点が77点以上である。② 領域Bの合計点が63点以上76点以下であって,かつ,領域A及びCの合計点の和が76点以上である。合計点によって高ストレス者と判別する範囲を図1に示す。図1の網掛けの範囲に入る場合は高ストレス者であり,それ以外の場合は高ストレス者ではない。
表1 質問,選択肢,回答例及び回答例での点数(領域Aの一部)
表1「質問,選択肢,回答例及び回答例での点数(領域Aの一部)」の列は,領域Aの質問,選択肢(そうだ/まあそうだ/ややちがう/ちがう),回答例での点数。回答例の選択肢は○で示される。質問ごとの内容,選択,点数は次のとおり。1. 非常にたくさんの仕事をしなければならない:そうだに○,4点。2. 時間内に仕事が処理しきれない:そうだに○,4点。3. 一生懸命働かなければならない:まあそうだに○,3点。4. かなり注意を集中する必要がある:ややちがうに○,2点。5. 高度の知識や技術が必要なむずかしい仕事だ:ややちがうに○,2点。6. 勤務時間中はいつも仕事のことを考えていなければならない:そうだに○,4点。7. からだを大変よく使う仕事だ:ちがうに○,1点。8. 自分のペースで仕事ができる:ちがうに○,4点。9. 自分で仕事の順番・やり方を決めることができる:ややちがうに○,3点。注記:「○」は,選択した回答を示す。
図1 高ストレス者と判別する範囲(網掛け)
図1「高ストレス者と判別する範囲(網掛け)」は,縦軸が領域Bの合計点(最小29,最大116),横軸が領域A及びCの合計点の和(最小26,最大104)。網掛け範囲①は領域Bが77点以上の範囲。網掛け範囲②は領域Bが63点以上77点未満で,かつ領域A及びCの合計点の和が76点以上の範囲。図には領域Bの77点及び63点,領域A及びCの合計点の和の76点を示す境界線がある。
図2 高ストレス者を判別する処理の流れ図
図2「高ストレス者を判別する処理の流れ図」。開始→「判別結果←0」→「領域Bの合計点を計算」→判定「領域Bの合計点」。判定から左の枝「77点以上」は「判別結果←1」に進み,その後,終了へ合流する。判定から右の枝は空欄bを経て「領域A及びCの合計点の和を計算」へ進む。判定から下の枝は空欄aを経て終了へ進む。領域A及びCの合計点の和の計算後,判定「領域A及びCの合計点の和」に進む。判定から左の枝は空欄cを経て「判別結果←1」に進み,その後,終了へ合流する。判定から下の枝は空欄dを経て終了へ進む。
表2 用意したテストデータの各領域の合計点
表2「用意したテストデータの各領域の合計点」。列はテストデータ,領域Aの合計点,領域Bの合計点,領域Cの合計点。データ1:34,63,18。データ2:34,87,27。データ3:34,63,36。データ4:51,87,36。データ5:51,58,36。データ6:51,66,36。
問問5 設問1
図2中の空欄に入れる正しい答えを,解答群の中から選べ。
a、b、c、dに関する解答群
ア 62点以下
イ 62点以上
ウ 63点以下
エ 63点以上
オ 63点以上かつ76点以下
カ 63点以上かつ77点以下
キ 75点以下
ク 76点以上
- A-ア 62点以下
- A-イ 62点以上
- A-ウ 63点以下
- A-エ 63点以上
- A-オ 63点以上かつ76点以下
- A-カ 63点以上かつ77点以下
- A-キ 75点以下
- A-ク 76点以上
- B-ア 62点以下
- B-イ 62点以上
- B-ウ 63点以下
- B-エ 63点以上
- B-オ 63点以上かつ76点以下
- B-カ 63点以上かつ77点以下
- B-キ 75点以下
- B-ク 76点以上
- C-ア 62点以下
- C-イ 62点以上
- C-ウ 63点以下
- C-エ 63点以上
- C-オ 63点以上かつ76点以下
- C-カ 63点以上かつ77点以下
- C-キ 75点以下
- C-ク 76点以上
- D-ア 62点以下
- D-イ 62点以上
- D-ウ 63点以下
- D-エ 63点以上
- D-オ 63点以上かつ76点以下
- D-カ 63点以上かつ77点以下
- D-キ 75点以下
- D-ク 76点以上
出典:令和元年度 秋期 基本情報技術者試験 午後 問5 設問1
問問5 設問2
次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。このシステムのテストに備えてテストデータを用意した。各テストデータは,領域A~Cの回答の合計点が表2に示す合計点になるように回答が入力された職業性ストレス簡易調査票である。図1に基づいて,①,②及びそれ以外の場合を判別できるかどうかをテストするには,テストデータ[e]を使用する。また,図2の流れ図で,分岐による全てのパスを通るテストをするには,テストデータ[f]を使用する。ここで,どちらのテストも,使用するテストデータの件数が最少となるように実施する。
e、fに関する解答群
ア 1,2及び3
イ 1,2及び4
ウ 1,3及び6
エ 2,4及び6
オ 4,5及び6
カ 1,2,3及び4
キ 1,3,4及び5
ク 1,4,5及び6
ケ 2,3,4及び5
コ 2,4,5及び6
- E-ア 1,2及び3
- E-イ 1,2及び4
- E-ウ 1,3及び6
- E-エ 2,4及び6
- E-オ 4,5及び6
- E-カ 1,2,3及び4
- E-キ 1,3,4及び5
- E-ク 1,4,5及び6
- E-ケ 2,3,4及び5
- E-コ 2,4,5及び6
- F-ア 1,2及び3
- F-イ 1,2及び4
- F-ウ 1,3及び6
- F-エ 2,4及び6
- F-オ 4,5及び6
- F-カ 1,2,3及び4
- F-キ 1,3,4及び5
- F-ク 1,4,5及び6
- F-ケ 2,3,4及び5
- F-コ 2,4,5及び6
出典:令和元年度 秋期 基本情報技術者試験 午後 問5 設問2
共通の文章
問6 販売管理システム開発の結合テストにおける進捗及び品質管理に関する次の記述を読んで,設問1~3に答えよ。
製造業のP社では,販売管理システムを構築するプロジェクト(以下,Qプロジェクトという)を進めており,情報システム部門のRさんがプロジェクトマネージャを担当している。P社では,結合テスト工程において,バグ管理図を用いて,テストの進捗とソフトウェアの品質を評価している。本問におけるバグ管理図とは,横軸に結合テスト期間の経過率を,縦軸に未消化テスト項目数及び累積バグ検出数を表したグラフのことである。
P社では,過去のシステム構築の実績値を基に,テスト項目数及びバグ検出数の標準値を定めており,Qプロジェクトの結合テストで用いる,テスト項目1件当たりのバグ検出数の標準値は,0.02件である。Qプロジェクトにおける結合テスト期間の経過率ごとの未消化テスト項目数及び累積バグ検出数の計画値を表1に示す。
Qプロジェクトでは,未消化テスト項目数,消化済テスト項目数及び累積バグ検出数の計画値と実績値から進捗と品質を評価する。また,結合テスト工程では,累積バグ検出数の実績値が,消化済テスト項目数の実績値に基づいて算出した累積バグ検出数の計画値の±25%の範囲内の場合,品質に問題はないと判断する。
表1
表1「結合テスト期間の経過率ごとの未消化テスト項目数及び累積バグ検出数の計画値」。列見出し「結合テスト期間の経過率(%)」:0,20,40,60,80,100。行「未消化テスト項目数(件)」:3,500,3,000,2,200,1,400,900,0。行「累積バグ検出数(件)」:0,10,26,42,52,70。
図1
図1「表1を基にしたバグ管理図」。横軸は結合テスト期間の経過率(%):0,20,40,60,80,100。左縦軸は未消化テスト項目数(件),目盛り0~3,500(500件刻み)。右縦軸は累積バグ検出数(件),目盛り0~70(10件刻み)。実線の折れ線(未消化テスト項目数の計画値)の各点は,経過率0,20,40,60,80,100%に対して3,500,3,000,2,200,1,400,900,0件。破線の折れ線(累積バグ検出数の計画値)の各点は,同じ経過率に対して0,10,26,42,52,70件。注記:実線の折れ線は未消化テスト項目数の計画値の推移を,破線の折れ線は累積バグ検出数の計画値の推移を表す。
表2
表2「担当者A~Eが担当するテスト項目数の計画値と60%経過時点での実績値」。列見出しは担当者A,B,C,D,E。行「担当するテスト項目数(計画値)」:500,700,700,800,800件。行「60%経過時点での消化済テスト項目数(実績値)」:210,390,400,450,300件。行「60%経過時点での累積バグ検出数(実績値)」:4,9,8,11,13件。単位:件。
計算式
60%経過時点での担当者ごとの消化済テスト項目数の計画値を求める式:担当するテスト項目数の計画値 ×(60%経過時点での消化済テスト項目数の計画値 ÷ 結合テスト全体のテスト項目数の計画値)。60%経過時点での消化済テスト項目数の計画値は,表1に示す未消化テスト項目数の計画値に基づいて算出する。
表3
表3「60%経過時点での担当者ごとの消化済テスト項目数の計画値」。列見出しは担当者A,B,C,D,E。行「消化済テスト項目数」:300,空欄d,網掛けで表示なし,480,480件。単位:件。注記:網掛けの部分は表示していない。
問問6 設問1
本文中の空欄a~cに入れる適切な答えを,それぞれの解答群の中から選べ。
60%経過時点での結合テスト全体の未消化テスト項目数の実績値は図1のa,累積バグ検出数の実績値は図1のbである。Rさんはプロットした結果を基に,結合テストは計画どおりには進捗していないと判断した。また,担当者A~Eの60%経過時点での累積バグ検出数の実績値の合計値は,担当者A~Eの60%経過時点での消化済テスト項目数の実績値の合計値に,バグ検出数の標準値である0.02を乗じて算出した累積バグ検出数のcと判断した。
aに関する解答群
ア 実線の折れ線が示す未消化テスト項目数の値より大きく
イ 実線の折れ線が示す未消化テスト項目数の値と等しく
ウ 実線の折れ線が示す未消化テスト項目数の値より小さく
bに関する解答群
ア 破線の折れ線が示す累積バグ検出数の値より大きい
イ 破線の折れ線が示す累積バグ検出数の値と等しい
ウ 破線の折れ線が示す累積バグ検出数の値より小さい
cに関する解答群
ア 計画値の75%未満なので,品質に問題がある
イ 計画値の75%以上100%未満なので,品質に問題はない
ウ 計画値の100%以上125%以下なので,品質に問題はない
エ 計画値の125%を超えているので,品質に問題がある
- A-ア 実線の折れ線が示す未消化テスト項目数の値より大きく
- A-イ 実線の折れ線が示す未消化テスト項目数の値と等しく
- A-ウ 実線の折れ線が示す未消化テスト項目数の値より小さく
- B-ア 破線の折れ線が示す累積バグ検出数の値より大きい
- B-イ 破線の折れ線が示す累積バグ検出数の値と等しい
- B-ウ 破線の折れ線が示す累積バグ検出数の値より小さい
- C-ア 計画値の75%未満なので,品質に問題がある
- C-イ 計画値の75%以上100%未満なので,品質に問題はない
- C-ウ 計画値の100%以上125%以下なので,品質に問題はない
- C-エ 計画値の125%を超えているので,品質に問題がある
出典:令和元年度 秋期 基本情報技術者試験 午後 問6 設問1
問問6 設問2
次の記述中の空欄d,eに入れる適切な答えを,それぞれの解答群の中から選べ。
Rさんは,更に結合テストの担当者ごとの進捗を評価することにした。60%経過時点での担当者ごとの消化済テスト項目数の計画値は,計算式に示す方法で求める。60%経過時点での担当者ごとの消化済テスト項目数の計画値を,表3に示す。
Qプロジェクトでは,結合テスト工程において,消化済テスト項目数の実績値が計画値の±10%の範囲内の場合,進捗に問題はないと判断する。Bさん,Cさん,Dさんの消化済テスト項目数の実績値は計画値の±10%の範囲内であり,累積バグ検出数の実績値も,60%経過時点での消化済テスト項目数の実績値に基づいて算出した累積バグ検出数の計画値の±25%の範囲内なので,進捗及び品質に問題はないと判断した。
Aさんが担当するテストの進捗とソフトウェアの品質に基づく判断は,次のとおりである。
・進捗:消化済テスト項目数の実績値が計画値の90%未満なので,進捗は遅れている。
・品質:バグの検出及び検出したバグの原因調査と修正は,順調に行われている。60%経過時点での消化済テスト項目数の実績値に基づいて算出した累積バグ検出数の計画値は4.2件であり,累積バグ検出数の実績値は計画値の±25%の範囲内なので,品質に問題はない。
Rさんは,Aさんが担当するテストの進捗が遅れているので,Aさんの作業に問題がないかどうかを確認した。テスト項目の内容及びテスト手順は正しく,報告書も適切に記載されていたが,結合テストデータの作成に時間を要していることが分かった。そこで,RさんはAさんの進捗遅れに対して,空欄eという対応を実施することにした。
dに関する解答群
ア 280
イ 300
ウ 360
エ 420
eに関する解答群
ア テスト項目を再度洗い出す
イ テスト要員を追加する
ウ テストデータを再作成する
エ テスト証跡の記載を一部省略する
オ テストの結果をAさんの結合テスト完了後に確認する
- D-ア 280
- D-イ 300
- D-ウ 360
- D-エ 420
- E-ア テスト項目を再度洗い出す
- E-イ テスト要員を追加する
- E-ウ テストデータを再作成する
- E-エ テスト証跡の記載を一部省略する
- E-オ テストの結果をAさんの結合テスト完了後に確認する
出典:令和元年度 秋期 基本情報技術者試験 午後 問6 設問2
問問6 設問3
次の記述中の空欄fに入れる適切な答えを,解答群の中から選べ。
Rさんは,60%経過時点でのEさんの消化済テスト項目数の実績値が計画値の90%未満であり,累積バグ検出数の実績値が消化済テスト項目数の実績値に基づいて算出した累積バグ検出数の計画値よりも大きくなっていたので,原因を調査することにした。Eさんは,Eさん以外の担当者が単体テストまでを行った機能1~5の結合テストを担当している。各機能は独立してテストが可能であり,機能1から順番にテストを行う計画である。
調査の結果,Eさんは機能1のテストは順調に完了したが,機能2のテストがはかどっていないことが分かった。理由を確認すると,機能2はバグの検出数が多く,バグの原因調査に時間を要したからであった。そこで,これまでに機能2で検出されたバグの原因を調査した結果,「詳細設計書の論理誤り」が多く見受けられた。Rさんは,更に,機能2の詳細設計を担当した者(以下,機能2担当者という)が詳細設計を担当した他の機能について,その結合テストの進捗を確認したところ,いずれの機能も結合テストの開始前であった。いずれの機能も,機能2と同じように問題が発生するおそれがあるので,Rさんは,販売管理システムに精通した要員を追加して,fを実施することにした。
- ア Eさんがテストを担当した機能の詳細設計書の再レビュー
- イ 機能2担当者が担当した機能の詳細設計書の再レビュー
- ウ 全機能の詳細設計書の再レビュー
- エ 販売管理システムの要件を理解するための勉強会
出典:令和元年度 秋期 基本情報技術者試験 午後 問6 設問3
共通の文章
問7 製品別の収益分析に関する次の記述を読んで,設問1~3に答えよ。
S社は,製品X,製品Y,製品Zを販売している。S社では,収益改善を目的にして,製品別の営業利益と営業利益率に関する分析を行っている。製品別の前年度実績を,表1に示す。
なお,本問における営業利益率などのパーセント(%)表記の値は,表においては,小数第1位を四捨五入して,整数で表示している。他の文中のパーセント(%)表記の値は,そのままの値を示している。
表1 製品別の前年度実績
表1「製品別の前年度実績」。単位は売上高・営業費用・営業利益が百万円、営業利益率が%。列は製品X、製品Y、製品Z、全体の順。売上高:2,200、1,000、800、4,000。営業費用:2,100、850、680、3,630。営業利益:100、150、120、370。営業利益率:5、15、15、9。注記:営業費用は,売上原価と販売費及び一般管理費で構成される。
aに関する解答群
設問1のaに関する解答群。選択肢の順:ア 242、イ 300、ウ 352、エ 400。
bに関する解答群
設問1のbに関する解答群。選択肢の順:ア 231、イ 252、ウ 336、エ 352。
表2 製品別の固定費と変動費
表2「製品別の固定費と変動費」。単位は百万円。列は製品X、製品Y、製品Zの順。固定費:1,000、350、280。変動費:1,100、500、400。本文では,固定費は販売数量の増減にかかわらず発生する一定額の費用,変動費は販売数量に比例して変化する費用と定義されている。
安全余裕率に関わる式
安全余裕率に関わる式:限界利益率=(売上高-変動費)÷売上高。損益分岐点売上高=固定費÷限界利益率。安全余裕率=(売上高-損益分岐点売上高)÷売上高。
表3 安全余裕率に関わる項目の値
表3「安全余裕率に関わる項目の値」。列は製品X、製品Y、製品Zの順。売上高(百万円):2,200、1,000、800。限界利益率(%):50、50、50。損益分岐点売上高(百万円):2,000、700、560。安全余裕率(%):9、30、30。
表4 安全余裕率の基準とその状態
表4「安全余裕率の基準とその状態」。安全余裕率(%)と状態の対応:10未満=危険、10以上20未満=普通、20以上40未満=優良、40以上=極めて優良。
表5 安全余裕率に関わる項目の試算値と関連条件
本文では,製品Xの売上高は前年度実績と同じとし,営業所の統廃合によって一時的に発生する費用は考慮しないとしている。統廃合で削減される製品Xの固定費の削減金額c1(百万円)を,製品Zの固定費である人件費に追加して営業を強化する。これによって製品Zの固定費はc1(百万円)増えるが,売上高は1,000百万円に増やせると見込む。製品1個当たりの販売価格は販売数量にかかわらず同じとする。表5「安全余裕率に関わる項目の試算値」。列は製品X、製品Zの順。売上高(百万円):2,200、1,000。限界利益率(%):両列とも網掛けで非表示。損益分岐点売上高(百万円):両列とも網掛けで非表示。安全余裕率(%):20、c2。注記:網掛けの部分は表示していない。
cに関する解答群
設問2のcに関する解答群。列見出しはc1、c2。選択肢の順:ア(120、20)、イ(120、33)、ウ(240、20)、エ(240、33)。
表6 試算結果と関連条件
設問3の前提:製品Xの売上高を確保するため,販売時に本来の販売価格に対して一律12%の値引きを行っていた。値引きなしで同じ売上高を達成した場合の営業利益率を,前年度実績に基づいて試算する。値引きなしで売る場合も,製品1個当たりの販売価格は販売数量にかかわらず同じとする。表6「試算結果」。列は値引きあり、値引きなしの順。売上高(百万円):2,200、2,200。営業費用(百万円)の内訳は変動費と固定費で,値引きありの変動費は1,100、固定費は1,000。値引きなしの変動費はd、固定費の欄は網掛けで非表示。営業利益(百万円)は値引きありが100、値引きなしの欄は網掛けで非表示。営業利益率(%)は値引きありが5、値引きなしがe。注記:網掛けの部分は表示していない。
dに関する解答群
設問3のdに関する解答群。選択肢の順:ア 880、イ 968、ウ 1,100、エ 1,232、オ 1,250。
eに関する解答群
設問3のeに関する解答群。選択肢の順:ア 5、イ 10、ウ 11、エ 15。
問問7 設問1
営業利益率の改善に関する次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。
aに関する解答群
ア 242
イ 300
ウ 352
エ 400
bに関する解答群
ア 231
イ 252
ウ 336
エ 352
- A-ア 242
- A-イ 300
- A-ウ 352
- A-エ 400
- B-ア 231
- B-イ 252
- B-ウ 336
- B-エ 352
出典:令和元年度 秋期 基本情報技術者試験 午後 問7 設問1
問問7 設問2
収益改善に関する次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,c1とc2に入れる答えは,cに関する解答群の中から組合せとして正しいものを選ぶものとする。
S社は,各製品の収益を分析するために,製品別の営業費用を調査し,営業費用を固定費と変動費に分けた。調査結果を,表2に示す。
次にS社は,各製品の安全余裕率の分析を行った。安全余裕率は,売上高と損益分岐点売上高との差から算出される指標であり,数値が大きいほど売上高が低下した場合に赤字になる可能性が低いといった余裕度を示す。安全余裕率を求める式は,資料に示すとおりである。安全余裕率に関わる項目の値を表3に,S社が定めている安全余裕率の基準とその状態を表4に示す。
表3の安全余裕率を見ると,製品Xは危険な状態にある。S社は,固定費を削減することによって,前年度実績と同じ売上高で安全余裕率20%を達成できるように,製品Xの固定費の削減目標の値をc1百万円と設定した。S社は,この目標値を達成するために,製品Xだけを販売している営業所を統廃合して賃借料などの固定費を削減することとした。
さらに,統廃合の結果として削減される製品Xの固定費の削減金額を製品Zの固定費である人件費に追加して,営業を強化することにした。これによって,製品Zの固定費はc1百万円増えるが,売上高は1,000百万円に増やせると見込んだ。製品1個当たりの販売価格は販売数量にかかわらず同じとする。安全余裕率に関わる項目の試算値を表5に示す。
- ア c1=120、c2=20
- イ c1=120、c2=33
- ウ c1=240、c2=20
- エ c1=240、c2=33
出典:令和元年度 秋期 基本情報技術者試験 午後 問7 設問2
問問7 設問3
営業利益率の試算に関する次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。
S社では,製品Xの売上高を確保するために,販売時に本来の販売価格に対して一律12%の値引きを行っていた。値引きなしで同じ売上高を達成した場合に製品Xの営業利益率がどうなるか,前年度実績に基づいて試算した。試算結果を表6に示す。ここで,値引きなしで売る場合においても,製品1個当たりの販売価格は販売数量にかかわらず同じとする。
dに関する解答群
ア 880
イ 968
ウ 1,100
エ 1,232
オ 1,250
eに関する解答群
ア 5
イ 10
ウ 11
エ 15
- D-ア 880
- D-イ 968
- D-ウ 1,100
- D-エ 1,232
- D-オ 1,250
- E-ア 5
- E-イ 10
- E-ウ 11
- E-エ 15
出典:令和元年度 秋期 基本情報技術者試験 午後 問7 設問3
共通の文章
問8「Bitap法による文字列検索」。関数 BitapMatch は、Bitap法を使って文字列検索を行うプログラムである。Bitap法は、検索対象の文字列(対象文字列)と検索文字列の照合に、個別の文字ごとに定義されるビット列を用いる。例えば、2進数の16ビット論理型定数 0000000000010101 は、上位の0を省略して “10101”B と表記する。本問では、対象文字列と検索文字列は英大文字で構成され、いずれも最長16文字とする。
プログラムの説明(1)
関数 BitapMatch は、対象文字列を Text[] に、検索文字列を Pat[] に格納して呼び出す。配列の要素番号は1から始まり、Text[] の i 番目の文字を Text[i]、Pat[] の i 番目の文字を Pat[i] と表記する。対象文字列と検索文字列は英大文字で構成され、いずれも最長16文字。
図1
図1の格納例。要素番号は左から1~14。Text[] の値は順に A, A, C, B, B, A, A, C, A, B, A, B, A, B。Pat[] の値は要素番号1~6の順に A, C, A, B, A, B。図のキャプションは「図1 対象文字列と検索文字列の格納例」。
プログラムの説明(2)
関数 BitapMatch は関数 GenerateBitMask を呼び出す。GenerateBitMask は、文字 “A”~“Z” の文字ごとに検索文字列に応じたビット列(ビットマスク)を生成し、要素数26の16ビット論理型配列 Mask[] に格納する。Mask[1] は “A”、Mask[2] は “B” に対応し、同様に Mask[1]~Mask[26] が “A”~“Z” に対応する。Mask[] の全要素を “0”B に初期化した後、1以上で Pat[] の文字数以下の全ての i について、Mask[Index(Pat[i])] の下位から数えて i 番目のビットを1にする。関数 Index は、引数にアルファベット順で n 番目の英大文字を指定すると、整数 n(1≦n≦26)を返す。
図2
図1の Pat[] が “ACABAB” の場合の Mask[] の値。Mask[1](“A”)= 0000000000010101、Mask[2](“B”)は図中で空欄 a として示されている、Mask[3](“C”)= 0000000000000010、Mask[4](“D”)= 0000000000000000、…、Mask[26](“Z”)= 0000000000000000。キャプションは「図2 図1で示した Pat[] に対する Mask[] の値」。
表1
GenerateBitMask の引数・返却値。Pat[]:文字型、入力、検索文字列が格納されている1次元配列。Mask[]:16ビット論理型、出力、文字 “A”~“Z” に対応するビットマスクが格納される1次元配列。返却値:整数型、出力、検索文字列の文字数。キャプションは「表1 関数 GenerateBitMask の引数と返却値の仕様」。
プログラム1
GenerateBitMask(Pat[], Mask[]) は整数型関数。整数型変数 i, PatLen を宣言する。PatLen ← Pat[] の文字数。i を1から26まで1ずつ増やす反復で Mask[i] ← 空欄 b(初期化)。次に i を1から PatLen まで1ずつ増やす反復で、Mask[Index(Pat[i])] に空欄 c と Mask[Index(Pat[i])] とのビットごとの論理和を格納する。最後に PatLen を返す。
設問1
設問1は、プログラムの説明およびプログラム1中の空欄に入れる正しい答えを解答群から選ぶ。空欄は a, b, c。
関数 BitapMatch の説明・表2
BitapMatch は Text[] と Pat[] を受け取り、Text[] の要素番号の小さい方から Pat[] と一致する文字列を検索する。一致する文字列が見つかった場合、一致した文字列の先頭の文字に対応する Text[] の要素番号を返す。見つからなければ −1 を返す。図1の例では Text[7]~Text[12] が Pat[] と一致するので、7を返す。BitapMatch の引数は Text[](文字型、入力、対象文字列を格納する1次元配列)と Pat[](文字型、入力、検索文字列を格納する1次元配列)。返却値は整数型、出力。一致時は先頭文字に対応する対象文字列の要素番号、一致しない場合は −1。
プログラム2
BitapMatch(Text[], Pat[]) は整数型関数。16ビット論理型変数 Goal, Status, Mask[26]、整数型変数 i, TextLen, PatLen を宣言する。TextLen ← Text[] の文字数。PatLen ← GenerateBitMask(Pat[], Mask[])。Status ← “0”B。Goal ← “1”B を (PatLen − 1) ビットだけ論理左シフトした値。i を1から TextLen まで1ずつ増やす反復で、行αは Status を1ビットだけ論理左シフトした値と “1”B のビットごとの論理和を Status に代入する。行βは Status と Mask[Index(Text[i])] とのビットごとの論理積を Status に代入する。Status と Goal とのビットごとの論理積が “0”B と等しくない場合、i − PatLen + 1 を返す。反復後は −1 を返す。
設問2・表3
設問2では、図1の Text[] と Pat[] を格納して BitapMatch を実行したとき、プログラム2の行βを実行した直後の i、Mask[Index(Text[i])]、Status の値の遷移を扱う。例として、i=1 のとき行βの直後の Status は “1”B。i=2 のとき、行α直後は “11”B となる。表3は行β実行直後の値を示し、i=1 は Mask[Index(Text[i])] = “10101”B、Status = “1”B。i=2 は Mask[Index(Text[i])] = “10101”B、Status は空欄 d。i=8 は Mask[Index(Text[i])] = “10”B、Status = “10”B。i=9 は Mask[Index(Text[i])] が空欄 e、Status が空欄 f。表の列見出しは i=1, 2, …, 8, 9, …。
表4
表4の正規表現の記号「[]」は、角括弧内に記載されている文字のいずれか1文字に一致する文字を表す。例えば “A[XYZ]B” は “AXB”, “AYB”, “AZB” を表す。
プログラム3
GenerateBitMask を拡張して正規表現を検索文字列に指定できるようにした関数 GenerateBitMaskRegex のプログラム。整数型変数 i, OriginalPatLen, PatLen, Mode を宣言する。OriginalPatLen ← Pat[] の文字数、PatLen ← 0、Mode ← 0。i を1から26まで1ずつ増やす反復で Mask[i] ← 空欄 b(初期化)。次に i を1から OriginalPatLen まで1ずつ増やす反復を行う。Pat[i] = “[” の場合、Mode ← 1、PatLen ← PatLen + 1。Pat[i] = “]” の場合、Mode ← 0。Mode = 0 の場合、PatLen ← PatLen + 1。該当する Pat[i] の文字について、Mask[Index(Pat[i])] に “1”B を (PatLen − 1) ビットだけ論理左シフトした値と Mask[Index(Pat[i])] とのビットごとの論理和を格納する。最後に PatLen を返す。
設問3
設問3では、正規表現 “AC[BA]A[ABC]A” を Pat[] に格納して GenerateBitMaskRegex を呼び出した場合の、文字 “A” に対応する Mask[1] の値 g と返却値 h を問う。また、角括弧内に [] を入れられないが、誤って “AC[B[AB]AC]A” を格納して呼び出した場合の Mask[1] の値 i を問う。プログラム3中の初期化の空欄 b には、設問1の b の正しい答えが入っているものとする。
問問8 設問1
プログラムの説明およびプログラム1中の空欄に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア 0000000000000101
イ 0000000000101000
ウ 0001010000000000
エ 1010000000000000
bに関する解答群
ア “0”B
イ “1”B
ウ “1”B を PatLen ビットだけ論理左シフトした値
エ “1”B を (PatLen − 1) ビットだけ論理左シフトした値
オ “1111111111111111”B
cに関する解答群
ア “1”B を (i − 1) ビットだけ論理左シフトした値
イ “1”B を i ビットだけ論理左シフトした値
ウ “1”B を (PatLen − 1) ビットだけ論理左シフトした値
エ “1”B を PatLen ビットだけ論理左シフトした値
オ “1”B
- A-ア 0000000000000101
- A-イ 0000000000101000
- A-ウ 0001010000000000
- A-エ 1010000000000000
- B-ア “0”B
- B-イ “1”B
- B-ウ “1”B を PatLen ビットだけ論理左シフトした値
- B-エ “1”B を (PatLen − 1) ビットだけ論理左シフトした値
- B-オ “1111111111111111”B
- C-ア “1”B を (i − 1) ビットだけ論理左シフトした値
- C-イ “1”B を i ビットだけ論理左シフトした値
- C-ウ “1”B を (PatLen − 1) ビットだけ論理左シフトした値
- C-エ “1”B を PatLen ビットだけ論理左シフトした値
- C-オ “1”B
出典:令和元年度 秋期 基本情報技術者試験 午後 問8 設問1
問問8 設問2
図1で示したとおりに Text[] と Pat[] に値を格納し、関数 BitapMatch を実行した。プログラム2の行βを実行した直後の変数 i と配列要素 Mask[Index(Text[i])] と変数 Status の値の遷移は、表3のとおりである。i=1 のとき行βを実行した直後の Status は “1”B であることから、i=2 のとき行αを実行した直後の Status は “1”B を1ビットだけ論理左シフトした “10”B と “1”B とのビットごとの論理和を取った “11”B となる。次に、i=2 のときに行βを実行した直後の Status の値は、Mask[Index(Text[2])] の値が “10101”B であることを考慮すると d となる。同様に、i=8 のとき行βを実行した直後の Status の値が “10”B であることに留意すると、i=9 のとき行αを実行した直後の行βで参照する Mask[Index(Text[9])] の値は e であるので、行βを実行した直後の Status の値は f となる。各空欄に入れる正しい答えを、解答群から選べ。
d、e、fに関する解答群
ア “0”B
イ “1”B
ウ “10”B
エ “11”B
オ “100”B
カ “101”B
キ “10101”B
- D-ア “0”B
- D-イ “1”B
- D-ウ “10”B
- D-エ “11”B
- D-オ “100”B
- D-カ “101”B
- D-キ “10101”B
- E-ア “0”B
- E-イ “1”B
- E-ウ “10”B
- E-エ “11”B
- E-オ “100”B
- E-カ “101”B
- E-キ “10101”B
- F-ア “0”B
- F-イ “1”B
- F-ウ “10”B
- F-エ “11”B
- F-オ “100”B
- F-カ “101”B
- F-キ “10101”B
出典:令和元年度 秋期 基本情報技術者試験 午後 問8 設問2
問問8 設問3
関数 GenerateBitMask の拡張に関する次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。ここで、プログラム3中の初期化の空欄 b には、設問1の b の正しい答えが入っているものとする。表4に示すような正規表現を検索文字列に指定できるように関数 GenerateBitMask を拡張し、関数 GenerateBitMaskRegex を作成した。Pat[] に “AC[BA]A[ABC]A” を格納して呼び出すと、文字 “A” に対応する Mask[1] は g となり、返却値は h となる。また、Pat[] に格納する文字列中に [] を入れ子にできないが、誤って “AC[B[AB]AC]A” を格納して呼び出した場合、Mask[1] は i となる。
g、iに関する解答群
ア “1001101”B
イ “1010100001”B
ウ “1011001”B
エ “101111”B
オ “110011”B
カ “111101”B
hに関する解答群
ア 4
イ 6
ウ 9
エ 13
- G-ア “1001101”B
- G-イ “1010100001”B
- G-ウ “1011001”B
- G-エ “101111”B
- G-オ “110011”B
- G-カ “111101”B
- H-ア 4
- H-イ 6
- H-ウ 9
- H-エ 13
- I-ア “1001101”B
- I-イ “1010100001”B
- I-ウ “1011001”B
- I-エ “101111”B
- I-オ “110011”B
- I-カ “111101”B
出典:令和元年度 秋期 基本情報技術者試験 午後 問8 設問3
共通の文章
問9 次のCプログラムの説明及びプログラムを読んで、設問1、2に答えよ。入力ファイルの内容を、文字及び16進数で表示するプログラムである。
プログラムの説明・表示仕様
【プログラムの説明】(1) 関数 dump の引数の仕様:char *filename は入力ファイルのファイル名、long from は表示を開始するバイト位置、long to は表示を終了するバイト位置(値が負の場合はファイルの末尾)。バイト位置はファイルの先頭のバイトから順に0、1、…と数える。(2) 入力ファイルはバイナリファイルとして読み込む。各バイトの内容(ビット構成)に制約はない。(3) 入力ファイル中の各バイトの内容を、文字及び16進数で表示する。図2は図1の入力ファイルの先頭から末尾までの表示例、図3は同じファイルのバイト位置17から40までの表示例。(4) 表示は、入力ファイルのバイト位置 from から60バイトずつ、3行1組で表示する。各組の1行目に各バイトが表す文字を、2行目に各バイトの16進数表示の上位桁を、3行目に同下位桁を表示する。例えば図中①のバイトは文字表示が「i」で、その16進数表示が69である。バイトの内容が16進数表示で20~7E以外の場合、そのバイトが表す文字として図中②のように「.」を表示する。各組の1行目の行頭に、その組に表示する最初のバイトのバイト位置を10進数で図中③の形式で表示する。入力ファイルの内容の表示が終わった後、最終行の④の位置には、入力ファイルの終わりに達して終了した場合は「END OF DATA」を、表示を終了するバイト位置に達して終了した場合は「END OF DUMP」を表示する。⑤の位置には、表示した入力ファイルの内容のバイト数を10進数で表示する。(5) 入力ファイルのファイルサイズ(バイト数)及び引数 from、to の条件:to < 0 の場合、to < 0 ≦ from < ファイルサイズ < 2³¹。to ≧ 0 の場合、0 ≦ from ≦ to < ファイルサイズ < 2³¹。(6) プログラム中で使用している関数 fgetc(s) は、ストリーム s から1文字を読み込んで返す。ファイルの終わりに達しているときは EOF を返す。
図1~図3 入力ファイルと表示例
図1「入力ファイルの例」:入力ファイルの内容は、Cプログラム main.c。プログラム末尾に「各行の行末には、復帰文字(0x0D)及び改行文字(0x0A)がある。」との注記がある。図2「図1の入力ファイルの先頭から末尾までの表示例」では、バイト位置0と60の2組を表示し、最終行に「END OF DATA ... 105 byte(s)」と表示する。図3「図1の入力ファイルのバイト位置17から40までの表示例」では、位置17からの文字列「/* for testing dump() */」を表示し、最終行に「END OF DUMP ... 24 byte(s)」と表示する。各例では、各組の文字列行、16進数上位桁行、下位桁行を順に表示する。図中の①~⑤は説明(4)に対応する表示箇所。
プログラム
【プログラム】
#include <stdio.h>
#define WIDTH 60 /* 行当たり表示バイト数 */
#define MASKCHR '.' /* 16進数表示で20~7E以外の場合の表示用文字 */
void dump(char *filename, long from, long to) {
FILE *infile;
int chr, pos = 0;
long cnt = 0;
char tblC[256], bufC[WIDTH + 1];
char tblH[256], bufH[WIDTH + 1];
char tblL[256], bufL[WIDTH + 1];
char hex[] = "0123456789ABCDEF";
for (chr = 0x00; chr <= 0xFF; chr++) {
if ((0x20 <= chr) && (chr <= 0x7E))
tblC[chr] = chr;
else
tblC[chr] = MASKCHR;
tblH[chr] = hex[chr >> 4];
tblL[chr] = hex[【a】];
}
bufC[WIDTH] = bufH[WIDTH] = bufL[WIDTH] = '\0';
infile = fopen(filename, "rb");
while (((chr = fgetc(infile)) != EOF) 【b1】 ((to < 0) 【b2】 (cnt <= to))) {
cnt++;
if (【c】) {
bufC[pos] = tblC[chr];
bufH[pos] = tblH[chr];
bufL[pos] = tblL[chr];
pos++;
if (【d】) {
printf("%10ld %s\n%12s%s\n%12s%s\n\n",
cnt - WIDTH, bufC, " ", bufH, " ", bufL);
pos = 0;
}
}
}
if (pos > 0) {
bufC[pos] = bufH[pos] = bufL[pos] = '\0';
printf("%10ld %s\n%12s%s\n%12s%s\n\n",
cnt - pos, bufC, " ", bufH, " ", bufL);
}
if (chr == EOF)
printf("END OF DATA ... %ld byte(s)\n", cnt - from);
else
printf("END OF DUMP ... %ld byte(s)\n", cnt - from);
fclose(infile);
}
問問9 設問1
プログラム中の空欄に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア chr & 0x0F
イ chr & 0xF0
ウ chr && 0x0F
エ chr && 0xF0
bに関する解答群
ア b1:&&、b2:&&
イ b1:&&、b2:||
ウ b1:||、b2:&&
エ b1:||、b2:||
cに関する解答群
ア cnt > from
イ cnt >= from
ウ cnt >= from - 1
dに関する解答群
ア cnt == WIDTH - 1
イ cnt == WIDTH
ウ cnt == WIDTH + 1
エ pos == WIDTH - 1
オ pos == WIDTH
カ pos == WIDTH + 1
- A-ア chr & 0x0F
- A-イ chr & 0xF0
- A-ウ chr && 0x0F
- A-エ chr && 0xF0
- B-ア b1:&&、b2:&&
- B-イ b1:&&、b2:||
- B-ウ b1:||、b2:&&
- B-エ b1:||、b2:||
- C-ア cnt > from
- C-イ cnt >= from
- C-ウ cnt >= from - 1
- D-ア cnt == WIDTH - 1
- D-イ cnt == WIDTH
- D-ウ cnt == WIDTH + 1
- D-エ pos == WIDTH - 1
- D-オ pos == WIDTH
- D-カ pos == WIDTH + 1
出典:令和元年度 秋期 基本情報技術者試験 午後 問9 設問1
問問9 設問2
関数 dump の動作に関する次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。表示結果の最終行(表示が1行だけの場合はその行)の表示内容について、次の二つのケースを考える。
[ケース1]ファイルサイズ=100、from=99、to=99。この場合、最終行の表示内容は[e]となる。
[ケース2]ファイルサイズ=0、from=0、to<0。ファイルサイズ及びfromの値がプログラムの説明(5)の条件を満たしていない。このケースで関数 dump を実行した場合、最終行の表示内容は[f]となる。
e、fに関する解答群
ア END OF DATA ... -1 byte(s)
イ END OF DUMP ... -1 byte(s)
ウ END OF DATA ... 0 byte(s)
エ END OF DUMP ... 0 byte(s)
オ END OF DATA ... 1 byte(s)
カ END OF DUMP ... 1 byte(s)
- E-ア END OF DATA ... -1 byte(s)
- E-イ END OF DUMP ... -1 byte(s)
- E-ウ END OF DATA ... 0 byte(s)
- E-エ END OF DUMP ... 0 byte(s)
- E-オ END OF DATA ... 1 byte(s)
- E-カ END OF DUMP ... 1 byte(s)
- F-ア END OF DATA ... -1 byte(s)
- F-イ END OF DUMP ... -1 byte(s)
- F-ウ END OF DATA ... 0 byte(s)
- F-エ END OF DUMP ... 0 byte(s)
- F-オ END OF DATA ... 1 byte(s)
- F-カ END OF DUMP ... 1 byte(s)
出典:令和元年度 秋期 基本情報技術者試験 午後 問9 設問2
共通の文章
問10「COBOL」。ある地域で5店舗のスーパーマーケットを展開するW社では、全店舗で弁当を販売している。どの店舗も、1日に仕入れる弁当の個数は一つの種類について50個以内である。売れ残りを減らす目的で、18時以降は正価の20%引き、19時以降は正価の50%引きで販売している。閉店後は売れ残った弁当を廃棄し、販売状況を分析して翌営業日の仕入れの参考にしている。このプログラムは、販売ファイルに格納された弁当の販売データを読み込み、店舗ごとに集計して販売リストに印字する。販売ファイルSAL-FILEは、図1に示すレコード様式の順ファイルで、全5店舗で1日に販売又は廃棄した弁当のデータが格納されている。弁当1個に対して1レコードが作成される。店舗番号は01~05、弁当種別には種類ごとに一意に割り振られた番号、値引率には正価販売が000、20%引き販売が020、50%引き販売が050、廃棄が100で格納される。販売リストは店舗番号及び弁当種別の昇順に印字する。
図1 販売ファイルのレコード様式
図1「販売ファイルのレコード様式」。順に、店舗番号(2桁)、弁当種別(4桁)、値引率(3桁)。店舗番号は01~05、弁当種別は種類ごとに一意な番号。値引率は正価販売000、20%引き販売020、50%引き販売050、廃棄100。
図2 販売リストの印字様式と説明
図2「販売リストの印字様式」。見出しは印刷済み。列は店舗番号(PIC 99)、弁当種別(PIC 9999)、販売個数(PIC Z9)、平均値引率(PIC Z9)、廃棄個数(PIC Z9)。販売個数は販売した弁当の個数で、廃棄分を含めない。平均値引率は弁当種別ごとに販売した弁当の値引率の平均で、廃棄分を含めない。すべての弁当を廃棄した場合は0を印字する。
図3 販売リストの印字例
図3「販売リストの印字例」。列見出しは店舗番号、弁当種別、販売個数、平均値引率、廃棄個数。印字例の値は、01/0001/18/10/2、01/0010/12/14/3、省略、02/0001/24/12/1、省略。
COBOLプログラム(行1~70)
プログラム(行番号付き)。空欄a~dは原本の空欄のまま記載。
1 DATA DIVISION.
2 FILE SECTION.
3 SD SRT-FILE.
4 01 SRT-REC.
5 02 SRT-STOR PIC 9(2).
6 02 SRT-CODE PIC 9(4).
7 02 SRT-DSCT PIC 9(3).
8 FD SAL-FILE.
9 01 SAL-REC PIC X(9).
10 FD PRT-FILE.
11 01 PRT-REC.
12 02 PRT-STOR PIC 9(2).
13 02 PRT-SP1 PIC X(8).
14 02 PRT-CODE PIC 9(4).
15 02 PRT-SP2 PIC X(6).
16 02 PRT-SALNO PIC Z9.
17 02 PRT-SP3 PIC X(8).
18 02 PRT-DSCT PIC Z9.
19 02 PRT-SP4 PIC X(10).
20 02 PRT-DSPNO PIC Z9.
21 WORKING-STORAGE SECTION.
22 77 SRT-FLAG PIC X(1) VALUE SPACE.
23 88 SRT-EOF VALUE "E".
24 77 CR-STOR PIC 9(2) VALUE ZERO.
25 77 CR-CODE PIC 9(4).
26 77 W-SALNO PIC 9(2).
27 77 W-DSPNO PIC 9(2).
28 77 W-TOTAL PIC 9(4).
29 77 W-DSCT PIC 9(2).
30 PROCEDURE DIVISION.
31 MAIN-PROC.
32 OPEN OUTPUT PRT-FILE.
33 SORT SRT-FILE ASCENDING KEY SRT-STOR SRT-CODE
34 USING SAL-FILE
35 OUTPUT PROCEDURE IS RET-PROC.
36 CLOSE PRT-FILE.
37 STOP RUN.
38 RET-PROC.
39 PERFORM UNTIL SRT-EOF
40 RETURN SRT-FILE AT END SET SRT-EOF TO TRUE
41 NOT AT END PERFORM CAL-PROC
42 END-RETURN
43 END-PERFORM.
44 PERFORM PRT-PROC.
45 CAL-PROC.
46 IF a THEN
47 PERFORM PRT-PROC
48 MOVE ZERO TO b
49 MOVE SRT-STOR TO CR-STOR
50 MOVE SRT-CODE TO CR-CODE
51 END-IF.
52 IF SRT-DSCT = 100 THEN
53 ADD 1 TO W-DSPNO
54 ELSE
55 ADD 1 TO W-SALNO
56 c
57 END-IF.
58 PRT-PROC.
59 IF d THEN
60 INITIALIZE PRT-REC
61 MOVE CR-STOR TO PRT-STOR
62 MOVE CR-CODE TO PRT-CODE
63 MOVE W-SALNO TO PRT-SALNO
64 IF W-SALNO NOT = ZERO THEN
65 COMPUTE W-DSCT = W-TOTAL / W-SALNO
66 MOVE W-DSCT TO PRT-DSCT
67 END-IF
68 MOVE W-DSPNO TO PRT-DSPNO
69 WRITE PRT-REC
70 END-IF.
表1 プログラムの変更内容
表1「プログラムの変更内容」。行20と21の間に追加:02 PRT-SP5 PIC X(8).、02 PRT-GRAPH PIC X(50)。行29と30の間に追加:77 W-DSCT00 PIC 9(2).、77 W-DSCT20 PIC 9(2).、77 W-DSCT50 PIC 9(2).、77 W-POS PIC 9(2)。行47と48の間に追加:MOVE ZERO TO W-DSCT00 W-DSCT20 W-DSCT50。行番号欄eの位置に次の処理を追加:EVALUATE SRT-DSCT/WHEN 0/ADD f TO W-DSCT00/WHEN 20/ADD f TO W-DSCT20/WHEN 50/ADD f TO W-DSCT50/END-EVALUATE。行68と69の間に追加:MOVE 1 TO W-POS。IF W-DSCT00 > ZERO THEN、MOVE ALL "0" TO PRT-GRAPH(W-POS:W-DSCT00)、ADD W-DSCT00 TO W-POS、END-IF。IF W-DSCT20 > ZERO THEN、MOVE ALL "o" TO PRT-GRAPH(W-POS:W-DSCT20)、ADD W-DSCT20 TO W-POS、END-IF。IF W-DSCT50 > ZERO THEN、MOVE ALL "-" TO PRT-GRAPH(W-POS:W-DSCT50)、ADD W-DSCT50 TO W-POS、END-IF。IF W-DSPNO > ZERO THEN、MOVE ALL "*" TO PRT-GRAPH(W-POS:W-DSPNO)、END-IF。
図4 販売グラフを追加した販売リストの印字例と販売グラフの説明
図4の販売グラフは正価を数字0、20%引きを小文字o、50%引きをハイフン-、廃棄を*として、それぞれ個数分だけこの順に表示する。例の列は店舗番号、弁当種別、販売個数、平均値引率、廃棄個数、販売グラフ。01/0001/18/10/2:0が12個、oが4個、-が2個、*が2個。01/0010/12/14/3:0が8個、oが1個、-が3個、*が3個。02/0001/24/12/1:0が17個、oが2個、-が5個、*が1個。間に省略行がある。
問問10 設問1
プログラム中の空欄に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア SRT-STOR = CR-STOR AND SRT-CODE = CR-CODE
イ SRT-STOR = CR-STOR OR SRT-CODE = CR-CODE
ウ SRT-STOR NOT = CR-STOR AND SRT-CODE NOT = CR-CODE
エ SRT-STOR NOT = CR-STOR OR SRT-CODE NOT = CR-CODE
bに関する解答群
ア CR-STOR CR-CODE
イ PRT-SALNO PRT-DSPNO
ウ PRT-STOR PRT-CODE
エ W-DSCT
オ W-SALNO W-DSPNO W-TOTAL
cに関する解答群
ア ADD 1 TO W-TOTAL
イ ADD SRT-DSCT TO W-TOTAL
ウ MOVE SRT-DSCT TO W-TOTAL
エ MOVE ZERO TO SRT-DSCT
オ MOVE ZERO TO W-DSPNO
dに関する解答群
ア CR-STOR = ZERO
イ CR-STOR NOT = ZERO
ウ NOT SRT-EOF
エ SRT-EOF
- A-ア SRT-STOR = CR-STOR AND SRT-CODE = CR-CODE
- A-イ SRT-STOR = CR-STOR OR SRT-CODE = CR-CODE
- A-ウ SRT-STOR NOT = CR-STOR AND SRT-CODE NOT = CR-CODE
- A-エ SRT-STOR NOT = CR-STOR OR SRT-CODE NOT = CR-CODE
- B-ア CR-STOR CR-CODE
- B-イ PRT-SALNO PRT-DSPNO
- B-ウ PRT-STOR PRT-CODE
- B-エ W-DSCT
- B-オ W-SALNO W-DSPNO W-TOTAL
- C-ア ADD 1 TO W-TOTAL
- C-イ ADD SRT-DSCT TO W-TOTAL
- C-ウ MOVE SRT-DSCT TO W-TOTAL
- C-エ MOVE ZERO TO SRT-DSCT
- C-オ MOVE ZERO TO W-DSPNO
- D-ア CR-STOR = ZERO
- D-イ CR-STOR NOT = ZERO
- D-ウ NOT SRT-EOF
- D-エ SRT-EOF
出典:令和元年度 秋期 基本情報技術者試験 午後 問10 設問1
問問10 設問2
図4に示すとおり、販売リストに販売グラフを追加して印字するようにプログラムを変更する。表1中の空欄に入れる正しい答えを、解答群の中から選べ。
eに関する解答群
ア 行番号50と51の間
イ 行番号53と54の間
ウ 行番号56と57の間
エ 行番号59と60の間
fに関する解答群
ア 1
イ W-DSCT
ウ W-DSPNO
エ W-SALNO
オ W-TOTAL
- E-ア 行番号50と51の間
- E-イ 行番号53と54の間
- E-ウ 行番号56と57の間
- E-エ 行番号59と60の間
- F-ア 1
- F-イ W-DSCT
- F-ウ W-DSPNO
- F-エ W-SALNO
- F-オ W-TOTAL
出典:令和元年度 秋期 基本情報技術者試験 午後 問10 設問2
共通の文章
問11 次のJavaプログラムの説明及びプログラムを読んで、設問1、2に答えよ。(Javaプログラムで使用するAPIの説明は、この冊子の末尾を参照してください。)
【プログラムの説明】スマートフォンやタブレット端末といった携帯端末に通知メッセージを配信するシステム(以下、通知システムという。)を模したプログラムである。この通知システムは、メール着信を通知するメッセージを非同期で携帯端末に配信する。このプログラムでは、通知メッセージを配信する処理及び各携帯端末の処理を、それぞれ独立したスレッドとして実行する。
このプログラムは、次のインタフェース及びクラスから成る。ここで、各コンストラクタ及びメソッドには、正しい引数が与えられるものとする。
(1) インタフェース NotificationListener は、通知メッセージを受け取るためのメソッドを定義する。以下、NotificationListener のインスタンスをリスナという。
① メソッド onNotificationReceived は、通知メッセージを受信したときに呼び出される。受信した通知メッセージは、引数の文字列のリストで与えられる。
(2) クラス MobileDevice は、携帯端末を表す。
① コンストラクタは、引数で指定された携帯端末名及びリスナをもつ携帯端末を生成する。
② メソッド getListener はリスナを、getName は携帯端末名を返す。
(3) クラス Notifier は、携帯端末の管理や通知メッセージの配信などを行う。Notifier のインスタンスは、シングルトン(Java仮想計算機内で唯一の存在)である。
① メソッド register は、引数で指定された利用者名とその携帯端末名を登録する。指定された利用者名に対応する携帯端末名が既に登録されている場合は、その利用者名に対応する携帯端末名として追加登録する。
② メソッド send は、引数で指定された利用者名で登録されている各携帯端末に、引数で指定された文字列を通知メッセージとして配信する。携帯端末に対して未配信の通知メッセージがある場合、引数のメッセージを未配信のメッセージリストに追加する。
③ メソッド loopForMessages は、引数で指定された携帯端末に対して、通知メッセージがあれば携帯端末のリスナに通知し、なければ通知メッセージを受け取れる状態(以下、待ち受け状態という。)にする。この処理を、通知システムが停止されるまで繰り返す。
④ メソッド shutdown は、通知システムを停止する。未配信の全メッセージ、全利用者名及び全携帯端末名の登録情報を削除し、登録されている全携帯端末の待ち受け状態を解除する。
(4) クラス Tester は、プログラム1~3をテストする。
① メソッド main は、利用者名 Taro の携帯端末名 phone 及び tablet を通知システムに登録して、Taro にメッセージを送信する。その後、通知システムを停止する。
② メソッド createUserMobileDevice は、利用者名とその携帯端末名を登録して、通知メッセージを受信できる状態にする処理を、新しく生成したスレッドで実行する。
図1は、クラス Tester のメソッド main を実行して得られた出力の例である。ここで、プログラムは、スレッドの実行速度及び事象発生に対する応答が十分速いシステムで実行されるものとする。また、スレッドのスケジューリングによって、各行の出力順は異なることがある。
プログラム1
プログラム1:import java.util.List; interface NotificationListener { void onNotificationReceived(List<String> messageList); }
プログラム2
プログラム2:public final class MobileDevice { private final String name; private final NotificationListener listener; public MobileDevice(String name, NotificationListener listener) { this.name = name; this.listener = listener; } public NotificationListener getListener() { return listener; } public String getName() { return name; } }
プログラム3(p.59)
プログラム3:Notifier は private static final Notifier INSTANCE = new Notifier();、private final Object lock = new Object();、利用者ごとの携帯端末を管理する private final Map<String, List<MobileDevice>> userMobileDevices = new HashMap<>();、携帯端末ごとの未配信メッセージを保持する private final Map<MobileDevice, List<String>> messagesToDeliver = new HashMap<>();、private volatile boolean active = true; を持つ。public static Notifier getInstance() は空欄 a を返す。private Notifier() {}。
プログラム3(p.60)
プログラム3の register(String user, MobileDevice device):synchronized (lock) 内で userMobileDevices.get(user) を devices に取得し、null なら new ArrayList<>() を代入し userMobileDevices.put(空欄 b) を実行する。その後 devices.add(device)。send(String user, String message):devices を new ArrayList<>() で初期化し、synchronized (lock) 内で userMobileDevices.containsKey(user) の場合、userMobileDevices.get(user) の各 device について messagesToDeliver.get(device) を messageList に取得する。null なら new ArrayList<>() を作り messagesToDeliver.put(空欄 c) を実行する。messageList.add(message) の後 devices.add(device)。lock の同期区間を出た後、devices の各 device を synchronized (device) で囲み device.notifyAll() を呼び出す。
プログラム3(p.61)
プログラム3の loopForMessages(MobileDevice device):while (active) の各反復で、synchronized (lock) 内に messagesToDeliver.remove(device) の結果を messageList に取得する。messageList != null なら device.getListener().onNotificationReceived(messageList) を呼び出す。続いて synchronized (device) 内で try { device.wait(3000L); } catch (InterruptedException e) { break; } を実行する。shutdown():active = false とし、devices を new ArrayList<>() で作る。synchronized (lock) 内で messagesToDeliver.clear() を実行し、userMobileDevices の各 user に対応する各 device を devices に追加してから userMobileDevices.clear() を実行する。その後、devices の各 device を synchronized (device) で囲み device.notifyAll() を呼び出す。
プログラム4(p.61–62)
プログラム4 Tester の main の宣言は public static void main(String[] args) 空欄 d InterruptedException。本文は createUserMobileDevice("Taro", "phone"); createUserMobileDevice("Taro", "tablet"); Notifier notifier = Notifier.getInstance(); notifier.send("Taro", "You have a message."); Thread.sleep(500L); notifier.shutdown(); /* α */。createUserMobileDevice(String user, String name) は MobileDevice device = new MobileDevice(name, messageList -> System.out.println(空欄 e + ": " + messageList)); とし、Notifier.getInstance() を取得して notifier.register(user, device) を実行し、新しいスレッドで notifier.loopForMessages(device) を実行する。スレッド終了後は System.out.printf("Terminating %s’s %s%n", user, name); を実行する。
図1
図1「メソッド main の実行結果の例」:phone: [You have a message.]/tablet: [You have a message.]/Terminating Taro’s tablet/Terminating Taro’s phone。各行の出力順はスレッドのスケジューリングによって異なることがある。
図2
図2「/* α */ と置き換える行」:notifier.send("Taro", "You have 2 messages."); と Thread.sleep(500L); の2行。
Java API説明(Map)
参照API(物理PDF p.77)java.util.Map<K,V>:キーと値を対応付けて保持し、各キーには一つの値だけを対応付ける。clear() は全対応付けを削除する。containsKey(Object key) は指定キーに値が対応付けられていれば true、それ以外は false。get(Object key) は対応する値を返し、対応付けがなければ null。keySet() は登録キーの集合を返す。put(K key, V value) は対応付けを登録し、既存の対応付けがあれば置き換える。戻り値は以前の値、なければ null。remove(Object key) は指定キーの対応付けを削除し、以前の値を返す。対応付けがなければ null。
Java API説明(HashMap)
参照API(物理PDF p.78)java.util.HashMap<K,V>:Map のハッシュを用いた実装。キー及び値は null でもよい。この実装は同期化(synchronized)を行わない。複数スレッドが並行して一つの HashMap のインスタンスにアクセスし、そのうち少なくとも一つのスレッドがマップに対して構造的な変更をする場合は、マップを使用する側で同期化が必要。構造的な変更は、一つ以上のマッピングの追加や削除を伴う操作であり、既存キーに対応する値だけを変更する操作は含まない。HashMap() は空の HashMap を作る。
Java API説明(List)
参照API(物理PDF p.78)java.util.List<E> は型 E の要素をリストとして管理するインタフェースで、Collection を継承する。add(E e) は指定要素をリストに追加し、戻り値は true。
Java API説明(ArrayList)
参照API(物理PDF p.78)java.util.ArrayList<E> は List の配列を用いた実装。ArrayList() は空の ArrayList を作る。toString() はリストの要素を文字列で表し、"[" と "]" で囲んだ文字列を返す。要素が複数あるときは各要素の文字列表現を ", "(コンマと空白文字)で区切る。このメソッドは AbstractCollection で定義され、ArrayList はそのクラスを継承する。
問問11 設問1
プログラム中の空欄 a~e に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア getInstance()
イ INSTANCE
ウ new Notifier()
エ Notifier()
オ Notifier.class
カ this
b、cに関する解答群
ア device, devices
イ device, messageList
ウ device, user
エ user, device
オ user, devices
カ user, messageList
dに関する解答群
ア extends
イ implements
ウ requires
エ throw
オ throws
カ uses
eに関する解答群
ア device
イ device.getName()
ウ name
エ Tester.this.name
オ this.name
カ user
- A-ア getInstance()
- A-イ INSTANCE
- A-ウ new Notifier()
- A-エ Notifier()
- A-オ Notifier.class
- A-カ this
- B-ア device, devices
- B-イ device, messageList
- B-ウ device, user
- B-エ user, device
- B-オ user, devices
- B-カ user, messageList
- C-ア device, devices
- C-イ device, messageList
- C-ウ device, user
- C-エ user, device
- C-オ user, devices
- C-カ user, messageList
- D-ア extends
- D-イ implements
- D-ウ requires
- D-エ throw
- D-オ throws
- D-カ uses
- E-ア device
- E-イ device.getName()
- E-ウ name
- E-エ Tester.this.name
- E-オ this.name
- E-カ user
出典:令和元年度 秋期 基本情報技術者試験 午後 問11 設問1
問問11 設問2
プログラム4のクラス Tester において、メソッド main の /* α */ を図2の2行で置き換えて実行したとき、この2行に対するプログラムの動作に関する記述として、正しい答えを解答群の中から選べ。
- ア 「phone: [You have 2 messages.]」だけを出力する。
- イ 「tablet: [You have 2 messages.]」だけを出力する。
- ウ メソッド loopForMessages で、NullPointerException が発生する。
- エ メソッド send で、NullPointerException が発生する。
- オ 利用者名 Taro が登録されていないので、メソッド send は何もしないで終了する。
- カ 利用者名 Taro が登録されているが、利用者名 Taro の携帯端末が何も登録されていないので、メソッド send は何もしないで終了する。
出典:令和元年度 秋期 基本情報技術者試験 午後 問11 設問2
共通の文章
問12 次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。
プログラム1の説明:符号が同一である二つの16ビットのパック10進数を加算する副プログラムADDP1である。本問では,パック10進数は,3桁の10進数の各桁をそれぞれ4ビットで表現し,最下位の4ビットに符号を置く。正又は0の場合は1100,負の場合は1101を付与する数値表現とする。符号が同一である二つのパック10進数の加算例を図2に示す。
(1) 副プログラムADDP1は,加算の対象となる符号が同一である二つの16ビットのパック10進数が,GR1,GR2に設定されて呼び出される。
(2) 副プログラムADDP1は,加算結果をGR0に設定して呼出し元に戻る。このとき,汎用レジスタGR1~GR7の内容は元に戻す。加算において,10進数の百の位からの桁上がりは発生しないものとする。
設問2で扱う副プログラムADDP2は,符号が異なる二つの16ビットのパック10進数を加算する。対象の数はGR1,GR2に設定されて呼び出され,加算結果をGR0に設定して戻る。汎用レジスタGR1~GR7の内容は元に戻す。
設問3の副プログラムADDPは,符号の組合せによってADDP1とADDP2を使い分け,二つの16ビットのパック10進数を加算する。対象の数はGR1,GR2に設定されて呼び出され,加算結果はGR0に入る。
図1
図1「10進数246のパック10進数表現」:16進数の各桁は2,4,6,C。対応する2進数の4ビット列は順に0010,0100,0110,1100。
図2
図2「符号が同一である二つのパック10進数の加算例」:パック10進数①は2,4,6,C(0010|0100|0110|1100)、パック10進数②は0,5,7,C(0000|0101|0111|1100)。加算結果は3,0,3,C(0011|0000|0011|1100)。
プログラム1
プログラム1(ADDP1)。空欄は原本の記号で示す。
ADDP1 START
RPUSH
ST GR1,A
ST GR2,B
LAD GR3,4 ; ビット数カウンタの初期化
a
ST GR1,RESULT ; 符号部を退避
LD GR1,A
SRL GR1,0,GR3
LD GR2,B
SRL GR2,0,GR3
LOOP AND GR1,=#000F
AND GR2,=#000F
LAD GR0,0
ADDL GR1,GR2
CPL GR1,=10
b ; 10以上の場合は桁上げ
SUBL GR1,=10
LAD GR0,1
MERGE c
OR GR1,RESULT ; 中間結果との併合
LAD GR3,4,GR3
CPL GR3,=16
JZE FIN ; 終了判定
ST GR1,RESULT ; 中間結果を退避
LD GR1,A
SRL GR1,0,GR3
LD GR2,B
SRL GR2,0,GR3
ADDL GR1,GR0
JUMP LOOP
FIN LD GR0,GR1
RPOP
RET
A DS 1
B DS 1
RESULT DS 1
END
設問1の解答群
設問1の解答群。a:ア AND GR1,=#000F/イ AND GR1,=#F000/ウ AND GR1,=#FFFF/エ OR GR1,=#000F/オ OR GR1,=#F000/カ OR GR1,=#FFFF。b:ア JMI MERGE/イ JNZ MERGE/ウ JPL MERGE/エ JOV MERGE/オ JZE MERGE。c:ア SLA GR1,0,GR3/イ SLL GR1,0,GR3/ウ SLL GR1,=4/エ SRA GR1,0,GR3/オ SRL GR1,0,GR3/カ SRL GR1,=4。
プログラム2
プログラム2(ADDP2)。空欄は原本の記号で示す。
ADDP2 START
RPUSH
CPL GR1,GR2
d
LD GR4,GR1
LD GR1,GR2
LD GR2,GR4
INI ST GR1,A
ST GR2,B
LAD GR3,4
a
ST GR1,RESULT
LD GR1,A
SRL GR1,0,GR3
LD GR2,B
SRL GR2,0,GR3
LOOP AND GR1,=#000F
AND GR2,=#000F
LAD GR0,0
SUBL GR1,GR2
JPL MERGE
e
ADDL GR1,=10
LAD GR0,1
MERGE c
OR GR1,RESULT
LAD GR3,4,GR3
CPL GR3,=16
JZE FIN
ST GR1,RESULT
LD GR1,A
SRL GR1,0,GR3
LD GR2,B
SRL GR2,0,GR3
f
JUMP LOOP
FIN LD GR0,GR1
CPL GR0,=#000D
JNZ FIN2
LAD GR0,#000C
FIN2 RPOP
RET
A DS 1
B DS 1
RESULT DS 1
END
原本には「設問2の枝問fは問題誤りにつき,問12を選択した受験者全員正解の措置済み」との注記がある。
設問2の解答群
設問2の解答群。d:ア JMI INI/イ JNZ INI/ウ JOV INI/エ JPL INI/オ JZE INI。e:ア JMI MERGE/イ JNZ MERGE/ウ JOV MERGE/エ JZE MERGE/オ SLL GR1,0,GR3/カ SRL GR1,0,GR3。f:ア ADDA GR1,GR0/イ ADDL GR1,=1/ウ ADDL GR1,GR0/エ ADDL GR3,GR0/オ SUBL GR1,=1/カ SUBL GR1,GR0。
プログラム3
プログラム3(ADDP)。空欄は原本の記号で示す。
ADDP START
LD GR0,GR1
g
SRL GR0,1
h
CALL ADDP1
JUMP FIN
P2 CALL ADDP2
FIN RET
END
設問3の解答群
設問3の解答群。g:ア ADDL GR1,=1/イ AND GR0,GR2/ウ OR GR1,GR2/エ SUBL GR1,=1/オ XOR GR0,GR2。h:ア JMI P2/イ JNZ P2/ウ JOV P2/エ JPL P2/オ JZE P2。
COMET II・CASL IIの関連命令仕様(公式別添物理ページ79~82、84)
COMET IIの関連命令仕様(公式別添)。LD r1,r2/LD r,adr[,x] はレジスタ又は実効アドレスの内容をロードする。ST r,adr[,x] はレジスタ内容を実効アドレスへ格納する。LAD r,adr[,x] は実効アドレスをロードする。ADDA/SUBA は算術加減算,ADDL/SUBL は論理加減算,AND/OR/XOR は論理演算。CPL は論理比較を行い,FRのSF/ZFを比較結果に応じて設定する。SLA/SRAは算術左/右シフト,SLL/SRLは論理左/右シフト。JPL/JMI/JNZ/JZE/JOVはそれぞれ正/負/非零/零/オーバーフロー時に分岐し,JUMPは無条件分岐する。RPUSHはGR1~GR7の順にスタックへ格納,RPOPはスタックからGR7~GR1の順に取り出すマクロ命令,CALLはサブルーチンを呼び出し,RETは呼出し元へ戻る。COMET IIは16ビット語を用い,FRにはOF,SF,ZFがある。 マクロ命令の一覧は物理p82、RPUSHとRPOPのレジスタ順は物理p84。
問問12 設問1
プログラム1中の空欄に入れる正しい答えを,解答群の中から選べ。
aに関する解答群
ア AND GR1,=#000F
イ AND GR1,=#F000
ウ AND GR1,=#FFFF
エ OR GR1,=#000F
オ OR GR1,=#F000
カ OR GR1,=#FFFF
bに関する解答群
ア JMI MERGE
イ JNZ MERGE
ウ JPL MERGE
エ JOV MERGE
オ JZE MERGE
cに関する解答群
ア SLA GR1,0,GR3
イ SLL GR1,0,GR3
ウ SLL GR1,=4
エ SRA GR1,0,GR3
オ SRL GR1,0,GR3
カ SRL GR1,=4
- A-ア AND GR1,=#000F
- A-イ AND GR1,=#F000
- A-ウ AND GR1,=#FFFF
- A-エ OR GR1,=#000F
- A-オ OR GR1,=#F000
- A-カ OR GR1,=#FFFF
- B-ア JMI MERGE
- B-イ JNZ MERGE
- B-ウ JPL MERGE
- B-エ JOV MERGE
- B-オ JZE MERGE
- C-ア SLA GR1,0,GR3
- C-イ SLL GR1,0,GR3
- C-ウ SLL GR1,=4
- C-エ SRA GR1,0,GR3
- C-オ SRL GR1,0,GR3
- C-カ SRL GR1,=4
出典:令和元年度 秋期 基本情報技術者試験 午後 問12 設問1
問問12 設問2
符号が異なる二つの16ビットのパック10進数を加算する副プログラムADDP2を作成した。プログラム2中の空欄に入れる正しい答えを,解答群の中から選べ。プログラム2中のa,cには,設問1の正しい答えが入っているものとする。
IPAの公式解答では空欄fは「正解なし」です。この画面ではdとeを採点します。
dに関する解答群
ア JMI INI
イ JNZ INI
ウ JOV INI
エ JPL INI
オ JZE INI
eに関する解答群
ア JMI MERGE
イ JNZ MERGE
ウ JOV MERGE
エ JZE MERGE
オ SLL GR1,0,GR3
カ SRL GR1,0,GR3
fに関する解答群
ア ADDA GR1,GR0
イ ADDL GR1,=1
ウ ADDL GR1,GR0
エ ADDL GR3,GR0
オ SUBL GR1,=1
カ SUBL GR1,GR0
- D-ア JMI INI
- D-イ JNZ INI
- D-ウ JOV INI
- D-エ JPL INI
- D-オ JZE INI
- E-ア JMI MERGE
- E-イ JNZ MERGE
- E-ウ JOV MERGE
- E-エ JZE MERGE
- E-オ SLL GR1,0,GR3
- E-カ SRL GR1,0,GR3
出典:令和元年度 秋期 基本情報技術者試験 午後 問12 設問2
問問12 設問3
符号にかかわらず二つの16ビットのパック10進数を加算できるように,符号の組合せによって副プログラムADDP1とADDP2を使い分ける副プログラムADDPを作成した。プログラム3中の空欄に入れる正しい答えを,解答群の中から選べ。
gに関する解答群
ア ADDL GR1,=1
イ AND GR0,GR2
ウ OR GR1,GR2
エ SUBL GR1,=1
オ XOR GR0,GR2
hに関する解答群
ア JMI P2
イ JNZ P2
ウ JOV P2
エ JPL P2
オ JZE P2
- G-ア ADDL GR1,=1
- G-イ AND GR0,GR2
- G-ウ OR GR1,GR2
- G-エ SUBL GR1,=1
- G-オ XOR GR0,GR2
- H-ア JMI P2
- H-イ JNZ P2
- H-ウ JOV P2
- H-エ JPL P2
- H-オ JZE P2
出典:令和元年度 秋期 基本情報技術者試験 午後 問12 設問3
共通の文章
問13 次の表計算のワークシート及びマクロの説明を読んで,設問1,2に答えよ。
Z組合では,収穫したメロンのうち1 kg以上かつ3 kg未満のものだけを組合で決めた3等級に分類して直接小売店に出荷している。出荷するメロンの等級と価格を決定する処理に,表計算ソフトを用いている。
【メロンの等級】出荷するメロンは,形状及び表皮色をそれぞれ評価して「優」「良」「並」のいずれかに分類する。評価は「優」が最も高く,「並」が最も低い。形状と表皮色の評価のうち低い方が,そのメロンの等級となる。メロンの等級ごとに「キログラム当たり単価」が設定されている。
【ワークシート:単価表】キログラム当たり単価が格納されたワークシート「単価表」を図1に示す。
【ワークシート:集計表】1回の出荷ごとに,出荷する個々のメロンに対して一意となるIDを付与する。1回の出荷数は1,000個以内である。各メロンの等級と価格(価格は,等級が「優」と「良」のものだけ)を決定するワークシート「集計表」の例を,図2に示す。
問1 ワークシート「集計表」の説明文中の空欄に入れる正しい答えを,解答群の中から選べ。
問2 マクロPackingの空欄に入れる正しい答えを,解答群の中から選べ。
単価表
図1 ワークシート「単価表」。列Aは見出し列。セルB1~D1は順に「優」「良」「並」。セルA2は「キログラム当たり単価(円/kg)」。セルB2~D2は順に1,500,1,200,800。
図2 集計表と入力・計算規則
図2 ワークシート「集計表」の例。列見出しはA: ID,B: 重量(kg),C: 形状,D: 表皮色,E: 等級,F: 算出価格(円),G: 販売価格(円)。行1は見出し行。行2以降に出荷するメロンのデータを1行ずつ入力する。データの最終行より下の行の列A~Dの各セルには空値が入力されている。列Aには付与したID,列Bには重量をkg単位で小数第3位まで,列C及びDには形状及び表皮色の評価を入力する。セルE2にはC2及びD2の評価に基づく等級を表示する式を入力し,E3~E1001に複写する。式の形:IF(A2=null, null, [a])。セルF2には式を入力し,F3~F1001に複写する。等級が「並」のとき「-」,それ以外のときメロンの算出価格を表示する。算出価格は単価表を参照したキログラム当たり単価×重量。式の形:IF(A2=null, null, IF(E2='並', '-', [b] * B2))。セルG2には式を入力し,G3~G1001に複写する。等級が「並」のとき「-」,それ以外のとき販売価格を表示する。販売価格は算出価格を50円単位で切り上げた値。式の形:IF(A2=null, null, IF(E2='並', '-', [c]))。例としてID 1,2,3,4,15,16,17,18,78の行が示されており,表中の値はそれぞれ,重量・形状・表皮色・等級・算出価格・販売価格の順に,1: 1.621,優,優,優,2,431.5,2,450;2: 1.854,良,優,良,2,224.8,2,250;3: 2.023,良,良,良,2,427.6,2,450;4: 2.456,並,良,並,-,-;15: 2.454,優,良,良,2,944.8,2,950;16: 2.858,優,優,優,4,287.0,4,300;17: 1.214,良,優,良,1,456.8,1,500;18: 1.014,良,並,並,-,-;78: 2.812,優,優,優,4,218.0,4,250。
図3 重量計算表
図3 ワークシート「重量計算表」の例。列A: 箱連番,B: 1個目のID,C: 2個目のID,D: 3個目のID,E: 4個目のID,F: 合計重量(kg),G: 販売価格(円)。例の行は,箱連番1: ID 4,7,18,(4個目空欄),5.728 kg,4,600円;箱連番2: ID 26,29,(3・4個目空欄),5.434 kg,4,350円;箱連番3: ID 32,36,39,41,4.822 kg,3,900円;箱連番4: ID 42,50,58,(4個目空欄),6.859 kg,5,500円;箱連番5: ID 61,69,72,77,6.536 kg,5,250円;箱連番6: ID 80,88,91,(4個目空欄),5.312 kg,4,250円。行1は見出し行。
重量計算表とマクロの仕様
重量計算表の作成条件:集計表の2行目以降のデータを上から順に参照し,メロンを大箱に割り振る。大箱には箱連番を付与する。一つの大箱には「メロンの合計重量が5 kg以上」又は「メロンの個数が4個」のどちらかを満たすまでメロンを割り振る。行1は見出し行。マクロPackingの実行前,セルA2~F1001は空値。セルG2~G1001には,箱連番が示す大箱に割り振られたメロンの合計重量から販売価格を算出する式を入れておく。この式は,合計重量を格納するセルが空値の場合,空値を表示する。マクロPackingは処理(1)~(4)を実行する。(1) 列Aの行2以降に1から順に箱連番を格納。(2) 列B~Eの行2以降に,各箱に割り振られたメロンのIDを格納。割り振られた個数が4未満だった場合,IDを格納しなかったセルは空値のまま。(3) 列Fの行2以降に各箱のメロンの合計重量を格納。(4) 割り振った結果,出荷条件を満たさない大箱に関する情報は表示しないようにする。
関連する表計算の機能・用語(p85~87)
図表・式の表記で用いる表計算仕様(公式別添,物理PDF p85~90)。セル値には数値,文字列,論理値,空値がある。空値はnullで表し,空値をもつセルを空白セルという。文字列は二重引用符で囲む。論理値はtrue及びfalse。式は定数,セル番地,演算子,括弧及び関数から構成される。演算子には単項の+,−,算術の+,−,*,/,^,比較の>,<,≥,≤,=,≠がある。関数IF(論理式, 式1, 式2)は論理式がtrueなら式1,falseなら式2の値を返す。論理積(論理式1, 論理式2, …)はすべてtrueのときtrue,それ以外はfalse。論理和(論理式1, 論理式2, …)は少なくとも一つがtrueのときtrue,それ以外はfalse。
解答群に関係する関数の仕様(p88~89)
関連する参照関数の仕様(公式別添,物理PDF p88~89)。照合一致(式, セル範囲, 検索の指定)は,1行又は1列の範囲を端から走査し,検索指定に応じて式の値と一致する値を探し,見つかった位置を返す。検索指定0は一致する値を検索する。水平照合(式, セル範囲, 行の位置, 検索の指定)は,範囲の上端行を左から右へ走査し,指定条件を満たす最初の列にある指定行の値を返す。表引き(セル範囲, 行の位置, 列の位置)は,範囲の左上端からの行・列位置で指定したセルの値を返す。切上げ(算術式, 桁位置)は指定位置で切り上げた値を返す。四捨五入(算術式, 桁位置)は指定位置で四捨五入した値を返す。桁位置は小数第1位を0とし,右方向を正として数える。切捨て(算術式, 桁位置)は指定位置で切り捨てた値を返す。
セル参照・相対参照の仕様(p85~87,p90)
セル参照とコピー(公式別添,物理PDF p85~87,p90)。他のワークシートのセル・範囲は「ワークシート名!セル番地/セル範囲」で指定する。セルを複写すると,相対参照は複写元と複写先の行・列の差だけ参照先が変わる。絶対参照は列記号・行番号の直前に$を付け,複写してもその部分が変わらない。相対(セル変数, 行の位置, 列の位置)はセル変数で指定したセルを基準に,行・列の位置を相対移動したセルを表す。例:相対(B5,2,3)はE7,相対(B5,−2,−1)はA3。
問問13 設問1
ワークシート「集計表」の説明文中の空欄a,b,cに入れる正しい答えを,それぞれの解答群の中から選べ。
aに関する解答群
ア IF(論理積(C2='並', D2='並'), '並', IF(論理積(C2='良', D2='良'), '良', '優'))
イ IF(論理積(C2='優', D2='優'), '優', IF(論理積(C2='並', D2='並'), '並', '良'))
ウ IF(論理積(C2='優', D2='優'), '優', IF(論理積(C2='良', D2='良'), '良', '並'))
エ IF(論理和(C2='並', D2='並'), '並', IF(論理和(C2='良', D2='良'), '良', '優'))
オ IF(論理和(C2='優', D2='優'), '優', IF(論理和(C2='並', D2='並'), '並', '良'))
カ IF(論理和(C2='優', D2='優'), '優', IF(論理和(C2='良', D2='良'), '良', '並'))
bに関する解答群
ア 照合一致(E2, 単価表!$B2:$D2, 0)
イ 照合一致(E2, 単価表!B$2:D$2, 0)
ウ 水平照合(E2, 単価表!$B1:$D2, 2, 0)
エ 水平照合(E2, 単価表!B$1:D$2, 2, 0)
オ 表引き(単価表!$B1:$D2, 2, 1)
カ 表引き(単価表!B$1:D$2, 2, 1)
cに関する解答群
ア 切上げ(F2 * 2, 0) / 2
イ 切上げ(F2 / 2, 0) * 2
ウ 切上げ(F2 / 50, 0) * 50
エ 四捨五入(F2, −2)
オ 四捨五入(F2 + 50, −2) − 50
カ 四捨五入(F2 / 50, 0) * 50
- A-ア IF(論理積(C2='並', D2='並'), '並', IF(論理積(C2='良', D2='良'), '良', '優'))
- A-イ IF(論理積(C2='優', D2='優'), '優', IF(論理積(C2='並', D2='並'), '並', '良'))
- A-ウ IF(論理積(C2='優', D2='優'), '優', IF(論理積(C2='良', D2='良'), '良', '並'))
- A-エ IF(論理和(C2='並', D2='並'), '並', IF(論理和(C2='良', D2='良'), '良', '優'))
- A-オ IF(論理和(C2='優', D2='優'), '優', IF(論理和(C2='並', D2='並'), '並', '良'))
- A-カ IF(論理和(C2='優', D2='優'), '優', IF(論理和(C2='良', D2='良'), '良', '並'))
- B-ア 照合一致(E2, 単価表!$B2:$D2, 0)
- B-イ 照合一致(E2, 単価表!B$2:D$2, 0)
- B-ウ 水平照合(E2, 単価表!$B1:$D2, 2, 0)
- B-エ 水平照合(E2, 単価表!B$1:D$2, 2, 0)
- B-オ 表引き(単価表!$B1:$D2, 2, 1)
- B-カ 表引き(単価表!B$1:D$2, 2, 1)
- C-ア 切上げ(F2 * 2, 0) / 2
- C-イ 切上げ(F2 / 2, 0) * 2
- C-ウ 切上げ(F2 / 50, 0) * 50
- C-エ 四捨五入(F2, −2)
- C-オ 四捨五入(F2 + 50, −2) − 50
- C-カ 四捨五入(F2 / 50, 0) * 50
出典:令和元年度 秋期 基本情報技術者試験 午後 問13 設問1
問問13 設問2
マクロPackingの空欄d,e,fに入れる正しい答えを,それぞれの解答群の中から選べ。
dに関する解答群
ア 相対(F1, i, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, 1, 0)
イ 相対(F1, i, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, i, 0)
ウ 相対(F1, i, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, j, 0)
エ 相対(F1, i, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, j, 0)
オ 相対(F1, j, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, 0, 0)
カ 相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, 0, 0)
キ 相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, i, 0)
ク 相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, j, 0)
eに関する解答群
ア 論理積(相対(F1, j, 0) = 5, CurrentColumn = 4)
イ 論理積(相対(F1, j, 0) = 5, CurrentColumn ≥ 4)
ウ 論理積(相対(F1, j, 0) < 5, CurrentColumn = 4)
エ 論理積(相対(F1, j, 0) ≥ 5, CurrentColumn < 4)
オ 論理和(相対(F1, j, 0) = 5, CurrentColumn ≥ 4)
カ 論理和(相対(F1, j, 0) < 5, CurrentColumn = 4)
キ 論理和(相対(F1, j, 0) ≥ 5, CurrentColumn = 4)
ク 論理和(相対(F1, j, 0) ≥ 5, CurrentColumn < 4)
fに関する解答群
ア 相対(A1, j, 1) ← null
イ 相対(A1, j, k) ← null
ウ 相対(A1, j, k) ← 相対(A1, j, k) + 1
エ 相対(A1, k, 1) ← null
オ 相対(A1, k, j) ← null
カ 相対(A1, k, j) ← 相対(A1, k, j) + 1
- D-ア 相対(F1, i, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, 1, 0)
- D-イ 相対(F1, i, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, i, 0)
- D-ウ 相対(F1, i, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, j, 0)
- D-エ 相対(F1, i, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, j, 0)
- D-オ 相対(F1, j, 0) ← 相対(F1, i, 0) + 相対(集計表!B1, 0, 0)
- D-カ 相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, 0, 0)
- D-キ 相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, i, 0)
- D-ク 相対(F1, j, 0) ← 相対(F1, j, 0) + 相対(集計表!B1, j, 0)
- E-ア 論理積(相対(F1, j, 0) = 5, CurrentColumn = 4)
- E-イ 論理積(相対(F1, j, 0) = 5, CurrentColumn ≥ 4)
- E-ウ 論理積(相対(F1, j, 0) < 5, CurrentColumn = 4)
- E-エ 論理積(相対(F1, j, 0) ≥ 5, CurrentColumn < 4)
- E-オ 論理和(相対(F1, j, 0) = 5, CurrentColumn ≥ 4)
- E-カ 論理和(相対(F1, j, 0) < 5, CurrentColumn = 4)
- E-キ 論理和(相対(F1, j, 0) ≥ 5, CurrentColumn = 4)
- E-ク 論理和(相対(F1, j, 0) ≥ 5, CurrentColumn < 4)
- F-ア 相対(A1, j, 1) ← null
- F-イ 相対(A1, j, k) ← null
- F-ウ 相対(A1, j, k) ← 相対(A1, j, k) + 1
- F-エ 相対(A1, k, 1) ← null
- F-オ 相対(A1, k, j) ← null
- F-カ 相対(A1, k, j) ← 相対(A1, k, j) + 1
出典:令和元年度 秋期 基本情報技術者試験 午後 問13 設問2