共通の文章
問1 Webサービスを利用するためのパスワードを安全に保存する方法に関する次の記述を読んで,設問1~3に答えよ。
A社が提供するWebサービスを利用するには,利用者が決めた利用者IDとパスワードを,Webアプリケーションが動作するサーバに登録しておく必要がある。A社のWebアプリケーションでは,利用者がWebアプリケーションにログインするときに,Webブラウザから利用者IDとパスワードがサーバに送信される。サーバは,受信した利用者IDとパスワードを,照合することによって認証する。利用者が決めたパスワードは,パスワードファイルに平文で保存されている。
近年,パスワードファイルが漏えいし,不正ログインが発生したと考えられる事件が多数報道されている。そこで,A社に勤めるCさんは,自社のWebアプリケーションにおけるパスワードファイルが漏えいした際の不正ログインを防止するための対策について,上司から検討を命じられた。
Cさんは対策として,パスワードを平文で保存するのではなく,ハッシュ関数でパスワードのハッシュ値を計算(以下,ハッシュ化という)し,そのハッシュ値を保存する方式を提案することにした。この方式におけるログイン時の認証では,受信したパスワードから求めたハッシュ値を,パスワードファイルに保存されているハッシュ値と照合する。パスワードの保存の流れと,照合の流れを図1に示す。
図1
図1「パスワードの保存の流れと,照合の流れ」。上段はパスワードの保存、下段はパスワードの照合を示す。保存時、Webブラウザのパスワード「i*ejEf/3as」がサーバに送信され、サーバが受信したパスワードをハッシュ化して、得られたハッシュ値「a4bde8ac02f7…」をパスワードファイルに保存する。照合時、Webブラウザから同じパスワード「i*ejEf/3as」がサーバに送信される。サーバはパスワードファイルからハッシュ値「a4bde8ac02f7…」を読み出し、受信したパスワードをハッシュ化して得たハッシュ値「a4bde8ac02f7…」と照合する。
ハッシュ関数の特徴
ハッシュ化に用いるハッシュ関数の特徴:(1) パスワードの長さに関係なく,ハッシュ値は固定長になる。(2) 空欄b。(3) ハッシュ値からパスワードを推測することが非常に困難である。(4) パスワードが1文字でも異なれば,ハッシュ値は大きく異なる。
図2
図2「ソルトを用いたパスワードの保存の流れと,照合の流れ」。上段は保存、下段は照合を示す。保存時、Webブラウザのパスワード「ncCr-q$x0w」がサーバに送信される。サーバは新しいソルト「cV4Ak#a⋯」を生成し、ソルトと受信したパスワードを連結した文字列をハッシュ化する。パスワードファイルには、ソルト「cV4Ak#a⋯」と、ハッシュ値「be8a943a32d⋯」を保存する。照合時、Webブラウザからパスワード「ncCr-q$x0w」がサーバに送信される。サーバはパスワードファイルからソルトとハッシュ値を読み出し、読み出したソルトと受信したパスワードを連結した文字列をハッシュ化して、得られたハッシュ値「be8a943a32d⋯」を、読み出したハッシュ値「be8a943a32d⋯」と照合する。
ソルトを用いる方式
ソルトを用いた方式では、パスワードを保存する都度、新しいソルトを生成し、ソルトとパスワードを連結した文字列をハッシュ化する。得られたハッシュ値は、パスワードだけをハッシュ化した場合のハッシュ値 空欄c。ソルトと得られたハッシュ値をパスワードファイルに保存する。照合時には、ファイルからソルトとハッシュ値を読み出し、読み出したソルトと受信したパスワードを連結した文字列をハッシュ化して、得られたハッシュ値を読み出したハッシュ値と照合する。ソルトは、十分な長さをもつランダムな文字列である。
問問1 設問1
Cさんは,パスワードのハッシュ化には,ハッシュ関数の一つである空欄aを用いることにした。ハッシュ化に用いるハッシュ関数は,一般的に「ハッシュ関数の特徴」に示す特徴を備えているので,パスワードが一致していることの確認に用いることができる。また,利用者のパスワードを平文で保存する場合と比べて,パスワードファイルが漏えいしても,より安全だと考えた。本文中の空欄a及びbに入れる適切な答えを,それぞれの解答群の中から選べ。
aに関する解答群
ア AES
イ Diffie-Hellman
ウ RSA
エ SHA-256
オ TLS
bに関する解答群
ア 異なるパスワードをハッシュ化したとき,同じハッシュ値になる可能性が高い。
イ 同一のパスワードをハッシュ化すると,同じハッシュ値になる。
ウ パスワードをハッシュ化した結果のハッシュ値を再度ハッシュ化すると,元のパスワードになる。
エ 秘密鍵を使用してハッシュ値から元のパスワードを復元できる。
- A-ア AES
- A-イ Diffie-Hellman
- A-ウ RSA
- A-エ SHA-256
- A-オ TLS
- B-ア 異なるパスワードをハッシュ化したとき,同じハッシュ値になる可能性が高い。
- B-イ 同一のパスワードをハッシュ化すると,同じハッシュ値になる。
- B-ウ パスワードをハッシュ化した結果のハッシュ値を再度ハッシュ化すると,元のパスワードになる。
- B-エ 秘密鍵を使用してハッシュ値から元のパスワードを復元できる。
出典:平成30年度 春期 基本情報技術者試験 午後 問1 設問1
問問1 設問2
Cさんは,自身が提案する方式について,社内の情報セキュリティ責任者にレビューを依頼したところ,この方式は漏えいしたパスワードファイルを攻撃者に入手された場合,事前計算による辞書攻撃に弱いという指摘を受けた。この攻撃では,あらかじめ攻撃者はパスワードとしてよく使われる文字列を,よく使われているハッシュ関数でハッシュ化し,ハッシュ値から元のパスワードが検索可能な一覧表を作成しておく。その後,攻撃者が漏えいしたパスワードファイルを入手したとき,この作成した一覧表からハッシュ値を検索する。ハッシュ値が一覧表に載っている場合は,元のパスワードを容易に知ることができる。
Cさんは,事前計算による辞書攻撃を難しくする方式を調査し,ソルトを用いる方式を提案することにした。ソルトとは,十分な長さをもつランダムな文字列である。
この方式におけるパスワードの保存では,まず,サーバは新しいパスワードの保存の都度,新しいソルトを生成し,ソルトとパスワードを連結した文字列をハッシュ化する。このとき得られるハッシュ値は,パスワードだけをハッシュ化した場合のハッシュ値 空欄c。次に,ハッシュ化に使用したソルトと得られたハッシュ値をパスワードファイルに保存する。
この方式におけるパスワードの照合では,まず,サーバはパスワードファイルからソルトとハッシュ値を読み出す。次に,読み出したソルトと受信したパスワードを連結した文字列をハッシュ化し,得られたハッシュ値を,読み出したハッシュ値と照合する。ソルトを用いたパスワードの保存の流れと,照合の流れを図2に示す。
ソルトを用いる方式が,事前計算による辞書攻撃の対策として効果があるのは,空欄dからである。本文中の空欄c及びdに入れる適切な答えを,それぞれの解答群の中から選べ。
cに関する解答群
ア と同じ値になる
イ とは異なる値になる
ウ よりも長さが長い
エ よりも長さが短い
dに関する解答群
ア 攻撃者が,ハッシュ値からではなくソルトから元のパスワードを検索するための一覧表を事前に作成しておく必要がある
イ 攻撃者がパスワードファイルからソルトを入手できない
ウ 攻撃者がパスワードファイルを入手するのが困難になる
エ 攻撃者が一つのパスワードに対して事前に求めるハッシュ値の数が膨大になる
- C-ア と同じ値になる
- C-イ とは異なる値になる
- C-ウ よりも長さが長い
- C-エ よりも長さが短い
- D-ア 攻撃者が,ハッシュ値からではなくソルトから元のパスワードを検索するための一覧表を事前に作成しておく必要がある
- D-イ 攻撃者がパスワードファイルからソルトを入手できない
- D-ウ 攻撃者がパスワードファイルを入手するのが困難になる
- D-エ 攻撃者が一つのパスワードに対して事前に求めるハッシュ値の数が膨大になる
出典:平成30年度 春期 基本情報技術者試験 午後 問1 設問2
問問1 設問3
次の記述中の[空欄]に入れる適切な答えを,解答群の中から選べ。
Cさんは,オフライン総当たり攻撃についても,対策を検討することにした。漏えいしたパスワードファイルに対するオフライン総当たり攻撃とは,攻撃者が,パスワードファイルを入手した後,全てのパスワードの候補を逐次生成してはハッシュ化し,得られたハッシュ値がパスワードファイルに保存されているハッシュ値と一致するかどうか,しらみつぶしに確認することによって,ハッシュ値の元のパスワードを見つける攻撃方法である。
Cさんは,オフライン総当たり攻撃を難しくする方式として,ストレッチングという方式があることを知った。
この方式では,まず,ソルトとパスワードを連結した文字列をハッシュ化してハッシュ値を得る。次に,得られたハッシュ値の後にソルトとパスワードを連結し,その連結結果をハッシュ化する。この操作を指定した回数だけ繰り返すことによって,パスワードの照合に用いるハッシュ値を得る。パスワードファイルには,ソルト及びパスワードの照合に用いるハッシュ値に加えて,繰返し回数も保存する。この方式では,ハッシュ化の操作を1回だけ行う方式と比べると,攻撃者が,オフライン総当たり攻撃を行う際,[空欄]。
- ア 生成すべきパスワードの候補の最大文字列長が長くなる
- イ 一つのパスワードの候補から求めたハッシュ値の長さが長くなる
- ウ 一つのパスワードの候補から求めたハッシュ値を,パスワードファイルのハッシュ値と比較する回数が増える
- エ 一つのパスワードの候補からハッシュ値を求める時間が増加する
出典:平成30年度 春期 基本情報技術者試験 午後 問1 設問3
共通の文章
問2 論理回路に関する次の記述を読んで,設問1~3に答えよ。主要な論理演算の真理値表を表1に示す。
表1
表1「主要な論理演算の真理値表」。列は入力(2値)と出力(AND(論理積)、OR(論理和)、NAND(否定論理積)、NOR(否定論理和))。入力と各出力の対応は、00:0, 0, 1, 1;01:0, 1, 1, 0;10:0, 1, 1, 0;11:1, 1, 0, 0。
表2
表2「XOR(排他的論理和)の真理値表」。入力と出力の対応は、00:0;01:1;10:1;11:0。
図1
図1「XOR(排他的論理和)の論理回路」。2つの入力がNANDゲートと、空欄aのゲートに入力される。各ゲートの出力がANDゲートに入力され、ANDゲートの出力が出力となる。
aに関する解答群
空欄aに関する解答群(原本の順):ア:AND、イ:NAND、ウ:NOR、エ:OR。
図2
図2「半加算器の論理回路」。1桁の2進数X、Yを入力し、その和の下位桁をZ、桁上がりをCとして出力する。空欄bの回路は入力X、Yを受けてZを出力し、空欄cの回路は入力X、Yを受けてCを出力する。
b、cに関する解答群
空欄b、cに関する解答群(原本の順):ア:AND、イ:NAND、ウ:NOR、エ:OR、オ:XOR。
設問3の説明
論理回路の動作条件:1ビット入力X、YをそれぞれパラメタWx、Wyで重み付けして加算し、パラメタTをしきい値とする。Wx×X+Wy×Y≧Tのとき1をZに出力し、Wx×X+Wy×Y<Tのとき0をZに出力する。例として、パラメタ[0.5, 0.5, 0.3]の場合の入出力関係はOR(論理和)になる。
表3
表3「パラメタ[0.5, 0.5, 0.3]の場合の入出力関係」。列は入力X、入力Y、Wx×X+Wy×Y、T、出力Z。行は、X=0,Y=0:0.5×0+0.5×0、0.3、0;X=0,Y=1:0.5×0+0.5×1、0.3、1;X=1,Y=0:0.5×1+0.5×0、0.3、1;X=1,Y=1:0.5×1+0.5×1、0.3、1。
d、eに関する解答群
空欄d、eに関する解答群(原本の順):ア:[-0.5, -0.5, -0.8]、イ:[-0.5, -0.5, -0.2]、ウ:[0.5, 0.5, -0.5]、エ:[0.5, 0.5, 0.2]、オ:[0.5, 0.5, 0.8]、カ:[0.5, 0.5, 1.5]。
問問2 設問1
表1に示した論理演算を行う論理回路を用いて,表2に示すXOR(排他的論理和)の論理演算を行う論理回路を図1のとおり作成した。図1中の空欄に入れる正しい答えを,解答群の中から選べ。
出典:平成30年度 春期 基本情報技術者試験 午後 問2 設問1
問問2 設問2
1桁の2進数X、Yを入力して,その和の下位桁をZ、桁上がりをCに出力する半加算器の論理回路を図2に示す。図2中の空欄に入れる正しい答えを,解答群の中から選べ。
b、cに関する解答群
ア AND
イ NAND
ウ NOR
エ OR
オ XOR
- B-ア AND
- B-イ NAND
- B-ウ NOR
- B-エ OR
- B-オ XOR
- C-ア AND
- C-イ NAND
- C-ウ NOR
- C-エ OR
- C-オ XOR
出典:平成30年度 春期 基本情報技術者試験 午後 問2 設問2
問問2 設問3
論理回路に関する次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。同様に、(1) AND(論理積)になる入出力関係はパラメタdで実現できる。(2) NAND(否定論理積)になる入出力関係はパラメタeで実現できる。
d、eに関する解答群
ア [-0.5, -0.5, -0.8]
イ [-0.5, -0.5, -0.2]
ウ [0.5, 0.5, -0.5]
エ [0.5, 0.5, 0.2]
オ [0.5, 0.5, 0.8]
カ [0.5, 0.5, 1.5]
- D-ア [-0.5, -0.5, -0.8]
- D-イ [-0.5, -0.5, -0.2]
- D-ウ [0.5, 0.5, -0.5]
- D-エ [0.5, 0.5, 0.2]
- D-オ [0.5, 0.5, 0.8]
- D-カ [0.5, 0.5, 1.5]
- E-ア [-0.5, -0.5, -0.8]
- E-イ [-0.5, -0.5, -0.2]
- E-ウ [0.5, 0.5, -0.5]
- E-エ [0.5, 0.5, 0.2]
- E-オ [0.5, 0.5, 0.8]
- E-カ [0.5, 0.5, 1.5]
出典:平成30年度 春期 基本情報技術者試験 午後 問2 設問3
共通の文章
問3 小学生を対象とした,ある子供会の名簿を管理する関係データベースに関する次の記述を読んで,設問1~4に答えよ。
D子供会は,小学校に入学するときに入会を受け付け,小学校を卒業したら退会する。D子供会では,会員名簿を管理するためのデータベースを構築して,会の運営に活用している。このたび,児童のイベントへの参加実績を記録するために,活動表とイベント表を追加した。データベースの表構成とデータ格納例を図1に示す。下線付きの項目は,主キーを表す。
図1 データベースの表構成とデータ格納例
図1 データベースの表構成とデータ格納例。下線付きの項目は主キー。
保護者表(列:保護者番号[主キー],保護者氏名,電話番号,住所)
例:12021|情報花子|03-1111-2222|東京都○○区□□□
児童表(列:児童番号[主キー],児童氏名,学年,保護者番号)
例:12027|情報一郎|6|12021
14021|情報二郎|4|12021
活動表(列:児童番号[主キーの一部],イベント番号[主キーの一部])
例:12027|18001
14021|18001
12027|18002
イベント表(列:イベント番号[主キー],イベント名,開催日)
例:18001|歓迎会|20180407
18002|地域清掃|20180414
各表には、続きがあることを示す「…」の行がある。
問問3 設問1
設問1 6年生を対象に実施するイベントの案内を配布するために,6年生の保護者の氏名と住所を抽出する。ここで,同一の保護者は重複して抽出しない。また,同じ住所に氏名が同じ保護者は,複数人いないものとする。正しいSQL文を,解答群の中から選べ。
- ア SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所
FROM 保護者表
WHERE 保護者表.保護者番号 NOT IN
(SELECT 児童表.保護者番号 FROM 児童表 WHERE 児童表.学年 = 6)
- イ SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所
FROM 保護者表, 児童表
WHERE 児童表.学年 = 6
GROUP BY 保護者表.保護者氏名, 保護者表.住所
- ウ SELECT DISTINCT 保護者表.保護者氏名, 保護者表.住所
FROM 保護者表, 児童表
WHERE 保護者表.保護者番号 = 児童表.保護者番号 AND 児童表.学年 = 6
- エ SELECT 保護者表.保護者氏名, 保護者表.住所
FROM 保護者表, 児童表
WHERE 保護者表.保護者番号 = 児童表.保護者番号
GROUP BY 保護者表.保護者氏名, 保護者表.住所 HAVING 児童表.学年 = 6
出典:平成30年度 春期 基本情報技術者試験 午後 問3 設問1
問問3 設問2
設問2 イベント番号が18001のイベントに参加した児童のうち,1年生である児童の保護者の保護者番号と氏名を抽出する。ここで,同一の保護者は重複して抽出しない。次のSQL文の空欄 a に入れる正しい答えを,解答群の中から選べ。
SELECT DISTINCT 保護者表.保護者番号, 保護者表.保護者氏名
〔空欄 a〕
- ア FROM 児童表, 保護者表, イベント表
WHERE 児童表.学年 = 1 AND
イベント表.イベント番号 = 18001
- イ FROM 児童表, 保護者表, イベント表
WHERE 児童表.保護者番号 = 保護者表.保護者番号 AND
児童表.学年 = 1 AND
イベント表.イベント番号 = 18001
- ウ FROM 児童表, 活動表, 保護者表
WHERE 児童表.児童番号 = 活動表.児童番号 AND
児童表.保護者番号 = 保護者表.保護者番号 AND
活動表.イベント番号 = 18001
GROUP BY 児童表.児童氏名 HAVING 児童表.学年 = 1
- エ FROM 児童表, 活動表, 保護者表
WHERE 児童表.児童番号 = 活動表.児童番号 AND
児童表.保護者番号 = 保護者表.保護者番号 AND
児童表.学年 = 1 AND
活動表.イベント番号 = 18001
出典:平成30年度 春期 基本情報技術者試験 午後 問3 設問2
問問3 設問3
設問3 イベント名と,そのイベントに参加した児童の数を表示する。次のSQL文の空欄 b に入れる正しい答えを,解答群の中から選べ。ここで,イベント名は全て異なるものとする。
SELECT イベント表.イベント名, 〔空欄 b〕
FROM 活動表, イベント表
WHERE 活動表.イベント番号 = イベント表.イベント番号
GROUP BY イベント表.イベント名
- ア AVG(活動表.イベント番号)
- イ COUNT(*)
- ウ MAX(活動表.イベント番号)
- エ SUM(活動表.イベント番号)
出典:平成30年度 春期 基本情報技術者試験 午後 問3 設問3
問問3 設問4
設問4 年度の切替えのために,次に示す手順で表を更新する。(1),(2)は入会前の準備のために3月31日に実行し,(3)~(7)は6年生が退会した4月1日に実行する。次のSQL文の空欄 c に入れる正しい答えを,解答群の中から選べ。
〔手順〕
(1) 新入会児童の保護者のうち,未登録の保護者を登録する。
(2) 新入会児童を登録する。このとき,学年の値は0とする。
(3) 活動表のレコードを全て削除する。
(4) 児童表の全ての児童に対して,学年の値に1を加える。
(5) 児童表から,学年の値が7の児童を削除する。
(6) 次のSQL文を実行して,保護者表から,在籍する児童がいなくなった保護者を削除する。
DELETE FROM 保護者表
WHERE 〔空欄 c〕
(7) イベント表のレコードを全て削除してから,新年度の計画に合わせてイベントを登録する。
- ア 保護者表.保護者番号 = NULL
- イ 保護者表.保護者番号 IN
(SELECT 児童表.保護者番号 FROM 児童表 WHERE 児童表.学年 = 7)
- ウ 保護者表.保護者番号 IN
(SELECT 児童表.保護者番号 FROM 児童表)
- エ 保護者表.保護者番号 NOT IN
(SELECT 児童表.保護者番号 FROM 児童表)
出典:平成30年度 春期 基本情報技術者試験 午後 問3 設問4
共通の文章
問4 クラウドサービス上でのシステム構築に関する次の記述を読んで,設問1,2に答えよ。
G社は,J社が運営するクラウドサービス上で,写真投稿サービス及び写真検索サービスを構築することにした。
(1) 写真投稿サービスは,利用者から投稿された写真を受け付け,自動で分類し,保管するサービスである。
(2) 写真検索サービスは,利用者から指定された条件に合致する写真を,保管されている写真の中から検索し,表示させるサービスである。
(3) 利用者は,PC,スマートフォンなど(以下,クライアントという)を用いてサービスを利用する。
システム構成を図1に示す。図1中の矢印の向きはアクセスの方向を示している。写真投稿サービス及び写真検索サービスの処理概要,仮想マシンの種類と性能,サーバ類のグループとアクセス制御の条件を資料に示す。
図1 システム構成
図1 システム構成。クライアントからインターネットへ接続し,インターネットから二つの負荷分散装置へ接続する。一方の負荷分散装置は複数のフロントサーバに接続し,もう一方は複数のレプリケーションサーバに接続する。フロントサーバはDBサーバ,キューサーバ,ストレージサーバにアクセスする。レプリケーションサーバはストレージサーバにアクセスする。複数のバックサーバはDBサーバ,キューサーバ,ストレージサーバにアクセスする。図中の矢印はアクセス方向を表す。DBはデータベース。
写真投稿サービスの処理概要
写真投稿サービスにおける処理の概要:(1) フロントサーバは,クライアントから写真を受け取り,一意なIDを写真に割り当て,ストレージサーバに保存する。(2) フロントサーバは,写真のID,ストレージサーバ上での写真の保存場所などを,その写真の属性情報としてDBサーバに登録する。(3) フロントサーバは,キューサーバに写真のIDを格納する。(4) バックサーバは,キューサーバから写真のIDを取得する。(5) バックサーバは,(4)で取得したIDに該当する写真の属性情報をDBサーバから検索し,ストレージサーバから写真を取得する。(6) バックサーバは,(5)で取得した写真をあるアルゴリズムによって分類し,分類結果をDBサーバのその写真の属性情報に付加する。(7) レプリケーションサーバは,ストレージサーバに定期的にアクセスし,新規に保存された写真を取得して自サーバ上に保存する。レプリケーションサーバ上の写真の保存場所は,ストレージサーバ上のそれと一意に対応付けられるように,あらかじめ定めてある規則に従って決定する。
写真検索サービスの処理概要
写真検索サービスにおける処理の概要:(1) フロントサーバは,クライアントから検索要求を受け取り,条件に合致する写真の属性情報をDBサーバから検索する。(2) フロントサーバは,検索された写真の属性情報から,レプリケーションサーバに保存された写真にアクセスするためのURLを作成する。(3) フロントサーバは,作成したURLを含むHTMLデータを生成してクライアントに返す。(4) クライアントは,フロントサーバから返されたHTMLデータに基づきレプリケーションサーバにアクセスし,写真を取得して表示する。なお,クライアントは,インターネットと負荷分散装置を介して,フロントサーバとレプリケーションサーバにアクセスする。
仮想マシンに関する条件
サーバは仮想マシン上で稼働させる。フロントサーバ及びバックサーバを稼働させる仮想マシンの主記憶容量やディスク容量は十分にあり,負荷に応じて台数を増減できる。計算処理能力やネットワーク処理能力に着目すると,仮想マシンには幾つかのタイプがある。仮想マシンのタイプを表1に示す。表1の計算処理能力は,タイプAの計算処理能力を1としたときの相対的な値である。ネットワーク処理能力は,タイプAのネットワーク処理能力を1としたときの相対的な値である。「1秒の計算処理量」とは,タイプAの仮想マシン1台を計算処理能力の100%で1秒間使用したときの処理量をいう。また,「1秒のネットワーク処理量」とは,タイプAの仮想マシン1台をネットワーク処理能力の100%で1秒間使用したときの処理量をいう。
表1 仮想マシンのタイプと処理量条件
表1 仮想マシンのタイプ。列は「タイプ」「計算処理能力」「ネットワーク処理能力」「コスト(円/時間)」。
A:1,1,10
B:2,1.5,18
C:4,2,34
D:8,2,60
フロントサーバにおいては,1要求当たり,計算処理量は0.1秒,ネットワーク処理量は0.07秒である。クライアントからの要求が非常に多いとき,フロントサーバのコストを最も低く抑えることができる仮想マシンのタイプは[a]である。ここで,各仮想マシンの計算処理能力とネットワーク処理能力の平均の使用率は,それぞれ50%以下に抑えることとする。
バックサーバにはタイプDの仮想マシンを使用する。バックサーバの写真1枚当たりの計算処理量は,25秒である。1時間当たり4,000枚の写真の投稿があるとき,計算処理能力の平均の使用率を50%以下とするのに最低限必要な仮想マシンの台数は[b]台である。ここで,ネットワーク処理能力は足りているものとする。
表2 グループとサーバ類の対応
表2 グループとグループに属するサーバ類との対応。グループ1:負荷分散装置。グループ2:フロントサーバ。グループ3:DBサーバ,キューサーバ。グループ4:バックサーバ。グループ5:ストレージサーバ。グループ6:レプリケーションサーバ。図1中の各サーバ及び負荷分散装置(以下,サーバ類という)は,表2に示すいずれかのグループに属しており,グループごとに他のグループやインターネットからのアクセス許可を設定できる。
表3 サーバ類が受け付けるプロトコル
表3 サーバ類が受け付けるプロトコル。列は「サーバ類」「プロトコル」「ポート番号」。
フロントサーバ:HTTP,80
キューサーバ:独自,15672
バックサーバ:無し,無し
ストレージサーバ:HTTP,80
DBサーバ:独自,15432
レプリケーションサーバ:HTTP,80
負荷分散装置:HTTP over TLS,443
表4 グループ3が許可するアクセス
各グループが許可するアクセスを必要最低限とすることにした結果,[c]が許可するアクセスは一致する。表4は,グループ3に属するサーバ類が,アクセス元に指定したグループに属するサーバ類から,指定したポート番号のポートを介してのアクセスを許可することを示す。グループ3が許可するアクセスは次のとおり。アクセス元グループ2:ポート番号15432と15672。アクセス元グループ4:ポート番号15432と15672。
問問4 設問1
本文中の空欄に入れる正しい答えを,解答群の中から選べ。aに関する解答群,bに関する解答群,cに関する解答群がある。
aに関する解答群
ア A
イ B
ウ C
エ D
bに関する解答群
ア 4
イ 7
ウ 28
エ 56
cに関する解答群
ア グループ1,2,5及び6
イ グループ2,5及び6
ウ グループ2及び6
エ グループ5及び6
- A-ア A
- A-イ B
- A-ウ C
- A-エ D
- B-ア 4
- B-イ 7
- B-ウ 28
- B-エ 56
- C-ア グループ1,2,5及び6
- C-イ グループ2,5及び6
- C-ウ グループ2及び6
- C-エ グループ5及び6
出典:平成30年度 春期 基本情報技術者試験 午後 問4 設問1
問問4 設問2
クライアントからの写真へのアクセスを,ストレージサーバがインターネットを介して直接受ける方法も考えられるが,この方法ではなく,図1のように負荷分散装置を介し,レプリケーションサーバが受けることの利点として適切な答えを,解答群の中から二つ選べ。
- ア クライアントからの写真へのアクセスが増加しても,ストレージサーバの負荷は高まらない。
- イ クライアントと写真へのアクセスに応答するサーバとの間に介在するサーバ類の台数が少ないので,ネットワーク遅延が小さい。
- ウ ストレージサーバに障害が発生しても,写真検索サービスの提供を継続できる。
- エ ストレージサーバに障害が発生しても,写真投稿サービスの提供を継続できる。
- オ 全てのフロントサーバに障害が発生しても,写真検索サービスの提供を継続できる。
出典:平成30年度 春期 基本情報技術者試験 午後 問4 設問2
共通の文章
問5 健康管理システムの設計に関する次の記述を読んで,設問1,2に答えよ。
K社は,従業員の健康診断管理業務に健康管理システムを利用している。全従業員には,年1回,誕生月に定期健康診断を受診させる。再検査が必要となった場合には,再度,健康診断を受診させる。
【健康管理システムを利用した健康診断管理業務の説明】
月初に,受診日(当月中旬の特定日)を指定して受診案内を通知する。受診すれば,受診した月の月末に健康診断結果を通知する。
(1) 健康管理システムに,当月の受診対象者を登録する。
① 当月が誕生月である従業員を抽出する。
② 前月の定期健康診断において,再検査が必要と判定された従業員を抽出する。
③ ①と②で抽出した従業員を受診対象者とし,健康診断コースを決定する。
④ 受診日を決定し,受診対象者の健康診断レコードを健康管理システムに登録する。
(2) 受診案内を受診対象者に通知する。
(3) 定期健康診断及び再検査の受診後に,受診者の判定結果などを健康管理システムに登録する。
(4) 受診者に,健康診断結果を通知する。
【健康管理システムの機能の説明】
健康管理システムの機能一覧を表1に示す。表1において,“業務との対応”列の項番は,【健康管理システムを利用した健康診断管理業務の説明】の項番に対応する。各機能では,健康管理システムの健康診断ファイルのアクセスと,人事システムの各マスタファイル(以下,マスタという)の情報の参照を行う。
【健康管理システム及び人事システムの関係の説明】
健康管理システムは,健康診断結果を健康診断ファイルで管理し,従業員の情報については,必要な項目の最新情報を人事システムの各マスタを参照して利用する。健康管理システム及び人事システムの関係は図1のとおりである。
【健康診断ファイルの説明】
健康診断ファイルのレコード様式を図2に示す。下線付きの項目は,主キーである。
(1) 対象年には,定期健康診断の受診対象となった年を設定する。再検査の場合は,前月に受診した定期健康診断の対象年と同じとする。
(2) 実施年月には,健康診断を受診する年月を設定する。
(3) 区分には,定期健康診断の場合は“定期”を,再検査の場合は“再検”を設定する。
(4) 判定結果,再検査要否及び判定年月日は,対象者登録機能で空白を設定し,判定結果登録機能で更新する。
【人事システムの各マスタの説明】
健康管理システムが参照する人事システムの各マスタのレコード様式を図3に示す。下線付きの項目は,主キーである。従業員マスタは,従業員の氏名,性別,生年月日などを保持する。従業員コードは,従業員に一意に付けられた番号であり,在勤地コードには,現在の在勤地の在勤地コードが入っている。職位マスタは,職位名と管理職フラグを保持し,管理職フラグで管理職かどうかが判別できる。在勤地マスタは,在勤地名とその在勤地の健康診断実施場所を保持する。
表1 健康管理システムの機能一覧
表1「健康管理システムの機能一覧」。列見出しは「機能名」「処理内容」「業務との対応」。行の内容:
・定期健康診断対象者抽出機能|当月が誕生月である従業員を従業員マスタから抽出する。|(1)①
・再検査対象者抽出機能|前月に定期健康診断を受診した従業員のうち,再検査が必要と判定された従業員を,健康診断ファイルから抽出する。|(1)②
・健康診断内容決定機能|定期健康診断対象者抽出機能,再検査対象者抽出機能で抽出した従業員に対して,健康診断コース及び健康診断実施場所を決定する。健康診断コースは,定期健康診断の場合は従業員の年齢,性別,管理職かどうかで決定する。再検査の場合は,前月に受診した定期健康診断の健康診断コースと同じとする。健康診断実施場所は,転勤になることも考慮し,従業員の現在の在勤地に基づいて決定する。|(1)③
・対象者登録機能|健康診断レコードを作成して健康診断ファイルに登録する。|(1)④
・判定結果登録機能|健康診断レコードの判定結果,再検査要否及び判定年月日を更新する。再検査要否は,定期健康診断後に再検査が必要な場合は“要”で,必要ない場合は“否”で更新する。再検査後の場合は,再検査要否は常に“否”で更新する。判定年月日は,処理を実行した年月日で更新する。|(3)
図1
図1「健康管理システム及び人事システムの関係」。健康管理システムには健康診断ファイルがある。健康管理システムから人事システムへ「参照」の関係があり,人事システムの従業員マスタ,職位マスタ,所属マスタ,在勤地マスタを参照する。
図2
図2「健康診断ファイルのレコード様式」。項目は左から,従業員コード(下線付き・主キー),対象年,実施年月,健康診断コース,区分,健康診断実施場所,受診年月日,判定結果,再検査要否,判定年月日。
図3
図3「健康管理システムが参照する人事システムの各マスタのレコード様式」。下線付き項目が各マスタの主キー。
・従業員マスタ:従業員コード(主キー),氏名,性別,生年月日,職位コード,所属コード,在勤地コード。
・職位マスタ:職位コード(主キー),職位名,管理職フラグ。
・所属マスタ:所属コード(主キー),所属名。
・在勤地マスタ:在勤地コード(主キー),在勤地名,健康診断実施場所。
図4及び未受診者抽出機能の処理の説明
未受診者の定義:当年の健康診断の未受診者は,従業員マスタから情報が抽出できる従業員のうち,次のいずれかに該当する者。(1) 当年の定期健康診断の健康診断レコードが存在しない。(2) 当年の定期健康診断の判定結果が登録されていない。(3) 当年の定期健康診断の結果,再検査が必要と判定されたが,再検査の健康診断レコードが存在しない,又はその判定結果が登録されていない。
図4「未受診者抽出機能の処理の流れ」:健康診断ファイルを入力して抽出1を行い,当年の健康診断ファイルを作成する。これを整列し,ファイルXを作成する。抽出2ではファイルXのレコードを先頭から順にファイルYへ出力する。ファイルYと従業員マスタを突合せ,未受診者ファイルを作成する。図4の従業員マスタは従業員コードの昇順で整列されている。
突合せ処理で先頭から順次読み込んで処理できるように,前処理として次を行う。① 抽出1処理で,対象年が当年のレコードを健康診断ファイルから抽出し,当年の健康診断ファイルを作成する。② 整列処理で,当年の健康診断ファイルを【c】で整列し,ファイルXを作成する。③ 抽出2処理で,ファイルXのレコードを先頭から順にファイルYに出力する。ここで,【d】が連続した場合には,最初に出現したレコードだけを出力する。
突合せ処理では,従業員マスタに存在する従業員コードに対して,次に示す①又は②のいずれかに該当する場合に,従業員コードを未受診者ファイルに出力する。① 従業員コードが一致するレコードがファイルYに存在しない。②【e】のレコードがファイルYに存在する。
問問5 設問1
次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。健康診断内容決定機能において,定期健康診断対象者抽出機能で従業員マスタから抽出された情報に加えて,定期健康診断の健康診断コース及び健康診断実施場所を決定するために最低限必要となるのは,【a】の情報である。再検査対象者抽出機能で健康診断ファイルから抽出された情報に加えて,再検査の健康診断実施場所を決定するために最低限必要となるのは,【b】の情報である。
a、bに関する解答群
ア 従業員マスタ
イ 従業員マスタ及び職位マスタ
ウ 従業員マスタ及び在勤地マスタ
エ 従業員マスタ,職位マスタ及び在勤地マスタ
オ 職位マスタ
カ 職位マスタ及び所属マスタ
キ 職位マスタ及び在勤地マスタ
ク 所属マスタ
ケ 所属マスタ及び在勤地マスタ
コ 在勤地マスタ
- A-ア 従業員マスタ
- A-イ 従業員マスタ及び職位マスタ
- A-ウ 従業員マスタ及び在勤地マスタ
- A-エ 従業員マスタ,職位マスタ及び在勤地マスタ
- A-オ 職位マスタ
- A-カ 職位マスタ及び所属マスタ
- A-キ 職位マスタ及び在勤地マスタ
- A-ク 所属マスタ
- A-ケ 所属マスタ及び在勤地マスタ
- A-コ 在勤地マスタ
- B-ア 従業員マスタ
- B-イ 従業員マスタ及び職位マスタ
- B-ウ 従業員マスタ及び在勤地マスタ
- B-エ 従業員マスタ,職位マスタ及び在勤地マスタ
- B-オ 職位マスタ
- B-カ 職位マスタ及び所属マスタ
- B-キ 職位マスタ及び在勤地マスタ
- B-ク 所属マスタ
- B-ケ 所属マスタ及び在勤地マスタ
- B-コ 在勤地マスタ
出典:平成30年度 春期 基本情報技術者試験 午後 問5 設問1
問問5 設問2
次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。
今回,健康管理業務として,12月の受診者の健康診断の判定結果を登録した後に,当年の健康診断の未受診者を抽出することになった。そのために,未受診者抽出機能を追加することにした。ここで,当年の健康診断の未受診者とは,従業員マスタから情報が抽出できる従業員のうち,(1) 当年の定期健康診断の健康診断レコードが存在しない,(2) 当年の定期健康診断の判定結果が登録されていない,(3) 当年の定期健康診断の結果,再検査が必要と判定されたが,再検査の健康診断レコードが存在しない,又はその判定結果が登録されていない,のいずれかに該当する者である。
未受診者抽出機能の処理の流れ及び説明は,資料「図4及び未受診者抽出機能の処理の説明」のとおりである。
cに関する解答群
ア 従業員コードの昇順
イ 従業員コードの昇順,実施年月の昇順
ウ 従業員コードの昇順,実施年月の降順
エ 従業員コードの降順
オ 従業員コードの降順,実施年月の昇順
カ 従業員コードの降順,実施年月の降順
dに関する解答群
ア 同じ従業員コード
イ 同じ従業員コード及び区分
ウ 同じ健康診断コース
エ 同じ健康診断コース及び区分
eに関する解答群
ア 判定結果が空白
イ 再検査要否が“要”
ウ 再検査要否が“否”
エ 判定結果が空白,又は再検査要否が“要”
オ 判定結果が空白,又は再検査要否が“否”
- C-ア 従業員コードの昇順
- C-イ 従業員コードの昇順,実施年月の昇順
- C-ウ 従業員コードの昇順,実施年月の降順
- C-エ 従業員コードの降順
- C-オ 従業員コードの降順,実施年月の昇順
- C-カ 従業員コードの降順,実施年月の降順
- D-ア 同じ従業員コード
- D-イ 同じ従業員コード及び区分
- D-ウ 同じ健康診断コース
- D-エ 同じ健康診断コース及び区分
- E-ア 判定結果が空白
- E-イ 再検査要否が“要”
- E-ウ 再検査要否が“否”
- E-エ 判定結果が空白,又は再検査要否が“要”
- E-オ 判定結果が空白,又は再検査要否が“否”
出典:平成30年度 春期 基本情報技術者試験 午後 問5 設問2
共通の文章
問6 EVM(Earned Value Management)手法を用いたプロジェクト管理に関する次の記述を読んで,設問1~3に答えよ。
S社では,クライアントサーバシステムとして構築されている既存の営業システムを,Webシステムに刷新するプロジェクト(以下,刷新プロジェクトという)を立ち上げた。Webシステムとして構築する営業システムを,新営業システムと呼ぶ。N社は,この刷新プロジェクトにおける外部設計から結合テストまでを受注した。
N社は,新営業システムの構成に合わせて,外部設計から結合テストまでを実施するプロジェクト体制を構築し,プロジェクトマネージャは,システム企画部に所属するY君が担当する。新営業システムは,サブシステムS1,サブシステムS2及び共通機能の三つのサブシステムで構成される。
N社では,新営業システムと類似するWebシステムの開発をこれまで複数案件行っており,組織のプロセス資産として各開発工程の生産性データを保有している。N社が保有する各開発工程の生産性を表1に示す。Y君は,要件定義の成果物である要件定義書とN社の過去の開発実績を参考にして,新営業システムの開発規模を見積もった。KLOC(Kilo Lines Of Code)は,ソースコード1,000行を単位とする指標である。
Y君は,(1)~(3)を前提に,各開発工程を完了させるために必要となる計画時点の工数(以下,計画工数という)を算出してプロジェクト計画を作成した。1か月の作業日数は20日とする。各開発工程における計画工数は,作業する各月に対して均等に割り当てる。例えば,外部設計を10.00人月と見積もった場合,外部設計の期間は2か月なので,各月に5.00人月を割り当てる。
図1
図1「刷新プロジェクトの結合テストまでのスケジュール」。横軸は経過月数。左端の「開発工程」は行見出し。基本計画は0~1か月、要件定義は1~2か月、外部設計は2~4か月、内部設計は4~6か月、製造・単体テストは6~10か月、結合テストは10~12か月。図中の括弧「N社が受注した範囲」は外部設計から結合テストまで。
表1
表1「各開発工程の生産性」。単位はKLOC/人月。開発工程と生産性の対応は,外部設計:8.00,内部設計:6.40,製造・単体テスト:3.20,結合テスト:8.00。
表2
表2「新営業システムの開発規模」。単位はKLOC。サブシステムと開発規模の対応は,S1:200.00,S2:240.00,共通機能:80.00。
表3
表3「外部設計と内部設計のサブシステムごとの計画工数」。単位は人月。列はサブシステム,外部設計,内部設計。S1の外部設計は25.00,内部設計は空欄a。S2の外部設計は30.00,内部設計欄は網掛けで非表示。共通機能の外部設計は10.00,内部設計欄は網掛けで非表示。合計の外部設計は65.00,内部設計欄は網掛けで非表示。注記:網掛けの部分は表示していない。
表4
表4「EVM指標のN社での意味」。BAC(人月)/完了までの総予算:プロジェクト計画時点に見積もった,プロジェクト完了までの予定総工数。PV(人月)/出来高計画値:プロジェクト計画時点において,プロジェクト状況の評価時点までの予定作業に割り当てていた予定工数。プロジェクト完了時点におけるPVはBACと同じ値になる。EV(人月)/出来高実績値:プロジェクト状況の評価時点までに完了した作業に対して,プロジェクト計画時点において割り当てていた予定工数。AC(人月)/コスト実績値:プロジェクト状況の評価時点までに完了した作業に対して,実際に必要となった工数。SV(人月)/スケジュール差異:評価時点におけるEVとPVの差。スケジュール面から見た差異を示す。CV(人月)/コスト差異:評価時点におけるEVとACの差。コスト面から見た差異を示す。SPI/スケジュール効率指数:SPI=EV/PV。スケジュール面から見た効率で,1未満の場合,進捗遅延していることを示す。CPI/コスト効率指数:CPI=EV/AC。コスト面から見た効率で,1未満の場合,コスト超過していることを示す。
表5
表5「外部設計工程のサブシステムごとのEVM指標値」。単位は人月。列はサブシステム,外部設計終了時点のPV,外部設計を開始してから1.75か月が経過した時点のPV・EV・AC。S1:25.00,21.88,21.15,21.60。S2:30.00,26.25,26.25,26.55。共通機能:10.00,8.75,8.75,8.10。本文には,外部設計開始から35作業日(1.75か月)が経過した時点の値であり,表5のEVM指標値は小数点第3位を四捨五入した値とある。
図2
図2「各経過月末時点のEVM指標値」。横軸は経過月数(2~12),縦軸は工数(人月,0~400)。凡例はPV(四角印,実線),EV(丸印,破線),AC(白丸印,点線)。グラフ上では,結合テスト開始時点が経過月10,結合テスト開始から1か月が経過した時点が経過月11として示されている。各系列のプロットはおおむね次のとおり:PVは月2から月12にかけて約0,33,65,105,150,190,228,265,305,340,380。EVは月2から月11にかけて約0,33,65,128,163,222,255,290,305,315。ACは月2から月11にかけて約0,33,65,102,140,180,207,250,305,375。月11付近の縦差を示す括弧があり,αはACとEVの間,βはPVとEVの間に描かれている。
問問6 設問1
外部設計と内部設計のサブシステムごとの計画工数を表3に示す。表3中の空欄aに入れる正しい答えを,解答群の中から選べ。
- ア 25.75
- イ 30.00
- ウ 31.25
- エ 37.50
出典:平成30年度 春期 基本情報技術者試験 午後 問6 設問1
問問6 設問2
次の(1)~(6)の記述のうち,表5のEVM指標値から予測した,外部設計が終了する時点での見通しとして適切な組合せはどれか。予測に当たってSPI及びCPIは,表5の実績と同等であるものとする。
(1)S1については,ACが外部設計終了時点のPVを超過しない。また,外部設計はスケジュール遅延せずに完了する。
(2)S1については,ACが外部設計終了時点のPVを超過する。また,外部設計はスケジュール遅延せずに完了する。
(3)S2については,外部設計はスケジュール遅延する。
(4)S2については,ACが外部設計終了時点のPVを超過する。また,外部設計はスケジュール遅延せずに完了する。
(5)共通機能については,外部設計はスケジュール遅延する。
(6)共通機能については,ACが外部設計終了時点のPVを超過しない。また,外部設計はスケジュール遅延せずに完了する。
- ア (1)と(4)
- イ (1)と(5)
- ウ (2)と(3)
- エ (2)と(4)
- オ (3)と(5)
- カ (3)と(6)
- キ (4)と(5)
- ク (4)と(6)
出典:平成30年度 春期 基本情報技術者試験 午後 問6 設問2
問問6 設問3
次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。e1~e3に入れる答えは,eに関する解答群の中から組合せとして正しいものを選ぶ。
図2は,外部設計を開始した時点から,結合テストを開始して1か月が経過した時点までの,各経過月末時点のEVM指標値をグラフにしたものである。Y君は,このグラフを用いてプロジェクトの現状分析を行うことにした。
結合テスト開始後,空欄bであることがグラフから読み取れる。また,αは空欄cを表し,βは空欄dを表している。
次に,未完了である残作業の作業工数(以下,残作業工数という)を式「e1-e2」で求めた。この残作業工数は,プロジェクト計画時点の見積りに基づいているが,今後の作業は計画どおり進捗するものとして,この残作業工数にe3を加算し,プロジェクトの全ての作業が完了したときの総工数の予測値を見直した。
bに関する解答群
ア 進捗状況とコスト状況のどちらも悪化傾向
イ 進捗状況とコスト状況のどちらも改善傾向
ウ 進捗状況は改善傾向,コスト状況は悪化傾向
エ 進捗状況は悪化傾向,コスト状況は改善傾向
c、dに関する解答群
ア BAC(完了までの総予算)
イ PV(出来高計画値)
ウ EV(出来高実績値)
エ AC(コスト実績値)
オ SV(スケジュール差異)
カ CV(コスト差異)
eに関する解答群
ア e1:BAC,e2:AC,e3:EV
イ e1:BAC,e2:EV,e3:AC
ウ e1:BAC,e2:PV,e3:EV
エ e1:PV,e2:AC,e3:EV
オ e1:PV,e2:BAC,e3:EV
カ e1:PV,e2:EV,e3:AC
- B-ア 進捗状況とコスト状況のどちらも悪化傾向
- B-イ 進捗状況とコスト状況のどちらも改善傾向
- B-ウ 進捗状況は改善傾向,コスト状況は悪化傾向
- B-エ 進捗状況は悪化傾向,コスト状況は改善傾向
- C-ア BAC(完了までの総予算)
- C-イ PV(出来高計画値)
- C-ウ EV(出来高実績値)
- C-エ AC(コスト実績値)
- C-オ SV(スケジュール差異)
- C-カ CV(コスト差異)
- D-ア BAC(完了までの総予算)
- D-イ PV(出来高計画値)
- D-ウ EV(出来高実績値)
- D-エ AC(コスト実績値)
- D-オ SV(スケジュール差異)
- D-カ CV(コスト差異)
- E-ア e1:BAC,e2:AC,e3:EV
- E-イ e1:BAC,e2:EV,e3:AC
- E-ウ e1:BAC,e2:PV,e3:EV
- E-エ e1:PV,e2:AC,e3:EV
- E-オ e1:PV,e2:BAC,e3:EV
- E-カ e1:PV,e2:EV,e3:AC
出典:平成30年度 春期 基本情報技術者試験 午後 問6 設問3
共通の文章
問7 収益の検討に関する次の記述を読んで,設問1~3に答えよ。小規模な部品メーカーであるR社は,部品Tだけを生産して大手機械メーカーに販売している。
表1 収益検討表
表1「収益検討表」。列は「ケース」「X」「Y」。行と値は次のとおり。販売数(千個):X 1,000、Y 1,200。売上高(千円):X 200,000、Y 240,000。変動費(千円):X・Yとも網掛けで表示なし。固定費(千円):X・Yとも網掛けで表示なし。利益(千円):X 16,000、Y 26,000。注記:網掛けの部分は表示していない。
図1 4社の売上高と費用の関係を示したグラフ
図1「4社の売上高と費用の関係を示したグラフ」。横軸は売上高、縦軸は費用で、原点は0。右端では上から実線①、破線②、点線③、一点鎖線④。①の縦軸切片が最も高く、③、②、④の順に低い。②は最も傾きが大きく、④は最も緩やか。実線①と点線③はほぼ平行に見え、傾きの数値は記されていない。破線②は途中で点線③を下から上に横切る。
問問7 設問1
次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。利益計画を策定するために,部品Tの販売数について2通りの検討を行った。表1は,部品Tの販売数を1,000千個見込むケースXと,1,200千個見込むケースYについての収益検討表である。両ケースの,売上高に対する変動費の比率(以下,変動費率という)は等しく,固定費は同額である。表1から,変動費率は[a]%,固定費は[b]千円である。よって,利益が0になる売上高(以下,損益分岐点売上高という)は,[c]千円となる。R社では,販売先から値下げ要求があることを想定して,販売数及び変動費を変えずに販売単価を下げた場合の値下げ率(値下げ額÷値下げ前の販売単価)と利益の計算を行った。利益がマイナスにならない最大の値下げ率は,ケースXでは[d]%であり,ケースYではケースX[e]。
aに関する解答群
ア 25
イ 40
ウ 60
エ 75
オ 80
bに関する解答群
ア 16,000
イ 34,000
ウ 64,000
エ 104,000
オ 134,000
cに関する解答群
ア 45,333
イ 64,000
ウ 85,333
エ 136,000
オ 256,000
dに関する解答群
ア 4
イ 8
ウ 10
エ 12
オ 16
eに関する解答群
ア と変わらない
イ よりも大きい
ウ よりも小さい
- A-ア 25
- A-イ 40
- A-ウ 60
- A-エ 75
- A-オ 80
- B-ア 16,000
- B-イ 34,000
- B-ウ 64,000
- B-エ 104,000
- B-オ 134,000
- C-ア 45,333
- C-イ 64,000
- C-ウ 85,333
- C-エ 136,000
- C-オ 256,000
- D-ア 4
- D-イ 8
- D-ウ 10
- D-エ 12
- D-オ 16
- E-ア と変わらない
- E-イ よりも大きい
- E-ウ よりも小さい
出典:平成30年度 春期 基本情報技術者試験 午後 問7 設問1
問問7 設問2
R社は,変動費と固定費の合計(以下,費用という)と売上高の関係を他の3社と比較して,分析した。その結果,変動費率はR社が他社と比べて最も高いことが分かった。売上高と費用の関係を示したグラフを,図1に示す。図1のグラフ①~④のうち,R社に該当するものを,解答群の中から選べ。
出典:平成30年度 春期 基本情報技術者試験 午後 問7 設問2
問問7 設問3
R社は,変動費率を下げる取組みを開始した。次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。R社は,固定費を変えずに変動費率だけを下げることによって,損益分岐点売上高を[f]こととした。そのために,[g]取組みを開始した。
fに関する解答群
ア 上げる
イ 下げる
ウ 0にする
gに関する解答群
ア 原材料の単価を下げる
イ 社員の給与を上げる
ウ 販売数を増やす
エ 販売単価を下げる
- F-ア 上げる
- F-イ 下げる
- F-ウ 0にする
- G-ア 原材料の単価を下げる
- G-イ 社員の給与を上げる
- G-ウ 販売数を増やす
- G-エ 販売単価を下げる
出典:平成30年度 春期 基本情報技術者試験 午後 問7 設問3
共通の文章
問8「ヒープソート」。ヒープの性質を利用してデータを昇順に整列するアルゴリズムを考える。ヒープは二分木であり、親は一つ又は二つの子をもち、親の値は子の値よりも常に大きいか等しい。本問では、親をもたない節を根と呼び、根は最大の値をもつものとする。子をもつ節では、その子に対する親を呼ぶ。プログラム1では、makeHeapが整数型の1次元配列dataに格納されたhnum個(hnum>0)のデータを規則に従って整数型の1次元配列heapに格納し、配列heapがヒープの性質を満たすようにする。配列の要素番号は0から始まる。配列要素heap[i](i=0, 1, 2, …)は節に対応し、その節が保持する値を格納する。heap[0]は根に対応する。heap[i]の節の左の子はheap[2×i+1]、右の子はheap[2×i+2]に対応する。子が一つの場合は左側の子として扱う。プログラム2のheapSortは、makeHeapで配列heapにデータを格納した後、整列対象領域と整列済みデータ領域に分け、最大値を整列済みデータ領域へ移しながらdownHeapでヒープを再構成し、昇順に整列する。
図1
図1「ヒープの例」。二分木の根は60。根の左の子は30、右の子は45。30の左の子は15、右の子は5。45の左の子は10、右の子は20。根には親がなく、親の値は子の値以上である。
図2
図2「図1のヒープの例に対応した配列heapの内容」。列見出し「要素番号」0、1、2、3、4、5、6に対し、「heap」の値は順に60、30、45、15、5、10、20。矢印は親子関係を表し、要素番号0と1・2、1と3・4、2と5・6がそれぞれ親子関係にある。
関数定義
親子の要素番号を関係付ける関数。lchild(i)は2×i+1を返す。rchild(i)は2×i+2を返す。parent(i)は(i−1)÷2の小数点以下を切り捨てた値を返す。
表1
プログラム1・副プログラムmakeHeapの引数仕様。引数data[]は整数型・入力で、データが格納されている1次元配列。heap[]は整数型・出力で、ヒープの性質を満たすようにデータを格納する1次元配列。hnumは整数型・入力で、データの個数。
表2
プログラム1・副プログラムswapの引数仕様。heap[]は整数型・入力/出力で、交換対象のデータが格納されている1次元配列。i、jは整数型・入力で、交換対象の要素番号。swapは二つの配列要素に格納されている値を交換する。
プログラム1
プログラム1のmakeHeapの処理。整数型変数i、kを用いる。iを0からhnum−1まで1ずつ増やしながら、heap[i]←data[i]、k←iとする。内側でk>0の間、条件aを判定し、条件に応じてswap(heap, k, b)、k←parent(k)、break(内側の繰返し処理から抜ける)を行う。プログラム中の条件と引数bは空欄であり、選択肢は設問1に示す。swapは一時変数tmpを使い、tmp←heap[i]、heap[i]←heap[j]、heap[j]←tmpの順に値を交換する。
プログラム2の説明
プログラム2の説明。heapSortは、最初にmakeHeapを使って配列heapにデータを格納する。配列heapは整列対象領域と整列済みデータ領域に分かれ、lastは整列対象領域の最後の配列要素の要素番号を示す。最初はheap全体が整列対象領域で、lastはhnum−1。整列対象領域がヒープの性質を満たすときheap[0]はその領域の最大値である。heap[0]とheap[last]を交換し、lastを1減らして整列対象領域を狭め、整列済みデータ領域を広げる。交換後にdownHeapで整列対象領域のデータをヒープの性質を満たすように再構成する。これを繰り返して整列済みデータ領域に昇順に整列されたデータを格納する。
図3
図3「配列heapにおける整列対象領域と整列済みデータ領域」。要素番号0からk−1までが整列対象領域、要素番号kがlast、要素番号k+1からhnum−1までが整列済みデータ領域である。
表3
プログラム2・副プログラムheapSortの引数仕様。data[]は整数型・入力で、整列対象のデータが格納されている1次元配列。heap[]は整数型・出力で、整列済みのデータを格納する1次元配列。hnumは整数型・入力で、データの個数。
表4
プログラム2・副プログラムdownHeapの引数仕様。heap[]は整数型・入力/出力で、整列対象のデータを格納する1次元配列。hlastは整数型・入力で、整列対象領域の最後の要素番号。
プログラム2・heapSort
プログラム2のheapSort処理。3行目でmakeHeap(data, heap, hnum)を実行する。4行目の繰返しはlastをhnum−1から始め、last>0の間、−1ずつ減らす。繰返し内で5行目にswap(heap, 0, last)を実行し、heap[0]とheap[last]の値を交換する。6行目にdownHeap(heap, last−1)を実行してheapを再構成する。
プログラム2・downHeap
プログラム2のdownHeap。整数型変数n、tmpを用いる。3行目でn←0。4行目のlchild(n)≦hlastの間、5行目でtmp←lchild(n)。6行目でrchild(n)≦hlastなら、7行目でheap[tmp]≦heap[rchild(n)]を比較し、真なら8行目でtmp←rchild(n)。11行目でheap[tmp]>heap[n]なら12行目でswap(heap, n, tmp)。それ以外は13行目のreturnで抜ける。交換した場合は15行目でn←tmpとして繰り返す。
プログラム2の動作
プログラム2の動作の説明。heapSortの3行目の実行直後、配列heapの内容は図2のとおりである。4~7行目の1回目の繰返しで、5行目のswap実行直後のheap[0]の値を空欄cに入れる。このため、要素番号0からhnum−2までのデータは、根に対応するheap[0]が最大値であるというヒープの性質を満たさなくなる。6行目で呼び出すdownHeapは、要素番号0からhlastまでの領域をヒープの性質を満たすように再構成する。downHeapでは、子の要素番号をnとし、最初にn←0とする。左の子の要素番号をtmpに代入し、右の子が存在する場合(rchild(n)≦hlast)、右の子の値が左の子の値について空欄dの条件を満たすとき、右の子の要素番号をtmpに代入する。heap[tmp]の値とheap[n]の値を比較し、heap[tmp]の値が大きければ交換し、tmpを次のnとして戻る。downHeapの15行目で最初にnに代入するtmpの値を空欄eに入れる。
問問8 設問1
プログラム1中の空欄に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア heap[k] > heap[lchild(k)]
イ heap[k] > heap[parent(k)]
ウ heap[k] > heap[rchild(k)]
エ heap[k] < heap[lchild(k)]
オ heap[k] < heap[parent(k)]
カ heap[k] < heap[rchild(k)]
bに関する解答群
ア heap[hnum−1]
イ heap[k]
ウ parent(hnum−1)
エ parent(k)
- A-ア heap[k] > heap[lchild(k)]
- A-イ heap[k] > heap[parent(k)]
- A-ウ heap[k] > heap[rchild(k)]
- A-エ heap[k] < heap[lchild(k)]
- A-オ heap[k] < heap[parent(k)]
- A-カ heap[k] < heap[rchild(k)]
- B-ア heap[hnum−1]
- B-イ heap[k]
- B-ウ parent(hnum−1)
- B-エ parent(k)
出典:平成30年度 春期 基本情報技術者試験 午後 問8 設問1
問問8 設問2
「プログラム2の動作」の記述中の空欄に入れる正しい答えを、解答群の中から選べ。
cに関する解答群
ア 5
イ 10
ウ 15
エ 20
dに関する解答群
ア 以下のときには
イ 以上のときには
ウ よりも大きいときには
エ よりも小さいときには
eに関する解答群
ア 1
イ 2
ウ 3
エ 4
オ 5
カ 6
- C-ア 5
- C-イ 10
- C-ウ 15
- C-エ 20
- D-ア 以下のときには
- D-イ 以上のときには
- D-ウ よりも大きいときには
- D-エ よりも小さいときには
- E-ア 1
- E-イ 2
- E-ウ 3
- E-エ 4
- E-オ 5
- E-カ 6
出典:平成30年度 春期 基本情報技術者試験 午後 問8 設問2
共通の文章
問9 次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
簡易集計プログラムである。このプログラムを用いると,例えば,図1の入力ファイルから,品番ごとのレコード件数と金額の合計を求めて,図2の集計ファイルを得ることができる。
プログラムは,キー項目及び数値項目の,開始桁位置及び桁数を引数で受け取り,キー項目で整列済みのレコードを入力ファイルから読み込み,キー項目の値ごとに,その件数と数値項目の値の合計を求め,集計ファイルにレコードとして書き出す。ここで,数値項目には整数の値が入る。
図1 入力ファイルのレコード例
図1 入力ファイルのレコード例。列は「年月日」「時分秒」「品番」「数量」「金額」。破線は項目の区切りを表す。
20180410;112610;FE-111;0001;000100
20180410;154358;FE-111;0001;000100
20180410;123820;FE-222;0002;000400
20180410;153249;FE-333;0001;000300
20180410;153044;FE-333;0001;000300
20180410;152859;FE-333;0001;000300
20180410;131923;FE-444;0002;000800
20180410;123907;FE-444;0001;000400
注記:見出しの行はレコードに含まれない。改行文字は表示していない。
図2 集計ファイルのレコード例
図2 集計ファイルのレコード例。列は「品番」「件数」「合計金額」。
FE-111 2 200
FE-222 1 400
FE-333 3 900
FE-444 2 1200
注記:見出しの行はレコードに含まれない。改行文字は表示していない。
プログラム1の説明
プログラム1の説明:
(1) 入力ファイルは固定長レコードの並びから成る。レコードは1,000文字以下の1バイト文字の並びであり,最後の文字の後には改行文字が付いている。ファイル名は引数 dataFile で指定する。
(2) レコード中のキー項目の開始桁位置及び桁数は,それぞれ引数 keyPos 及び keyLen で指定する。また,数値項目の開始桁位置及び桁数は,それぞれ引数 valuePos 及び valueLen で指定する。開始桁位置はレコードの先頭文字の桁位置を0として数える。キー項目及び数値項目の桁数はいずれも9桁以下とする。
(3) 入力レコードは,キー項目の昇順に整列されている。
(4) 集計ファイルにレコードとして,キー項目の値,キー項目ごとの件数及び数値項目の値の合計を各9桁分の領域に右詰めで出力し,各項目の直前に1個の空白文字を出力する。レコードの最後の文字の後には改行文字を付ける。ファイル名は引数 listFile で指定する。
(5) 引数及び入力レコードの内容に誤りはないものとする。また,数値項目の値の合計は9桁以下であり,算術演算であふれは起きないものとする。
(6) 使用しているライブラリ関数の概要:atol(s) は文字列 s が表す数値を long 型の表現に変換した値を返す。fgets(s,m,f) はストリーム f から改行文字まで(最大 m−1 文字)読み取り,配列 s に格納して s を返す。ストリームの終わりに達した場合は NULL を返す。strcmp(s1,s2) は文字列を比較し,s1<s2 なら負,s1=s2 なら0,s1>s2 なら正の値を返す。strcpy(s1,s2) は文字列 s2 を文字列 s1 に複写する。strncpy(s1,s2,n) は文字列 s2 の先頭から n 個の文字を文字列 s1 に複写し,文字列 s1 の値を返す。
プログラム1
プログラム1(空欄 a,b,c は原文のまま):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define recSize 1002 /* 入力レコードの最大文字数 + 2('\n', '\0') */
void outList(char *dataFile, char *listFile,
int keyPos, int keyLen, int valuePos, int valueLen) {
[a] *inFile, *outFile;
char inBuf[recSize], inKey[10], key[10], temp[10];
long count, inValue, value;
char format[] = " %9s %9ld %9ld\n";
key[keyLen] = '\0';
inKey[keyLen] = '\0';
temp[valueLen] = '\0';
outFile = fopen(listFile, "w");
inFile = fopen(dataFile, "r");
if (fgets(inBuf, recSize, inFile) != NULL) {
strncpy(key, inBuf + keyPos, keyLen);
count = 1;
value = atol(strncpy(temp, inBuf + valuePos, valueLen));
while (fgets(inBuf, recSize, inFile) != NULL) {
strncpy(inKey, inBuf + keyPos, keyLen);
inValue = atol(strncpy(temp, inBuf + valuePos, valueLen));
if (strcmp(key, inKey) != 0) {
fprintf(outFile, format, key, count, value);
count = 1;
strcpy(key, inKey);
value = inValue;
}
else {
[b]
}
}
[c]
}
fclose(inFile);
fclose(outFile);
}
図3 入力ファイルのレコード例
図3 入力ファイルのレコード例。列は「年月日」「時分秒」「品番」「数量」「金額」。破線は項目の区切りを表す。
20180410;11;2610;FE-111;0001;000100
20180410;12;3820;FE-222;0002;000400
20180410;12;3907;FE-444;0001;000400
20180410;13;1923;FE-444;0002;000800
20180410;13;5044;FE-333;0001;000300
20180410;13;2859;FE-333;0001;000300
20180410;15;3249;FE-333;0001;000300
20180410;15;4358;FE-111;0001;000100
注記:見出しの行はレコードに含まれない。改行文字は表示していない。
設問2の処理説明と図4・図5
設問2に関する処理の説明:図3のように,時分秒のうちの時をキー項目として昇順に整列済みのレコードを入力ファイルから読み込み,時間帯(0時台,1時台,…,23時台)ごとの件数と金額の合計(合計金額)を求め,時,件数,合計金額を表す棒グラフを印字する。処理は次の手順で行う。
(1) プログラム1を利用して,図3の入力ファイルから図4の集計ファイルを得る。
(2) プログラム2を利用して,図4の集計ファイルから図5の印字結果を得る。
図4 集計ファイルのレコード例。列は「時」「件数」「合計金額」。
11 1 100
12 2 800
13 2 1100
15 3 700
注記:見出しの行はレコードに含まれない。改行文字は表示していない。
図5 印字結果の例。列は「時」「件数」「合計金額」。各レコードに続けて棒グラフを印字する。
11 1 100 |**
12 2 800 |******************
13 2 1100 |*************************
15 3 700 |***************
注記:見出しの行は印字結果に含まれない。
プログラム2の説明
プログラム2の説明:
(1) プログラム1で書き出した集計ファイルからレコードを読み込む。ファイル名は引数 listFile で指定する。
(2) 読み込んだ各レコードに,そのレコードの合計金額の値 value に応じた長さのグラフを追加して印字する。集計ファイル中の合計金額の値の最大値 valueMax を25個の「*」で表し,他の値は 25 × value ÷ valueMax 個(小数点以下切捨て)の「*」で表す。ここで,集計ファイル中の合計金額の値の最大値は正であり,最小値は0以上であるものとする。
プログラム2
プログラム2(空欄 a は原文のまま):
#include <stdio.h>
#include <stdlib.h>
#define listLen 32 /* 入力レコードの最大文字数 + 2('\n', '\0') */
void outListG(char *listFile) {
[a] *inFile;
char inBuf[listLen];
long value, valueMax;
char graph[] = "*************************";
inFile = fopen(listFile, "r");
valueMax = 0;
while (fgets(inBuf, listLen, inFile) != NULL) {
value = atol(inBuf + 21);
if (value > valueMax) {
valueMax = value;
}
}
fclose(inFile);
inFile = fopen(listFile, "r");
while (fgets(inBuf, listLen, inFile) != NULL) {
value = atol(inBuf + 21);
printf("%.30s |%s\n",
inBuf, &graph[25 - 25 * value / valueMax]); /* α */
/* %.30s はレコードの先頭からの30桁(\nの直前まで)を出力する */
}
fclose(inFile);
}
設問2の発問と表1の説明
設問2の説明文:次の記述中の空欄に入れる適切な答えを,解答群の中から選べ。ここで,プログラム2中の空欄aには,設問1の正しい答えが入っているものとする。
図4の集計ファイルを用いると図5の印字結果が得られるが,集計ファイル中の合計金額の値によっては,コメント /* α */ を付した印字処理の実行時に問題が発生する場合がある。
「集計ファイル中の合計金額の値の最大値は正であり,最小値は0以上である」が満たされない場合も考慮に含め,コメント /* α */ を付した印字処理の実行時に発生し得る事象として,①算術演算であふれが発生,②算術演算でゼロ除算が発生,③配列の定義外の要素位置を参照,がある。これらの事象が発生し得る value と valueMax の値の例を表1にまとめる。long型の数値の範囲は −2^31 ~ 2^31−1(2^31 = 2,147,483,648)とする。
表1 事象と例の対応表
表1 事象①〜③が発生し得る value と valueMax の値の例。列は「発生し得る事象」「valueの値とvalueMaxの値の例」。
① 算術演算であふれ
② 算術演算でゼロ除算
③ 配列の定義外の要素位置を参照
問問9 設問1
プログラム1中の空欄に入れる適切な答えを,解答群の中から選べ。
aに関する解答群
ア char
イ FILE
ウ file
エ int
b、cに関する解答群
ア fprintf(outFile, format, inKey, count, inValue);
イ fprintf(outFile, format, key, count, value);
ウ count++; value += inValue;
エ count++; value += inValue; fprintf(outFile, format, key, count, value);
オ count--; fprintf(outFile, format, inKey, count, inValue);
- A-ア char
- A-イ FILE
- A-ウ file
- A-エ int
- B-ア fprintf(outFile, format, inKey, count, inValue);
- B-イ fprintf(outFile, format, key, count, value);
- B-ウ count++; value += inValue;
- B-エ count++; value += inValue; fprintf(outFile, format, key, count, value);
- B-オ count--; fprintf(outFile, format, inKey, count, inValue);
- C-ア fprintf(outFile, format, inKey, count, inValue);
- C-イ fprintf(outFile, format, key, count, value);
- C-ウ count++; value += inValue;
- C-エ count++; value += inValue; fprintf(outFile, format, key, count, value);
- C-オ count--; fprintf(outFile, format, inKey, count, inValue);
出典:平成30年度 春期 基本情報技術者試験 午後 問9 設問1
問問9 設問2
コメント /* α */ を付した印字処理の実行時に発生し得る事象について,表1の空欄に入れるvalueとvalueMaxの値の例を解答群の中から選べ。
d、e、fに関する解答群
ア value = −1,000,000,valueMax = 0
イ value = −10,000,000,valueMax = 10,000,000
ウ value = 0,valueMax = 10,000,000
エ value = 100,valueMax = 10,000,000
オ value = 10,000,000,valueMax = 10,000,000
カ value = 100,000,000,valueMax = 100,000,000
- D-ア value = −1,000,000,valueMax = 0
- D-イ value = −10,000,000,valueMax = 10,000,000
- D-ウ value = 0,valueMax = 10,000,000
- D-エ value = 100,valueMax = 10,000,000
- D-オ value = 10,000,000,valueMax = 10,000,000
- D-カ value = 100,000,000,valueMax = 100,000,000
- E-ア value = −1,000,000,valueMax = 0
- E-イ value = −10,000,000,valueMax = 10,000,000
- E-ウ value = 0,valueMax = 10,000,000
- E-エ value = 100,valueMax = 10,000,000
- E-オ value = 10,000,000,valueMax = 10,000,000
- E-カ value = 100,000,000,valueMax = 100,000,000
- F-ア value = −1,000,000,valueMax = 0
- F-イ value = −10,000,000,valueMax = 10,000,000
- F-ウ value = 0,valueMax = 10,000,000
- F-エ value = 100,valueMax = 10,000,000
- F-オ value = 10,000,000,valueMax = 10,000,000
- F-カ value = 100,000,000,valueMax = 100,000,000
出典:平成30年度 春期 基本情報技術者試験 午後 問9 設問2
共通の文章
問10 次のCOBOLプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
【プログラムの説明】Web上でショッピングサイトを運営しているP社では,注文を受けて入金確認の処理を待っている商品の注文情報を注文ファイルに格納し,前日に入金された情報を入金ファイルに格納する。P社では毎朝10時に入金確認の処理を実行し,注文ファイルの情報と入金ファイルの情報を突き合わせて結果リストを印字する。このとき,入金が確認できなかった商品の注文情報は,出荷待ちファイルに格納する。前処理として,注文ファイルには,前日にプログラムを実行した際に出力された出荷待ちファイルの情報と,前日に受けた商品の注文情報を格納しておく。
このショッピングサイトでは,代金の支払方法として,銀行振込,コンビニ払い,クレジットカード払い(以下,カード払いという),商品着払い(以下,着払いという)のいずれかを注文時に選択できる。注文時に選択した支払方法と入金方法が異なることはない。銀行振込及びコンビニ払いによる入金の情報が入金ファイルに格納され,入金が確認できた注文を出荷対象とする。支払方法にカード払い又は着払いが選択された場合は,注文を受けた翌日に出荷する。
図1 注文ファイルのレコード様式・属性
図1 注文ファイルのレコード様式(順ファイル)。項目と桁数は,注文番号8桁,注文日時14桁,請求金額7桁,支払種別1桁。注文番号は注文ごとに一意で,99999999が割り振られることはない。注文日時は西暦の年,月,日と24時間表記の時,分,秒で,それぞれ4桁,2桁,2桁,2桁,2桁,2桁。請求金額は正の整数。支払種別は銀行振込,コンビニ払い,カード払い,着払いにそれぞれ対応する値1,2,3,4。レコードは注文番号の昇順に整列されている。
図2 入金ファイルのレコード様式・属性
図2 入金ファイルのレコード様式(順ファイル)。項目と桁数は,注文番号8桁,入金日時14桁,入金金額7桁,入金種別1桁。注文番号には入金が確認できた注文の注文番号が設定されている。入金日時は西暦の年,月,日と24時間表記の時,分,秒で,それぞれ4桁,2桁,2桁,2桁,2桁,2桁。入金金額は正の整数。入金種別は銀行振込,コンビニ払いにそれぞれ対応する値1,2。レコードは注文番号の昇順に整列されている。同じ注文番号のレコードが複数格納されることはない。
図3 出荷待ちファイルのレコード様式
図3 出荷待ちファイルのレコード様式(順ファイル)。支払方法に銀行振込又はコンビニ払いが選択された注文のうち,入金を確認できなかった商品の注文情報が格納される。各項目の内容は注文ファイルのレコード様式と同じ。
図4 結果リストの印字様式
図4 結果リストの印字様式。見出しは印刷済みとする。列は注文番号(例:99999999),結果(例:XX),請求金額(例:Z,ZZZ,ZZ9),入金金額(例:Z,ZZZ,ZZ9),差額(例:--,---,--9)。
表1 結果欄に印字するコードと意味・印字条件
結果リストには,出荷する注文と,エラーと判定した注文の情報を印字する。結果欄に印字するコードと意味:00=出荷対象(請求金額と入金金額が一致した,又は支払方法がカード払い,着払いのいずれか);10=エラー(入金ファイルの注文番号に対応する注文がなかった);20=エラー(請求金額と入金金額が一致しなかった)。差額欄には入金金額から請求金額を減算した金額を印字する。結果欄のコードが10の場合は,請求金額欄と差額欄には,0を印字する。支払方法がカード払い,着払いのいずれかであった場合は,入金金額欄と差額欄には,0を印字する。判定がエラーの場合は,出荷待ちファイルに情報は出力せず,個別に対処する。
プログラム データ定義
プログラムのデータ定義:ORD-FILE,RCP-FILE,WAT-FILEの各レコードはPIC X(30)。PRT-FILEのレコードPRT-RECは,PRT-NO PIC 9(8),続いてPIC X(4),PRT-RSLT PIC X(2),続いてPIC X(6),PRT-ORD PIC Z,ZZZ,ZZ9,続いてPIC X(4),PRT-RCP PIC Z,ZZZ,ZZ9,続いてPIC X(4),PRT-DIFF PIC --,---,--9。作業領域ORD-DATAは,ORD-NO PIC 9(8),ORD-EOF VALUE 99999999,ORD-DT(ORD-DATE PIC 9(8),ORD-TIME PIC 9(6)),ORD-AMNT PIC 9(7),ORD-CODE PIC 9(1)。RCP-DATAは,RCP-NO PIC 9(8),RCP-EOF VALUE 99999999,RCP-DT(RCP-DATE PIC 9(8),RCP-TIME PIC 9(6)),RCP-AMNT PIC 9(7),RCP-CODE PIC 9(1)。
プログラム 処理本文
プログラム本文(空欄a~dは原本どおり未補完)。
OPEN INPUT ORD-FILE RCP-FILE
OUTPUT WAT-FILE PRT-FILE.
INITIALIZE ORD-DATA RCP-DATA.
PERFORM ORD-PROC.
PERFORM RCP-PROC.
MOVE SPACE TO PRT-REC.
PERFORM UNTIL [a]
INITIALIZE PRT-REC
MOVE ORD-NO TO PRT-NO
EVALUATE TRUE
WHEN ORD-NO < RCP-NO
IF [b] THEN
MOVE "00" TO PRT-RSLT
ELSE
WRITE WAT-REC FROM ORD-DATA
END-IF
MOVE ORD-AMNT TO PRT-ORD
PERFORM ORD-PROC
WHEN ORD-NO = RCP-NO
IF [c] THEN
MOVE "00" TO PRT-RSLT
ELSE
MOVE "20" TO PRT-RSLT
COMPUTE PRT-DIFF = RCP-AMNT - ORD-AMNT
END-IF
MOVE ORD-AMNT TO PRT-ORD
MOVE RCP-AMNT TO PRT-RCP
PERFORM ORD-PROC
PERFORM RCP-PROC
WHEN ORD-NO > RCP-NO
MOVE "10" TO PRT-RSLT
MOVE RCP-AMNT TO PRT-RCP
MOVE RCP-NO TO PRT-NO
PERFORM RCP-PROC
END-EVALUATE
IF PRT-RSLT NOT = SPACE THEN
[d]
END-IF
END-PERFORM.
CLOSE ORD-FILE RCP-FILE WAT-FILE PRT-FILE.
STOP RUN.
ORD-PROC.
IF NOT ORD-EOF THEN
READ ORD-FILE INTO ORD-DATA AT END SET ORD-EOF TO TRUE
END-READ
END-IF.
RCP-PROC.
IF NOT RCP-EOF THEN
READ RCP-FILE INTO RCP-DATA AT END SET RCP-EOF TO TRUE
END-READ
END-IF.
設問1 解答群
設問1の解答群。空欄aの選択肢:ア ORD-EOF;イ ORD-EOF AND RCP-EOF;ウ ORD-EOF OR RCP-EOF;エ RCP-EOF。空欄b,cに共通の選択肢:ア ORD-AMNT = RCP-AMNT;イ ORD-AMNT = ZERO;ウ ORD-AMNT NOT = RCP-AMNT;エ ORD-CODE = 1 OR 2;オ ORD-CODE = 3 OR 4;カ ORD-CODE = RCP-CODE。空欄dの選択肢:ア ADD 1 TO PRT-NO;イ MOVE SPACE TO PRT-REC;ウ SET ORD-EOF RCP-EOF TO TRUE;エ WRITE PRT-REC。
表2 プログラムの変更内容
設問2の表2「プログラムの変更内容」。行番号36と37の間に追加:01 CR-DATE-X./02 CR-DATE PIC 9(8)./77 W-CNT PIC 9(3)。行番号38と39の間に追加:MOVE FUNCTION CURRENT-DATE TO CR-DATE-X. 注記:プログラムを実行した日付が,YYYYMMDD形式でCR-DATE-Xに格納される。空欄eの位置に追加する処理:COMPUTE W-CNT = FUNCTION INTEGER-OF-DATE(CR-DATE) - FUNCTION INTEGER-OF-DATE(ORD-DATE)/IF [f] THEN/DISPLAY ORD-NO/END-IF。
設問2 解答群
設問2のeに関する解答群:ア 行番号51と52の間;イ 行番号53と54の間;ウ 行番号65と66の間;エ 行番号71と72の間。fに関する解答群:ア W-CNT < 7;イ W-CNT = 7;ウ W-CNT > 7;エ W-CNT NOT = 7。
問問10 設問1
プログラム中の空欄に入れる正しい答えを,解答群の中から選べ。
aに関する解答群
ア ORD-EOF
イ ORD-EOF AND RCP-EOF
ウ ORD-EOF OR RCP-EOF
エ RCP-EOF
b、cに関する解答群
ア ORD-AMNT = RCP-AMNT
イ ORD-AMNT = ZERO
ウ ORD-AMNT NOT = RCP-AMNT
エ ORD-CODE = 1 OR 2
オ ORD-CODE = 3 OR 4
カ ORD-CODE = RCP-CODE
dに関する解答群
ア ADD 1 TO PRT-NO
イ MOVE SPACE TO PRT-REC
ウ SET ORD-EOF RCP-EOF TO TRUE
エ WRITE PRT-REC
- A-ア ORD-EOF
- A-イ ORD-EOF AND RCP-EOF
- A-ウ ORD-EOF OR RCP-EOF
- A-エ RCP-EOF
- B-ア ORD-AMNT = RCP-AMNT
- B-イ ORD-AMNT = ZERO
- B-ウ ORD-AMNT NOT = RCP-AMNT
- B-エ ORD-CODE = 1 OR 2
- B-オ ORD-CODE = 3 OR 4
- B-カ ORD-CODE = RCP-CODE
- C-ア ORD-AMNT = RCP-AMNT
- C-イ ORD-AMNT = ZERO
- C-ウ ORD-AMNT NOT = RCP-AMNT
- C-エ ORD-CODE = 1 OR 2
- C-オ ORD-CODE = 3 OR 4
- C-カ ORD-CODE = RCP-CODE
- D-ア ADD 1 TO PRT-NO
- D-イ MOVE SPACE TO PRT-REC
- D-ウ SET ORD-EOF RCP-EOF TO TRUE
- D-エ WRITE PRT-REC
出典:平成30年度 春期 基本情報技術者試験 午後 問10 設問1
問問10 設問2
支払方法に銀行振込又はコンビニ払いが選択された注文のうち,注文日の翌日を1日目として,7日を過ぎて入金が確認できなかった注文の注文番号を表示するようにプログラムを変更する。表2中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,組込み関数INTEGER-OF-DATEは,引数に指定されたYYYYMMDD形式の日付を西暦1601年1月1日からの通算の日数に変換して返す。
eに関する解答群
ア 行番号51と52の間
イ 行番号53と54の間
ウ 行番号65と66の間
エ 行番号71と72の間
fに関する解答群
ア W-CNT < 7
イ W-CNT = 7
ウ W-CNT > 7
エ W-CNT NOT = 7
- E-ア 行番号51と52の間
- E-イ 行番号53と54の間
- E-ウ 行番号65と66の間
- E-エ 行番号71と72の間
- F-ア W-CNT < 7
- F-イ W-CNT = 7
- F-ウ W-CNT > 7
- F-エ W-CNT NOT = 7
出典:平成30年度 春期 基本情報技術者試験 午後 問10 設問2
共通の文章
問11 次のJavaプログラムの説明及びプログラムを読んで,設問1~4に答えよ。
【プログラムの説明】
A君は,先輩エンジニアであるBさんの指導の下で,表現式(以下,式という)を構築するためのライブラリの作成を進めている。ライブラリはAPIを提供する。
まず,次のインタフェース及びクラスをパッケージ com.example.expr に作成した。
プログラムの説明(Expression,Constant,Addition)
(1)インタフェース Expression は,式を表す。すなわち,Expression を実装するクラスは,型としての式を表す。
① メソッド evaluate は,式を評価した結果を型 int で返す。
(2)クラス Constant は,定数を式(型 Expression)として表す。
① コンストラクタは,引数で与えられた型 int の値を表す定数を生成する。
② メソッド evaluate は,この定数の値を返す。
③ メソッド toString は,この定数の値を文字列として返す。
(3)クラス Addition は,加算を式(型 Expression)として表す。
① コンストラクタは,加算式を生成する。加算式 a + b において,演算子 + の左側 a の部分を左側の式,右側 b の部分を右側の式とし,それぞれ引数 left 及び引数 right で指定する。いずれかの引数が null のときは,NullPointerException を投げる。
② メソッド evaluate は,左側の式を評価した値に右側の式を評価した値を加え,その値を返す。
③ メソッド toString は,この加算式を表す文字列を返す。
プログラム1
プログラム1:package com.example.expr;
public interface Expression {
public int evaluate();
}
プログラム2
プログラム2:package com.example.expr;
public class Constant implements Expression {
private final int value;
public Constant(int value) {
this.value = value;
}
public int evaluate() { return value; }
public String toString() { return String.valueOf(value); }
}
プログラム3
プログラム3:package com.example.expr;
public class Addition implements Expression {
private final Expression left, right;
public Addition(Expression left, Expression right) {
if (left == null || right == null) {
throw new NullPointerException();
}
this.left = left;
this.right = right;
}
public int evaluate() {
return left.evaluate() + right.evaluate();
}
public String toString() {
return String.format("(%s + %s)", left, right);
}
}
図1・プログラム4
図1 メソッド main の出力結果:(2 + 5)= 7
プログラム4:package com.example.test;
import □a□.Addition;
import □a□.Constant;
import □a□.Expression;
public class Test {
public static void main(String[] args) {
Expression two = new Constant(2);
Expression five = new Constant(5);
Expression add = new Addition(□b□);
System.out.println(□c□ + " = " + □d□);
/* α */
}
}
設問2に関する説明
Bさんからの助言:『乗除算などの式を実装するクラスを追加する前に,上位クラスを導入して二項演算を表すクラスを簡単に実装できるようにすべきである。また,アプリケーションが必要とする全ての二項演算をライブラリで用意するのは一般に難しいので,パッケージ外でも二項演算がそのクラスの下位クラスとして簡単に実装できるようにすべきである。』
(1)抽象クラス BinaryOperatorExpression は,二項演算子を使用する式(以下,二項演算式という)を表す。
① コンストラクタは,二項演算式を生成する。二項演算式 a OP b において,二項演算子 OP の左側 a の部分を左側の式,右側 b の部分を右側の式とし,それぞれ引数 left 及び引数 right で指定する。いずれかの引数が null のときは,NullPointerException を投げる。
② メソッド getLeft 及び getRight は,それぞれ左側の式及び右側の式を返す。
③ 抽象メソッド getOperator は,この二項演算式の演算子を文字列で返す。
④ メソッド toString は,この二項演算式を表す文字列を返す。
このクラスをBさんに見てもらったところ,『ライブラリで用意されたAPIを呼び出すアプリケーションで二項演算式を表すクラスの実装に使えるようにすることが目的なので,□にするために,コンストラクタとメソッド getLeft,getRight 及び getOperator は public ではなく protected にすべきである』という指摘を受け,その修正をしてプログラム5を作成した。
プログラム5
プログラム5:package com.example.expr;
public abstract class BinaryOperatorExpression implements Expression {
private final Expression left, right;
protected BinaryOperatorExpression(Expression left, Expression right) {
if (left == null || right == null) {
throw new NullPointerException();
}
this.left = left;
this.right = right;
}
protected Expression getLeft() {
return left;
}
protected Expression getRight() {
return right;
}
protected abstract String getOperator();
public String toString() {
return String.format("(%s %s %s)",
getLeft(), getOperator(), getRight());
}
}
プログラム6・図2
プログラム6は,ライブラリのパッケージ外で二項演算式を実装するテストとして,減算式を表すクラス Subtraction を実装したものである。
プログラム6:package com.example.test;
import □a□.BinaryOperatorExpression;
import □a□.Expression;
public class Subtraction extends BinaryOperatorExpression {
public Subtraction(Expression left, Expression right) {
super(left, right);
}
public int evaluate() {
return getLeft().evaluate() - getRight().evaluate();
}
public String getOperator() {
return "-";
}
}
プログラム6をテストするために,プログラム4のメソッド main の /* α */ の行を図2に示す行に置き換えて実行したところ,図1に示した出力結果に加え,出力結果「□」を得た。
図2 メソッド main の /* α */ の行を置き換える行:
System.out.println(new Subtraction(add, new Subtraction(two, five)));
問問11 設問1
A君は,クラス Constant 及び Addition をAPIとして呼び出すテストをするために,クラス Test をパッケージ com.example.test に作成して実行したところ,図1の出力結果を得た。プログラム4中の[空欄]に入れる正しい答えを,解答群の中から選べ。
aに関する解答群
ア com.example.expr
イ com.example.test
ウ static com.example.expr
エ static com.example.test
bに関する解答群
ア 2, 5
イ 5, 2
ウ five
エ five, two
オ two
カ two, five
c、dに関する解答群
ア add
イ add.evaluate()
ウ five
エ five.evaluate()
オ two
カ two + five
キ two.evaluate()
- A-ア com.example.expr
- A-イ com.example.test
- A-ウ static com.example.expr
- A-エ static com.example.test
- B-ア 2, 5
- B-イ 5, 2
- B-ウ five
- B-エ five, two
- B-オ two
- B-カ two, five
- C-ア add
- C-イ add.evaluate()
- C-ウ five
- C-エ five.evaluate()
- C-オ two
- C-カ two + five
- C-キ two.evaluate()
- D-ア add
- D-イ add.evaluate()
- D-ウ five
- D-エ five.evaluate()
- D-オ two
- D-カ two + five
- D-キ two.evaluate()
出典:平成30年度 春期 基本情報技術者試験 午後 問11 設問1
問問11 設問2
次の記述中の[空欄]に入れる正しい答えを,解答群の中から選べ。A君は,これまでに作成したプログラムをBさんに見てもらったところ,次のアドバイスを受けた。ライブラリに抽象クラス BinaryOperatorExpression を追加した後,Bさんからの指摘を受けてプログラム5を作成した。材料「設問2に関する説明」の記述中の[空欄]に入る正しい答えを選べ。
- ア 下位クラスを実装するクラスだけで使える
- イ 上位クラスの実装が下位クラスで改変されない
- ウ 通常のアプリケーションがどのパッケージからでも呼び出せる
- エ パッケージ com.example.expr 内の下位クラスだけで使える
出典:平成30年度 春期 基本情報技術者試験 午後 問11 設問2
問問11 設問3
次の記述中の[空欄]に入れる正しい答えを,解答群の中から選べ。ここで,プログラム6中の[a]には,設問1の正しい答えが入っているものとする。プログラム6をテストするため,プログラム4のメソッド main の /* α */ の行を図2に示す行に置き換えて実行したところ,図1に示した出力結果に加え,出力結果「[空欄]」を得た。
- ア ((2 + 5) - (2 - 5))
- イ ((7) - (-3))
- ウ (2 + 5 - 2 - 5)
- エ (2 + 5) - (2 - 5)
- オ 0
- カ 10
出典:平成30年度 春期 基本情報技術者試験 午後 問11 設問3
問問11 設問4
次の記述中の[空欄]に入れる正しい答えを,解答群の中から選べ。Bさんから,更に次の指摘を受けた。『オブジェクトの等価についての考慮も必要である。例えば,[空欄]を評価すると,二つのインスタンスが表す値が等しいので true になるべきだが,今のクラス Constant の実装では false になる。』
- ア new Constant(9) == new Constant(9)
- イ new Constant(9).equals(new Constant(9))
- ウ new Constant(9).evaluate() == new Constant(9).evaluate()
- エ new Constant(9).evaluate().equals(new Constant(9).evaluate())
出典:平成30年度 春期 基本情報技術者試験 午後 問11 設問4
共通の文章
問12 次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。
【プログラム1の説明】0~65534の整数を表す数字から成る文字列(以下,数字列という)を数値に変換する副プログラムDTOBである。文字列は,DC命令の文字定数と同じ形式で主記憶に格納される。図1に,数字列567を格納した例を示す。主プログラムは,数字列が格納されている領域の先頭アドレスをGR1に,数字列の長さをGR2に設定してDTOBを呼ぶ。DTOBは,数値に変換して得た値をGR0に格納して呼出し元に戻る。副プログラムDTOBから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
【プログラム2の説明】文字列は,一つ以上の空白文字で区切られた任意の個数の数字列を含み,最後はピリオドで終わる。最後の数字列とピリオドの間,又は文字列の先頭に一つ以上の空白文字があってもよい。図2に文字列の例を示す。管理テーブルには,文字列中に数字列が現れるごとに,順に1語から成る要素を追加し,数字列を数値に変換して得た値を格納する。数字列の探索が終了したとき,管理テーブルの最後に1語から成る要素を追加し,数値の終わりを示す印として−1を格納する。図2の文字列をGETWDで処理して得た管理テーブルを図3に示す。主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に,管理テーブルの先頭アドレスをGR2に設定してGETWDを呼ぶ。副プログラムGETWDから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
【プログラム3の説明】MULTは,数字列を二つだけ含む,【プログラム2の説明】(1)で示した形式の文字列について,最初の数字列に対応する数値を被乗数とし,2番目の数字列に対応する数値を乗数として乗算を行う。乗算においてあふれは発生しないものとする。主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に設定してMULTを呼ぶ。MULTは,演算結果をGR0に格納して呼出し元に戻る。副プログラムMULTから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
図1
図1「数字列の格納例」。文字列「567」は3語で格納される。第1語=#0035,第2語=#0036,第3語=#0037。
図2
図2「文字列の例」。枠内の文字列は「△△1234△56789△△△9876△。」(△は空白文字を表す)。注記:空白文字は「△」と表記する。
図3
図3「GETWDで処理して得た管理テーブル」。4語の内容は順に1234,56789,9876,−1。注記:数値は10進数で表記している。
プログラム1
プログラム1(DTOB)。空欄aは空欄のまま。
DTOB START
RPUSH
ADDL GR2,GR1
LAD GR0,0 ; 戻り値の初期化
LP CPL GR1,GR2 ; 変換終了か?
JZE FIN
LD GR4,0,GR1 ; 数字1文字の取出し
SUBL GR4,='0' ; 1桁を数値に変換
SLL GR0,1 ; GR0を10倍してGR4を加算
LD GR5,GR0
[a]
ADDL GR0,GR5
ADDL GR0,GR4
LAD GR1,1,GR1
JUMP LP
FIN RPOP
RET
END
プログラム2
プログラム2(GETWD)。空欄b,c,dは空欄のまま。
GETWD START
RPUSH
LD GR6,GR1
LD GR7,GR2
LD GR3,=-1 ; 数字列の処理状態フラグの初期化
LAD GR6,-1,GR6
LP LAD GR6,1,GR6
LD GR4,0,GR6 ; 1文字の取出し
CPL GR4,='.'
JZE FIN
CPL GR4,=' '
[b]
CALL SETWD
JUMP LP
NUM LD GR3,GR3 ; 数字列の処理中か?
JZE LP
LD GR3,=0 ; 次の数字列の処理開始
LD GR1,GR6 ; 数字列の先頭アドレスを退避
JUMP LP
FIN CALL SETWD
LD GR2,=-1
ST GR2,0,GR7 ; 数値の終わりを示す印を格納
RPOP
RET
SETWD LD GR3,GR3
[c]
LD GR2,GR6
SUBL GR2,GR1
CALL DTOB ; 数字列を数値に変換
SETWD内の上記表記は原画像の行順を保ち、空欄cは空欄のまま記録。
プログラム2(続き)
プログラム2の続き(SETWD末尾)。
ST GR0,0,GR7
LD GR3,=-1 ; 数字列の処理中状態を解除
[d]
FIN2 RET
END
プログラム3
プログラム3(MULT)。空欄e,fは空欄のまま。
MULT START
RPUSH
LAD GR2,CTBL
CALL GETWD
LD GR4,0,GR2 ; GR4 ← 被乗数
LD GR5,1,GR2 ; GR5 ← 乗数
LD GR0,=0
LD GR5,GR5
LP [e]
LD GR3,GR5
AND GR3,=#0001 ; 乗数の最下位ビットのチェック
JZE NEXT
ADDL GR0,GR4
NEXT SLL GR4,1 ; 被乗数を1ビット左論理シフト
[f]
JUMP LP
FIN RPOP
RET
CTBL DS 3 ; GETWD用管理テーブル
END
問1 解答群
問1の解答群(a)。ア ADDL GR5,GR4;イ SLL GR4,1;ウ SLL GR4,2;エ SLL GR5,1;オ SLL GR5,2。
問2 解答群 b
問2の解答群b。ア JNZ FIN;イ JNZ LP;ウ JNZ NUM;エ JZE FIN;オ JZE LP;カ JZE NUM。
問2 解答群 c
問2の解答群c。ア JNZ FIN;イ JNZ FIN2;ウ JNZ NUM;エ JZE FIN;オ JZE FIN2;カ JZE NUM。
問2 解答群 d
問2の解答群d。ア LAD GR6,1,GR1;イ LAD GR6,1,GR6;ウ LAD GR7,1,GR2;エ LAD GR7,1,GR7;オ LD GR6,GR1;カ LD GR7,GR2。
問3 解答群 e
問3の解答群e。ア JMI FIN;イ JMI NEXT;ウ JPL FIN;エ JPL NEXT;オ JZE FIN;カ JZE NEXT。
問3 解答群 f
問3の解答群f。ア ADDL GR0,GR5;イ ADDL GR5,GR4;ウ LD GR5,GR4;エ SLL GR5,1;オ SRL GR5,1。
COMET II 命令仕様(関連部分)
参照仕様(物理PDF p.74–75):COMET IIの汎用レジスタGR0~GR7は16ビット。論理加算ADDL r1,r2はr1←(r1)+L(r2)、論理減算SUBL r1,r2はr1←(r1)−L(r2)。論理積AND r1,r2はr1←(r1) AND (r2)。比較CPL r1,r2は符号なしの論理比較を行い,結果に応じSF,ZFを設定する。左論理シフトSLL r,adrは,rを実効アドレスで指定したビット数だけ左にシフトし,空いたビット位置に0を入れる。JPLは正分岐,JMIは負分岐,JNZは非零分岐,JZEは零分岐。
COMET II 命令仕様(ロード・ストア・分岐)
参照仕様(物理PDF p.74–75):LD r1,r2はr1←(r2),LD r,adr[x]はr←(実効アドレス)。ST r,adr[x]は実効アドレス←(r)。LAD r,adr[x]はr←実効アドレス。命令の比較結果による分岐条件はJPL(SF=0かつZF=0),JMI(SF=1),JNZ(ZF=0),JZE(ZF=1)。
COMET II 命令仕様(スタック・呼出し・復帰)
参照仕様(物理PDF p.76):PUSHはスタックに指定内容を格納し,POPはスタックから取り出す。CALLは戻りアドレスをスタックに格納してサブルーチンを呼び出す。RETは戻りアドレスを復元して呼出し元へ戻る。
CASL II DC命令仕様
参照仕様(物理PDF p.78):CASL IIのDC命令は定数データを連続する語に格納する。文字定数は,文字列の各文字を順に1語の下位8ビットに格納し,上位8ビットには0を入れる。文字列の前後をアポストロフィで囲む。
CASL II マクロ命令仕様(RPUSH・RPOP)
参照仕様(物理PDF p.79):RPUSHはGRの内容をGR1,GR2,…,GR7の順序でスタックに格納する。RPOPはスタック内容を取り出し,GR7,GR6,…,GR1の順序でGRに格納する。
問問12 設問1
プログラム1中の空欄aに入れる正しい答えを,解答群の中から選べ。
- ア ADDL GR5,GR4
- イ SLL GR4,1
- ウ SLL GR4,2
- エ SLL GR5,1
- オ SLL GR5,2
出典:平成30年度 春期 基本情報技術者試験 午後 問12 設問1
問問12 設問2
文字列の先頭から数字列を探索し,順に,対応する数値を管理テーブルに格納する副プログラムGETWDを,DTOBを使用して作成した。プログラム2中の空欄に入れる正しい答えを,解答群の中から選べ。
bに関する解答群
ア JNZ FIN
イ JNZ LP
ウ JNZ NUM
エ JZE FIN
オ JZE LP
カ JZE NUM
cに関する解答群
ア JNZ FIN
イ JNZ FIN2
ウ JNZ NUM
エ JZE FIN
オ JZE FIN2
カ JZE NUM
dに関する解答群
ア LAD GR6,1,GR1
イ LAD GR6,1,GR6
ウ LAD GR7,1,GR2
エ LAD GR7,1,GR7
オ LD GR6,GR1
カ LD GR7,GR2
- B-ア JNZ FIN
- B-イ JNZ LP
- B-ウ JNZ NUM
- B-エ JZE FIN
- B-オ JZE LP
- B-カ JZE NUM
- C-ア JNZ FIN
- C-イ JNZ FIN2
- C-ウ JNZ NUM
- C-エ JZE FIN
- C-オ JZE FIN2
- C-カ JZE NUM
- D-ア LAD GR6,1,GR1
- D-イ LAD GR6,1,GR6
- D-ウ LAD GR7,1,GR2
- D-エ LAD GR7,1,GR7
- D-オ LD GR6,GR1
- D-カ LD GR7,GR2
出典:平成30年度 春期 基本情報技術者試験 午後 問12 設問2
問問12 設問3
GETWDを使用して,二つの整数の積を求める副プログラムMULTを作成した。プログラム3中の空欄に入れる正しい答えを,解答群の中から選べ。
eに関する解答群
ア JMI FIN
イ JMI NEXT
ウ JPL FIN
エ JPL NEXT
オ JZE FIN
カ JZE NEXT
fに関する解答群
ア ADDL GR0,GR5
イ ADDL GR5,GR4
ウ LD GR5,GR4
エ SLL GR5,1
オ SRL GR5,1
- E-ア JMI FIN
- E-イ JMI NEXT
- E-ウ JPL FIN
- E-エ JPL NEXT
- E-オ JZE FIN
- E-カ JZE NEXT
- F-ア ADDL GR0,GR5
- F-イ ADDL GR5,GR4
- F-ウ LD GR5,GR4
- F-エ SLL GR5,1
- F-オ SRL GR5,1
出典:平成30年度 春期 基本情報技術者試験 午後 問12 設問3
共通の文章
問13 次の表計算のワークシート及びマクロの説明を読んで、設問1、2に答えよ。
Z社は、表計算ソフトを用いた会議室の予約システムを作成中である。会議室は15室あり、それぞれ一意の会議室番号が振られている。定員は会議室ごとに異なり、スクリーンがある会議室とない会議室がある。会議室は9時から21時まで利用できる。予約システムは、ワークシート「会議室選定」とワークシート「予約リスト」で構成される。
ワークシート「会議室選定」のA2~A16には会議室番号、B2~B16には定員、C2~C16にはスクリーンがある場合「有」、ない場合「無」が入力されている。予約条件はA19~E19に入力し、A19は利用日、B19は開始時刻、C19は終了時刻、D19は利用人数、E19はスクリーン利用希望を表す(希望する場合「要」、希望しない場合「不要」)。日付はYYYYMMDD、時刻はhhmmの形式の整数値で表す。終了時刻は開始時刻より後である。
条件入力後にマクロ SelectRoom を実行すると、「予約リスト」に格納された予約一覧を参照し、各会議室について、条件で指定した利用日の開始時刻から終了時刻まで(開始時刻及び終了時刻を含まない)に他の予約が入っていない場合は「可」、そうでない場合は「否」をD2~D16に格納する。E2~E16には対応する会議室の収容率を求める式が入力されている。収容率は利用人数÷定員で求める。ただし、利用人数が定員を超える場合、スクリーン利用を希望しているのに会議室にスクリーンがない場合、又はD列が「否」の場合、収容率は0とする。A22には推奨会議室番号を表示する式が入力されている。推奨会議室は収容率が最大となる正の値の会議室で、最大値が等しい会議室が複数あるときは表の最も上の会議室を表示する。条件を満たす会議室がない場合は「なし」と表示する。
ワークシート「予約リスト」には予約一覧が格納されている。1件の予約データは1行に入力され、列Aは一意の予約ID、列Bは利用日、列Cは開始時刻、列Dは終了時刻、列Eは利用人数、列Fはスクリーン利用希望(希望する場合「要」、希望しない場合「不要」)、列Gは予約された会議室番号である。日付及び時刻の形式は前述と同じで、予約データは利用日の昇順に整列されている。新しい予約データの登録にはマクロ Register を実行する。予約総数は9,998件までで、データ最終行より下の行の列A~Gは空値である。会議室の予約は9時から21時まで可能であり、21時を過ぎたら直ちにマクロ Update を実行する。Update は利用が終了した予約データを予約一覧から削除し、その行より下の予約データを上方向に詰める。Register、Update、SelectRoomの実行中に他のマクロが実行されることはない。
図1 会議室選定シートの例
図1「ワークシート『会議室選定』の例」。列見出しはA: 会議室番号、B: 定員、C: スクリーン、D: 使用可否、E: 収容率。行2: 101, 15, 有, 可, 0.40。行3: 102, 5, 無, 可, 0.00。行4: 103, 8, 有, 否, 0.00。行5: 201, 10, 有, 可, 0.60。行14: 501, 20, 無, 可, 0.00。行15: 502, 5, 有, 可, 0.00。行16: 503, 50, 有, 可, 0.12。行17は空欄。行18の見出しはA: 利用日、B: 開始時刻、C: 終了時刻、D: 利用人数、E: スクリーン。行19の値は20180415, 1300, 1530, 6, 要。行20は空欄。行21はA列に「推奨会議室」。行22の例示値はA列に201。表中の省略された行は省略記号で示されている。
図2 予約リストの例
図2「ワークシート『予約リスト』の例」。列見出しはA: 予約ID、B: 利用日、C: 開始時刻、D: 終了時刻、E: 利用人数、F: スクリーン、G: 会議室番号。行2: 613, 20180415, 1300, 1530, 6, 要, 401。行3: 574, 20180415, 1300, 1530, 6, 要, 103。行4: 588, 20180415, 1300, 1500, 6, 要, 301。行5: 565, 20180415, 900, 1100, 10, 要, 201。行520: 893, 20180501, 900, 1000, 5, 不要, 102。行521: 924, 20180501, 1000, 1100, 30, 不要, 503。行522は空欄。途中の行は省略記号で示されている。データ最終行は10,000行目の例が示されている。
マクロ SelectRoom の擬似コード
マクロ SelectRoom の擬似コード(空欄 d、e、f を含む)。数値型 I, J, NumRoom。NumRoom ← 15。Iを1からNumRoomまで1ずつ増やしながら、相対(D1, I, 0) ← '可'。条件付き個数(予約リスト!B2:B10000, = A19) > 0 の間、J ← 照合一致(A19, 予約リスト!B2:B10000, 0)。否定(d) の場合、e ← '否'。J ← J + 1。f。外側のIの反復の終了まで。
解答群 a
空欄aの候補は、E2の式の外側の論理和に渡す複数の引数を列挙する。論理積に含まれる範囲は選択肢ごとに異なる。
解答群 b
空欄bの選択肢。ア: 最小(E2:E16) = 0。イ: 最小(E2:E16) = 1。ウ: 最小(E2:E16) > 0。エ: 最小(E2:E16) < 1。オ: 最大(E2:E16) = 0。カ: 最大(E2:E16) = 1。キ: 最大(E2:E16) > 0。ク: 最大(E2:E16) < 1。
解答群 c
空欄cの選択肢。ア: 照合一致(最小(E2:E16), E2:E16, 0)。イ: 照合一致(最大(E2:E16), E2:E16, 0)。ウ: 照合検索(最小(E2:E16), E2:E16, A2:A16)。エ: 照合検索(最大(E2:E16), E2:E16, A2:A16)。オ: 表引き(A2:A16, 順位(最小(E2:E16), E2:E16, 0), 1)。カ: 表引き(A2:A16, 順位(最大(E2:E16), E2:E16, 0), 1)。
解答群 d
空欄dの選択肢。ア: 論理積(表引き(予約リスト!C2:C10000, J, 1) ≥ C19, 表引き(予約リスト!D2:D10000, J, 1) ≤ B19)。イ: 論理積(表引き(予約リスト!C2:C10000, J, 1) ≤ C19, 表引き(予約リスト!D2:D10000, J, 1) ≥ B19)。ウ: 論理積(表引き(予約リスト!D2:D10000, J, 1) ≥ C19, 表引き(予約リスト!C2:C10000, J, 1) ≤ B19)。エ: 論理積(表引き(予約リスト!D2:D10000, J, 1) ≤ C19, 表引き(予約リスト!C2:C10000, J, 1) ≥ B19)。オ: 論理和(表引き(予約リスト!C2:C10000, J, 1) ≥ C19, 表引き(予約リスト!D2:D10000, J, 1) ≤ B19)。カ: 論理和(表引き(予約リスト!C2:C10000, J, 1) ≤ C19, 表引き(予約リスト!D2:D10000, J, 1) ≥ B19)。キ: 論理和(表引き(予約リスト!D2:D10000, J, 1) ≥ C19, 表引き(予約リスト!C2:C10000, J, 1) ≤ B19)。ク: 論理和(表引き(予約リスト!D2:D10000, J, 1) ≤ C19, 表引き(予約リスト!C2:C10000, J, 1) ≥ B19)。
解答群 e
空欄eの選択肢。ア: 相対(D2, J − 1, 0)。イ: 相対(D2, J, 0)。ウ: 相対(D2, 照合一致(表引き(予約リスト!G2:G10000, J, 1), A2:A16, 0) − 1, 0)。エ: 相対(D2, 照合一致(表引き(予約リスト!G2:G10000, J, 1), 予約リスト!G2:G10000, 0) − 1, 0)。オ: 相対(D2, 照合一致(予約リスト!G2, A2:A16, 0) − 1, 0)。カ: 相対(D2, 照合一致(予約リスト!G2, A2:A16, 1) − 1, 0)。
解答群 f
空欄fの選択肢。ア: 表引き(予約リスト!B2:B10000, J, 1) = A19。イ: 表引き(予約リスト!B2:B10000, J, 1) = null。ウ: 表引き(予約リスト!B2:B10000, J, 1) ≠ A19。エ: 表引き(予約リスト!B2:B10000, J, 1) ≠ null。オ: 表引き(予約リスト!C2:C10000, J, 1) < B19。カ: 表引き(予約リスト!D2:D10000, J, 1) > C19。
関数仕様:論理関数、条件付き個数、最大・最小、順位
表計算ソフトの関数仕様(公式別添、物理PDF p.81–84からこの問に関係する仕様)。論理積(論理式1, 論理式2, …)は、全ての論理式がtrueならtrue、それ以外はfalseを返す。論理和(論理式1, 論理式2, …)は、少なくとも一つがtrueならtrue、それ以外はfalseを返す。否定(論理式)はtrueならfalse、falseならtrueを返す。IF(論理式, 式1, 式2)は論理式がtrueなら式1、そうでなければ式2の値を返す。条件付き個数(セル範囲, 検索条件の記述)は範囲内で条件を満たすセルの個数を返す。最大(セル範囲)と最小(セル範囲)は範囲内の最大値と最小値を返す。順位(算術式, セル範囲, 順序の指定)は範囲内での順位を返し、順序の指定0は降順、1は昇順。同値は同順位として、その順位の個数分だけ次順位を加算する。
関数仕様:表引き、照合一致、相対
表計算ソフトの関数仕様(公式別添、物理PDF p.82–84からこの問に関係する仕様)。表引き(セル範囲, 行の位置, 列の位置)は、範囲の左上端から行・列を1始まりで数え、指定された行・列の位置にあるセルの値を返す。照合検索(式, 検索のセル範囲, 抽出のセル範囲)は、同じ大きさの1行又は1列の各範囲に対し、検索範囲の左端又は上端から一致する最初のセルを探し、同じ相対位置の抽出範囲の値を返す。照合一致(式, セル範囲, 検索の指定)は、範囲を走査して条件を満たす最初のセルの位置を返す。検索の指定0は式の値と一致する値を検索する。相対(セル変数, 行の位置, 列の位置)は、セル変数で指定したセルを基準に、行及び列の位置の分だけ移動したセルを表す。
セル参照と式の複写
表計算ソフトのセル参照仕様(公式別添、物理PDF p.80–82)。セル範囲は左上端セルと右下端セルをコロンで結んで表す。他のワークシートのセル又は範囲は「ワークシート名!セル番地」又は「ワークシート名!セル範囲」と表す。式を複写すると、相対参照の行・列位置は複写元と複写先の差に応じて変化し、絶対参照は変化しない。列と行の両方を固定する場合は両方の直前に$を付ける。
予約リスト及びマクロ実行条件
問題文に示された予約処理条件。予約一覧は利用日の昇順で整列され、データ最終行より下は空値。SelectRoomは各室について予約条件と同じ利用日の予約を調べる。マクロRegister、Update、SelectRoomの実行中に他のマクロは実行されない。
問問13 設問1
ワークシート「会議室選定」に関する次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。(1) 次の式をセルE2に入力し、セルE3~E16に複写する。IF(論理和(a), 0, D$19 / B2)。(2) 次の式をセルA22に入力する。IF(b, 'なし', c)。
aに関する解答群
ア 論理積(E$19='要', C2='有'), D2='否', D$19 > B2
イ 論理積(E$19='要', C2='無'), D2='否', D$19 > B2
ウ 論理積(E$19='要', C2='有', D2='否'), D$19 > B2
エ 論理積(E$19='要', C2='無', D2='否'), D$19 > B2
オ 論理積(E$19='不要', C2='有'), D2='否', D$19 > B2
カ 論理積(E$19='不要', C2='無'), D2='否', D$19 > B2
キ 論理積(E$19='不要', C2='有', D2='否'), D$19 > B2
ク 論理積(E$19='不要', C2='無', D2='否'), D$19 > B2
bに関する解答群
ア 最小(E2:E16) = 0
イ 最小(E2:E16) = 1
ウ 最小(E2:E16) > 0
エ 最小(E2:E16) < 1
オ 最大(E2:E16) = 0
カ 最大(E2:E16) = 1
キ 最大(E2:E16) > 0
ク 最大(E2:E16) < 1
cに関する解答群
ア 照合一致(最小(E2:E16), E2:E16, 0)
イ 照合一致(最大(E2:E16), E2:E16, 0)
ウ 照合検索(最小(E2:E16), E2:E16, A2:A16)
エ 照合検索(最大(E2:E16), E2:E16, A2:A16)
オ 表引き(A2:A16, 順位(最小(E2:E16), E2:E16, 0), 1)
カ 表引き(A2:A16, 順位(最大(E2:E16), E2:E16, 0), 1)
- A-ア 論理積(E$19='要', C2='有'), D2='否', D$19 > B2
- A-イ 論理積(E$19='要', C2='無'), D2='否', D$19 > B2
- A-ウ 論理積(E$19='要', C2='有', D2='否'), D$19 > B2
- A-エ 論理積(E$19='要', C2='無', D2='否'), D$19 > B2
- A-オ 論理積(E$19='不要', C2='有'), D2='否', D$19 > B2
- A-カ 論理積(E$19='不要', C2='無'), D2='否', D$19 > B2
- A-キ 論理積(E$19='不要', C2='有', D2='否'), D$19 > B2
- A-ク 論理積(E$19='不要', C2='無', D2='否'), D$19 > B2
- B-ア 最小(E2:E16) = 0
- B-イ 最小(E2:E16) = 1
- B-ウ 最小(E2:E16) > 0
- B-エ 最小(E2:E16) < 1
- B-オ 最大(E2:E16) = 0
- B-カ 最大(E2:E16) = 1
- B-キ 最大(E2:E16) > 0
- B-ク 最大(E2:E16) < 1
- C-ア 照合一致(最小(E2:E16), E2:E16, 0)
- C-イ 照合一致(最大(E2:E16), E2:E16, 0)
- C-ウ 照合検索(最小(E2:E16), E2:E16, A2:A16)
- C-エ 照合検索(最大(E2:E16), E2:E16, A2:A16)
- C-オ 表引き(A2:A16, 順位(最小(E2:E16), E2:E16, 0), 1)
- C-カ 表引き(A2:A16, 順位(最大(E2:E16), E2:E16, 0), 1)
出典:平成30年度 春期 基本情報技術者試験 午後 問13 設問1
問問13 設問2
マクロ SelectRoom 中の空欄に入れる正しい答えを、解答群の中から選べ。
dに関する解答群
ア 論理積(表引き(予約リスト!C2:C10000, J, 1) ≥ C19, 表引き(予約リスト!D2:D10000, J, 1) ≤ B19)
イ 論理積(表引き(予約リスト!C2:C10000, J, 1) ≤ C19, 表引き(予約リスト!D2:D10000, J, 1) ≥ B19)
ウ 論理積(表引き(予約リスト!D2:D10000, J, 1) ≥ C19, 表引き(予約リスト!C2:C10000, J, 1) ≤ B19)
エ 論理積(表引き(予約リスト!D2:D10000, J, 1) ≤ C19, 表引き(予約リスト!C2:C10000, J, 1) ≥ B19)
オ 論理和(表引き(予約リスト!C2:C10000, J, 1) ≥ C19, 表引き(予約リスト!D2:D10000, J, 1) ≤ B19)
カ 論理和(表引き(予約リスト!C2:C10000, J, 1) ≤ C19, 表引き(予約リスト!D2:D10000, J, 1) ≥ B19)
キ 論理和(表引き(予約リスト!D2:D10000, J, 1) ≥ C19, 表引き(予約リスト!C2:C10000, J, 1) ≤ B19)
ク 論理和(表引き(予約リスト!D2:D10000, J, 1) ≤ C19, 表引き(予約リスト!C2:C10000, J, 1) ≥ B19)
eに関する解答群
ア 相対(D2, J − 1, 0)
イ 相対(D2, J, 0)
ウ 相対(D2, 照合一致(表引き(予約リスト!G2:G10000, J, 1), A2:A16, 0) − 1, 0)
エ 相対(D2, 照合一致(表引き(予約リスト!G2:G10000, J, 1), 予約リスト!G2:G10000, 0) − 1, 0)
オ 相対(D2, 照合一致(予約リスト!G2, A2:A16, 0) − 1, 0)
カ 相対(D2, 照合一致(予約リスト!G2, A2:A16, 1) − 1, 0)
fに関する解答群
ア 表引き(予約リスト!B2:B10000, J, 1) = A19
イ 表引き(予約リスト!B2:B10000, J, 1) = null
ウ 表引き(予約リスト!B2:B10000, J, 1) ≠ A19
エ 表引き(予約リスト!B2:B10000, J, 1) ≠ null
オ 表引き(予約リスト!C2:C10000, J, 1) < B19
カ 表引き(予約リスト!D2:D10000, J, 1) > C19
- D-ア 論理積(表引き(予約リスト!C2:C10000, J, 1) ≥ C19, 表引き(予約リスト!D2:D10000, J, 1) ≤ B19)
- D-イ 論理積(表引き(予約リスト!C2:C10000, J, 1) ≤ C19, 表引き(予約リスト!D2:D10000, J, 1) ≥ B19)
- D-ウ 論理積(表引き(予約リスト!D2:D10000, J, 1) ≥ C19, 表引き(予約リスト!C2:C10000, J, 1) ≤ B19)
- D-エ 論理積(表引き(予約リスト!D2:D10000, J, 1) ≤ C19, 表引き(予約リスト!C2:C10000, J, 1) ≥ B19)
- D-オ 論理和(表引き(予約リスト!C2:C10000, J, 1) ≥ C19, 表引き(予約リスト!D2:D10000, J, 1) ≤ B19)
- D-カ 論理和(表引き(予約リスト!C2:C10000, J, 1) ≤ C19, 表引き(予約リスト!D2:D10000, J, 1) ≥ B19)
- D-キ 論理和(表引き(予約リスト!D2:D10000, J, 1) ≥ C19, 表引き(予約リスト!C2:C10000, J, 1) ≤ B19)
- D-ク 論理和(表引き(予約リスト!D2:D10000, J, 1) ≤ C19, 表引き(予約リスト!C2:C10000, J, 1) ≥ B19)
- E-ア 相対(D2, J − 1, 0)
- E-イ 相対(D2, J, 0)
- E-ウ 相対(D2, 照合一致(表引き(予約リスト!G2:G10000, J, 1), A2:A16, 0) − 1, 0)
- E-エ 相対(D2, 照合一致(表引き(予約リスト!G2:G10000, J, 1), 予約リスト!G2:G10000, 0) − 1, 0)
- E-オ 相対(D2, 照合一致(予約リスト!G2, A2:A16, 0) − 1, 0)
- E-カ 相対(D2, 照合一致(予約リスト!G2, A2:A16, 1) − 1, 0)
- F-ア 表引き(予約リスト!B2:B10000, J, 1) = A19
- F-イ 表引き(予約リスト!B2:B10000, J, 1) = null
- F-ウ 表引き(予約リスト!B2:B10000, J, 1) ≠ A19
- F-エ 表引き(予約リスト!B2:B10000, J, 1) ≠ null
- F-オ 表引き(予約リスト!C2:C10000, J, 1) < B19
- F-カ 表引き(予約リスト!D2:D10000, J, 1) > C19
出典:平成30年度 春期 基本情報技術者試験 午後 問13 設問2