旧制度の午前・午後と、2023年度以降の科目A・科目Bの公開問題を区別しています。現在の試験対策では現行シラバスと科目Bの形式を確認してください。公開問題は本試験の全出題を網羅する資料ではありません。
2017年度 秋期 午後の概要
SSHによる通信
情報セキュリティ · SSH / 公開鍵暗号方式 / 共通鍵暗号方式 / ディジタル署名 / 中間者攻撃
SSHによる通信における安全な通信経路の確立手順、サーバ認証、利用者認証(公開鍵認証およびパスワード認証)の特徴、並びに通信データの暗号化方式に関する次の設問1〜4に答えよ。
解答・解説を表示
解答
設問1 a: エ, 設問1 b: イ, 設問2: オ, 設問3: ア, 設問4: ア
解説
まず要点:SSH(Secure Shell)は、最初に公開鍵暗号で安全な通信路とセッション鍵を作り、その後のデータは速い共通鍵暗号でやり取りする。最初だけ安全な方法を使い、大量のデータは速い方法で送るので、安全と速さを両立できる。利用者認証では、秘密鍵を送らず署名だけを送る公開鍵認証を使うと、より安全になる。
解き方
- 安全な通信路を作る段階で、クライアントが持つサーバの公開鍵でサーバの署名を確かめ、中間者攻撃(通信の間に割り込む攻撃)を防ぐ。
- データの暗号化には、処理が速い共通鍵暗号が向いていることを理由と結び付ける。
- 利用者認証では、公開鍵認証は秘密鍵を手元に残して署名だけ送るのに対し、パスワード認証はパスワードそのものをサーバへ渡すため、偽のサーバに弱い点をつかむ。
小問ごとの答え
- 小問 設問1 a:エ
- サーバ認証において、クライアントは事前に正当性を確認・保存しておいた「サーバの公開鍵」を用いて、サーバから送られたセッション識別子へのディジタル署名を検証します。
- 小問 設問1 b:イ
- 公開鍵認証方式では、クライアントが自身の秘密鍵で作成した署名を送信し、サーバはあらかじめ登録されている「クライアントの公開鍵」を用いてその署名を検証します。
- 小問 設問2:オ
- サーバ認証により正当な接続先であるかを確認することで、クライアントと正規サーバの間に第三者が入り込んで通信を中継・改ざんする「中間者攻撃(Man-in-the-Middle)」を防止できます。
- 小問 設問3:ア
- セッション中の通信データ暗号化には、公開鍵暗号方式と比較して暗号化・復号処理が非常に高速である共通鍵暗号方式が用いられます。
- 小問 設問4:ア
- パスワード認証では暗号化された安全な経路を通るものの、接続先サーバ自体が悪意の第三者に侵害・乗っ取られていた場合、送信したパスワードがそのまま取得されてしまいます。
覚えるポイント
- ディジタル署名の検証には送信者の公開鍵を用い、作成には送信者の秘密鍵を用いる。
- 共通鍵暗号方式は公開鍵暗号方式よりも暗号化・復号の処理速度が大幅に高速である。
- SSHのサーバ認証は接続先が意図した本物であることを保証し、中間者攻撃を防ぐ。
間違えやすいところ
- パスワード認証の弱点を「通信の途中で盗み見られる」と誤解しやすいが、SSHは通信路を作った後に認証するので暗号化されている。
- 署名を作る側と検証する側で、どちらの鍵(秘密鍵か公開鍵か)を使うかを混同しやすい。
出題の前提:平成29年度秋期 基本情報技術者試験 午後 問1
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.6 ↗(www.ipa.go.jp) / 公式問題冊子 p.7 ↗(www.ipa.go.jp) / 公式問題冊子 p.8 ↗(www.ipa.go.jp)
プロセスの排他制御
ソフトウェア · 排他制御 / セマフォ / P操作 / V操作 / デッドロック
単一CPUコンピュータにおける共有メモリ上のデータ更新と、セマフォ変数を用いた排他制御(P操作・V操作)、および複数資源獲得に伴うデッドロックの発生条件に関する次の設問1〜3に答えよ。
解答・解説を表示
解答
設問1: ウ, 設問2 a: ウ, 設問2 b: エ, 設問3: エ
解説
まず要点:複数のプロセスが同じデータを同時に更新すると、処理の割り込みで更新が消えて食い違うことがある。これを防ぐには、セマフォという仕組みのP操作(資源を確保して施錠する)とV操作(資源を返して解錠する)で、同時に1つだけが実行できる部分を作る。複数の資源を取る順番がプロセスごとに違うと、互いに相手の解放を待ち続けるデッドロック(永久に止まる状態)が起こる。
解き方
- 排他制御をしない競合状態で、起こり得る実行の順番をすべて試し、結果として出てこない値を調べる。
- セマフォ変数Sが「1:解放」「0:確保」という決まりに沿って、P操作(待つ、0へ変える)とV操作(1へ戻す)の正しい仕様を選ぶ。
- p5が資源をy1→y2の順に取り、逆にy2→y1の順で取ろうとする場合を探し、デッドロックが起こる条件を満たす順番を導く。
小問ごとの答え
- 小問 設問1:ウ
- 排他制御がない場合、両方が直列実行されれば100+30-50=80、p1の書出し後にp2が古い100を基に書けば50、p2の書出し後にp1が古い100を基に書けば130となりますが、初期値である100のまま残ることはあり得ません。
- 小問 設問2 a:ウ
- P操作は資源の獲得操作です。セマフォ変数Sが1(解放状態)なら0(確保状態)に変更して終了し、0であれば他のプロセスが解放して1になるまで待機した後、0に変更して終了します。
- 小問 設問2 b:エ
- V操作は資源の返却(解放)操作です。更新処理を終えて資源を解放するため、セマフォ変数Sの値を1にして終了します。
- 小問 設問3:エ
- プロセスp5が「y1確保→y2確保」の順で要求するため、プロセスp6が逆順の「y2確保→y1確保」で要求する場合、p5がy1を保持したままy2を待ち、p6がy2を保持したままy1を待つ循環待ちが発生しデッドロックとなります。
覚えるポイント
- P操作はロック獲得(セマフォの減算・待ち)、V操作はロック解放(セマフォの加算)。
- デッドロックは複数のプロセスが複数の資源を異なる順序で排他的に確保しようとするときに生じる。
間違えやすいところ
- セマフォ変数の値の意味(この問題では1が解放、0が確保)を取り違え、P操作とV操作の条件を逆に選んでしまう。
- デッドロックを防ぐには、全プロセスで資源を取る順番をそろえる(順序付けする)必要がある点を見落とす。
出題の前提:平成29年度秋期 基本情報技術者試験 午後 問2
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.9 ↗(www.ipa.go.jp) / 公式問題冊子 p.10 ↗(www.ipa.go.jp) / 公式問題冊子 p.11 ↗(www.ipa.go.jp) / 公式問題冊子 p.12 ↗(www.ipa.go.jp)
会員制通信販売事業者における会員販売データ管理
データベース · 関係データベース / SQL / GROUP BY句 / HAVING句 / ビュー
清涼飲料水の会員制通信販売事業を運営するD社の販売管理データベースに関する次の設問に答えよ。 データベース構成: ・会員表(会員番号、氏名、生年、電話番号、郵便番号、住所) ・販売表(伝票番号、販売日、会員番号、販売額) ・販売明細表(伝票番号、商品番号、個数) ・商品表(商品番号、分類、商品名、単価) ※下線は主キーを表す。 設問1:2016年の1年間において、分類がコーヒーである商品を5回以上購入し、かつその購入額の合計が10,000円以上である会員の氏名、郵便番号、住所を抽出するSQL文の空欄 a に入る適切なものを解群から選べ。 設問2:商品表の単価を何回でも変更できるようにするため、販売明細表に「販売時単価」属性を追加した。この変更によって得ることができる情報として最も適切なものを解群から選べ。 設問3:単価変更に対応後、2017年1月1日〜6月30日を対象に、商品表の分類別の販売額の合計(合計販売額)を会員の年齢(2017-生年)ごとに求めて出力するSQL文の空欄 b(b1, b2, b3)の適切な組合せを選べ。 設問4:入荷管理システムで利用する表(入荷表、ビュー入荷集計表)と販売管理システムの表を用いて、図4のビュー販売集計表およびビュー在庫表を作成する。ビュー販売集計表の作成に必要な最小限の表の数 c1 と、ビュー在庫表の作成に必要な最小限の表の数(ビュー販売集計表も含める) c2 の組合せとして正しいものを選べ。
- 設問1 ア
- AND 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31' AND 商品表.分類 = 'コーヒー' AND 商品表.単価 * 販売明細表.個数 >= 10000 GROUP BY 販売表.会員番号 HAVING COUNT(*) >= 5
- 設問1 イ
- AND 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31' AND 商品表.分類 = 'コーヒー' GROUP BY 販売表.会員番号 HAVING SUM(商品表.単価 * 販売明細表.個数) >= 10000 AND COUNT(*) >= 5
- 設問1 ウ
- AND 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31' GROUP BY 販売表.会員番号 HAVING 商品表.分類 = 'コーヒー' AND SUM(商品表.単価 * 販売明細表.個数) >= 10000 AND COUNT(*) >= 5
- 設問1 エ
- GROUP BY 販売表.会員番号 HAVING 販売表.販売日 >= '2016-01-01' AND 販売表.販売日 <= '2016-12-31' AND 商品表.分類 = 'コーヒー' AND SUM(販売表.販売額) >= 10000 AND COUNT(*) >= 5
- 設問2 ア
- ある時,ある商品をある会員が購入した単価と,その直後に変更された単価との価格差
- 設問2 イ
- 実際に購入された商品の,販売時点の単価の変遷
- 設問2 ウ
- 全ての商品についての,単価の変遷
- 設問2 エ
- 全ての商品についての,直近の単価変更日の前日における単価
- 設問3 ア
- b1: SUM(単価 * 個数), b2: 商品表.単価, 販売明細表.個数, b3: 年齢, 分類
- 設問3 イ
- b1: SUM(単価 * 個数), b2: 商品表.単価, 販売明細表.個数, b3: 年齢, 分類, 合計販売額
- 設問3 ウ
- b1: SUM(販売額), b2: 販売表.販売額, b3: 年齢, 分類
- 設問3 エ
- b1: SUM(販売額), b2: 販売表.販売額, b3: 年齢, 分類, 合計販売額
- 設問3 オ
- b1: SUM(販売時単価 * 個数), b2: 販売明細表.販売時単価, 販売明細表.個数, b3: 年齢, 分類
- 設問3 カ
- b1: SUM(販売時単価 * 個数), b2: 販売明細表.販売時単価, 販売明細表.個数, b3: 年齢, 分類, 合計販売額
- 設問4 ア
- c1: 1, c2: 2
- 設問4 イ
- c1: 1, c2: 3
- 設問4 ウ
- c1: 2, c2: 2
- 設問4 エ
- c1: 2, c2: 3
解答・解説を表示
解答
設問1 a: イ, 設問2: イ, 設問3 b: オ, 設問4 c: ア
解説
まず要点:SQL(データベースを操作する言葉)では、行を絞り込むWHERE句と、グループに分けた後の集計値に対する条件を書くHAVING句をきちんと使い分ける必要がある。また、明細に販売時の価格を残しておくと、後で値段が変わっても過去の取引価格を正しく集計できる。
解き方
- 設問1では、まとめる前の条件(販売日、分類)はWHERE句に、まとめるキー(会員番号)と集計の条件(SUM、COUNT)はHAVING句に置く文法を選ぶ。
- 設問2では、販売明細表に販売時単価を足すと、実際に売れた商品の単価の移り変わりだけが記録される性質を見抜く。
- 設問3では、副問合せFACTTBで必要な列(販売時単価、個数)を取り出し、主問合せで年齢・分類ごとのSUM(販売時単価 * 個数)を計算する作りを確かめる。
- 設問4では、ビュー販売集計表に必要な表数(販売明細表の1つ)と、ビュー在庫表に必要な表数(ビュー入荷集計表とビュー販売集計表の2つ)をそれぞれ特定する。
小問ごとの答え
- 小問 設問1 a:イ
- 購入日と分類コーヒーの絞り込みはグループ化前の行に対する条件なのでWHERE句に記述し、会員番号ごとの集計結果に対する条件(購入回数5回以上、合計金額10,000円以上)はHAVING句に記述するため「イ」が正解です。
- 小問 設問2:イ
- 販売明細表に販売時単価を持たせることで、販売実績が存在する商品について販売時点での単価の履歴・変遷を追うことが可能になります。一度も売れていない商品の単価や販売直後の改定値などは保持されないため「イ」が正解です。
- 小問 設問3 b:オ
- 単価変更対応後は販売明細表の「販売時単価」を用いる必要があります。副問合せFACTTBのSELECT句b2には販売明細表の販売時単価と個数を含め、外側SQLではb1に「SUM(販売時単価 * 個数)」を指定します。また、GROUP BY句b3には集計関数以外の「年齢, 分類」を指定するため「オ」が正解です。
- 小問 設問4 c:ア
- ビュー販売集計表は商品番号ごとに個数を集計するだけなので「販売明細表」の1表のみで作成できます(c1=1)。ビュー在庫表は「ビュー入荷集計表」と「ビュー販売集計表」の2表を商品番号で結合し、入荷総数-販売総数(販売がない場合は0)を計算することで作成できるため c2=2 となり、「ア」が正解です。
覚えるポイント
- WHERE句は行の絞り込み、HAVING句はGROUP BYによるグループ化後の集計値に対する絞り込みを行う。
- GROUP BY句には、SELECT句に指定する集計関数以外の列を指定する。
間違えやすいところ
- WHERE句でSUMなどの集計の関数を使おうとしたり、HAVING句にまとめる前の個別の列の条件を書いてしまう間違いが多い。
- GROUP BY句に、SELECT句で別名を付けた集計列名(合計販売額など)を入れてしまう間違い。
出題の前提:問題文および図1〜図4の表定義・SQL仕様に基づく。
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.13 ↗(www.ipa.go.jp) / 公式問題冊子 p.14 ↗(www.ipa.go.jp) / 公式問題冊子 p.15 ↗(www.ipa.go.jp) / 公式問題冊子 p.16 ↗(www.ipa.go.jp) / 公式問題冊子 p.17 ↗(www.ipa.go.jp)
コールセンタ設備の構成案及び必要となるオペレータ数の検討
ネットワーク · VoIP / シーケンス図 / 待ち行列理論 / M/M/sモデル / リトルの公式
X社のコールセンタ設備の構成案および必要となるオペレータ数の検討に関する次の設問に答えよ。 設問1:図2のシーケンス図において、公衆電話網から音声ゲートウェイを介して届いた着信要求に対し、着信分配情報サーバに問合せを行って接続先端末を決定し、電話端末へ接続要求を送る構成となっている。オブジェクト a1〜a3 に入る構成要素の組合せとして正しいものを解群から選べ。 設問2:1人のオペレータが1回の問合せに応対する通話時間と結果記録時間の合計を処理時間とする。表1より、平均通話時間は4分、平均結果記録時間は2分である。このとき、想定する平均処理時間は b 分である。また、ピーク時の着信件数が360件/時であるとき、平均着信間隔は c 秒となる。 さらに、リトルの公式 λ × W = L(λ: 平均到着率、W: 平均待ち時間、L: 平均待ち行列長)と表2のオペレータ数と平均待ち行列長の関係を用いて、ピーク時の平均待ち時間を20秒以下にするために必要な最小のオペレータ数 d を求めよ。
- 設問1 ア
- a1: 音声ゲートウェイ, a2: コールサーバ, a3: 顧客情報サーバ
- 設問1 イ
- a1: 音声ゲートウェイ, a2: コールサーバ, a3: 着信分配情報サーバ
- 設問1 ウ
- a1: コールサーバ, a2: 音声ゲートウェイ, a3: 着信分配情報サーバ
- 設問1 エ
- a1: 着信分配情報サーバ, a2: 音声ゲートウェイ, a3: 顧客情報サーバ
- 設問1 オ
- a1: 着信分配情報サーバ, a2: コールサーバ, a3: 顧客情報サーバ
- 設問2 b, c ア
- 3
- 設問2 b, c イ
- 4
- 設問2 b, c ウ
- 5
- 設問2 b, c エ
- 6
- 設問2 b, c オ
- 7
- 設問2 b, c カ
- 8
- 設問2 b, c キ
- 9
- 設問2 b, c ク
- 10
- 設問2 b, c ケ
- 11
- 設問2 b, c コ
- 12
- 設問2 d ア
- 40
- 設問2 d イ
- 41
- 設問2 d ウ
- 42
- 設問2 d エ
- 43
- 設問2 d オ
- 44
解答・解説を表示
解答
設問1 a: イ, 設問2 b: エ, 設問2 c: ク, 設問2 d: ウ
解説
まず要点:リトルの公式(L = λ × W)は、待ち行列(順番待ちの列)が安定しているとき、平均の待ち人数L、平均の到着率λ、平均の待ち時間Wの間に成り立つ基本の関係である。平均到着率λは、平均到着間隔の逆数で求められる。
解き方
- 設問1では、本文にある各装置の役割(音声ゲートウェイ:外線の受付、コールサーバ:VoIPの制御、着信分配情報サーバ:状態の管理と割当て)と照らし合わせ、図2のオブジェクトを特定する。
- 設問2 bでは、表1から通話時間4分と記録時間2分を足し合わせ、処理時間6分を求める。
- 設問2 cでは、1時間(3,600秒)をピーク時の着信件数360件で割り、平均着信間隔10秒を求める。
- 設問2 dでは、平均到着率λ = 1/10(件/秒)と目標の待ち時間W = 20秒から、許される最大の待ち行列長L = 1/10 × 20 = 2.0を計算し、表2からL ≦ 2.0を満たす最小のオペレータ数を読み取る。
小問ごとの答え
- 小問 設問1 a:イ
- 顧客電話機からの要求を最初に受ける a1 は「音声ゲートウェイ」、VoIP制御および端末への接続要求を担う a2 は「コールサーバ」、オペレータ席の状態を管理し接続先端末を決定する a3 は「着信分配情報サーバ」であるため「イ」が正解です。
- 小問 設問2 b:エ
- 平均処理時間は通話時間(4分)と結果記録時間(2分)の合計であるため、4 + 2 = 6分(エ)となります。
- 小問 設問2 c:ク
- ピーク時の着信件数は1時間(3,600秒)あたり360件なので、平均着信間隔は 3,600秒 ÷ 360件 = 10秒(ク)となります。
- 小問 設問2 d:ウ
- 平均着信間隔が10秒より平均到着率 λ = 1/10(件/秒)です。平均待ち時間 W ≦ 20秒 を満たす平均待ち行列長 L は、リトルの公式 λ × W = L より L = (1/10) × 20 = 2.0 以下となります。表2より、平均待ち行列長が2.0以下となる最小のオペレータ数は「42人」(ウ)です。
覚えるポイント
- リトルの公式: L = λ × W(L: 平均待ち行列長、λ: 平均到着率、W: 平均待ち時間)
- 平均到着率 λ は「1 ÷ 平均到着間隔」であり、単位(秒や分)をそろえて計算する。
間違えやすいところ
- 平均着信間隔の計算で、1時間を60秒としてしまい、単位を間違える(正しくは3,600秒)。
- リトルの公式で、平均待ち時間W(秒)と到着率λ(件/時)の時間の単位をそろえずに計算してしまう間違い。
出題の前提:問題文中の検討要件、表1、表2、およびリトルの公式に基づく。
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.18 ↗(www.ipa.go.jp) / 公式問題冊子 p.19 ↗(www.ipa.go.jp) / 公式問題冊子 p.20 ↗(www.ipa.go.jp) / 公式問題冊子 p.21 ↗(www.ipa.go.jp) / 公式問題冊子 p.22 ↗(www.ipa.go.jp)
買上げ・入金管理システムを用いた月次集計処理
ソフトウェア設計 · データベース設計 / E-R図 / 消し込み処理 / 流れ図
買上げ・入金管理システムにおける月次集計処理および消込み処理に関する問題である。関係データベースのE-R図(図1)の空欄[ a ]、および消込み処理の流れ図(図2)の空欄[ b ]〜[ f ]に入る最も適切なものを各解答群から選べ。なお、得意先は入金を買上げ前にも買上げ後にも行うことができる。
- 設問1 a
- 図1の消込表の属性 [ a ](ア: 消込番号/月間買上げ番号, イ: 消込番号/入金番号, ウ: 得意先ID/消込番号, エ: 得意先ID/月間買上げ番号, オ: 得意先ID/入金番号, カ: 入金番号/月間買上げ番号)
- 設問2 b
- 図2のαで入金表から取得する条件 [ b ](ア: 入金額=充当額, イ: 入金額>充当額, ウ: 入金額<充当額, エ: 充当額=0)
- 設問2 c
- 図2のβで月間買上げ表から取得する条件 [ c ](ア: 月間買上げ額>0, イ: 月間買上げ額>消込額, ウ: 消込額=0, エ: 消込額>0, オ: 消込額=月間買上げ額, カ: 消込額>月間買上げ額)
- 設問2 d
- 図2のβで月間買上げ表の整列順 [ d ](ア: 買上げ年月の降順, イ: 買上げ年月の昇順, ウ: 消込額の降順, エ: 月間買上げ額の昇順, オ: 得意先IDの昇順)
- 設問2 e
- 図2の変数1に代入する式 [ e ](ア: [月間買上げ].月間買上げ額+[月間買上げ].消込額, イ: [月間買上げ].月間買上げ額-[月間買上げ].消込額, ウ: [月間買上げ].消込額-[月間買上げ].月間買上げ額, エ: [入金].入金額+[入金].充当額, オ: [入金].入金額-[入金].充当額, カ: [入金].充当額-[入金].入金額)
- 設問2 f
- 図2の変数2に代入する式 [ f ](選択肢群はeと同じ)
解答・解説を表示
解答
設問1 a: カ, 設問2 b: イ, 設問2 c: イ, 設問2 d: イ, 設問2 e: オ, 設問2 f: イ
解説
まず要点:売掛金の消込み処理では、まだ使っていない入金と、まだ消し込んでいない請求(月間買上げ)を、それぞれ古い順に突き合わせる。入金の残りと請求の残りの大きさに応じて消込額を決めて更新する手順を組み立てる。
解き方
- E-R図の関連から、交差実体である消込表の外部キーと主キーの構成をつかむ。
- 処理の決まり(古い順、未充当分だけが対象)に基づき、各表から取り出す条件式と並べ替えの順を決める。
- 流れ図の変数の比較(変数1>変数2)と更新処理から、変数1が入金の残額、変数2が買上げの未消込額を表すことを読み取る。
小問ごとの答え
- 小問 設問1 a:カ
- 消込表は「入金」と「月間買上げ」の多対多の関連を解消する交差実体であり、主キーとして両方の主キーである「入金番号」と「月間買上げ番号」の複合主キーを持ちます。
- 小問 設問2 b:イ
- 消込み処理では「まだ入金額の全てを充当しきれていない入金」を対象とするため、入金額から既充当額を引いた残額がある条件、すなわち「入金額>充当額」が適切です。
- 小問 設問2 c:イ
- 「充当が完了していない月間買上げ額」が対象であるため、月間買上げ額のうちまだ消し込まれていない残額が存在する「月間買上げ額>消込額」の条件を指定します。
- 小問 設問2 d:イ
- 「買上げ年月の古い順に」充当していく仕様であるため、買上げ年月を古い順、すなわち「買上げ年月の昇順」に整列して取得します。
- 小問 設問2 e:オ
- 変数1は消込み①のループ直後で設定され、現在処理中の入金の未充当額(入金額-充当額)を保持します。分岐で変数1が未消込額より大きいか判定し、減算更新されます。
- 小問 設問2 f:イ
- 変数2は消込み②のループ内で設定され、現在処理中の月間買上げの未消込額(月間買上げ額-消込額)を保持します。
覚えるポイント
- 交差実体(連関実体)は結びつける双方の親テーブルの主キーを外部キーとして取り込み、通常それらの複合キーを主キーとします。
間違えやすいところ
- 流れ図の変数1と変数2がそれぞれ「入金の残額」なのか「買上げ額の残額」なのかを、分岐後の「充当額←充当額+変数2」などの更新式から逆算して確かめず、取り違えてしまう間違いが多い。
出題の前提:平成29年度秋期基本情報技術者試験午後問5
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.23 ↗(www.ipa.go.jp) / 公式問題冊子 p.24 ↗(www.ipa.go.jp) / 公式問題冊子 p.25 ↗(www.ipa.go.jp) / 公式問題冊子 p.26 ↗(www.ipa.go.jp) / 公式問題冊子 p.27 ↗(www.ipa.go.jp)
情報システム運用サービスの予算策定と提示価格の計算
サービスマネジメント · ITサービスマネジメント / 予算策定 / 利益率計算 / 原価分析
情報システム運用サービスを提供するA社における、B社サービスの予算策定および提示価格の計算に関する記述を読んで設問1〜3に答えよ。
- 設問1
- 2015〜2017年度の3年度分の予算と実績に関する傾向分析として正しいもの(ア〜カ)
- 設問2 a
- 表2における2018年度のネットワーク費の予算額(ア: 220, イ: 230, ウ: 240, エ: 250, オ: 260, カ: 270)
- 設問2 b
- 2018年度予算の各費目割合と2017年度実績の各費目割合の比較(ア〜カ)
- 設問3 c
- 利益率が10%となる2018年度の提示価格(千円)(ア: 5,670, イ: 6,300, ウ: 6,930, エ: 7,000)
- 設問3 d
- その他経費10%削減・人件費5%削減時の2018年度予算合計の削減割合(ア: 10%未満の, イ: 10%の, ウ: 10%より大きな)
- 設問3 e
- 上記削減時の提示価格を要求価格と同額とした場合の利益率の変化(ア: 上がる, イ: 変わらない, ウ: 下がるがゼロ以下にはならない, エ: 下がってゼロになる, オ: 下がってマイナスになる)
- 設問3 f
- 自動化により人件費15%削減、その他経費10%削減、サーバ費5%増とした場合の利益率(%)(ア: 5.5, イ: 6.1, ウ: 7.1, エ: 7.9, オ: 8.0, カ: 8.9)
解答・解説を表示
解答
設問1: カ, 設問2 a: オ, 設問2 b: エ, 設問3 c: エ, 設問3 d: ア, 設問3 e: ウ, 設問3 f: エ
解説
まず要点:ITサービスの価格を決めるときは、人件費や設備費、通信費などの過去の実績をもとに予算を立て、利益率=(売上-費用)/売上という式で売価やコスト削減の効果を試算する。
解き方
- 過去の実績データの増減と、予算を超えたかどうかを表から正確に計算して確かめる。
- 提示価格を求める式 (P-C)/P = 利益率 から、P = C / (1-利益率) を導いて価格を計算する。
- 費目ごとの増減(%)を各費目の基準額にかけて新しい予算を足し合わせ、要求価格に対する新しい利益率を計算する。
小問ごとの答え
- 小問 設問1:カ
- 実績合計は2015年度6,670>5,900、2016年度6,240>5,800、2017年度7,540>7,290であり、3年度とも予算合計を上回っています。
- 小問 設問2 a:オ
- ネットワーク費の2016年度実績は240、2017年度実績は250で増分は10です。2017年度実績250に増分10を加えると260千円となります。
- 小問 設問2 b:エ
- 2017年度実績に対する2018年度予算の割合を比較すると、人件費のみが58.36%から47.62%へと低下し、他の4費目(サーバ費、PC費、ネットワーク費、その他経費)はすべて割合が上昇しています。
- 小問 設問3 c:エ
- 利益率=(提示価格-予算)/提示価格×100=10%より、提示価格×0.90=予算(6,300千円)となります。したがって提示価格は 6,300÷0.90=7,000千円です。
- 小問 設問3 d:ア
- 人件費5%削減で150千円減、その他経費10%削減で110千円減、削減合計は260千円です。削減率は 260÷6,300≒4.13% となり、10%未満の削減となります。
- 小問 設問3 e:ウ
- 新予算は 6,300-260=6,040千円、要求価格は 7,000×0.90=6,300千円です。利益率は (6,300-6,040)/6,300≒4.13% であり、元の10%から下がりますが正の値(ゼロ以下にはならない)です。
- 小問 設問3 f:エ
- 人件費2,550、サーバ費1,365、PC費640、NW費260、その他経費990となり、新予算合計は5,805千円です。利益率は (6,300-5,805)/6,300=495/6,300≒7.857%となり、四捨五入して7.9%です。
覚えるポイント
- 利益率がrの場合、提示価格Pは「予算÷(1-r)」で算出します。予算に(1+r)を掛ける計算(原価加算のマークアップ)とは異なる点に注意が必要です。
間違えやすいところ
- 利益率10%の提示価格を求めるときに、6,300×1.10=6,930千円としてしまう誤り(マークアップと利益率の混同)がよくある。
出題の前提:平成29年度秋期基本情報技術者試験午後問6
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.28 ↗(www.ipa.go.jp) / 公式問題冊子 p.29 ↗(www.ipa.go.jp) / 公式問題冊子 p.30 ↗(www.ipa.go.jp) / 公式問題冊子 p.31 ↗(www.ipa.go.jp) / 公式問題冊子 p.32 ↗(www.ipa.go.jp)
購買管理システムの導入による業務改善効果
システム戦略 · 業務改善 / 費用対効果 / 投資対効果分析 / システム化要件
日用品メーカのC社における、購買管理システム導入に伴う業務改善効果の評価に関する問題である。システム要件を実現するための開発費と、それによって削減される年間費用(年間効果)を試算し、予算の制約条件下で効果が最大となるシステム要件の組合せを決定する。
- ア
- 設問1 a,b: 増加する / 設問1 c: c1=6,608, c2=84 / 設問2 d: SYS903もSYS907も採用できる / 設問2 e: SYS903もSYS905も採用できる / 設問2 f: SYS903とSYS905
- イ
- 設問1 a,b: 減少するがゼロにならない / 設問1 c: c1=6,608, c2=6,524 / 設問2 d: SYS903もSYS907も採用できない / 設問2 e: SYS903もSYS905も採用できない / 設問2 f: SYS903とSYS907
- ウ
- 設問1 a,b: 不要になる / 設問1 c: c1=7,028, c2=6,524 / 設問2 d: SYS903は採用できるが,SYS907は採用できない / 設問2 e: SYS903は採用できるが,SYS905は採用できない / 設問2 f: SYS905
- エ
- 設問1 a,b: 変わらない / 設問1 c: c1=7,112, c2=84 / 設問2 d: SYS907は採用できるが,SYS903は採用できない / 設問2 e: SYS905は採用できるが,SYS903は採用できない / 設問2 f: SYS907
- オ
- 設問1 c: c1=7,112, c2=7,028
解答・解説を表示
解答
設問1 a: ウ, 設問1 b: イ, 設問1 c: エ, 設問2 d: イ, 設問2 e: ウ, 設問2 f: イ
解説
まず要点:システム化による投資の効果(費用対効果)は、導入の前後で作業の工数や人件費がどれだけ変わるかの差から、年間で削減できる額を求めて評価する。複数の要件から選ぶときは、開発費の上限(予算の制約)の中で、年間効果が最も大きくなる組合せを比べて決める。
解き方
- 設問1では、1日当たりの照合・依頼の工数(分)を足し合わせ、年間の稼働日数240日と時給換算(1,400円/60分)をかけて、現状値c1と将来値c2の年間費用を求める。
- 設問2では、予算30,000千円から必須要件(SYS901, 902, 904)と先に決まったSYS908の開発費を引き、残りの予算で実現できる要望要件の組合せと年間効果を比べる。
小問ごとの答え
- 小問 設問1 a:ウ
- システム化によって目視での照合や再照合はデータチェック機能により自動化されるため、作業時間は不要になります。
- 小問 設問1 b:イ
- 仕入先がWeb画面を介して入力・送信することで誤りは大幅に減少しますが、将来値でも3枚発生するためゼロにはなりません。
- 小問 設問1 c:エ
- 現状は(200+18)枚×5分+18枚×10分=1,270分/日となり、240日・時給1,400円で年間7,112千円です。将来は3枚×5分=15分/日となり年間84千円です。
- 小問 設問2 d:イ
- SYS905を採用した場合の開発費残額は1,050千円となり、SYS903(1,200千円)とSYS907(1,630千円)のどちらも採用できません。
- 小問 設問2 e:ウ
- SYS907を採用した場合の開発費残額は2,170千円となり、SYS903(1,200千円)は採用可能ですが、SYS905(2,750千円)は採用できません。
- 小問 設問2 f:イ
- SYS908に加えてSYS907とSYS903を採用した方が年間効果が23,258千円となり、SYS905のみ採用の22,948千円より大きくなります。
覚えるポイント
- 業務改善の費用対効果は、(作業時間×時給×年間稼働日数)から現状と将来の差額を年間効果として求めます。
- 予算制約下での要件選択では、まず必須要件を除いた残余予算を把握し、組合せごとの総効果を比較します。
間違えやすいところ
- 設問1 cの現状値の計算で、最初の200枚の照合だけでなく、誤り18枚を照合し直す時間(18枚×5分)を足し忘れる間違いが多い。
- 開発費に対する年間効果の割合(効果率)が高い順に選んでも、予算の余り方によっては次に良い要件の組合せの方が総効果で上回ることがある。
出題の前提:平成29年度秋期基本情報技術者試験午後問題問7
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.33 ↗(www.ipa.go.jp) / 公式問題冊子 p.34 ↗(www.ipa.go.jp) / 公式問題冊子 p.35 ↗(www.ipa.go.jp) / 公式問題冊子 p.36 ↗(www.ipa.go.jp) / 公式問題冊子 p.37 ↗(www.ipa.go.jp)
文字列の誤りの検出
データ構造及びアルゴリズム · チェックディジット / 誤り検出 / 2次元パリティ / アルゴリズム
文字と数値の対応表を用いた検査文字(チェック文字)の生成アルゴリズム、および検査文字付文字列の誤り検証アルゴリズムに関する問題である。1文字の誤りや隣接文字の入替え誤りを検出する仕組み、2次元配列(表)構造に拡張した誤り検出手法の特性を追跡する。
- ア
- 設問1 a: false, false / 設問1 b: N - sum % N / 設問1 c: sum / N = 0 / 設問2 d: 1と2と3と4である / 設問3 e: j / 設問4 f: 1と2と3と4である
- イ
- 設問1 a: false, true / 設問1 b: sum % N / 設問1 c: sum / N != 0 / 設問2 d: 2である / 設問3 e: k / 設問4 f: 2である
- ウ
- 設問1 a: true, false / 設問1 b: (N - sum % N) % N / 設問1 c: sum % N = 0 / 設問2 d: 2と3である / 設問3 e: l / 設問4 f: 2と3である
- エ
- 設問1 a: true, true / 設問1 b: (sum - N) % N / 設問1 c: sum % N != 0 / 設問2 d: 2と3と4である / 設問3 e: m / 設問4 f: 2と3と4である
- オ
- 設問2 d: 2と4である / 設問4 f: 2と4である
- カ
- 設問2 d: ない / 設問4 f: ない
解答・解説を表示
解答
設問1 a: エ, 設問1 b: ウ, 設問1 c: エ, 設問2 d: オ, 設問3 e: ウ, 設問4 f: カ
解説
まず要点:チェックサムやチェックディジットは、文字の位置に応じた重み(この問題では奇数番目を2倍、偶数番目はそのままなど)を付け、割り算の余り(modulo N)を使って誤りを見つける。縦と横の2方向で検査文字を付けると、1方向の検査ではすり抜ける複数の文字の誤りも、直交する列方向では1文字の誤りとして確実に見つけられる。
解き方
- 設問1では、擬似言語のフラグ変数is_even/is_oddの初期値とループ内での反転の順を追い、奇数番目・偶数番目に行う処理(2倍して足すか、そのまま足すか)と分岐の正しさを一致させる。
- 設問2では、各ケースの文字列について右端から重みを付けて足し、sum % 30を計算して、余りが0になるものを特定する。
- 設問3では、5列目の文字を上から並べた文字列に生成アルゴリズムを当てはめ、対応する文字を求める。
- 設問4では、行の検査をすり抜けたケースでも、文字が置き換わった列に注目すると縦方向の文字列では1文字だけの誤りになるため、列の検証で必ず誤りとして見つかることを導く。
小問ごとの答え
- 小問 設問1 a:エ
- 末尾文字から逆順走査する際、a1は奇数番目に2倍処理を行うため条件分岐のelseを通す必要がありtrue、a2は奇数番目をそのまま足すため分岐先を通す必要がありtrueとなります。
- 小問 設問1 b:ウ
- 説明(1)④に従い、Nからsum%Nを引いた値をさらにNで割った余りを求めるため、(N - sum % N) % Nとなります。
- 小問 設問1 c:エ
- 説明(2)④に従い、総和sumがNで割り切れない場合にret_valueをfalseにするため、条件式はsum % N != 0となります。
- 小問 設問2 d:オ
- ケース2とケース4は計算される総和sumが60となり、30で割り切れるため誤りがない(falseと判定されない)ケースとなります。
- 小問 設問3 e:ウ
- 5列目の文字列「␣s␣␣」の末尾から奇数・偶数番目の計算を行うと総和は15となり、検査値は(30-15)%30=15で文字「l」になります。
- 小問 設問4 f:カ
- ケース2と4は1行目単体では誤りなしと判定されますが、変化した列位置において縦方向の検査文字付文字列が1文字誤りとなるため列検証で必ず誤りが検出され、誤りなしとなるケースはありません。
覚えるポイント
- Luhnアルゴリズム類似の検査方式では、桁位置による重み付けで隣接桁の転置誤りなどを検出します。
- 2次元の検査文字体系では、ある行で検出できなかった複数文字誤りも、該当する列では1文字誤りとなって検出されるため、検出能力が格段に向上します。
間違えやすいところ
- 設問1 aで、ループ変数の初期状態(i=len)が末尾の文字=1番目の文字であることを忘れ、フラグの真偽を逆にしてしまう誤りがある。
- 設問4で、1行目の検証結果(ケース2と4)だけに気を取られ、各列の検証が行われる仕様を見落としてしまう間違いが多い。
出題の前提:平成29年度秋期基本情報技術者試験午後問題問8
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.38 ↗(www.ipa.go.jp) / 公式問題冊子 p.39 ↗(www.ipa.go.jp) / 公式問題冊子 p.40 ↗(www.ipa.go.jp) / 公式問題冊子 p.41 ↗(www.ipa.go.jp) / 公式問題冊子 p.42 ↗(www.ipa.go.jp) / 公式問題冊子 p.43 ↗(www.ipa.go.jp) / 公式問題冊子 p.44 ↗(www.ipa.go.jp) / 公式問題冊子 p.45 ↗(www.ipa.go.jp)
回文の探索と表示(C言語)
ソフトウェア開発 · C言語 / 文字列探索 / ポインタ演算 / 回文判定
文字列中から回文を探索して表示するCプログラムに関する次の仕様およびプログラムを読み、設問1〜3に答えよ。 〔プログラムの説明〕 ・英字、数字、記号および空白文字から成る文字列中から回文を探す。 ・回文の判定では、英字の大文字と小文字は区別せず、記号および空白文字は無視する。 ・回文は英数字で始まり英数字で終わる。英数字1文字は回文としない。 ・複数の回文がある場合、先頭文字位置が文字列の先頭に最も近いものを表示する。先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。 設問1:プログラム中の [ a ] 〜 [ c ] に入れる正しい答えを選択肢から選べ。 設問2:先頭文字位置が同じ回文が複数ある場合、長さが最も「長い」ものを表示するように関数 find_last_char を用いて変更する。表2中の [ d ]、[ e ] に入れる正しい答えを選択肢から選べ。 設問3:変更後のプログラムに対し、"No!_Madam,_I'm_Adam_Graham._This_is_my_gym."(_は空白)を引数として実行したとき、回文の表示が終了するまでに関数 find_last_char が呼び出される回数 [ f ] と、最後の呼出しにおける引数 count の値 [ g ] を選べ。
- 設問1 a ア
- i
- 設問1 a イ
- ith - &text[0]
- 設問1 a ウ
- ith - &text[0] + 1
- 設問1 a エ
- hit - ith
- 設問1 a オ
- hit - ith + 1
- 設問1 b ア
- l == r
- 設問1 b イ
- l != r
- 設問1 b ウ
- chars[l] == chars[r]
- 設問1 b エ
- chars[l] != chars[r]
- 設問1 b オ
- tolower(chars[l]) == tolower(chars[r])
- 設問1 b カ
- tolower(chars[l]) != tolower(chars[r])
- 設問1 c ア
- ch == str[i]
- 設問1 c イ
- ch != str[i]
- 設問1 c ウ
- tolower(ch) == tolower(str[i])
- 設問1 c エ
- tolower(ch) != tolower(str[i])
- 設問1 c オ
- (ch == tolower(str[i])) || (tolower(ch) == str[i])
- 設問1 c カ
- (ch == tolower(str[i])) && (tolower(ch) == str[i])
- 設問2 d ア
- textlen - psize
- 設問2 d イ
- textlen - i - psize
- 設問2 d ウ
- textlen - i + psize
- 設問2 d エ
- psize + 2
- 設問2 d オ
- psize - 2
- 設問2 e ア
- i = count; i > 0
- 設問2 e イ
- i = count; i >= 0
- 設問2 e ウ
- i = count - 1; i > 0
- 設問2 e エ
- i = count - 1; i >= 0
- 設問3 f ア
- 2
- 設問3 f イ
- 3
- 設問3 f ウ
- 4
- 設問3 f エ
- 5
- 設問3 f オ
- 6
- 設問3 f カ
- 7
- 設問3 g ア
- 13
- 設問3 g イ
- 20
- 設問3 g ウ
- 31
- 設問3 g エ
- 36
- 設問3 g オ
- 38
解答・解説を表示
解答
設問1 a: オ, 設問1 b: カ, 設問1 c: ウ, 設問2 d: オ, 設問2 e: エ, 設問3 f: オ, 設問3 g: イ
解説
まず要点:回文かどうかは、記号や空白を飛ばしながら両端の英数字を小文字にして比べます。前後の文字が違えば回文ではありません。2つの位置の間にある文字数は「終わりの位置−始めの位置+1」で数えます。いちばん長い回文を探すときは、探す範囲を少しずつ狭めながら後ろ側から同じ文字を探します。
解き方
- 設問1:2つの位置の差から部分の長さを求める式、大文字小文字を無視した左右の比較、文字を探す条件をそれぞれ考える。
- 設問2:長い回文を先に見つけるための探す範囲のせばめ方と、後ろの番号から0までたどる繰り返しを明らかにする。
- 設問3:与えられた文字列で find_last_char が呼ばれる回数と、目的の回文ができる最後の呼び出しの count の値を順にたどる。
小問ごとの答え
- 小問 設問1 a:オ
- ポインタ ith から hit までの文字数は、終端 hit と始端 ith の差に 1 を加えた「hit - ith + 1」によって求められます。
- 小問 設問1 b:カ
- 大文字と小文字を区別せずに左右対称を検査し、不一致なら回文ではないため「tolower(chars[l]) != tolower(chars[r])」となります。
- 小問 設問1 c:ウ
- 文字探索において大文字小文字を区別しないため、両者を小文字化して比較する「tolower(ch) == tolower(str[i])」が条件となります。
- 小問 設問2 d:オ
- 前回見つかった回文長 psize よりも短い候補を末尾から逆順に探すため、次の探索範囲の文字数は psize - 2 となります。
- 小問 設問2 e:エ
- 先頭から count 文字以内の末尾(添字 count - 1)から先頭(添字 0)まで逆順に走査するため、「i = count - 1; i >= 0」が正解です。
- 小問 設問3 f:オ
- i=0('N')で1回、i=4('M')で3回(直後、2回目、3回目で回文成立)、i=14('A')で2回、合計6回呼び出されます。
- 小問 設問3 g:イ
- 回文「Madam,_I'm_Adam」が成立して表示される最後の呼出しでは、直前の回文長22に対して count = 22 - 2 = 20 が渡されます。
覚えるポイント
- C言語において両端を含む区間の長さは (end - start + 1) で求める。
間違えやすいところ
- count 個を探すときのいちばん大きい番号が count - 1 であることを見落とす。
出題の前提:平成29年度秋期 基本情報技術者試験 午後問題 問9
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.46 ↗(www.ipa.go.jp) / 公式問題冊子 p.47 ↗(www.ipa.go.jp) / 公式問題冊子 p.48 ↗(www.ipa.go.jp) / 公式問題冊子 p.49 ↗(www.ipa.go.jp) / 公式問題冊子 p.50 ↗(www.ipa.go.jp) / 公式問題冊子 p.51 ↗(www.ipa.go.jp) / 公式問題冊子 p.52 ↗(www.ipa.go.jp)
駐車場の自動精算システム(COBOL)
ソフトウェア開発 · COBOL / 索引ファイル / 順呼び出し / 日付・時刻計算 / 表引き
駐車場の自動精算システムに関する次のCOBOLプログラムの説明及びプログラムを読んで、設問1〜3に答えよ。 〔プログラムの説明〕 ・利用者は入庫時に利用番号と入庫時刻が記録された駐車券を受け取り、出庫時に精算機に投入して精算する。 ・プログラム1は入庫時に精算ファイルに記録するサブプログラム、プログラム2は出庫時に駐車料金を計算して精算ファイルに記録し、料金を呼び出し元に返すサブプログラムである。 ・精算ファイルは主キーを利用番号とする索引ファイルである。 ・駐車料金は1時間ごとに300円課金され、入庫時刻と同じ“分”を過ぎると1分でも次の1時間の課金対象となる。 設問1:プログラム1における精算ファイルの呼出し法として正しいものを解答群から選べ。 設問2:プログラム2中の [ a ] 〜 [ c ] に入れる正しい答えを選択肢から選べ。 設問3:夜間時間帯(20時00分〜翌朝5時59分)の課金単位を100円とする割引を導入するため、プログラム2を変更する。表1中の [ d ] 〜 [ f ] に入れる正しい答えを選択肢から選べ。
- 設問1 ア
- 順呼出し (ACCESS MODE IS SEQUENTIAL)
- 設問1 イ
- 動的呼出し (ACCESS MODE IS DYNAMIC)
- 設問1 ウ
- 乱呼出し (ACCESS MODE IS RANDOM)
- 設問2 a ア
- ADD PRM-FEE TO ACCT-FEE
- 設問2 a イ
- MOVE ACCT-FEE TO PRM-FEE
- 設問2 a ウ
- MOVE PRM-FEE TO ACCT-FEE
- 設問2 a エ
- MOVE PRM-NO TO ACCT-NO
- 設問2 b ア
- *
- 設問2 b イ
- +
- 設問2 b ウ
- -
- 設問2 b エ
- /
- 設問2 c ア
- ADD 1 TO W-HRS
- 設問2 c イ
- ADD ACCT-O-HH TO W-HRS
- 設問2 c ウ
- SUBTRACT 1 FROM W-HRS
- 設問2 c エ
- SUBTRACT ACCT-I-HH FROM W-HRS
- 設問3 d ア
- COMPUTE W-IDX = ACCT-I-HH + 1
- 設問3 d イ
- COMPUTE W-IDX = ACCT-I-HH - 1
- 設問3 d ウ
- MOVE 1 TO W-IDX
- 設問3 d エ
- MOVE ACCT-I-HH TO W-IDX
- 設問3 e ア
- W-CNT = W-HRS
- 設問3 e イ
- W-CNT > W-HRS
- 設問3 e ウ
- W-HRS = W-IDX
- 設問3 e エ
- W-IDX = 24
- 設問3 e オ
- W-IDX = W-CNT
- 設問3 e カ
- W-IDX > 24
- 設問3 f ア
- W-CNT = W-HRS
- 設問3 f イ
- W-CNT > W-HRS
- 設問3 f ウ
- W-HRS = W-IDX
- 設問3 f エ
- W-IDX = 24
- 設問3 f オ
- W-IDX = W-CNT
- 設問3 f カ
- W-IDX > 24
解答・解説を表示
解答
設問1: ア, 設問2 a: イ, 設問2 b: ウ, 設問2 c: ア, 設問3 d: ア, 設問3 e: イ, 設問3 f: カ
解説
まず要点:COBOLで索引ファイルの末尾に追加するとき(OPEN EXTEND)は、順呼出しモードを使います。0時〜23時を1〜24の配列の番号に対応させるときは1を足して合わせます。時間を数える繰り返しでは、番号が24を超えたら先頭の1に戻します。
解き方
- 設問1:プログラム1のファイルの開き方(EXTEND)と書き込み(WRITE)から、呼び出し方を判断する。
- 設問2:プログラム2の料金を返す文、出庫と入庫の時刻の差の計算、分の切り上げを順に確かめて空欄を埋める。
- 設問3:時間帯別の料金表の作りを確かめ、最初の番号の決め方、繰り返しの終わり方、日付をまたぐ判定を特定する。
小問ごとの答え
- 小問 設問1:ア
- プログラム1では OPEN EXTEND でファイルを開き、末尾へ連続して WRITE するため、呼出し法は順呼出し(SEQUENTIAL)となります。
- 小問 設問2 a:イ
- 計算された料金 ACCT-FEE を呼出し元への返却用パラメータ PRM-FEE に設定するため、「MOVE ACCT-FEE TO PRM-FEE」とします。
- 小問 設問2 b:ウ
- 出庫時刻の通算時間から入庫時刻の通算時間を引いて駐車時間(時間単位)を求めるため、演算子は減算の「-」となります。
- 小問 設問2 c:ア
- 入庫の「分」より出庫の「分」が大きい場合、端数時間が発生しているため課金単位数 W-HRS に 1 を加算(ADD 1 TO W-HRS)します。
- 小問 設問3 d:ア
- 入庫時刻の時は 0〜23 で表現されますが、COBOL のテーブル添字は 1〜24 であるため、「COMPUTE W-IDX = ACCT-I-HH + 1」として 1 を加算します。
- 小問 設問3 e:イ
- PERFORM VARYING W-CNT FROM 1 BY 1 UNTIL では終了条件を指定するため、W-HRS 回繰り返した後に終了する条件は「W-CNT > W-HRS」です。
- 小問 設問3 f:カ
- 毎時インデックス W-IDX に 1 を足していき、24 時を超えて翌日の 0 時(添字 1)に戻す判定条件は「W-IDX > 24」となります。
覚えるポイント
- COBOLのテーブル添字は1から始まり、UNTIL条件は真になった時点で終了する。
間違えやすいところ
- 0〜23時の表記をそのまま1〜24の番号に使おうとして、1を足すのを忘れる。
出題の前提:平成29年度秋期 基本情報技術者試験 午後問題 問10
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.53 ↗(www.ipa.go.jp) / 公式問題冊子 p.54 ↗(www.ipa.go.jp) / 公式問題冊子 p.55 ↗(www.ipa.go.jp) / 公式問題冊子 p.56 ↗(www.ipa.go.jp) / 公式問題冊子 p.57 ↗(www.ipa.go.jp)
Javaプログラムによる複数条件での表の整列処理
ソフトウェア開発 · Java / Comparator / Map / オブジェクト指向 / ソートアルゴリズム
文字列の配列を要素にもつ配列で表現された表の行を、指定された順序指定子と列位置に基づいて並べ替えるJavaプログラム(TableSorterクラスおよびテスト用クラス)に関する問題である。空欄a〜eを埋めてプログラムを完成させ、また並べ替え条件を変更した際の実行結果を答える。
- 設問1 a ア
- Character, Comparator<String>
- 設問1 a イ
- Character, String
- 設問1 a ウ
- String, Comparator<String>
- 設問1 a エ
- String, String
- 設問1 b ア
- int i = 0; i < orderBys.length; i++
- 設問1 b イ
- int i = 0; i < table.length; i++
- 設問1 b ウ
- OrderBy orderBy : orderBys
- 設問1 b エ
- String[] row : table
- 設問1 c ア
- .get(col)
- 設問1 c イ
- .get(orderBy.col)
- 設問1 c ウ
- [col]
- 設問1 c エ
- [orderBy.col]
- 設問1 d ア
- !=
- 設問1 d イ
- <
- 設問1 d ウ
- ==
- 設問1 d エ
- >
- 設問1 e ア
- -order
- 設問1 e イ
- order
- 設問1 e ウ
- orderBy.isReversed ? -order : order
- 設問1 e エ
- orderBy.isReversed ? order : -order
- 設問2 ア
- apple 2 300
- 設問2 イ
- apple 3 1,000
- 設問2 ウ
- banana 1 300
- 設問2 エ
- banana 2 2,000
- 設問2 オ
- cherry 1 1,000
- 設問3 ア
- apple 2 300
- 設問3 イ
- apple 3 1,000
- 設問3 ウ
- banana 1 300
- 設問3 エ
- banana 2 2,000
- 設問3 オ
- cherry 1 1,000
解答・解説を表示
解答
設問1 a: ウ, 設問1 b: ウ, 設問1 c: エ, 設問1 d: ア, 設問1 e: ウ, 設問2: イ, 設問3: イ
解説
まず要点:複数の条件で並べ替えるときは、優先度の高いキーから順に比べます。違いが出た時点でその結果を返し、同じ値のときだけ次のキーを比べます。文字の並び順で比べる場合と、数値に直して比べる場合の違いに注意します。
解き方
- プログラム1のクラスや項目の作りとComparatorの処理から、空欄a〜eの書き方と動きを明らかにする。
- 設問2と設問3で指定された列の番号と比べ方(文字の並び順か、カンマを取った数値か)を確かめ、並び順を正しくたどる。
小問ごとの答え
- 小問 設問1 a:ウ
- putSortOrderメソッドの第1引数がString key、第2引数がComparator<String> orderであり、orderMap.put(key, order)と格納されているため、orderMapの型はMap<String, Comparator<String>>となります。
- 小問 設問1 b:ウ
- 可変長引数final OrderBy... orderBysで渡された各ソート条件を順に評価するため、拡張for文の形式「OrderBy orderBy : orderBys」が適切です。
- 小問 設問1 c:エ
- 比較対象のs1およびs2は表の行を表すString配列(String[])なので、orderByで指定された列インデックスを参照するには配列添字[orderBy.col]を用います。
- 小問 設問1 d:ア
- 現在のソートキーによる比較結果orderが0以外(一致しない)であれば大小順が確定するため、直ちに結果をリターンします。したがって「order != 0」となります。
- 小問 設問1 e:ウ
- 降順フラグorderBy.isReversedがtrueの場合は逆順とするため-orderを返し、falseの場合は昇順のままorderを返します。条件演算子を用いて「orderBy.isReversed ? -order : order」と記述します。
- 小問 設問2:イ
- 第1キーは列2の文字列辞書順(昇順)、第2キーは列0の文字列辞書順(昇順)です。列2の値を文字列として辞書順比較すると、'1,000' < '2,000' < '300' となり、'1,000'を持つ行(apple 3とcherry 1)が先頭候補となります。次に第2キーの列0で'apple' < 'cherry'となるため、1行目は「apple 3 1,000」が出力されます。
- 小問 設問3:イ
- 第1キーはカンマを除去した数値昇順(列2)、第2キーは辞書順(列0)です。数値としては300(apple 2, banana 1)、1000(apple 3, cherry 1)、2000(banana 2)となります。300のグループでは第2キー比較により1行目がapple 2 300、2行目がbanana 1 300となります。続く1000のグループではapple 3とcherry 1のうち'apple'が先に来るため、3行目は「apple 3 1,000」となります。
覚えるポイント
- 文字列の辞書順比較(lexical order)では文字コードの先頭から比較されるため、数値文字列の大小関係と異なる場合がある点に注意する。
間違えやすいところ
- '1,000'と'300'を文字の並び順で比べるとき、数値だと思って300が小さいと間違えやすいです。
出題の前提:平成29年度秋期基本情報技術者試験 午後 問11
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.58 ↗(www.ipa.go.jp) / 公式問題冊子 p.59 ↗(www.ipa.go.jp) / 公式問題冊子 p.60 ↗(www.ipa.go.jp) / 公式問題冊子 p.61 ↗(www.ipa.go.jp) / 公式問題冊子 p.62 ↗(www.ipa.go.jp) / 公式問題冊子 p.63 ↗(www.ipa.go.jp)
ビット列の検索および置換を行うアセンブラプログラム
ソフトウェア開発 · CASL II / アセンブラ / ビット演算 / 論理シフト / 算術シフト
COMET IIのアセンブラ言語CASL IIにおいて、2語から成るビット列αの中から指定されたビット列βと一致する位置を検索する副プログラムBSRH、および一致した部分をビット列γで置き換える副プログラムBREPに関する問題である。空欄a〜dを埋め、さらに特定条件下でのレジスタの値を導出する。
- 設問1 a ア
- AND GR7, GR2
- 設問1 a イ
- OR GR7, GR2
- 設問1 a ウ
- SLL GR7, 0, GR2
- 設問1 a エ
- SRL GR7, 0, GR2
- 設問1 a オ
- XOR GR7, GR2
- 設問1 b ア
- JMI FOUND
- 設問1 b イ
- JMI NEXT
- 設問1 b ウ
- JOV FOUND
- 設問1 b エ
- JOV NEXT
- 設問1 b オ
- JPL FOUND
- 設問1 b カ
- JPL NEXT
- 設問2 ア
- SLL GR6, -1, GR3
- 設問2 イ
- SLL GR6, 0, GR3
- 設問2 ウ
- SRA GR6, -1, GR3
- 設問2 エ
- SRA GR6, 0, GR3
- 設問2 オ
- SRL GR6, -1, GR3
- 設問2 カ
- SRL GR6, 0, GR3
- 設問3 c ア
- ADDL GR2, GR7
- 設問3 c イ
- LD GR2, =0
- 設問3 c ウ
- LD GR2, =16
- 設問3 c エ
- LD GR2, =32
- 設問3 c オ
- SUBA GR2, GR7
- 設問3 d ア
- AND GR2, GR4
- 設問3 d イ
- OR GR2, GR4
- 設問3 d ウ
- SLL GR2, 0, GR4
- 設問3 d エ
- SRL GR2, 0, GR4
- 設問3 d オ
- XOR GR2, =#FFFF
- 設問4 ア
- #0003
- 設問4 イ
- #0007
- 設問4 ウ
- #8000
- 設問4 エ
- #C000
- 設問4 オ
- #E000
- 設問4 カ
- #F000
解答・解説を表示
解答
設問1 a: オ, 設問1 b: エ, 設問2: ウ, 設問3 c: イ, 設問3 d: イ, 設問4: オ
解説
まず要点:COMET IIのビット操作では、指定した範囲だけを取り出すためのマスク(ビットを選ぶ型)を作るときに、算術右シフト(SRA)で符号を広げる方法を使います。また、2語にまたがるシフトでは、はみ出したビットをOF(あふれを知らせる印)で下の語から上の語へと移します。
解き方
- BSRHの検索の繰り返しで、マスクした部分と探すキーをXORして0か調べる方法と、2語間の繰り上げをたどる。
- BREPで1語目の中・2語目の中・2語にまたがる場合の分け方と、レジスタの操作やマスクの作りをたどって値を求める。
小問ごとの答え
- 小問 設問1 a:オ
- 行13でマスクされたGR7と探索対象ビット列β(GR2に左詰めで格納)が完全一致するかを判定するため、排他的論理和をとって結果が0になるか(JZE FOUND)を調べます。したがって「XOR GR7, GR2」が入ります。
- 小問 設問1 b:エ
- 2語のビット列を左シフトする際、2語目GR5のシフト(SLL GR5, 1)で最上位から溢れたビットはOFに設定されます。OF=1のとき1語目GR4の最下位に1を補うため、NEXTへ分岐する命令「JOV NEXT」が適切です。
- 小問 設問2:ウ
- 上位nビットが1で下位が0のマスクを作成するため、最上位ビットのみが1である#8000に対して算術右シフトを行うと、符号ビットの1が上位に補充されます。シフト量はn-1ビット(GR3-1)であるため、「SRA GR6, -1, GR3」となります。
- 小問 設問3 c:イ
- 2語目のみに一致した場合、行30の直後でGR2をp-16に設定する必要があります。行11でGR3には16-pが保持されているため、GR2を0にしておけば「SUBA GR2, GR3」により 0 - (16 - p) = p - 16 が求まります。よって「LD GR2, =0」です。
- 小問 設問3 d:イ
- 行38〜39で対象ビット範囲を0クリアしたGR2に対して、位置合わせされた置換用ビット列γ(GR4に格納)を合成して書き戻すため、論理和命令「OR GR2, GR4」を実行します。
- 小問 設問4:オ
- αのビット列は1語目が#FFF3(末尾0011)、2語目が#7FFF(先頭0111)であり、β=11011はビット位置14〜18(1語目の下位2ビットと2語目の上位3ビット)に現れるためp=14です。1語目に入るビット数は16-14=2ビットでGR3=2となります。2語目用マスクGR6は初期マスク#F800を行23でGR3(2ビット)左シフトするため、#F800(1111 1000 0000 0000)<< 2 = #E000(1110 0000 0000 0000)となります。
覚えるポイント
- CASL IIの算術右シフト(SRA)は符号ビット(ビット15)を維持して空いたビットに複写するため、先頭から連続する1のマスク生成に極めて有用です。
間違えやすいところ
- SLLのとき、はみ出したビットがOFに入るという決まりを忘れ、SFやZFで分けようとする間違いが多いです。
出題の前提:平成29年度秋期基本情報技術者試験 午後 問12
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.64 ↗(www.ipa.go.jp) / 公式問題冊子 p.65 ↗(www.ipa.go.jp) / 公式問題冊子 p.66 ↗(www.ipa.go.jp) / 公式問題冊子 p.67 ↗(www.ipa.go.jp)
サーバのアクセスログの分析(表計算ソフトの関数およびマクロ)
ソフトウェア開発 · 表計算 / 文字列操作 / 検索関数 / マクロ / アルゴリズム
社内のProxyサーバのアクセスログを分析するため、表計算ソフトを用いてワークシート「ログ」「集計」およびマクロ「Page_count」を作成した。各設問の記述中の空欄[ a ]〜[ f ]に当てはまる適切なものを、それぞれの解答群から選べ。 【ワークシート構成】 ・「ログ」:A列(時刻:1970年1月1日0:00からの経過分)、B列(IPアドレス)、C列(URL)、D列(時間帯0〜23)、E列(曜日コード0〜6、木曜=0)、F列(集計キー:時間帯と曜日コードを結合した文字列) ・「曜日」:1行目に木〜水、2行目に曜日コード0〜6(A1=木/A2=0、…、G1=水/G2=6) ・「集計」:時間帯別・曜日別のアクセス集計表および分析表 ・マクロ「Page_count」:アクセス先集計シートにおいてURLごとのアクセス回数を集計する
- 設問1 a カ
- IF(A2 = null, null, 剰余(切捨て(A2 / 60, 0), 24))
- 設問2 b ウ
- =結合(B$2, 水平照合($A3, 曜日!$B$1:$H$2, 2, 0))
- 設問2 c イ
- 照合検索(最大(Z3:Z9), Z3:Z9, A3:A9)
- 設問3 d ウ
- 論理積(count_url ≠ null, count_url ≠ log_url)
- 設問3 e イ
- count_url = null
- 設問3 f ア
- 相対(A1, count_line, 1) ← 相対(A1, count_line, 1) + 1
解答・解説を表示
解答
設問1 a: カ, 設問2 b: ウ, 設問2 c: イ, 設問3 d: ウ, 設問3 e: イ, 設問3 f: ア
解説
まず要点:表計算で日時を扱うときは、分と時間の単位を換算し、割った余りで繰り返し(1日は24時間、1週間は7日)を取り出します。表から値を探す関数でデータを参照し、マクロでは上から順に探す繰り返しの続け方や終わった後の分け方、相対セル参照を正しく書くことが大切です。
解き方
- 設問1:経過した分から時間帯(0〜23)を出す式を考え、60で割って時間にした後、24の余りを取る式を選ぶ。
- 設問2:集計キーの作り方(時間帯+曜日コード)に従い、セル参照と水平照合を結合の式に入れる。いちばん多い曜日は照合検索で取り出す。
- 設問3:マクロの上から順に探す流れをたどり、続ける条件、未登録のときの分け方、既存の行を更新するときの相対参照の加算を明らかにする。
小問ごとの答え
- 小問 設問1 a:カ
- A2は基準時刻からの経過分数であるため、60で割って切り捨てる(切捨て(A2 / 60, 0))ことで通算経過時間となり、これを24で割った余りを求めることで当日の時間帯(0〜23)が得られます。
- 小問 設問2 b:ウ
- 集計キーは時間帯と曜日コードをつないだ文字列です。時間帯は列見出し「B$2」、曜日コードはセル$A3の曜日を「水平照合($A3, 曜日!$B$1:$H$2, 2, 0)」で検索して取得し、これを結合します。
- 小問 設問2 c:イ
- アクセス回数の曜日別合計はZ3:Z9にあり、対応する曜日はA3:A9にあります。最多の曜日を求めるには、照合検索(式, 検索範囲, 抽出範囲)を用いて照合検索(最大(Z3:Z9), Z3:Z9, A3:A9)とします。
- 小問 設問3 d:ウ
- 集計シートを上から順に探索するループの継続条件は、「セルの値が空値ではなく」かつ「探しているURLにまだ一致していない」間であるため、論理積(count_url ≠ null, count_url ≠ log_url)となります。
- 小問 設問3 e:イ
- ループ終了後、count_urlがnullであれば未登録の新規URLであることを意味するため、新規行にURLと初期値1を登録する処理を行う分岐条件として「count_url = null」を指定します。
- 小問 設問3 f:ア
- 既存のURLが見つかった場合(else側)は、当該行の列B(相対参照で列方向+1の位置)にあるアクセス回数を1加算するため、「相対(A1, count_line, 1) ← 相対(A1, count_line, 1) + 1」を実行します。
覚えるポイント
- 時間帯(0〜23)の算出は「剰余(切捨て(経過分 / 60, 0), 24)」で行う
- 水平照合は上端行をキー検索し、指定行位置の値を返す
- 線形探索マクロの継続条件は「末尾未達 AND 未発見」である
間違えやすいところ
- 照合検索の引数の順番(検索値、探す範囲、取り出す範囲)を逆にしてしまう。
- 相対参照の引数(セル、行のずれ、列のずれ)で行と列の順番を混同してしまう。
- 前判定の繰り返しで、続ける条件のところに終わる条件を書いて取り違える。
出題の前提:平成29年度秋期 基本情報技術者試験 午後問題 問13 表計算
出典:IPA『2017年度 秋期 午後』
公式問題冊子 p.68 ↗(www.ipa.go.jp) / 公式問題冊子 p.69 ↗(www.ipa.go.jp) / 公式問題冊子 p.70 ↗(www.ipa.go.jp) / 公式問題冊子 p.71 ↗(www.ipa.go.jp) / 公式問題冊子 p.72 ↗(www.ipa.go.jp) / 公式問題冊子 p.73 ↗(www.ipa.go.jp) / 公式問題冊子 p.74 ↗(www.ipa.go.jp) / 公式問題冊子 p.75 ↗(www.ipa.go.jp)
2017年度 秋期 午後
参照した公式資料
IPAが公開した2017年度 秋期 午後の問題・解答資料です。

