共通の文章
問1 SSHによる通信に関する次の記述を読んで,設問1~4に答えよ。
SSHは遠隔ログインのための通信プロトコル及びソフトウェアであり,通信データの盗聴対策や,通信相手のなりすましを防ぐ仕組みを備えている。SSHでは,サーバにログインしてデータをやり取りする通信(以下,ログインセッションという)に先立って,安全な通信経路の確立と利用者認証を行う必要がある。安全な通信経路の確立,利用者認証及びログインセッションを合わせてSSHセッションと呼ぶ。その流れを図1に示す。
【安全な通信経路の確立の概要】
安全な通信経路の確立は,次のようにして行う。
(1) クライアントがサーバにアクセスする。
(2) サーバとクライアントが,SSHセッションで使用する暗号アルゴリズムについて合意する。
(3) サーバとクライアントが,通信データの暗号化に使用するセッション鍵と,他のSSHセッションと区別するためのセッション識別子について合意する。
(4) [下線①:クライアントがサーバ認証を行う。]サーバ認証では,クライアントがあらかじめ入手して正当性を確認しておいた[a]を用い,サーバによるセッション識別子へのディジタル署名が正しいかどうかを検証する。
(5) 合意した暗号アルゴリズムとセッション鍵を用いて,[下線②:共通鍵暗号方式による通信データの暗号化]を開始する。これ以降の通信は,全て暗号化される。
【利用者認証の概要】
クライアントからサーバへのログインでは,サーバは利用者認証を行う。SSHの利用者認証の方式には,ディジタル署名を用いる「公開鍵認証」とパスワードを用いる「パスワード認証」がある。
「公開鍵認証」では,クライアントの公開鍵を事前にサーバに登録しておき,この登録されている公開鍵に対応する秘密鍵をクライアントがもっていることをサーバが確認する。この確認では,クライアントがセッション識別子などに対するディジタル署名をサーバに送信し,サーバが[b]を用いてディジタル署名を検証する。
「パスワード認証」では,クライアントが利用者IDとパスワードを送信し,サーバは受け取ったパスワードが当該利用者のパスワードと一致していることを検証する。なお,[下線③:「パスワード認証」は,「公開鍵認証」に比べて,安全性が低いと考えられている。]
図1 SSHセッションの流れ
図1「SSHセッションの流れ」。横軸は右向きの時間。SSHセッション開始からSSHセッション終了までを「SSHセッション」とし、その内訳は時間順に「安全な通信経路の確立」→「利用者認証」→「ログインセッション」。
問問1 設問1
本文中の[空欄]に入れる適切な答えを,解答群の中から選べ。
a、bに関する解答群
ア 安全な通信経路の確立時に合意したセッション鍵
イ クライアントの公開鍵
ウ クライアントの秘密鍵
エ サーバの公開鍵
オ サーバの秘密鍵
- A-ア 安全な通信経路の確立時に合意したセッション鍵
- A-イ クライアントの公開鍵
- A-ウ クライアントの秘密鍵
- A-エ サーバの公開鍵
- A-オ サーバの秘密鍵
- B-ア 安全な通信経路の確立時に合意したセッション鍵
- B-イ クライアントの公開鍵
- B-ウ クライアントの秘密鍵
- B-エ サーバの公開鍵
- B-オ サーバの秘密鍵
出典:平成29年度 秋期 基本情報技術者試験 午後 問1 設問1
問問1 設問2
本文中の下線①によって防ぐことができる攻撃として適切な答えを,解答群の中から選べ。
- ア DoS攻撃
- イ SQLインジェクション
- ウ クロスサイトスクリプティング
- エ 総当たり攻撃
- オ 中間者攻撃
出典:平成29年度 秋期 基本情報技術者試験 午後 問1 設問2
問問1 設問3
本文中の下線②について,通信データの暗号化に公開鍵暗号方式ではなく共通鍵暗号方式を用いる理由として適切な答えを,解答群の中から選べ。
- ア 共通鍵暗号方式は,公開鍵暗号方式よりも暗号処理が高速である。
- イ 共通鍵暗号方式は,公開鍵暗号方式よりも解読に時間が掛かる。
- ウ 共通鍵暗号方式は,公開鍵暗号方式よりも鍵の再利用が容易である。
- エ 共通鍵暗号方式は,公開鍵暗号方式よりも鍵の配布が容易である。
出典:平成29年度 秋期 基本情報技術者試験 午後 問1 設問3
問問1 設問4
本文中の下線③のように考えられている理由として適切な答えを,解答群の中から選べ。
- ア 「パスワード認証」では,サーバが攻撃者に乗っ取られていた場合,送信したパスワードを攻撃者に取得されてしまう。
- イ 「パスワード認証」では,正当なサーバとは異なるサーバに接続させられてしまっても利用者が気づけない。
- ウ 「パスワード認証」では,パスワードだけを用いるが,「公開鍵認証」では,パスワードの他にディジタル署名も用いる。
- エ 「パスワード認証」では,利用者のパスワードが平文でネットワーク上を流れるので,盗聴されるとパスワードを取得されてしまう。
出典:平成29年度 秋期 基本情報技術者試験 午後 問1 設問4
共通の文章
問2 プロセスの排他制御に関する次の記述を読んで、設問1~3に答えよ。
単一のCPUと、プロセス間で共有するデータ(以下、共有データという)を格納するためのメモリ(以下、共有メモリという)をもつコンピュータXにおいて、並行に実行される複数のプロセスが、共有データを更新する場合を考える。二つのプロセスp1、p2が共有データyを更新する際には、図1に示す更新処理1、更新処理2を、それぞれ①~③の順番に行う。
図1
図1「二つのプロセスが共有データに対して更新処理を行う例」。コンピュータX内にプロセスp1、共有メモリ、プロセスp2がある。p1の更新処理1、p2の更新処理2は、それぞれ①共有データyの値の読込み、②読み込んだ値の更新、③共有データyへの更新結果の書出し、の順に行う。図中の矢印は共有データyへのアクセス(読込み又は書出し)を表す。
図2
図2「セマフォ変数Sを利用した更新処理」。共有メモリにはセマフォ変数Sと共有データyがある。プロセスp3はP操作、更新処理1、V操作の順に行い、プロセスp4はP操作、更新処理2、V操作の順に行う。更新処理1と更新処理2は図1と同じ処理である。図中の実線矢印は共有データyへのアクセスを、点線矢印と黒丸はセマフォ変数Sへの操作を表す。セマフォ変数は、対応する共有データが解放されている状態を示す1、又はいずれかのプロセスに確保されている状態を示す0の値をもつ。セマフォ変数の値はP操作とV操作で変更する。
問問2 設問1
二つのプロセスp1、p2の実行前の共有データyの値が100であり、共有データyに対して排他制御を行わずに、プロセスp1が更新処理1を、プロセスp2が更新処理2を並行して各1回だけ行った。結果として、共有データyが取り得ない値を、解答群の中から選べ。
【更新処理1】:共有データyの値を30増加させる。
【更新処理2】:共有データyの値を50減少させる。
出典:平成29年度 秋期 基本情報技術者試験 午後 問2 設問1
問問2 設問2
共有データに対して排他制御を行う仕組みとして、セマフォ変数を利用する方法を考える。図2において、共有データyに対して排他制御をした上で更新処理を行うために、プロセスp3はP操作、更新処理1、V操作の順に処理を行い、プロセスp4はP操作、更新処理2、V操作の順に処理を行う。P操作は、[a]。V操作は、[b]。ここで、P操作とV操作は、それぞれ実行中の中断はないものとする。ただし、プロセスが待ち状態になれば、CPUは別のプロセスを実行させるものとする。次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア セマフォ変数Sの値が0であれば1に変更し、終了する。1であれば0になるまで待った後、1に変更して終了する。
イ セマフォ変数Sの値が0であれば1に変更し、終了する。1であれば何もせずに終了する。
ウ セマフォ変数Sの値が1であれば0に変更し、終了する。0であれば1になるまで待った後、0に変更して終了する。
エ セマフォ変数Sの値が1であれば0に変更し、終了する。0であれば何もせずに終了する。
bに関する解答群
ア セマフォ変数Sの値が0であれば1になるまで待った後、終了する。
イ セマフォ変数Sの値が1であれば0になるまで待った後、終了する。
ウ セマフォ変数Sの値を0にして終了する。
エ セマフォ変数Sの値を1にして終了する。
- A-ア セマフォ変数Sの値が0であれば1に変更し、終了する。1であれば0になるまで待った後、1に変更して終了する。
- A-イ セマフォ変数Sの値が0であれば1に変更し、終了する。1であれば何もせずに終了する。
- A-ウ セマフォ変数Sの値が1であれば0に変更し、終了する。0であれば1になるまで待った後、0に変更して終了する。
- A-エ セマフォ変数Sの値が1であれば0に変更し、終了する。0であれば何もせずに終了する。
- B-ア セマフォ変数Sの値が0であれば1になるまで待った後、終了する。
- B-イ セマフォ変数Sの値が1であれば0になるまで待った後、終了する。
- B-ウ セマフォ変数Sの値を0にして終了する。
- B-エ セマフォ変数Sの値を1にして終了する。
出典:平成29年度 秋期 基本情報技術者試験 午後 問2 設問2
問問2 設問3
プロセスp5、p6が更新する二つの共有データy1、y2があり、それぞれに異なるセマフォ変数を対応させて、個別に確保と解放ができるようにした場合を考える。共有データy1に対してセマフォ変数S1を、共有データy2に対してセマフォ変数S2を用いて排他制御を行う。プロセスp5が、次の順序で共有データy1、y2に対する確保と解放を行うとき、プロセスp6が共有データy1、y2に対する確保と解放を行う順序によってはデッドロックが発生する可能性がある。デッドロックが発生する可能性がある、プロセスp6の共有データy1、y2に対する確保と解放の順序を、解答群の中から選べ。
【プロセスp5の共有データに対する確保と解放の順序】
y1の確保、y2の確保、y2の解放、y1の解放
- ア y1の確保、y1の解放、y2の確保、y2の解放
- イ y1の確保、y2の確保、y1の解放、y2の解放
- ウ y1の確保、y2の確保、y2の解放、y1の解放
- エ y2の確保、y1の確保、y1の解放、y2の解放
- オ y2の確保、y2の解放、y1の確保、y1の解放
出典:平成29年度 秋期 基本情報技術者試験 午後 問2 設問3
共通の文章
問3 会員制通信販売事業者における会員販売データ管理に関する次の記述を読んで,設問1~4に答えよ。
清涼飲料水の会員制通信販売事業を運営するD社では,販売促進と商品管理の効率化を目的に会員情報や販売情報を管理するシステム(以下,販売管理システムという)を,事業開始当初から導入している。注文の受付は電話応対で行い,電話の受付時間は8時から20時までである。
販売管理システムで利用するデータベースの表構成とデータ格納例を,図1に示す。下線付きの項目は主キーである。
図1 販売管理システムで利用するデータベースの表構成とデータ格納例
図1 販売管理システムで利用するデータベースの表構成とデータ格納例。下線付き項目は主キー。
会員表の列:会員番号(主キー),氏名,生年,電話番号,郵便番号,住所。例:K20001|山田太郎|1960|03-3811-XXXX|112-0003|東京都文京区…;K20002|中村二郎|1953|03-3235-YYYY|160-0022|東京都新宿区…;以下省略。
販売表の列:伝票番号(主キー),販売日,会員番号。例:D0000001|2016-10-02|K20002;D0000002|2016-10-02|K40027;D0000003|2016-10-02|K20004;以下省略。
販売明細表の列:伝票番号(主キー),商品番号(主キー),個数。例:D0000001|S1000001|30;D0000001|S1000002|10;D0000002|S3000001|1;以下省略。
商品表の列:商品番号(主キー),分類,商品名,単価。例:S1000001|コーヒー|ブラックコーヒー 200mL|100;S1000002|コーヒー|エスプレッソ 200mL|120;S3000001|ジュース|リンゴジュース 1L 12本|2000;以下省略。
図2 変更した販売明細表の表構成
図2 変更した販売明細表の表構成。列は伝票番号,商品番号,個数,販売時単価。
図3 入荷管理システムで利用するデータベースの表構成
図3 入荷管理システムで利用するデータベースの表構成。入荷表の列は入荷番号(主キー),商品番号,入荷日,入荷数。ビュー入荷集計表の列は商品番号,入荷総数。ビュー入荷集計表は運用開始から現在までの入荷数の総数を表示する。
図4 入荷管理システムのデータベースに追加する表の構成
図4 入荷管理システムのデータベースに追加する表の構成。ビュー販売集計表の列は商品番号,販売総数。ビュー在庫表の列は商品番号,在庫数。ビュー在庫表はビュー販売集計表を用いて作成する。一度でも入荷した商品は,在庫数がゼロでも表示する仕様。
問問3 設問1
設問1 販売促進のために,コーヒーの新商品案内のはがきを送ることになった。その際,購入しそうな会員に効率よく案内するために,2016年の1月1日から12月31日までの1年間において,分類がコーヒーである商品を5回以上購入し,かつ,その購入額の合計が10,000円以上である会員の氏名,郵便番号,住所を抽出することにした。ここで,1回の購入は販売明細表の1行に該当するものとする。次のSQL文の空欄 a に入れる正しい答えを,解答群の中から選べ。
SELECT 会員表.氏名, 会員表.郵便番号, 会員表.住所
FROM 会員表 WHERE 会員表.会員番号 IN
(SELECT 販売表.会員番号
FROM 販売表, 販売明細表, 商品表
WHERE 販売表.伝票番号 = 販売明細表.伝票番号 AND
商品表.商品番号 = 販売明細表.商品番号 [空欄 a])
- ア AND 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31'
AND 商品表.分類 = 'コーヒー'
AND 商品表.単価 * 販売明細表.個数 >= 10000
GROUP BY 販売表.会員番号
HAVING COUNT(*) >= 5
- イ AND 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31'
AND 商品表.分類 = 'コーヒー'
GROUP BY 販売表.会員番号
HAVING SUM(商品表.単価 * 販売明細表.個数) >= 10000
AND COUNT(*) >= 5
- ウ AND 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31'
GROUP BY 販売表.会員番号
HAVING 商品表.分類 = 'コーヒー'
AND SUM(商品表.単価 * 販売明細表.個数) >= 10000
AND COUNT(*) >= 5
- エ GROUP BY 販売表.会員番号
HAVING 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31'
AND 商品表.分類 = 'コーヒー'
AND SUM(販売表.販売額) >= 10000
AND COUNT(*) >= 5
出典:平成29年度 秋期 基本情報技術者試験 午後 問3 設問1
問問3 設問2
設問2 商品表の単価を何回でも変更できるようにする。併せて,販売時点の単価が分かるように,販売明細表の項目として販売時点の単価を追加することにした。変更した販売明細表の表構成を図2に示す。商品表の単価の変更は,当日の受付時間前に行う。販売時点の単価の追加によって得ることができる情報として最も適切な答えを,解答群の中から選べ。
- ア ある時,ある商品をある会員が購入した単価と,その直後に変更された単価との価格差
- イ 実際に購入された商品の,販売時点の単価の変遷
- ウ 全ての商品についての,単価の変遷
- エ 全ての商品について,直近の単価変更日の前日における単価
出典:平成29年度 秋期 基本情報技術者試験 午後 問3 設問2
問問3 設問3
設問3 商品表の単価を変更できるようにした後の販売状況を把握するために,2017年の1月1日から6月30日までの半年間を対象に,商品表の分類別の販売額の合計(合計販売額)を会員の年齢ごとに求めて,出力したい。年齢は2017から生年を引いた値とする。次のSQL文の空欄に入れる正しい答えを,解答群の中から選べ。ここで,b1~b3に入れる答えは,bに関する解答群の中から組合せとして正しいものを選ぶものとする。
SELECT 年齢, 分類, [b1] AS 合計販売額
FROM
(SELECT 2017 - 会員表.生年 AS 年齢, 商品表.分類, [b2]
FROM 会員表, 販売表, 販売明細表, 商品表
WHERE 会員表.会員番号 = 販売表.会員番号 AND
販売表.伝票番号 = 販売明細表.伝票番号 AND
販売明細表.商品番号 = 商品表.商品番号 AND
販売表.販売日 >= '2017-01-01' AND
販売表.販売日 <= '2017-06-30'
) FACTTBL
GROUP BY [b3]
ORDER BY 年齢 ASC, 合計販売額 DESC
- ア b1:SUM(単価 * 個数);b2:商品表.単価,販売明細表.個数;b3:年齢,分類
- イ b1:SUM(単価 * 個数);b2:商品表.単価,販売明細表.個数;b3:年齢,分類,合計販売額
- ウ b1:SUM(販売額);b2:販売表.販売額;b3:年齢,分類
- エ b1:SUM(販売額);b2:販売表.販売額;b3:年齢,分類,合計販売額
- オ b1:SUM(販売時単価 * 個数);b2:販売明細表.販売時単価,販売明細表.個数;b3:年齢,分類
- カ b1:SUM(販売時単価 * 個数);b2:販売明細表.販売時単価,販売明細表.個数;b3:年齢,分類,合計販売額
出典:平成29年度 秋期 基本情報技術者試験 午後 問3 設問3
問問3 設問4
設問4 入荷情報を管理するシステム(以下,入荷管理システムという)を販売管理システムと同時に運用開始している。入荷管理システムで利用するデータベースの表構成を図3に示す。
ビュー入荷集計表は運用開始から現在までの入荷数の総数を表示する。さらに販売総数を把握するためにビュー販売集計表を,最新の在庫数を把握するためにビュー在庫表を作成する。ビュー在庫表は一度でも入荷した商品は在庫数ゼロでも表示する仕様である。データベースに追加する表の構成を,図4に示す。
次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。ここで,c1とc2に入れる答えは,cに関する解答群の中から組合せとして正しいものを選ぶものとする。
図1~図3の表を用いて,図4のビュー販売集計表を作成するための必要最小限の表の数は c1 である。図4のビュー在庫表は,ビュー販売集計表を用いて作成する。このとき,ビュー在庫表を作成するための必要最小限の表の数は,ビュー販売集計表も含めて c2 である。
- ア c1:1;c2:2
- イ c1:1;c2:3
- ウ c1:2;c2:2
- エ c1:2;c2:3
出典:平成29年度 秋期 基本情報技術者試験 午後 問3 設問4
共通の文章
問4 コールセンタ設備の構成案及び必要となるオペレータ数の検討に関する次の記述を読んで,設問1,2に答えよ。
X社のコールセンタでは,顧客からの問合せの電話に対して30人のオペレータで処理を行っているが,「電話で待たされる」という顧客からの意見が多く寄せられている。この度,顧客が電話で待たされる時間の短縮を目的に,既存のコールセンタの設備とオペレータ数を見直すことにした。検討の要件とコールセンタ設備の構成案は,次のとおりである。
【検討の要件】
(1) コールセンタでは,IPをベースにして拡張が可能なVoIP(Voice over Internet Protocol)を採用する。
(2) コールセンタに着信があってからオペレータと通話を開始できるまでの平均待ち時間を,問合せが最も多い時間帯(以下,ピーク時という)においても,20秒以下になるようにオペレータを増員する。
【コールセンタ設備の構成案】
VoIPサーバ群は,顧客情報サーバ,コールサーバ及び着信分配情報サーバで構成する。オペレータ席には,それぞれ電話端末とPCを設置する。VoIPサーバ群と,音声ゲートウェイ及びオペレータ席との間はレイヤ3スイッチで接続する。
図1 コールセンタ設備の構成案
図1「コールセンタ設備の構成案」。コールセンタ内に,VoIPサーバ群(顧客情報サーバ,コールサーバ,着信分配情報サーバ),レイヤ3スイッチ,オペレータ席,音声ゲートウェイがある。VoIPサーバ群はレイヤ3スイッチを介して,オペレータ席及び音声ゲートウェイに接続される。各オペレータ席には電話端末とPCがある。音声ゲートウェイは公衆電話網につながり,公衆電話網には複数の顧客電話機がつながる。図にはオペレータ席が複数示され,途中は「…」で省略されている。
設備の役割とオペレータ席の状態
顧客情報サーバは,過去の問合せ内容の検索や,顧客とのやり取りを記録するために利用される。コールサーバはVoIPの制御を行い,音声ゲートウェイから電話の接続要求があると,オペレータ席にある電話端末とPCの状態(以下,オペレータ席の状態という)を管理している着信分配情報サーバに問い合わせて,接続要求待ちのオペレータ席の電話端末へ接続する。オペレータ席の状態には,接続要求待ち,通話中及び結果記録中の状態があり,着信分配情報サーバは各オペレータ席がどの状態にあるかを認識している。
図2 顧客からの通話要求をオペレータ席の電話端末に接続するシーケンス
図2「顧客からの通話要求をオペレータ席の電話端末に接続するシーケンス」。オブジェクトは左から「顧客電話機」,a1,a2,a3,「電話端末」。実線矢印は要求メッセージ,点線矢印は応答メッセージを表す。時系列順に,顧客電話機からa1へ「接続要求」,a1からa2へ「接続要求」,a2からa3へ「接続先端末問合せ」,a3から電話端末へ「接続先状況確認」が送られる。電話端末側に「接続先端末決定」の処理があり,a3からa2へ点線で「接続先端末通知」が返る。その後,a2から電話端末へ「接続要求」が送られ,電話端末からa2,a2からa1,a1から顧客電話機へ,それぞれ点線で「接続応答」が返る。
表1 想定する問合せの処理件数及び平均処理時間
表1「想定する問合せの処理件数及び平均処理時間」。列は項目,値。ピーク時の着信件数(件/時):360。平均通話時間(分/件):4。平均結果記録時間(分/件):2。
オペレータ席の状態と処理時間
オペレータ席の状態と問合せの処理:接続要求待ちの状態にあるオペレータ席の電話端末に接続要求があると,オペレータが顧客と通話を開始することによって通話中の状態になる。通話が終了すると結果記録中の状態となり,オペレータはPCから顧客情報サーバにその結果の記録を行う。結果の記録が完了すると,接続要求待ちの状態に戻る。1人のオペレータが1回の問合せに応対する通話時間と結果記録時間の合計を処理時間とする。
リトルの公式
平均到着率(平均着信間隔の逆数)をλとすると,平均待ち行列長Lと平均待ち時間Wとの間には,λ×W=Lが成立する。
表2 オペレータ数と平均待ち行列長の関係
表2「オペレータ数と平均待ち行列長の関係」。列はオペレータ数(人),平均待ち行列長。40:3.704。41:2.304。42:1.474。43:0.957。44:0.626。窓口数sのM/M/sモデルに表1の条件を適用した場合の関係として示されている。
問問4 設問1
図2中の空欄に入れる正しい答えを,解答群の中から選べ。
- ア a1:音声ゲートウェイ,a2:コールサーバ,a3:顧客情報サーバ
- イ a1:音声ゲートウェイ,a2:コールサーバ,a3:着信分配情報サーバ
- ウ a1:コールサーバ,a2:音声ゲートウェイ,a3:着信分配情報サーバ
- エ a1:着信分配情報サーバ,a2:音声ゲートウェイ,a3:顧客情報サーバ
- オ a1:着信分配情報サーバ,a2:コールサーバ,a3:顧客情報サーバ
出典:平成29年度 秋期 基本情報技術者試験 午後 問4 設問1
問問4 設問2
次の記述中の空欄に入れる正しい答えを,解答群の中から選べ。1人のオペレータが1回の問合せに応対する通話時間と結果記録時間の合計を処理時間とする。想定する平均処理時間はb分であり,コールセンタのピーク時における平均着信間隔はc秒となる。リトルの公式と表2を用いると,ピーク時の平均待ち時間を20秒以下にするために必要なオペレータ数は最小d人となる。
b、cに関する解答群
ア 3
イ 4
ウ 5
エ 6
オ 7
カ 8
キ 9
ク 10
ケ 11
コ 12
dに関する解答群
ア 40
イ 41
ウ 42
エ 43
オ 44
- B-ア 3
- B-イ 4
- B-ウ 5
- B-エ 6
- B-オ 7
- B-カ 8
- B-キ 9
- B-ク 10
- B-ケ 11
- B-コ 12
- C-ア 3
- C-イ 4
- C-ウ 5
- C-エ 6
- C-オ 7
- C-カ 8
- C-キ 9
- C-ク 10
- C-ケ 11
- C-コ 12
- D-ア 40
- D-イ 41
- D-ウ 42
- D-エ 43
- D-オ 44
出典:平成29年度 秋期 基本情報技術者試験 午後 問4 設問2
共通の文章
問5 買上げ・入金管理システムを用いた月次集計処理に関する次の記述を読んで,設問1,2に答える。E社は,10年以上の取引実績がある得意先とは,双方が合意した上で,得意先の買上げに対する支払を,1回の入金で行うことも,複数回の入金で行うことも許容した取引を行っている。得意先は,入金を,買上げ前にも,買上げ後にも行うことができる。E社の担当者は,得意先の買上げ及び入金が発生するたびに,買上げ・入金管理システムに記録している。毎月の最終営業日の取引終了後に,買上げ・入金管理システムを用いて月次集計処理を行っている。月次集計処理は月間買上げ額確定処理と消込み処理から成り,月間買上げ額確定処理の終了後に消込み処理を行う。月間買上げ額確定処理は,得意先ごとに当月1か月分の買上げ金額を合計して,当月の買上げの合計額(月間買上げ額)を確定させる処理である。消込み処理は,充当が完了していない月間買上げ額に対して,得意先からの入金を充当していく処理である。過去の月間買上げ額に対する充当が完了していない場合や,得意先から入金された金額が全て月間買上げ額に充当されずに残っている場合がある。したがって,消込み処理では,充当が完了していない月間買上げ額に対して,買上げ年月の古い順に,まだ入金額の全てを充当しきれていない入金を,入金日の古い順に充当していく。
図1 関係データベースのE-R図
図1「関係データベースのE-R図」。表と属性は次のとおり。得意先:得意先ID(主キー),得意先名,住所,電話番号。商品:商品コード(主キー),商品名,単価。買上げ:買上げ伝票番号(主キー),買上げ日,得意先ID,月間買上げ番号。買上げ明細:買上げ伝票番号,明細番号(両属性に主キーを示す下線),商品コード,数量,買上げ金額。月間買上げ:月間買上げ番号(主キー),得意先ID,買上げ年月,月間買上げ額,消込額。入金:入金番号(主キー),得意先ID,入金額,入金日,充当額。消込:図中の属性 a(空欄),消込充当額,消込日。図の関係は,得意先から入金,買上げ,月間買上げへの1対多,商品から買上げ明細への1対多,買上げから買上げ明細への1対多,月間買上げから買上げ及び消込への1対多,入金から消込への1対多を示す。図の凡例:属性名の実線の下線は主キーを示す。矢印は1対多を示す。
表1 各表の説明
表1「各表の説明」。得意先:得意先の情報。商品:E社が取り扱う商品の情報。買上げ:1伝票単位の買上げ情報。買上げ明細:1伝票を構成する商品単位の買上げ情報。月間買上げ:得意先の月間買上げ額と,月間買上げ額に対して充当された金額(消込額)に関する情報。入金:得意先からの入金額と,その入金を月間買上げ額に充当した金額(充当額)に関する情報。消込:ある入金からある月間買上げに対して,充当した金額(消込充当額)の情報。
表2 主な表の属性の説明
表2「主な表の属性の説明」。月間買上げ:月間買上げ額=ある得意先の,ある年月1か月分の買上げ金額。消込額=月間買上げ額のうち,既に充当された金額。入金:入金額=ある得意先から入金された金額。充当額=入金額のうち,月間買上げに既に充当した金額。消込:消込充当額=ある入金からある月間買上げに対して,消込み処理で充当した金額。
図2 消込み処理の流れ図
図2「消込み処理の流れ図」。開始後,入金表から b の条件を満たすレコードを整列して取得し,取得したレコードのうち先頭のものを[入金]とする。消込み①では[入金]がないかを判定する。入金がある場合,月間買上げ表から[入金].得意先IDと同じ得意先IDをもち,c の条件を満たすレコードを整列して取得し,先頭のものを[月間買上げ]とする。変数1 ← e。消込み②では[月間買上げ]がないかを判定する。月間買上げがある場合,変数2 ← f とし,変数1 > 変数2 を判定する。Yesの場合,[月間買上げ].消込額 ← [月間買上げ].月間買上げ額,[月間買上げ]表で月間買上げ表を更新する,[入金].充当額 ← [入金].充当額+変数2,[入金]表で入金表を更新する。さらに,消込表に変数2の値を消込充当額として,消込みに使用した入金と月間買上げの情報をもつレコードを登録し,変数1 ← 変数1-変数2 とする。その後,βで取得したレコードのうち次のものを[月間買上げ]とし,消込み②を繰り返す。Noの場合,[月間買上げ].消込額 ← [月間買上げ].消込額+変数1,[月間買上げ]表で月間買上げ表を更新する,[入金].充当額 ← [入金].入金額,[入金]表で入金表を更新する。消込表に変数1の値を消込充当額として,消込みに使用した入金と月間買上げの情報をもつレコードを登録する。消込み②の後,αで取得したレコードのうち次のものを[入金]とし,消込み①を繰り返す。入金がない場合は終了する。図の注記:「[X]」はX表の処理中のレコードを表し,「[X].Y」はX表の処理中のレコードの属性Yを表す。
問問5 設問1
図1中の空欄 a に入れる属性の組として適切な答えを,解答群の中から選べ。
- ア 消込番号,月間買上げ番号
- イ 消込番号,入金番号
- ウ 得意先ID,消込番号
- エ 得意先ID,月間買上げ番号
- オ 得意先ID,入金番号
- カ 入金番号,月間買上げ番号
出典:平成29年度 秋期 基本情報技術者試験 午後 問5 設問1
問問5 設問2
図2は,消込み処理の流れ図である。次の記述及び図2中の空欄に入れる適切な答えを,解答群の中から選べ。図2のα部分では,入金表から b の条件を満たすレコードを,得意先IDの昇順,入金日の昇順に整列して取得する。消込み①の繰返し処理では,取得したレコードを順に処理する。βの部分では,消込み①の繰返しで処理中のレコードの得意先IDと同じ得意先IDをもつ月間買上げ表のレコードのうち,c の条件を満たすレコードを,d に整列して取得する。消込み②の繰返し処理では,取得したレコードを順に処理する。
bに関する解答群
ア 入金額 = 充当額
イ 入金額 > 充当額
ウ 入金額 < 充当額
エ 充当額 = 0
cに関する解答群
ア 月間買上げ額 > 0
イ 月間買上げ額 > 消込額
ウ 消込額 = 0
エ 消込額 > 0
オ 消込額 = 月間買上げ額
カ 消込額 > 月間買上げ額
dに関する解答群
ア 買上げ年月の降順
イ 買上げ年月の昇順
ウ 消込額の降順
エ 月間買上げ額の昇順
オ 得意先IDの昇順
e、fに関する解答群
ア [月間買上げ].月間買上げ額 + [月間買上げ].消込額
イ [月間買上げ].月間買上げ額 - [月間買上げ].消込額
ウ [月間買上げ].消込額 - [月間買上げ].月間買上げ額
エ [入金].入金額 + [入金].充当額
オ [入金].入金額 - [入金].充当額
カ [入金].充当額 - [入金].入金額
- B-ア 入金額 = 充当額
- B-イ 入金額 > 充当額
- B-ウ 入金額 < 充当額
- B-エ 充当額 = 0
- C-ア 月間買上げ額 > 0
- C-イ 月間買上げ額 > 消込額
- C-ウ 消込額 = 0
- C-エ 消込額 > 0
- C-オ 消込額 = 月間買上げ額
- C-カ 消込額 > 月間買上げ額
- D-ア 買上げ年月の降順
- D-イ 買上げ年月の昇順
- D-ウ 消込額の降順
- D-エ 月間買上げ額の昇順
- D-オ 得意先IDの昇順
- E-ア [月間買上げ].月間買上げ額 + [月間買上げ].消込額
- E-イ [月間買上げ].月間買上げ額 - [月間買上げ].消込額
- E-ウ [月間買上げ].消込額 - [月間買上げ].月間買上げ額
- E-エ [入金].入金額 + [入金].充当額
- E-オ [入金].入金額 - [入金].充当額
- E-カ [入金].充当額 - [入金].入金額
- F-ア [月間買上げ].月間買上げ額 + [月間買上げ].消込額
- F-イ [月間買上げ].月間買上げ額 - [月間買上げ].消込額
- F-ウ [月間買上げ].消込額 - [月間買上げ].月間買上げ額
- F-エ [入金].入金額 + [入金].充当額
- F-オ [入金].入金額 - [入金].充当額
- F-カ [入金].充当額 - [入金].入金額
出典:平成29年度 秋期 基本情報技術者試験 午後 問5 設問2
共通の文章
問6 情報システム運用サービスの予算策定と提示価格の計算に関する次の記述を読んで,設問1~3に答えよ。
A社は、顧客であるB社に対して、情報システムの運用サービス(以下、B社サービスという)を提供している。A社の運用サービス部では、B社サービスの提供に必要な次年度の費用を見積もり、見積もった費用(以下、予算という)を営業部に提出している。毎年度、営業部では、運用サービス部で作成した予算を基に、所定の利益率が維持できるようにB社サービスの提示価格を算出してB社と交渉している。近年は、B社から価格を下げるよう要求されることが多くなってきている。
B社サービスに関する2015~2017年度の3年度分の予算と実際に掛かった費用(以下、実績という)は、表1のとおりである。ただし、2017年度の実績は見込みであるが、ここでは実績と呼ぶ。
表1
表1「B社サービスに関する2015~2017年度の3年度分の予算と実績」。単位:千円。列は各年度の予算・実績。費目ごとの値は次のとおり。
| 費目 | 2015年度 予算 | 2015年度 実績 | 2016年度 予算 | 2016年度 実績 | 2017年度 予算 | 2017年度 実績 |
|---|---:|---:|---:|---:|---:|---:|
| 人件費 | 3,000 | 3,500 | 2,800 | 3,000 | 4,000 | 4,400 |
| サーバ費 | 1,200 | 1,250 | 1,250 | 1,400 | 1,400 | 1,250 |
| PC費 | 500 | 500 | 500 | 500 | 640 | 640 |
| ネットワーク費 | 200 | 220 | 250 | 240 | 250 | 250 |
| その他経費 | 1,000 | 1,200 | 1,000 | 1,100 | 1,000 | 1,000 |
| 合計 | 5,900 | 6,670 | 5,800 | 6,240 | 7,290 | 7,540 |
表2
表2「B社サービスに関する2018年度の予算」。単位:千円。列は費目・予算。人件費とPC費の予算欄は網掛けで、値は表示されていない。表に印刷されている値は、サーバ費1,300、ネットワーク費a、その他経費1,100、合計6,300。注記:「網掛けの部分は表示していない。」
設問1 解答群
設問1の解答群。各選択肢の文は次のとおり。
設問2 a 解答群
設問2の解答群a。選択肢は、ア 220、イ 230、ウ 240、エ 250、オ 260、カ 270。
設問2 b 解答群
設問2の解答群b。選択肢は次のとおり。
ア サーバ費の割合とその他経費の割合が上がって、それら以外の費目の割合が下がっている
イ サーバ費の割合とその他経費の割合が下がって、それら以外の費目の割合が上がっている
ウ 人件費の割合が上がって、それ以外の費目の割合が下がっている
エ 人件費の割合が下がって、それ以外の費目の割合が上がっている
オ 人件費の割合とサーバ費の割合が上がって、それら以外の費目の割合が下がっている
カ 人件費の割合とサーバ費の割合が下がって、それら以外の費目の割合が上がっている
設問3 c 解答群
設問3 c の解答群は、ア 5,670、イ 6,300、ウ 6,930、エ 7,000。
設問3 d 解答群
設問3 d の解答群は、ア 10%未満の、イ 10%の、ウ 10%よりも大きな。
設問3 e 解答群
設問3 e の解答群は、ア 上がる、イ 変わらない、ウ 下がるがゼロ以下にはならない、エ 下がってゼロになる、オ 下がってマイナスになる。
設問3 f 解答群
設問3 f の解答群は、ア 5.5、イ 6.1、ウ 7.1、エ 7.9、オ 8.0、カ 8.9。
問問6 設問1
運用サービス部では、B社サービスに関する2018年度の予算を作成するに当たって、表1を用いて2015~2017年度の3年度分の予算と実績に関する傾向を分析した。正しい答えを、解答群の中から選べ。
- ア 人件費の実績は、3年度とも、各年度の実績の合計の過半を占めている。
- イ サーバ費の実績は、2年度連続で上がっている。
- ウ PC費の実績は、2016年度の前年度に対する増分よりも、2017年度の前年度に対する増分の方が小さい。
- エ ネットワーク費の予算は2年度連続で下がっているが、ネットワーク費の実績は2年度連続で上がっている。
- オ その他経費は、各費目中で、予算も実績も2015年度は2番目に大きい費目であったが、2017年度は3番目に大きい費目となっている。
- カ 各費目の実績の合計は、3年度とも、各費目の予算の合計を上回っている。
出典:平成29年度 秋期 基本情報技術者試験 午後 問6 設問1
問問6 設問2
B社サービスに関する2018年度の予算について、次の記述中の空欄に入れる正しい答えを、解答群の中から選べ。
運用サービス部では、B社サービスに関する2018年度の予算を次のとおり作成した。
(1) 人件費の予算は、2016年度の人件費の実績と同じとする。
(2) サーバ費の予算は、2015~2017年度のサーバ費の実績の平均とする。
(3) PC費の予算は、2017年度のPC費の実績と同じとする。
(4) ネットワーク費の予算は、ネットワーク費の実績を用いて、2016年度に対する2017年度の増分を2017年度の実績に加えたものとする。
(5) その他経費の予算は、2015~2017年度のその他経費の実績の平均とする。
運用サービス部で作成したB社サービスに関する2018年度の予算を、表2に示す。
2018年度の各費目の予算が予算の合計に占める割合を、2017年度の各費目の実績が実績の合計に占める割合と比較すると、空欄b。
aに関する解答群
ア 220
イ 230
ウ 240
エ 250
オ 260
カ 270
bに関する解答群
ア サーバ費の割合とその他経費の割合が上がって、それら以外の費目の割合が下がっている
イ サーバ費の割合とその他経費の割合が下がって、それら以外の費目の割合が上がっている
ウ 人件費の割合が上がって、それ以外の費目の割合が下がっている
エ 人件費の割合が下がって、それ以外の費目の割合が上がっている
オ 人件費の割合とサーバ費の割合が上がって、それら以外の費目の割合が下がっている
カ 人件費の割合とサーバ費の割合が下がって、それら以外の費目の割合が上がっている
- A-ア 220
- A-イ 230
- A-ウ 240
- A-エ 250
- A-オ 260
- A-カ 270
- B-ア サーバ費の割合とその他経費の割合が上がって、それら以外の費目の割合が下がっている
- B-イ サーバ費の割合とその他経費の割合が下がって、それら以外の費目の割合が上がっている
- B-ウ 人件費の割合が上がって、それ以外の費目の割合が下がっている
- B-エ 人件費の割合が下がって、それ以外の費目の割合が上がっている
- B-オ 人件費の割合とサーバ費の割合が上がって、それら以外の費目の割合が下がっている
- B-カ 人件費の割合とサーバ費の割合が下がって、それら以外の費目の割合が上がっている
出典:平成29年度 秋期 基本情報技術者試験 午後 問6 設問2
問問6 設問3
2018年度の提示価格に関する次の記述中の空欄に入れる適切な答えを、解答群の中から選べ。
営業部では、運用サービス部が作成した予算を基に、利益率が10%となるようにB社サービスの提示価格を算出した。2018年度の提示価格は、空欄c千円となった。ここで、利益率は、提示価格から予算を引いた額を提示価格で割った値であり、100を乗じて%表示する。
営業部がB社にB社サービスの提示価格を提案したところ、提示価格から10%低い価格(以下、要求価格という)を要求された。
運用サービス部と営業部で検討した結果、サービスレベルの変更についてB社と合意できれば、その他経費を10%、人件費を5%削減できることが分かった。この場合、2018年度の予算の合計は空欄d削減となり、要求価格と同額を提示価格とすると、利益率は空欄e。
また、作業の一部を自動化することによって、人件費を先の5%と合わせて15%削減できることが分かった。ただし、この場合には、サーバ費については5%上がる見込みである。運用サービス部では、先のその他経費の10%削減と合わせてB社サービスの2018年度の予算を再度作成した。このとき、提示価格を要求価格と同額にすると、利益率は空欄f%。ここで、%表示する値は、利益率に100を乗じて小数第2位で四捨五入したものである。
cに関する解答群
ア 5,670
イ 6,300
ウ 6,930
エ 7,000
dに関する解答群
ア 10%未満の
イ 10%の
ウ 10%よりも大きな
eに関する解答群
ア 上がる
イ 変わらない
ウ 下がるがゼロ以下にはならない
エ 下がってゼロになる
オ 下がってマイナスになる
fに関する解答群
ア 5.5
イ 6.1
ウ 7.1
エ 7.9
オ 8.0
カ 8.9
- C-ア 5,670
- C-イ 6,300
- C-ウ 6,930
- C-エ 7,000
- D-ア 10%未満の
- D-イ 10%の
- D-ウ 10%よりも大きな
- E-ア 上がる
- E-イ 変わらない
- E-ウ 下がるがゼロ以下にはならない
- E-エ 下がってゼロになる
- E-オ 下がってマイナスになる
- F-ア 5.5
- F-イ 6.1
- F-ウ 7.1
- F-エ 7.9
- F-オ 8.0
- F-カ 8.9
出典:平成29年度 秋期 基本情報技術者試験 午後 問6 設問3
共通の文章
問7 購買管理システムの導入による業務改善効果に関する次の記述を読んで,設問1,2に答えよ。
日用品メーカのC社では,ソフトウェアパッケージを用いた購買管理システムの導入を進めており,システムの要件定義を終えたところである。定義された要件には,ソフトウェアパッケージの機能を活用できる要件と,追加でシステム開発が必要な要件(以下,システム要件という)がある。全てのシステム要件を実現すると,開発費が当初の予算を超えることが分かった。そこで,各システム要件を実現した場合に削減される1年間のコスト(以下,年間効果という)と必要な開発費とを併せて評価し,実現するシステム要件を決定することにした。この決定に当たっては,購買管理システムの保守運用費は考慮しないものとする。
C社は,システム要件8件について評価することにした。
表1 年間効果を試算するための条件
【表1 年間効果を試算するための条件】列は試算条件,現状値,将来値。注文書に対して提出される注文請書枚数(枚/日):200,200。注文請書の誤りの発生枚数(枚/日):18,3。注文請書と注文書との目視での照合及び再照合の作業に要する時間(分/枚):5,0。誤りが見つかった注文請書の再提出の依頼作業に要する時間(分/枚):10,5。作業に要する人件費(円/時間):1,400,1,400。
表の将来値はシステム化後の作業状況を想定して設定した値である。再照合時に誤りは発生しないものとする。
表2 システム要件に対する年間効果の試算と分類の結果
【表2 システム要件に対する年間効果の試算と分類の結果】単位:千円。列は要件ID,システム要件,開発費,年間効果,分類。SYS901:システム要件欄は網掛けで非表示,開発費5,800,年間効果4,800,必須要件。SYS902:システム要件欄は網掛けで非表示,開発費6,200,年間効果7,320,必須要件。SYS903:システム要件欄は網掛けで非表示,開発費1,200,年間効果670,要望要件。SYS904:「仕入先からの注文請書を購買管理システムで処理できるようにする」,開発費12,400,年間効果欄は網掛けで非表示,必須要件。SYS905:システム要件欄は網掛けで非表示,開発費2,750,年間効果1,640,要望要件。SYS906:システム要件欄は網掛けで非表示,開発費4,300,年間効果520,要望要件。SYS907:システム要件欄は網掛けで非表示,開発費1,630,年間効果1,280,要望要件。SYS908:システム要件欄は網掛けで非表示,開発費1,800,年間効果2,160,要望要件。注記:網掛けの部分は表示していない。
図1 要望要件に分類したシステム要件の年間効果と効果率
【図1 要望要件に分類したシステム要件の年間効果と効果率】横軸は年間効果(千円),目盛は0,500,1,000,1,500,2,000,2,500。縦軸は効果率,目盛は0.00から1.40まで0.20刻み。プロット点は表2の要望要件に対応する。おおよその座標はSYS903(年間効果670,効果率約0.56),SYS905(1,640,約0.66),SYS906(520,約0.10),SYS907(1,280,約0.77),SYS908(2,160,1.20)。図中でSYS906とSYS908の点にはIDラベルが付されている。他の点にはIDラベルが付されていない。図には横長の網掛け領域が3箇所描かれている。注記:網掛けの部分は表示していない。
a,bに関する解答群
【a,bに関する解答群】ア:増加する。イ:減少するがゼロにならない。ウ:不要になる。エ:変わらない。
cに関する解答群
【cに関する解答群】列は選択肢,c1(千円),c2(千円)。ア:6,608,84。イ:6,608,6,524。ウ:7,028,6,524。エ:7,112,84。オ:7,112,7,028。
dに関する解答群
【dに関する解答群】ア:SYS903もSYS907も採用できる。イ:SYS903もSYS907も採用できない。ウ:SYS903は採用できるが,SYS907は採用できない。エ:SYS907は採用できるが,SYS903は採用できない。
eに関する解答群
【eに関する解答群】ア:SYS903もSYS905も採用できる。イ:SYS903もSYS905も採用できない。ウ:SYS903は採用できるが,SYS905は採用できない。エ:SYS905は採用できるが,SYS903は採用できない。
fに関する解答群
【fに関する解答群】ア:SYS903とSYS905。イ:SYS903とSYS907。ウ:SYS905。エ:SYS907。
問問7 設問1
(1)システム化するための開発費と年間効果を試算する。また,各システム要件を,“必ず実現したい”という要件(以下,必須要件という)と,“できれば実現したい”という要件(以下,要望要件という)に分類する。
(2)必須要件の一つである“仕入先からの注文請書を購買管理システムで処理できるようにする”の年間効果を試算する。購買管理システムは仕入先も利用するものとし,システム化によって,C社での注文請書の確認と再提出依頼の作業は次のようになる。
① 仕入先からファックスで送付されてきた注文請書の内容と注文書の内容の目視での照合に代えて,購買管理システム上のデータチェックで照合を行う。
② データチェックで誤りが見つかったときに,仕入先への注文請書の再提出の依頼をWeb画面で行う。
③ 再提出された注文請書の内容と注文書の内容の照合(以下,再照合という)も購買管理システムで行う。
上記①~③の年間効果を試算するために,注文請書の確認と再提出依頼の作業状況を調査して条件を設定した。その結果を表1に示す。将来値はシステム化後の作業状況を想定して設定した値である。ここで,再照合時に誤りは発生しないものとする。
(3)表1の将来値を設定するに当たり,注文請書と注文書との目視での照合及び再照合の作業に要する時間は,システム化によって空欄aと想定した。また,仕入先がWebを介して注文書の確認と注文請書の送信を行うことによって,注文請書の誤りの発生枚数は空欄bと想定した。
1年当たりの稼働日数を240日とすると,現状で注文請書の確認,再提出依頼及び再照合の作業に要する年間費用は空欄c1千円であり,システム化された場合には空欄c2千円となって,この差額が年間効果となる。
a、bに関する解答群
ア 増加する
イ 減少するがゼロにならない
ウ 不要になる
エ 変わらない
cに関する解答群
ア c1:6,608千円,c2:84千円
イ c1:6,608千円,c2:6,524千円
ウ c1:7,028千円,c2:6,524千円
エ c1:7,112千円,c2:84千円
オ c1:7,112千円,c2:7,028千円
- A-ア 増加する
- A-イ 減少するがゼロにならない
- A-ウ 不要になる
- A-エ 変わらない
- B-ア 増加する
- B-イ 減少するがゼロにならない
- B-ウ 不要になる
- B-エ 変わらない
- C-ア c1:6,608千円,c2:84千円
- C-イ c1:6,608千円,c2:6,524千円
- C-ウ c1:7,028千円,c2:6,524千円
- C-エ c1:7,112千円,c2:84千円
- C-オ c1:7,112千円,c2:7,028千円
出典:平成29年度 秋期 基本情報技術者試験 午後 問7 設問1
問問7 設問2
表2に示した三つの必須要件については全て採用するものとし,五つの要望要件については開発費と年間効果を評価して,採用,不採用を決定することにした。必須要件を含めて購買管理システムのシステム化のための開発費が予算の30,000千円に収まるように要望要件を選択することにした。
選択に当たり,開発費に対する年間効果の割合(以下,効果率という)も選択条件とした。要望要件に分類したシステム要件の年間効果と効果率を,図1に示す。
(1)SYS908は,効果率も年間効果も最も大きく,開発費が予算に収まるので,採用とした。また,効果率も年間効果も最も小さいSYS906は不採用とした。
(2)続いて,残りの三つの要望要件から,開発費が予算に収まり,年間効果が最大になるような選択を行うこととした。
① SYS905を採用したとき,開発費の予算を考えると空欄d。この場合,開発費の総額は28,950千円となり,年間効果は22,948千円となる。
② 一方,SYS907を採用したとき,開発費の予算を考えると空欄e。この場合,開発費の総額は29,030千円となり,年間効果は23,258千円となる。
(1),(2)の評価の結果,開発費が予算に収まり,年間効果を最大にするには,要望要件はSYS908に加えて空欄fを採用すればよい。
dに関する解答群
ア SYS903もSYS907も採用できる
イ SYS903もSYS907も採用できない
ウ SYS903は採用できるが,SYS907は採用できない
エ SYS907は採用できるが,SYS903は採用できない
eに関する解答群
ア SYS903もSYS905も採用できる
イ SYS903もSYS905も採用できない
ウ SYS903は採用できるが,SYS905は採用できない
エ SYS905は採用できるが,SYS903は採用できない
fに関する解答群
ア SYS903とSYS905
イ SYS903とSYS907
ウ SYS905
エ SYS907
- D-ア SYS903もSYS907も採用できる
- D-イ SYS903もSYS907も採用できない
- D-ウ SYS903は採用できるが,SYS907は採用できない
- D-エ SYS907は採用できるが,SYS903は採用できない
- E-ア SYS903もSYS905も採用できる
- E-イ SYS903もSYS905も採用できない
- E-ウ SYS903は採用できるが,SYS905は採用できない
- E-エ SYS905は採用できるが,SYS903は採用できない
- F-ア SYS903とSYS905
- F-イ SYS903とSYS907
- F-ウ SYS905
- F-エ SYS907
出典:平成29年度 秋期 基本情報技術者試験 午後 問7 設問2
共通の文章
問8 次のプログラムの説明及びプログラムを読んで,設問1~4に答えよ。
文字列の誤りを検出するために,N種類の文字に0,1,…,N−1の整数値を重複なく割り当て,検査文字を生成するプログラムと,元となる文字列の末尾に検査文字を追加した検査文字付文字列を検証するプログラムである。ここで扱う30種類の文字,及び文字に割り当てた数値を表1に示す。空白文字は「□」と表記する。
表1
表1「文字,及び文字に割り当てた数値」。文字と数値の対応:□→0,.→1,,→2,?→3,a→4,b→5,c→6,d→7,e→8,f→9,g→10,h→11,i→12,j→13,k→14,l→15,m→16,n→17,o→18,p→19,q→20,r→21,s→22,t→23,u→24,v→25,w→26,x→27,y→28,z→29。
検査文字の生成・検証の手順
プログラムの説明:(1) 検査文字の生成。① 文字列の末尾の文字を1番目の文字とし,文字列の先頭に向かって奇数番目の文字に割り当てた数値を2倍してNで割り,商と余りの和を求め,全て足し合わせる。② 偶数番目の文字に割り当てた数値は,そのまま全て足し合わせる。③ ①と②の結果を足し合わせる。④ Nから③で求めた総和をNで割った余りを引く。さらにその結果をNで割り,余りを求める。求めた数値に対応する文字を検査文字とする。(2) 検査文字付文字列の検証。① 検査文字付文字列の末尾の文字を1番目の文字とし,文字列の先頭に向かって偶数番目の文字に割り当てた数値を2倍してNで割り,商と余りの和を求め,全て足し合わせる。② 奇数番目の文字に割り当てた数値は,そのまま全て足し合わせる。③ ①と②の結果を足し合わせる。④ ③で求めた総和がNで割り切れる場合は誤りがないと判定し,割り切れない場合は誤りがあると判定する。生成例:文字列 ipa□□ に対する検査文字は f。検査文字付文字列は ipa□□f。
表2
表2「関数 calcCheckCharacter の引数及び返却値の仕様」:input[]は文字型・入力・文字列が格納されている1次元配列。lenは整数型・入力・文字列の文字列長(1以上)。返却値は文字型・出力・生成した検査文字。関数 calcCheckCharacter は関数 getValue,関数 getChar を使用する。
表3および関数仕様
表3「関数 validateCheckCharacter の引数及び返却値の仕様」:input[]は文字型・入力・検査文字付文字列が格納されている1次元配列。lenは整数型・入力・検査文字付文字列の文字列長(2以上)。返却値は論理型・出力・誤りがないと判定した場合 true,誤りがあると判定した場合 false。関数 validateCheckCharacter は関数 getValue を使用する。関数 getValue は表1に従い,引数の文字に割り当てた数値を返す。関数 getChar は表1に従い,引数の数値に対応する文字を返す。
プログラム
設問1のプログラム。calcCheckCharacter(input[], len):整数型 N, sum, i, value, check_value;論理型 is_even。N←30,sum←0,is_even←false。iをlenから1まで−1ずつ変化させて繰り返す:value←getValue(input[i])。is_even == [a1] の場合 sum←sum+value,それ以外の場合 sum←sum+(value×2)÷N+(value×2)%N。繰返しごとに is_even←not is_even。check_value←[b]。getChar(check_value)を返す。validateCheckCharacter(input[], len):整数型 N, sum, i, value;論理型 is_odd, ret_value。N←30,sum←0,is_odd←true,ret_value←true。iをlenから1まで−1ずつ変化させて繰り返す:value←getValue(input[i])。is_odd == [a2] の場合 sum←sum+value,それ以外の場合 sum←sum+(value×2)÷N+(value×2)%N。繰返しごとに is_odd←not is_odd。ループ後,[c] の場合 ret_value←false。ret_valueを返す。配列の添字は1から始まる。
設問1・aの解答群
設問1 aに関する解答群(列見出し:a1,a2):ア=false,false;イ=false,true;ウ=true,false;エ=true,true。
設問1・bの解答群
設問1 bに関する解答群:ア N−sum%N;イ sum%N;ウ (N−sum%N)%N;エ (sum−N)%N。
設問1・cの解答群
設問1 cに関する解答群:ア sum÷N=0;イ sum÷N≠0;ウ sum%N=0;エ sum%N≠0。
設問2・dの解答群
設問2 dに関する解答群:ア 1と2と3と4である;イ 2である;ウ 2と3である;エ 2と3と4である;オ 2と4である;カ ない。
表4
表4「検査文字付文字列」:ケース1 ipb□□f;ケース2 api□□f;ケース3 pia□□f;ケース4 □□apif。設問2の本文は,複数の文字に誤りがある場合に誤りがないと判定されることがある例を問い,表4の検査文字付文字列を validateCheckCharacter で検証する。文字列 ipa□□ に対し生成される検査文字は f。
図1
図1「作成中の検査文字付表」。文字列長5の4個の文字列 ipa␣␣,tests,make␣,it.␣␣ を上の行から順に格納し,先頭位置を最左列にそろえる。列1~5の内容:行1 i,p,a,␣,␣;行2 t,e,s,t,s;行3 m,a,k,e,␣;行4 i,t,.,␣,␣。列6は空欄。
検査文字付表の作成・検証方法
検査文字付表の作成方法:文字列長が n である m 個の文字列について,(m+1)行(n+1)列の表を用意する。各文字列の先頭位置を最左列にそろえて,上の行から順に表に格納する。太枠内の各行各列をそれぞれ文字列とみなして検査文字を生成し,最右列と最下行に格納する。図1の4行5列目(太枠内)の検査文字が設問3の空欄である。検査文字付表の検証では,作成した表の最下行を除く各行と,最右列を除く各列を文字列とみなし,それぞれ validateCheckCharacter で検証する。全て誤りがないと判定された場合は表に誤りがないと判定し,一つでも誤りがあると判定された場合は表に誤りがあると判定する。
図2
図2「完成した検査文字付表」。列1~6の内容:行1 i,p,a,␣,␣,f;行2 t,e,s,t,s,i;行3 m,a,k,e,␣,n;行4 i,t,.,␣,␣,h;行5 r,a,v,b,網掛け空欄,空欄。行5列5は網掛け部分で、印刷上は空欄。設問3では,表の5行5列目(網掛け部分)の検査文字を問う。
設問3・eの解答群
設問3 eに関する解答群:ア j;イ k;ウ l;エ m。
図3
図3「1行目を取り除いた検査文字付表」。行1は空欄。行2~5は図2と同じ内容(行2 t,e,s,t,s,i;行3 m,a,k,e,␣,n;行4 i,t,.,␣,␣,h;行5 r,a,v,b,網掛けの正しい値,空欄)。注記:5行5列目(網掛け部分)には設問3の正しい答えが入っているものとする。設問4では,表4のケース1~4の検査文字付文字列を順に図3の1行目に格納して検証する。
設問4・fの解答群
設問4 fに関する解答群:ア 1と2と3と4である;イ 2である;ウ 2と3である;エ 2と3と4である;オ 2と4である;カ ない。
問問8 設問1
プログラム中の空欄に入れる正しい答えを解答群の中から選べ。a1とa2に入れる答えは,aに関する解答群から組合せとして正しいものを選ぶ。
aに関する解答群
ア a1=false,a2=false
イ a1=false,a2=true
ウ a1=true,a2=false
エ a1=true,a2=true
bに関する解答群
ア N−sum%N
イ sum%N
ウ (N−sum%N)%N
エ (sum−N)%N
cに関する解答群
ア sum÷N=0
イ sum÷N≠0
ウ sum%N=0
エ sum%N≠0
- A-ア a1=false,a2=false
- A-イ a1=false,a2=true
- A-ウ a1=true,a2=false
- A-エ a1=true,a2=true
- B-ア N−sum%N
- B-イ sum%N
- B-ウ (N−sum%N)%N
- B-エ (sum−N)%N
- C-ア sum÷N=0
- C-イ sum÷N≠0
- C-ウ sum%N=0
- C-エ sum%N≠0
出典:平成29年度 秋期 基本情報技術者試験 午後 問8 設問1
問問8 設問2
本プログラムでは,検査文字付文字列の誤りが1文字であれば誤りを検出できる。しかし,複数の文字に誤りがある場合には,誤りがないと判定されることがある。例えば,関数 validateCheckCharacter で表4に示す検査文字付文字列を検証した場合,誤りがないと判定されるケースはどれか。文字列 ipa␣␣ に対し生成される検査文字は f である。
- ア 1と2と3と4である
- イ 2である
- ウ 2と3である
- エ 2と3と4である
- オ 2と4である
- カ ない
出典:平成29年度 秋期 基本情報技術者試験 午後 問8 設問2
問問8 設問3
本プログラムを文字列長が同じである複数の文字列に対して適用することを考える(図1参照)。文字列長が5である4個の文字列を用いて作成した検査文字付表(図2)の5行5列目(網掛け部分)の検査文字は何か。
出典:平成29年度 秋期 基本情報技術者試験 午後 問8 設問3
問問8 設問4
図2の1行目の検査文字付文字列を取り除いた,図3の検査文字付表について考える。表4のケース1~4の検査文字付文字列を順に図3の1行目に格納して検証した場合,検査文字付表に誤りがないと判定されるケースはどれか。
- ア 1と2と3と4である
- イ 2である
- ウ 2と3である
- エ 2と3と4である
- オ 2と4である
- カ ない
出典:平成29年度 秋期 基本情報技術者試験 午後 問8 設問4
共通の文章
問9 次のCプログラムの説明及びプログラムを読んで、設問1~3に答えよ。
【プログラムの説明】
文字列の中から、回文(palindrome)を探して表示する関数 find_palindrome である。回文とは、先頭から読んだ文字の並びと末尾から読んだ文字の並びが一致する文字の並びのことである。ただし、ここでは次の条件を満たすものとする。
・文字列は英字(A~Z、a~z)、数字(0~9)、記号(! " # % & ’ ( ) * + , - . / : ; < = > ? [ ] ^ _ { | })及び空白文字から成る。
・文字の並びを読むとき、英字の大文字と小文字は区別しない。
・文字の並びを読むとき、記号及び空白文字は無視する。
・回文は英数字で始まり英数字で終わる。ただし、英数字1文字は回文ではない。
本問のプログラムが表示する回文の例を表1に示す。No.1で示す文字列において、文字の並び bc0cb は回文である。c0c も回文であるが、本問のプログラムでは、文字列の先頭に最も近い文字から始まるものを表示する。また、No.2で示す文字列において、英字の大文字と小文字は区別しないので、文字の並び Bc0Cb は回文である。さらに、No.3で示す文字列において、英字の大文字と小文字を区別せず、かつ、記号及び空白文字を無視するので、文字の並び B!c0 Cb は回文である。No.4で示す文字列において、文字列の先頭に最も近い b を先頭文字とする文字の並び bc0cb と bc0cb1bc0cb は、いずれも回文である。しかし、本問のプログラムでは、先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。
表1
表1「本問のプログラムが表示する回文の例」。列見出しは「No.」「文字列」「表示する回文」。行は、1: abc0cbe → bc0cb、2: ABc0CbE → Bc0Cb、3: AB!c0 CbE → B!c0 Cb、4: abc0cb1bc0cbe → bc0cb。
関数 find_palindrome の仕様
関数 find_palindrome の仕様:文字列 text の中から回文を探して表示する。複数の回文がある場合、先頭文字位置が文字列の先頭に最も近いものを表示する。先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。引数は text(文字列)。関数は is_palindrome 及び find_char を使用する。
関数 is_palindrome の仕様
関数 is_palindrome の仕様:文字の並び chars が回文かどうかを判定する。引数は chars(文字の並び)及び size(文字の並び chars の長さ)。回文の場合は1、回文でない場合は0を返す。
関数 find_char の仕様
関数 find_char の仕様:文字列 str 中で、文字 ch が最初に現れる位置を求める。ただし、英字の大文字と小文字は区別しない。引数は str(文字列)及び ch(文字)。文字 ch が現れる場合は最初に現れる位置へのポインタ、現れない場合は空ポインタを返す。
ライブラリ関数
使用するライブラリ関数の概要:isalnum(ch) は、文字 ch が英数字のとき0以外の値を返し、それ以外のとき0を返す。tolower(ch) は、文字 ch が英大文字のとき対応する英小文字を返し、それ以外のとき文字 ch を返す。putchar(ch) は文字 ch を表示する。
プログラム
プログラム(空欄 a、b、c を含む)。
1 #include <stdio.h>
2 #include <ctype.h>
3 void find_palindrome(const char*);
4 int is_palindrome(const char*, int);
5 const char* find_char(const char*, char);
6 void find_palindrome(const char* text) {
7 int i;
8 int psize; /* 文字の並びの長さ */
9 const char* ith; /* 文字列 text の第 i 文字へのポインタ */
10 const char* hit; /* 第 i 文字と一致した文字へのポインタ */
11 for (i = 0; text[i] != '\0'; i++) {
12 if (!isalnum(text[i])) {
13 continue;
14 }
15 ith = &text[i];
16 hit = find_char(ith + 1, *ith);
17 while (hit != NULL) {
18 psize = [a];
19 if (is_palindrome(ith, psize)) {
20 while (ith < hit + 1) {
21 putchar(*ith);
22 ith++;
23 }
24 putchar('\n');
25 return;
26 }
27 hit = find_char(hit + 1, *ith);
28 }
29 }
30 }
31 int is_palindrome(const char* chars, int size) {
32 int l;
33 int r;
34 for (l = 0, r = size - 1; l < r; l++, r--) {
35 while (!isalnum(chars[l])) {
36 l++;
37 }
38 while (!isalnum(chars[r])) {
39 r--;
40 }
41 if ([b]) {
42 return 0;
43 }
44 }
45 return 1;
46 }
47 const char* find_char(const char* str, char ch) {
48 int i;
49 for (i = 0; str[i] != '\0'; i++) {
50 if ([c]) {
51 return &str[i];
52 }
53 }
54 return NULL;
55 }
関数 find_last_char の仕様
関数 find_last_char の仕様:文字列 str の先頭から文字数 count 以内の範囲で、文字 ch が現れる最後の位置を求める。ただし、英字の大文字と小文字は区別しない。引数は str(文字列)、ch(文字)、count(文字数)。文字 ch が現れる場合は最後に現れる位置へのポインタ、現れない場合は空ポインタを返す。
strlen の仕様
strlen(text) は文字列 text の長さを返す。ただし、終端ナル文字 '\0' は含まない。
表2
表2「プログラムの変更内容」。処置と変更内容:行番号2と3の間に追加 → #include <string.h>。行番号5を変更 → const char* find_last_char(const char*, char, int);。行番号10と11の間に追加 → unsigned int textlen = strlen(text);。行番号16を変更 → hit = find_last_char(ith + 1, *ith, textlen - i - 1);。行番号27を変更 → hit = find_last_char(ith + 1, *ith, [d]);。行番号47~49を変更 → const char* find_last_char(const char* str, char ch, int count) { int i; for ([e]; i--) {
設問3の入力文字列
設問3で実行する文字列。記号「␣」は空白文字を表す:No!␣Madam,␣I’m␣Adam␣Graham.␣This␣is␣my␣gym.
問問9 設問1
プログラム中の空欄に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア i
イ ith - &text[0]
ウ ith - &text[0] + 1
エ hit - ith
オ hit - ith + 1
bに関する解答群
ア l == r
イ l != r
ウ chars[l] == chars[r]
エ chars[l] != chars[r]
オ tolower(chars[l]) == tolower(chars[r])
カ tolower(chars[l]) != tolower(chars[r])
cに関する解答群
ア ch == str[i]
イ ch != str[i]
ウ tolower(ch) == tolower(str[i])
エ tolower(ch) != tolower(str[i])
オ (ch == tolower(str[i])) || (tolower(ch) == str[i])
カ (ch == tolower(str[i])) && (tolower(ch) == str[i])
- A-ア i
- A-イ ith - &text[0]
- A-ウ ith - &text[0] + 1
- A-エ hit - ith
- A-オ hit - ith + 1
- B-ア l == r
- B-イ l != r
- B-ウ chars[l] == chars[r]
- B-エ chars[l] != chars[r]
- B-オ tolower(chars[l]) == tolower(chars[r])
- B-カ tolower(chars[l]) != tolower(chars[r])
- C-ア ch == str[i]
- C-イ ch != str[i]
- C-ウ tolower(ch) == tolower(str[i])
- C-エ tolower(ch) != tolower(str[i])
- C-オ (ch == tolower(str[i])) || (tolower(ch) == str[i])
- C-カ (ch == tolower(str[i])) && (tolower(ch) == str[i])
出典:平成29年度 秋期 基本情報技術者試験 午後 問9 設問1
問問9 設問2
関数 find_palindrome が、先頭文字位置が同じ回文が複数ある場合、長さが最も長いものを表示するように、プログラムを変更する。表2中の空欄に入れる正しい答えを、解答群の中から選べ。
dに関する解答群
ア textlen - psize
イ textlen - i - psize
ウ textlen - i + psize
エ psize + 2
オ psize - 2
eに関する解答群
ア i = count; i > 0
イ i = count; i >= 0
ウ i = count - 1; i > 0
エ i = count - 1; i >= 0
- D-ア textlen - psize
- D-イ textlen - i - psize
- D-ウ textlen - i + psize
- D-エ psize + 2
- D-オ psize - 2
- E-ア i = count; i > 0
- E-イ i = count; i >= 0
- E-ウ i = count - 1; i > 0
- E-エ i = count - 1; i >= 0
出典:平成29年度 秋期 基本情報技術者試験 午後 問9 設問2
問問9 設問3
設問2で変更した関数 find_palindrome を、図示された文字列を引数として実行した。空白文字は記号「␣」で示す。関数 find_palindrome が回文の表示を終了するまでに、関数 find_last_char は何回呼び出され、その最後の呼出しにおける引数 count の値はいくらか。
fに関する解答群
ア 2
イ 3
ウ 4
エ 5
オ 6
カ 7
gに関する解答群
ア 13
イ 20
ウ 31
エ 36
オ 38
- F-ア 2
- F-イ 3
- F-ウ 4
- F-エ 5
- F-オ 6
- F-カ 7
- G-ア 13
- G-イ 20
- G-ウ 31
- G-エ 36
- G-オ 38
出典:平成29年度 秋期 基本情報技術者試験 午後 問9 設問3
共通の文章
問10 次のCOBOLプログラムの説明及びプログラムを読んで,設問1~3に答えよ。
ある駐車場では,自動精算システムを導入している。利用者は,入庫時に利用番号と入庫時刻が記録された駐車券を受け取り,出庫時に駐車券を精算機に投入して駐車料金を支払う。連続した複数日にまたがる駐車も可能である。プログラム1は入庫時に入庫時刻を精算ファイルに記録するサブプログラムであり,プログラム2は出庫時に駐車料金を計算して出庫時刻とともに精算ファイルに記録し,駐車料金の値を呼出し元に返すサブプログラムである。
精算ファイルの説明・図1
(1)精算ファイルは,図1に示すレコード様式の索引ファイルであり,プログラムの実行時に既に存在する。主キーは利用番号である。ファイルの排他制御は適切に行われるものとする。
図1 精算ファイルのレコード様式:利用番号 8桁,入庫時刻 12桁,出庫時刻 12桁,駐車料金 6桁。
① 利用番号には,入庫時に発券される駐車券ごとに1ずつ増える8桁の数字が格納される。
② 入庫時刻及び出庫時刻には,西暦の年,月,日と,24時間表記の時(0~23),分(0~59)が,それぞれ4桁,2桁,2桁,2桁,2桁で格納される。
プログラム1の説明・図2
(2)プログラム1のパラメタの様式は,図2のとおりである。呼出し元プログラムから利用番号と入庫時刻を受け取る。
図2 プログラム1のパラメタの様式:利用番号 8桁,入庫時刻 12桁。
プログラム1
プログラム1
行番号 1 DATA DIVISION.
行番号 2 FILE SECTION.
行番号 3 FD ACCT-FILE.
行番号 4 01 ACCT-REC.
行番号 5 02 ACCT-NO PIC X(8).
行番号 6 02 ACCT-IN PIC 9(12).
行番号 7 02 ACCT-OUT PIC 9(12).
行番号 8 02 ACCT-FEE PIC 9(6).
行番号 9 LINKAGE SECTION.
行番号10 01 PRM.
行番号11 02 PRM-NO PIC X(8).
行番号12 02 PRM-IN PIC 9(12).
行番号13 PROCEDURE DIVISION USING PRM.
行番号14 MAIN-PROC.
行番号15 OPEN EXTEND ACCT-FILE.
行番号16 INITIALIZE ACCT-REC.
行番号17 MOVE PRM-NO TO ACCT-NO.
行番号18 MOVE PRM-IN TO ACCT-IN.
行番号19 WRITE ACCT-REC.
行番号20 CLOSE ACCT-FILE.
行番号21 EXIT PROGRAM.
プログラム2の説明・図3
(3)プログラム2のパラメタの様式は,図3のとおりである。呼出し元プログラムから利用番号と出庫時刻を受け取り,駐車料金の値を返す。
図3 プログラム2のパラメタの様式:利用番号 8桁,出庫時刻 12桁,駐車料金 6桁。
駐車料金の算出条件
(4)駐車料金は,入庫時刻を基準に駐車時間を1時間単位に区切って算出する。この単位を課金単位と呼び,1課金単位当たり300円を課金する。各課金単位の開始時刻の「分」は,入庫時刻と同じ「分」とする。各課金単位の開始時刻から1分以上が経過すると課金対象になる。例えば,10時30分に入庫して,11時30分に出庫した場合,課金単位は1で,駐車料金は300円である。10時30分に入庫して,11時31分に出庫した場合,2時間目の課金単位の開始時刻である11時30分から1分が経過しているので,課金単位は2となり,駐車料金は600円になる。駐車料金が999,999円を超えることはない。
INTEGER-OF-DATE
(5)プログラム2の中で使用している組込み関数 INTEGER-OF-DATE は,引数に指定された日付を西暦1601年1月1日からの通算の日数に変換して返す。
プログラム2
プログラム2
行番号 1 DATA DIVISION.
行番号 2 FILE SECTION.
行番号 3 FD ACCT-FILE.
行番号 4 01 ACCT-REC.
行番号 5 02 ACCT-NO PIC X(8).
行番号 6 02 ACCT-IN.
行番号 7 03 ACCT-I-DATE PIC 9(8).
行番号 8 03 ACCT-I-TIME.
行番号 9 04 ACCT-I-HH PIC 9(2).
行番号10 04 ACCT-I-MM PIC 9(2).
行番号11 02 ACCT-OUT.
行番号12 03 ACCT-O-DATE PIC 9(8).
行番号13 03 ACCT-O-TIME.
行番号14 04 ACCT-O-HH PIC 9(2).
行番号15 04 ACCT-O-MM PIC 9(2).
行番号16 02 ACCT-FEE PIC 9(6).
行番号17 WORKING-STORAGE SECTION.
行番号18 77 W-HRS PIC 9(4).
行番号19 LINKAGE SECTION.
行番号20 01 PRM1.
行番号21 02 PRM-NO PIC X(8).
行番号22 02 PRM-OUT PIC 9(12).
行番号23 01 PRM2.
行番号24 02 PRM-FEE PIC 9(6).
行番号25 PROCEDURE DIVISION USING PRM1 PRM2.
行番号26 MAIN-PROC.
行番号27 OPEN I-O ACCT-FILE.
行番号28 MOVE PRM-NO TO ACCT-NO.
行番号29 READ ACCT-FILE.
行番号30 MOVE PRM-OUT TO ACCT-OUT.
行番号31 PERFORM COMP-PROC.
行番号32 [空欄 a].
行番号33 REWRITE ACCT-REC.
行番号34 CLOSE ACCT-FILE.
行番号35 EXIT PROGRAM.
行番号36 COMP-PROC.
行番号37 COMPUTE W-HRS =
行番号38 (FUNCTION INTEGER-OF-DATE(ACCT-O-DATE) * 24 + ACCT-O-HH) [空欄 b]
行番号39 (FUNCTION INTEGER-OF-DATE(ACCT-I-DATE) * 24 + ACCT-I-HH).
行番号40 IF ACCT-I-MM < ACCT-O-MM THEN
行番号41 [空欄 c]
行番号42 END-IF.
行番号43 COMPUTE ACCT-FEE = W-HRS * 300.
設問1の発問
設問1 プログラム1における精算ファイルの呼出し法として正しい答えを,解答群の中から選べ。ここで,括弧内は,呼出し法に対応する環境部のファイル管理記述項におけるACCESS MODE句の書き方である。
設問1の解答群
設問1の解答群:ア 順呼出し(ACCESS MODE IS SEQUENTIAL)/イ 動的呼出し(ACCESS MODE IS DYNAMIC)/ウ 乱呼出し(ACCESS MODE IS RANDOM)。
設問2の発問
設問2 プログラム2中の[空欄]に入れる正しい答えを,解答群の中から選べ。
設問2・aの解答群
aに関する解答群:ア ADD PRM-FEE TO ACCT-FEE/イ MOVE ACCT-FEE TO PRM-FEE/ウ MOVE PRM-FEE TO ACCT-FEE/エ MOVE PRM-NO TO ACCT-NO。
設問2・bの解答群
bに関する解答群:ア */イ +/ウ -/エ /。
設問2・cの解答群
cに関する解答群:ア ADD 1 TO W-HRS/イ ADD ACCT-O-HH TO W-HRS/ウ SUBTRACT 1 FROM W-HRS/エ SUBTRACT ACCT-I-HH FROM W-HRS。
設問3の発問
設問3 夜間時間帯の料金割引を実施するために,プログラム2を変更する。夜間時間帯は20時00分から翌朝5時59分までとし,各課金単位の開始時刻が夜間時間帯に含まれるときは,1課金単位当たりの課金を100円とする。表1中の[空欄]に入れる正しい答えを,解答群の中から選べ。
表1 プログラム2の変更内容
表1 プログラム2の変更内容。
処置「行番号18と19の間に追加」:
77 W-CNT PIC 9(4).
77 W-IDX PIC 9(2).
01 W-ACCT-VAL PIC X(72) VALUE
"100100100100100100300300300300300300
- "300300300300300300300300100100100100".
01 W-ACCT-TBL REDEFINES W-ACCT-VAL.
02 W-ACCT PIC 9(3) OCCURS 24.
処置「行番号43を変更」:
[空欄 d].
PERFORM TEST BEFORE VARYING W-CNT FROM 1 BY 1
UNTIL [空欄 e]
ADD W-ACCT(W-IDX) TO ACCT-FEE
ADD 1 TO W-IDX
IF [空欄 f] THEN
MOVE 1 TO W-IDX
END-IF
END-PERFORM.
注記 変更内容の各行とも,空白でない最終文字の直後で改行している。行番号18と19の間に追加する変更内容の1桁目は標識領域である。
設問3・dの解答群
dに関する解答群:ア COMPUTE W-IDX = ACCT-I-HH + 1/イ COMPUTE W-IDX = ACCT-I-HH - 1/ウ MOVE 1 TO W-IDX/エ MOVE ACCT-I-HH TO W-IDX。
設問3・e,fの解答群
e,fに関する解答群:ア W-CNT = W-HRS/イ W-CNT > W-HRS/ウ W-HRS = W-IDX/エ W-IDX = 24/オ W-IDX = W-CNT/カ W-IDX > 24。
問問10 設問1
プログラム1における精算ファイルの呼出し法として正しい答えを,解答群の中から選べ。ここで,括弧内は,呼出し法に対応する環境部のファイル管理記述項におけるACCESS MODE句の書き方である。
- ア 順呼出し(ACCESS MODE IS SEQUENTIAL)
- イ 動的呼出し(ACCESS MODE IS DYNAMIC)
- ウ 乱呼出し(ACCESS MODE IS RANDOM)
出典:平成29年度 秋期 基本情報技術者試験 午後 問10 設問1
問問10 設問2
プログラム2中の空欄に入れる正しい答えを,解答群の中から選べ。
aに関する解答群
ア ADD PRM-FEE TO ACCT-FEE
イ MOVE ACCT-FEE TO PRM-FEE
ウ MOVE PRM-FEE TO ACCT-FEE
エ MOVE PRM-NO TO ACCT-NO
bに関する解答群
ア *
イ +
ウ -
エ /
cに関する解答群
ア ADD 1 TO W-HRS
イ ADD ACCT-O-HH TO W-HRS
ウ SUBTRACT 1 FROM W-HRS
エ SUBTRACT ACCT-I-HH FROM W-HRS
- A-ア ADD PRM-FEE TO ACCT-FEE
- A-イ MOVE ACCT-FEE TO PRM-FEE
- A-ウ MOVE PRM-FEE TO ACCT-FEE
- A-エ MOVE PRM-NO TO ACCT-NO
- B-ア *
- B-イ +
- B-ウ -
- B-エ /
- C-ア ADD 1 TO W-HRS
- C-イ ADD ACCT-O-HH TO W-HRS
- C-ウ SUBTRACT 1 FROM W-HRS
- C-エ SUBTRACT ACCT-I-HH FROM W-HRS
出典:平成29年度 秋期 基本情報技術者試験 午後 問10 設問2
問問10 設問3
夜間時間帯の料金割引を実施するために,プログラム2を変更する。夜間時間帯は20時00分から翌朝5時59分までとし,各課金単位の開始時刻が夜間時間帯に含まれるときは,1課金単位当たりの課金を100円とする。表1中の空欄に入れる正しい答えを,解答群の中から選べ。
dに関する解答群
ア COMPUTE W-IDX = ACCT-I-HH + 1
イ COMPUTE W-IDX = ACCT-I-HH - 1
ウ MOVE 1 TO W-IDX
エ MOVE ACCT-I-HH TO W-IDX
e、fに関する解答群
ア W-CNT = W-HRS
イ W-CNT > W-HRS
ウ W-HRS = W-IDX
エ W-IDX = 24
オ W-IDX = W-CNT
カ W-IDX > 24
- D-ア COMPUTE W-IDX = ACCT-I-HH + 1
- D-イ COMPUTE W-IDX = ACCT-I-HH - 1
- D-ウ MOVE 1 TO W-IDX
- D-エ MOVE ACCT-I-HH TO W-IDX
- E-ア W-CNT = W-HRS
- E-イ W-CNT > W-HRS
- E-ウ W-HRS = W-IDX
- E-エ W-IDX = 24
- E-オ W-IDX = W-CNT
- E-カ W-IDX > 24
- F-ア W-CNT = W-HRS
- F-イ W-CNT > W-HRS
- F-ウ W-HRS = W-IDX
- F-エ W-IDX = 24
- F-オ W-IDX = W-CNT
- F-カ W-IDX > 24
出典:平成29年度 秋期 基本情報技術者試験 午後 問10 設問3
共通の文章
問11 次のJavaプログラムの説明及びプログラムを読んで、設問1〜3に答えよ。
【プログラムの説明】
文字列の配列を要素にもつ配列で表現された表中の行を、並べ替えるプログラムである。表は行の配列として、行は文字列の配列として構成される。各行の指定した列が、指定した順序に並ぶように行を並べ替える。
図1は、表の最左列の文字列を辞書順に、最左列の文字列が等しい行は右隣の列の文字列を数値とみなしたときに降順になるように並べ替えた例である。
クラス TableSorter は、表中の行を並べ替える機能を提供する。putSortOrder(String key, Comparator<String> order) は、このクラスのメソッド sort で指定可能な順序を登録する。key は表を並べ替える順序を示すために使用する文字列(順序指定子)、order はインタフェース Comparator 型のオブジェクトで、key で指定した順序指定子が示す順序を規定する。
sort(String[][] table, final OrderBy... orderBys) は、条件として指定した列が指定した順序になるように表中の行を並べ替える。条件は複数指定できる。並び順の決定には先に指定した条件が優先される。先に指定した条件で並び順が決まらない行については、後に指定した条件を加えて決定する。指定した全ての条件で順序が決まらない行については、並べ替える前の並び順を維持する。
OrderBy は並べ替えの条件を表すクラスである。フィールド key は順序指定子、フィールド col は比較対象の列の位置を示す数(行を表す String 型配列の添字)である。フィールド isReversed が false であれば、順序指定子 key で指定されるオブジェクトのメソッド compare が返す大小関係で昇順に並べ替える。true であれば降順に並べ替える。
図1 並べ替えの例
図1「並べ替えの例」。左の表(列の順に):apple | 3 | 1,000、cherry | 1 | 1,000、banana | 1 | 300、banana | 2 | 2,000、apple | 2 | 300。矢印で示された並べ替え後の表(同じ列順):apple | 3 | 1,000、apple | 2 | 300、banana | 2 | 2,000、banana | 1 | 300、cherry | 1 | 1,000。本文では、左端列を辞書順にし、同じ場合は右隣の列を数値とみなして降順にした例と説明される。
プログラム1
プログラム1(空欄は原本どおり)。import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; public class TableSorter { private Map<[a]> orderMap = new HashMap<[a]>(); public void putSortOrder(String key, Comparator<String> order) { orderMap.put(key, order); } public void sort(String[][] table, final OrderBy... orderBys) { Arrays.sort(table, new Comparator<String[]>() { public int compare(String[] s1, String[] s2) { for ([b]) { int order = orderMap.get(orderBy.key).compare(s1[c], s2[c]); if (order [d] 0) { return [e]; } } return 0; } }); } public static class OrderBy { final String key; final int col; final boolean isReversed; public OrderBy(String key, int col) { this(key, col, false); } public OrderBy(String key, int col, boolean isReversed) { this.key = key; this.col = col; this.isReversed = isReversed; } } }
プログラム2と図2 実行結果
プログラム2の入力データ data(各行の列順は文字列列、数値を表す文字列列、金額等を表す文字列列):{"apple", "3", "1,000"}; {"cherry", "1", "1,000"}; {"banana", "1", "300"}; {"banana", "2", "2,000"}; {"apple", "2", "300"}。順序指定子 lex には String の compareTo による比較を登録し、num には Integer に変換して compareTo で比較する順序を登録する。通常実行時の sort 呼出しは sorter.sort(data, new TableSorter.OrderBy("lex", 0), new TableSorter.OrderBy("num", 1, true)); 出力は各行の各列を「%s 」で表示し、行末で改行する。実行結果は apple 3 1,000 / apple 2 300 / banana 2 2,000 / banana 1 300 / cherry 1 1,000。
設問2の置換コード
設問2でαが示す2行に置き換える呼出し:sorter.sort(data, new TableSorter.OrderBy("lex", 2), new TableSorter.OrderBy("lex", 0));
設問3の置換コード
設問3でαが示す2行に置き換えるコード。まず順序指定子 num に比較器を登録する:sorter.putSortOrder("numC", new Comparator<String>() { public int compare(String s1, String s2) { return new Integer(s1.replace(",", "")).compareTo(new Integer(s2.replace(",", ""))); } }); 次に呼び出す:sorter.sort(data, new TableSorter.OrderBy("numC", 2), new TableSorter.OrderBy("lex", 0));
関連API:String、Integer
API仕様(物理PDF p.76):String.compareTo(String anotherString) は二つの文字列を辞書順に比較し、等しいとき0、小さいとき負、大きいとき正を返す。String.replace(CharSequence target, CharSequence replacement) は文字列中の target に一致する部分を replacement に置き換えた文字列を返す。Integer(String s) は符号付き10進数の文字列を表す Integer を構築する。Integer.compareTo(Integer anotherInteger) は数値比較を行い、等しいとき0、小さいとき負、大きいとき正を返す。
関連API:Arrays、Comparator、Map
API仕様(物理PDF p.77):Arrays.sort(T[] a, Comparator<? super T> c) は、コンパレータ compare の大小関係に従って配列を昇順に並べ替える。同じ大きさの要素の順序は並べ替え前の順序を維持する。Comparator<T>.compare(T o1, T o2) は大小関係を整数値で返し、等しいとき0、小さいとき負、大きいとき正を返す。Map<K,V>.get(Object key) は指定キーに対応する値を返し、対応がなければ null。Map<K,V>.put(K key, V value) はキーと値を登録し、既存の対応があれば置き換え、以前の値(なければ null)を返す。
関連API:HashMap
API仕様(物理PDF p.78):HashMap() は空の HashMap を作る。
問問11 設問1
プログラム1中の空欄に入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア Character, Comparator<String>
イ Character, String
ウ String, Comparator<String>
エ String, String
bに関する解答群
ア int i = 0; i < orderBys.length; i++
イ int i = 0; i < table.length; i++
ウ OrderBy orderBy : orderBys
エ String[] row : table
cに関する解答群
ア .get(col)
イ .get(orderBy.col)
ウ [col]
エ [orderBy.col]
dに関する解答群
ア !=
イ <
ウ ==
エ >
eに関する解答群
ア -order
イ order
ウ orderBy.isReversed ? -order : order
エ orderBy.isReversed ? order : -order
- A-ア Character, Comparator<String>
- A-イ Character, String
- A-ウ String, Comparator<String>
- A-エ String, String
- B-ア int i = 0; i < orderBys.length; i++
- B-イ int i = 0; i < table.length; i++
- B-ウ OrderBy orderBy : orderBys
- B-エ String[] row : table
- C-ア .get(col)
- C-イ .get(orderBy.col)
- C-ウ [col]
- C-エ [orderBy.col]
- D-ア !=
- D-イ <
- D-ウ ==
- D-エ >
- E-ア -order
- E-イ order
- E-ウ orderBy.isReversed ? -order : order
- E-エ orderBy.isReversed ? order : -order
出典:平成29年度 秋期 基本情報技術者試験 午後 問11 設問1
問問11 設問2
プログラム2のαで示した2行を、設問2の置換コードの2行と入れ替えて実行したとき、実行結果の1行目に出力される内容として正しい答えを、解答群の中から選べ。
- ア apple 2 300
- イ apple 3 1,000
- ウ banana 1 300
- エ banana 2 2,000
- オ cherry 1 1,000
出典:平成29年度 秋期 基本情報技術者試験 午後 問11 設問2
問問11 設問3
プログラム2のαで示した2行を、設問3の置換コードの8行と入れ替えて実行したとき、実行結果の3行目に出力される内容として正しい答えを、解答群の中から選べ。
- ア apple 2 300
- イ apple 3 1,000
- ウ banana 1 300
- エ banana 2 2,000
- オ cherry 1 1,000
出典:平成29年度 秋期 基本情報技術者試験 午後 問11 設問3
共通の文章
問12 次のアセンブラプログラムの説明及びプログラムを読んで、設問1~4に答えよ。
【プログラム1の説明】
連続する2語から成るビット列αの中から、別のビット列βと一致する部分ビット列を検索する副プログラムBSRHである。部分ビット列の検索の概要を、図1に示す。
プログラム1の説明
【プログラム1の説明】
(1) 主プログラムは、αが格納されている領域の先頭アドレスをGR1に、βをGR2に、βの長さn(1≦n≦16)をGR3に設定して副プログラムBSRHを呼ぶ。βはGR2に左詰めで設定し、残りのビットには0を設定する。
(2) 副プログラムBSRHは、αの先頭(ビット位置0)からβと照合し、一致する部分ビット列がある場合は最初に一致する部分ビット列の先頭のビット位置pを、一致する部分ビット列がない場合は−1を、GR0に設定して主プログラムに戻る。
(3) 副プログラムBSRHから戻るとき、汎用レジスタGR1~GR7の内容は元に戻す。
図1
図1「部分ビット列の検索の概要」。ビット列αはビット位置0から31まで。位置pを先頭とするnビットの部分ビット列を、ビット列βと照合する。
プログラム1
プログラム1(行番号、ラベル、命令、オペランド、コメント)。空欄a、bは原本の空欄のまま。
1 BSRH START
2 RPUSH
3 LD GR0,=-1
4 LD GR6,=#FFFF ; マスク作成
5 SRL GR6,0,GR3
6 XOR GR6,=#FFFF
7 LD GR4,0,GR1 ; αの取出し
8 LD GR5,1,GR1
9 LD GR1,=32
10 SUBA GR1,GR3 ; GR1 ← 32 − n
11 LD GR3,GR1 ; GR3 ← 32 − n
12 LP LD GR7,GR4
13 AND GR7,GR6
14 [空欄a]
15 JZE FOUND ; 一致あり
16 SUBA GR1,=1
17 JMI FIN ; 一致なし
18 SLL GR4,1 ; αを1ビット左シフト
19 SLL GR5,1
20 [空欄b]
21 JUMP LP
22 NEXT OR GR4,=#0001
23 JUMP LP
24 FOUND SUBA GR3,GR1 ; pの算出
25 LD GR0,GR3
26 FIN RPOP
27 RET
28 END
プログラム2
プログラム2(行番号、ラベル、命令、オペランド、コメント)。空欄c、dは原本の空欄のまま。
1 BREP START
2 RPUSH
3 CALL BSRH
4 LD GR2,GR0
5 JMI FIN
6 LD GR6,=#FFFF ; マスク作成
7 SRL GR6,0,GR3
8 XOR GR6,=#FFFF
9 LD GR7,GR3 ; GR7 ← n
10 LD GR3,=16
11 SUBA GR3,GR2 ; GR3 ← 16 − p
12 JMI ONL2
13 JZE ONL2
14 CPA GR3,GR7 ; (16 − p) と n の比較
15 JMI NEXT ; 2語にまたがる処理
16 JUMP ONL1 ; 一致する部分ビット列が1語目だけのとき
17 NEXT LD GR5,GR4 ; γとマスクを退避
18 LD GR7,GR6
19 CALL S1 ; 1語目の処理
20 LD GR4,GR5
21 LD GR6,GR7
22 SLL GR4,0,GR3 ; 2語目用γの調整
23 SLL GR6,0,GR3 ; 2語目用マスクの調整
24 LAD GR1,1,GR1
25 CALL S2 ; 2語目の最終処理
26 JUMP FIN
27 ONL1 CALL S1
28 JUMP FIN
29 ONL2 [空欄c]
30 SUBA GR2,GR3 ; GR2 ← p − 16
31 LAD GR1,1,GR1 ; 操作対象を2語目にして、
32 CALL S1 ; 2語目の処理
33 FIN RPOP
34 RET
35 S1 SRL GR4,0,GR2 ; γの調整
36 SRL GR6,0,GR2 ; マスクの調整
37 S2 LD GR2,0,GR1 ; 操作対象語の取出し
38 XOR GR6,=#FFFF
39 AND GR2,GR6
40 [空欄d]
41 ST GR2,0,GR1
42 RET
43 END
設問1の解答群
プログラム1中の空欄aに関する解答群(原本順)。
ア AND GR7,GR2
イ OR GR7,GR2
ウ SLL GR7,0,GR2
エ SRL GR7,0,GR2
オ XOR GR7,GR2
プログラム1中の空欄bに関する解答群(原本順)。
ア JMI FOUND
イ JMI NEXT
ウ JOV FOUND
エ JOV NEXT
オ JPL FOUND
カ JPL NEXT
設問2の解答群
設問2の解答群(原本順)。
ア SLL GR6,-1,GR3
イ SLL GR6,0,GR3
ウ SRA GR6,-1,GR3
エ SRA GR6,0,GR3
オ SRL GR6,-1,GR3
カ SRL GR6,0,GR3
設問3の解答群
プログラム2中の空欄cに関する解答群(原本順)。
ア ADDL GR2,GR7
イ LD GR2,=0
ウ LD GR2,=16
エ LD GR2,=32
オ SUBA GR2,GR7
プログラム2中の空欄dに関する解答群(原本順)。
ア AND GR2,GR4
イ OR GR2,GR4
ウ SLL GR2,0,GR4
エ SRL GR2,0,GR4
オ XOR GR2,=#FFFF
設問4の設定および解答群
実行時の設定:αは1語目が#FFF3、2語目が#7FFF。βは(11011)₂、nは5、γは(11110)₂。
解答群(原本順):ア #0003、イ #0007、ウ #8000、エ #C000、オ #E000、カ #F000。
関連するアセンブラ言語仕様(物理PDF p.79–84)
関連するCOMET IIの仕様。
・1語は16ビット。主記憶のアドレス範囲は0~65535。数値は16ビットの2進数で表現し、負数は2の補数で表現する。汎用レジスタはGR0~GR7。GR1~GR7は指標レジスタとしても使用できる。
・論理積 AND r1,r2 は r1 ← (r1) AND (r2)、論理和 OR r1,r2 は r1 ← (r1) OR (r2)、排他的論理和 XOR r1,r2 は r1 ← (r1) XOR (r2)。論理演算は被演算データを符号なし数値とみなす。
・算術左シフト SLA、算術右シフト SRA、論理左シフト SLL、論理右シフト SRL は、実効アドレスで指定したビット数だけrを左または右にシフトする。算術シフトでは符号を除いてシフトし、左シフトの空きビットには0、右シフトの空きビットには符号と同じビットを入れる。論理シフトでは符号を含めてシフトし、空きビットには0を入れる。シフト命令はOFを除くFRを設定する。
・JPL adr はFRの値に応じて分岐し、分岐しない場合は次の命令に進む。JMI adr はSF=1のとき分岐する。JZE adr はZF=1のとき分岐する。JOV adr はOF=1のとき分岐する。JUMP adr は無条件に分岐する。
・CPA r1,r2 は算術比較を行い、比較結果によってSF、ZFを設定する。
・RPUSH はGRの内容をGR1、GR2、…、GR7の順にスタックへ格納する。RPOPはスタックの内容を順次取り出し、GR7、GR6、…、GR1の順にGRへ格納する。
・CALL adr はサブルーチンを呼び出し、RETはサブルーチンから戻る。
問問12 設問1
プログラム1中の空欄a、bに入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア AND GR7,GR2
イ OR GR7,GR2
ウ SLL GR7,0,GR2
エ SRL GR7,0,GR2
オ XOR GR7,GR2
bに関する解答群
ア JMI FOUND
イ JMI NEXT
ウ JOV FOUND
エ JOV NEXT
オ JPL FOUND
カ JPL NEXT
- A-ア AND GR7,GR2
- A-イ OR GR7,GR2
- A-ウ SLL GR7,0,GR2
- A-エ SRL GR7,0,GR2
- A-オ XOR GR7,GR2
- B-ア JMI FOUND
- B-イ JMI NEXT
- B-ウ JOV FOUND
- B-エ JOV NEXT
- B-オ JPL FOUND
- B-カ JPL NEXT
出典:平成29年度 秋期 基本情報技術者試験 午後 問12 設問1
問問12 設問2
プログラム1の行番号4~6を、次の2命令で置き換えても、GR6には同じ値が得られる。空欄に入れる正しい答えを、解答群の中から選べ。
LD GR6,=#8000
[空欄]
- ア SLL GR6,-1,GR3
- イ SLL GR6,0,GR3
- ウ SRA GR6,-1,GR3
- エ SRA GR6,0,GR3
- オ SRL GR6,-1,GR3
- カ SRL GR6,0,GR3
出典:平成29年度 秋期 基本情報技術者試験 午後 問12 設問2
問問12 設問3
αの先頭からβと照合し、最初に一致する部分ビット列を、βと同じ長さの別のビット列γで置き換える副プログラムBREPを、BSRHを使用して作成した。γはGR4に左詰めで設定し、残りのビットには0を設定する。それ以外のBREPの呼出しに関する仕様は、プログラム1の説明中のBSRHをBREPに読み替えて適用する。プログラム2中の空欄c、dに入れる正しい答えを、解答群の中から選べ。
cに関する解答群
ア ADDL GR2,GR7
イ LD GR2,=0
ウ LD GR2,=16
エ LD GR2,=32
オ SUBA GR2,GR7
dに関する解答群
ア AND GR2,GR4
イ OR GR2,GR4
ウ SLL GR2,0,GR4
エ SRL GR2,0,GR4
オ XOR GR2,=#FFFF
- C-ア ADDL GR2,GR7
- C-イ LD GR2,=0
- C-ウ LD GR2,=16
- C-エ LD GR2,=32
- C-オ SUBA GR2,GR7
- D-ア AND GR2,GR4
- D-イ OR GR2,GR4
- D-ウ SLL GR2,0,GR4
- D-エ SRL GR2,0,GR4
- D-オ XOR GR2,=#FFFF
出典:平成29年度 秋期 基本情報技術者試験 午後 問12 設問3
問問12 設問4
次の設定でプログラム2を実行したとき、行番号23の命令実行直後のGR6に格納されている値として正しい答えを、解答群の中から選べ。
α:1語目 #FFF3、2語目 #7FFF
β:(11011)₂
n:5
γ:(11110)₂
- ア #0003
- イ #0007
- ウ #8000
- エ #C000
- オ #E000
- カ #F000
出典:平成29年度 秋期 基本情報技術者試験 午後 問12 設問4
共通の文章
問13「表計算のワークシート及びマクロ」。S社では、社内業務用PCからインターネットへ接続する際、社内に設置したProxyサーバを利用している。サーバの運用担当者Tさんは、社内から社外のWebページへのアクセス状況を確認するため、サーバのアクセスログを分析することにした。ワークシート「ログ」には、2017年4月3日(月)から2017年4月30日(日)までの4週間に社外のWebページにアクセスした記録だけをアクセスログから取り出し、集計に必要な加工を行った結果が入力されている。ワークシート「集計」には「アクセス集計表」及び「アクセス分析表」を作成する。マクロPage_countは、ワークシート「ログ」のデータからURLごとのアクセス回数を求め、ワークシート「アクセス先集計」に格納する。
図1 ワークシート「ログ」の例
図1「ワークシート『ログ』の例」。1行目は見出し行、データは2行目以降。列A「時刻」、B「IPアドレス」、C「URL」、D「時間帯」、E「曜日コード」、F「集計キー」。行2の例は、A=24852960、B=192.168.20.112、C=http://○○○.com/index.html、D=0、E=4、F=04。行3は、A=24852980、B=192.168.50.30、C=http://www.△△△.co.jp/top.html、D=0、E=4、F=04。行9058は、A=24893254、B=192.168.10.103、C=http://□□□.co.jp/index.html、D=23、E=3、F=233。行9059は、A=24893274、B=192.168.20.107、C=http://◇◇◇.co.jp/index.html、D=23、E=3、F=233。各URL中の「○○○」「△△△」「□□□」「◇◇◇」は特定の文字列を表す。行9060は空欄。時刻は、基準となる1970年1月1日(木)0時00分から当該時刻までの分を単位とする経過時間。列Bには社外のWebページにアクセスしたPCのIPアドレス、列CにはアクセスしたWebページのURLが入力される。列Dには列Aの時刻に対応する時間帯を表す式が入力される。時間帯は0時台(0時00分~0時59分)を0、1時台を1、…、23時台(23時00分~23時59分)を23とする整数値。列Eには列Aの時刻に対応する曜日を0~6の整数値で表す曜日コードを表示する式が入力される。曜日コードは、1970年1月1日(木)を0とし、水曜日の6まで順に割り振る。列Fには時間帯と曜日コードをつないで一つの文字列とした集計キーを表示する式が入力される。データは最大9,998件までで、データの最終行よりも下の行の列A~Cの各セルには空値が入力されている。
図2 ワークシート「曜日」
図2「ワークシート『曜日』」。列B~Hの1行目は曜日で、順に木、金、土、日、月、火、水。2行目は曜日コードで、順に0、1、2、3、4、5、6。
図3 ワークシート「集計」の例
図3「ワークシート『集計』の例」。アクセス集計表は、列Aに「曜日\時間帯」、列B~Yに時間帯0~23、列Zに「計」を置く。行3~9は月、火、水、木、金、土、日、行10は「計」。例示値は、月行がB=13、C=9、D=6、E=5、F=6、N=163、O=183、Y=18、Z=1645、火行が15、11、6、5、1、125、157、9、1376、水行が16、6、5、3、3、104、143、10、1222、木行が18、10、7、6、8、161、203、18、1820、金行が15、7、8、8、1、133、167、16、1482、土行が13、6、4、1、4、92、96、9、945、日行が5、4、1、3、3、50、68、6、568。行10の例示値はB=95、C=53、D=37、E=31、F=26、N=828、O=1017、Y=86、Z=9058。省略列には「…」が示されている。アクセス分析表は行12から始まり、時間帯分析として最多となる時間帯をD14に13、最少となる時間帯をD15に4と表示する例、曜日分析として最多となる曜日をD17に木、最少となる曜日をD18に日と表示する例を示す。アクセス集計表はワークシート「ログ」を参照し、社外のWebページへのアクセス回数を曜日・時間帯ごとに集計する。アクセス分析表はアクセス回数が最多・最少となる時間帯及び曜日を表示する。
図4 ワークシート「アクセス先集計」の例
図4「ワークシート『アクセス先集計』の例」。1行目は見出しで、A列はURL、B列はアクセス回数。例では行2がhttp://○○○.com/index.html/383、行3がhttp://www.△△△.co.jp/top.html/782、行4がhttp://□□□.co.jp/index.html/675、行5がhttp://◇◇◇.co.jp/index.html/119。省略行には「…」が示されている。URL中の各記号列は特定の文字列を表す。マクロ実行前のA2~B9999にはあらかじめ空値を入力しておき、実行結果は2行目以降に表示する。
公式別添 表計算関数仕様
公式別添の表計算関数仕様(物理PDF p.86~88)。IF(論理式, 式1, 式2)は、論理式がtrueなら式1、そうでなければ式2を返す。最大(セル範囲)・最小(セル範囲)は範囲内の最大値・最小値を返す。条件付個数(セル範囲, 検索条件)は条件を満たすセルの個数を返す。剰余(算術式1, 算術式2)は、算術式1を算術式2で除算した剰余を返す。整数部(算術式)は値以下の最大の整数を返す。切上げ(算術式, 桁位置)・切捨て(算術式, 桁位置)は指定した桁位置で切り上げ・切り捨てた値を返す。結合(式1, 式2, …)は引数の値を文字列として順につないだ文字列を返す。論理積は全てtrueのときtrue、論理和は少なくとも一つがtrueのときtrueを返す。表引き(セル範囲, 行位置, 列位置)は範囲内の指定位置のセル値を返す。水平照合(式, セル範囲, 行位置, 検索の指定)は範囲上端行を検索し、指定した行位置の値を返す。照合一致(式, セル範囲, 検索の指定)は1行又は1列の範囲を検索し、条件を満たす最初のセルの位置を返す。検索の指定0は一致する値、1は式の値以下の最大値を検索する。照合検索(式, 検索セル範囲, 抽出セル範囲)は同じ大きさの検索範囲と抽出範囲を対象にし、検索条件に一致する最初のセルの位置に対応する抽出範囲の値を返す。
公式別添 マクロ・セル変数仕様
公式別添のマクロ及びセル変数仕様(物理PDF p.88~90)。マクロは一意の名前を付けて宣言し、変数は数値型・文字列型・論理型があり、宣言して使用する。セルを変数として使用するセル変数は宣言せずに使用できる。セル変数の絶対表現はセル番地、相対表現は相対(基準セル, 行の位置, 列の位置)で表す。基準セルの行・列位置を0とし、下・右を正、上・左を負として指定位置のセルを表す。別シートを参照するセル番地・範囲はシート名に「!」を付けて表す。マクロ例には条件を使った繰返し処理が示されている。
マクロ Page_count
数値型:log_line, count_line。文字列型:log_url, count_url。log_line←1。相対(ログ!A1, log_line, 2)≠nullの間:count_line←1、log_url←相対(ログ!A1, log_line, 2)、count_url←相対(A1, count_line, 0)。空欄dの反復内でcount_line←count_line+1、count_url←相対(A1, count_line, 0)。空欄eの条件が成立すれば相対(A1, count_line, 0)←log_url、相対(A1, count_line, 1)←1。成立しなければ空欄f。最後にlog_line←log_line+1。
問問13 設問1
ワークシート「ログ」に関する記述中の空欄aに入れる正しい答えを解答群から選ぶ。セルD2~F9999に入力する各式は、当該行の列Aのセルの値が空値であれば空値を返す。セルD2には、セルA2の時刻に対応する時間帯を表示する式を入力する。
E2には曜日コードを表示する式 IF(A2 = null, null, 剰余(切捨て(A2/1440, 0), 7)) を入力する。1440は1日を分に換算した値(24×60)。F2には集計キーの式 IF(A2 = null, null, 結合(D2, E2)) を入力する。D2・E2・F2の式を行3~9999の対応列に複写する。
- ア IF(A2 = null, null, 切上げ(剰余(A2 / 24, 60), 0))
- イ IF(A2 = null, null, 切上げ(剰余(A2, 60) / 1440, 0))
- ウ IF(A2 = null, null, 切捨て(剰余(A2 / 24, 60), 0))
- エ IF(A2 = null, null, 切捨て(剰余(A2, 60) / 1440, 0))
- オ IF(A2 = null, null, 剰余(切捨て(A2 / 1440, 0), 60))
- カ IF(A2 = null, null, 剰余(切捨て(A2 / 60, 0), 24))
出典:平成29年度 秋期 基本情報技術者試験 午後 問13 設問1
問問13 設問2
ワークシート「集計」に関する記述中の空欄b、cに入れる正しい答えを解答群から選ぶ。セルB3には、ワークシート「ログ」のデータの中から、曜日と時間帯がそれぞれ当該セルと同じ行の列Aで示す曜日、同じ列の行2で示す時間帯に一致するデータの個数を数えて表示する式を入力し、セルB3~Y9に複写する。式は条件付個数(ログ!$F$2:$F$9999, b)の形である。セルD17には、アクセス回数を曜日ごとに集計したとき、値が最多となる曜日を「月」~「日」で表示する式を入力する。最多・最少となる曜日が複数あるときは、アクセス集計表の上端に最も近い曜日を表示する。
セルZ3には同じ行のB~Y列の合計式を入力し、Z4~Z9に複写する。B10には同じ列の行3~9の合計式を入力し、C10~Z10に複写する。D14・D15には最多・最少となる時間帯を表示する式を入力し、同値なら表の左端に最も近い時間帯を選ぶ。D18には最少となる曜日を「月」~「日」で表示する式を入力する。
bに関する解答群
ア =結合(B$2, 照合一致($A3, 曜日!$B$1:$H$1, 0))
イ =結合(B$2, 照合検索($A3, 曜日!$B$2:$H$2, 曜日!$B$1:$H$1))
ウ =結合(B$2, 水平照合($A3, 曜日!$B$1:$H$2, 2, 0))
エ =結合(照合一致($A3, 曜日!$B$1:$H$1, 0), B$2)
オ =結合(照合検索($A3, 曜日!$B$2:$H$2, 曜日!$B$1:$H$1), B$2)
カ =結合(水平照合($A3, 曜日!$B$1:$H$2, 2, 0), B$2)
cに関する解答群
ア 照合検索(最大(B10:Y10), B10:Y10, B2:Y2)
イ 照合検索(最大(Z3:Z9), Z3:Z9, A3:A9)
ウ 照合検索(照合一致(最大(Z3:Z9), Z3:Z9, 0) - 1, 曜日!B2:H2, 曜日!B1:H1)
エ 表引き(A3:Z9, 1, 照合一致(最大(Z3:Z9), Z3:Z9, 0))
オ 表引き(A3:Z9, 照合一致(最大(Z3:Z9), Z3:Z9, 0), 照合一致(最大(B10:Y10), B10:Y10, 0))
カ 表引き(曜日!B1:H1, 1, 照合一致(最大(Z3:Z9), Z3:Z9, 0))
- B-ア =結合(B$2, 照合一致($A3, 曜日!$B$1:$H$1, 0))
- B-イ =結合(B$2, 照合検索($A3, 曜日!$B$2:$H$2, 曜日!$B$1:$H$1))
- B-ウ =結合(B$2, 水平照合($A3, 曜日!$B$1:$H$2, 2, 0))
- B-エ =結合(照合一致($A3, 曜日!$B$1:$H$1, 0), B$2)
- B-オ =結合(照合検索($A3, 曜日!$B$2:$H$2, 曜日!$B$1:$H$1), B$2)
- B-カ =結合(水平照合($A3, 曜日!$B$1:$H$2, 2, 0), B$2)
- C-ア 照合検索(最大(B10:Y10), B10:Y10, B2:Y2)
- C-イ 照合検索(最大(Z3:Z9), Z3:Z9, A3:A9)
- C-ウ 照合検索(照合一致(最大(Z3:Z9), Z3:Z9, 0) - 1, 曜日!B2:H2, 曜日!B1:H1)
- C-エ 表引き(A3:Z9, 1, 照合一致(最大(Z3:Z9), Z3:Z9, 0))
- C-オ 表引き(A3:Z9, 照合一致(最大(Z3:Z9), Z3:Z9, 0), 照合一致(最大(B10:Y10), B10:Y10, 0))
- C-カ 表引き(曜日!B1:H1, 1, 照合一致(最大(Z3:Z9), Z3:Z9, 0))
出典:平成29年度 秋期 基本情報技術者試験 午後 問13 設問2
問問13 設問3
マクロPage_count中の空欄d、e、fに入れる正しい答えを解答群から選ぶ。マクロはワークシート「ログ」のセルC2を最初の対象セルとし、以降セルC3、C4、…と順次下に移しながら、対象セルの値が空値になるまで処理を繰り返す。対象セルのURLと同じ値が入力されているかを、ワークシート「アクセス先集計」のセルA2から下に検索する。同じURLのセルが見つかったときは、当該行の列Bのアクセス回数に1を加える。列Aのセル値が空値になるまで検索しても同じURLが見つからなかったときは、最初に現れた空値の行の列Aに対象セルの値を、列Bに1を格納する。
dに関する解答群
ア 論理積(count_url = null, count_url = log_url)
イ 論理積(count_url = null, count_url ≠ log_url)
ウ 論理積(count_url ≠ null, count_url ≠ log_url)
エ 論理和(count_url = null, count_url = log_url)
オ 論理和(count_url = null, count_url ≠ log_url)
カ 論理和(count_url ≠ null, count_url ≠ log_url)
eに関する解答群
ア count_url = log_url
イ count_url = null
ウ count_url ≠ null
エ log_url = null
オ log_url ≠ null
fに関する解答群
ア 相対(A1, count_line, 1) ← 相対(A1, count_line, 1) + 1
イ 相対(A1, count_line, 1) ← 相対(ログ!A1, log_line, 2)
ウ 相対(A1, count_line, 2) ← 相対(A1, count_line, 2) + 1
エ 相対(A1, count_line, 2) ← 相対(ログ!A1, log_line, 2)
オ 相対(A1, log_line, 1) ← 相対(A1, log_line, 1) + 1
カ 相対(A1, log_line, 2) ← 相対(A1, log_line, 2) + 1
- D-ア 論理積(count_url = null, count_url = log_url)
- D-イ 論理積(count_url = null, count_url ≠ log_url)
- D-ウ 論理積(count_url ≠ null, count_url ≠ log_url)
- D-エ 論理和(count_url = null, count_url = log_url)
- D-オ 論理和(count_url = null, count_url ≠ log_url)
- D-カ 論理和(count_url ≠ null, count_url ≠ log_url)
- E-ア count_url = log_url
- E-イ count_url = null
- E-ウ count_url ≠ null
- E-エ log_url = null
- E-オ log_url ≠ null
- F-ア 相対(A1, count_line, 1) ← 相対(A1, count_line, 1) + 1
- F-イ 相対(A1, count_line, 1) ← 相対(ログ!A1, log_line, 2)
- F-ウ 相対(A1, count_line, 2) ← 相対(A1, count_line, 2) + 1
- F-エ 相対(A1, count_line, 2) ← 相対(ログ!A1, log_line, 2)
- F-オ 相対(A1, log_line, 1) ← 相対(A1, log_line, 1) + 1
- F-カ 相対(A1, log_line, 2) ← 相対(A1, log_line, 2) + 1
出典:平成29年度 秋期 基本情報技術者試験 午後 問13 設問3