旧制度の午前・午後と、2023年度以降の科目A・科目Bの公開問題を区別しています。現在の試験対策では現行シラバスと科目Bの形式を確認してください。公開問題は本試験の全出題を網羅する資料ではありません。
2019年度 春期 午後の概要
クラウドサービスの利用者認証
情報セキュリティ · SAML / シングルサインオン / ディジタル署名 / アクセス制御
A社における社内LANおよびB社クラウドサービスの利用者認証連携(SAMLを参考にした構成)に関する次の記述を読み、設問1・2に答えよ。 〔社内構成とクラウドサービスの概要〕 A社では利用者が社内LAN上のクライアントPCからプロキシサーバを経由して社外Webサービスを利用している。社外から社内LANへのリモートアクセスや社内LAN宛ての外部からの直接通信はファイアウォールで禁止されている。 A社は販売管理システムをB社クラウドサービスへ移行し、シングルサインオンを実現するために社内LANにIDプロバイダ(IdP)を設置した。IdPは認証結果、認証有効期限、利用者IDからなる認証済情報にディジタル署名を付加してブラウザ経由でB社に送る。 〔設問1〕 本文中の空欄 a 〜 c に入る適切な語句を解答群から選べ。 (1) 利用者が本人であることを確認するためにA社認証サーバで用いる [ a ] は、B社クラウドサービスには送信しない。 (2) B社クラウドサービスは、付加されているディジタル署名を使って、受信した認証済情報に [ b ] がないことを検証する。このために、IdPの [ c ] をB社クラウドサービスに登録しておく。 〔設問2〕 次の記述中の空欄 d, e に入る適切な答えを選べ。 B社クラウドサービスは接続元IPアドレス制限の機能を提供していないが、他の業務システムと同様に社内LANからの利用に限定できる。 この理由は、[ d ] ことが必要であるが、IdPを社内LANに設置するので、社外からB社クラウドサービスを利用しようとしても、図2中の [ e ] の送信で失敗し、利用者認証されないからである。
- a〜cの選択肢: ア
- PKI
- a〜cの選択肢: イ
- 改ざん
- a〜cの選択肢: ウ
- 公開鍵
- a〜cの選択肢: エ
- サービス妨害
- a〜cの選択肢: オ
- 生体情報
- a〜cの選択肢: カ
- パスワード
- a〜cの選択肢: キ
- 秘密鍵
- a〜cの選択肢: ク
- 利用者ID
- a〜cの選択肢: ケ
- 漏えい
- dの選択肢: ア
- B社クラウドサービスが、IdPと直接通信する
- dの選択肢: イ
- B社クラウドサービスが、利用者認証情報を検証し、Webブラウザに返信する
- dの選択肢: ウ
- IdPが、利用者に代わって、利用者認証情報をB社クラウドサービスに送信する
- dの選択肢: エ
- Webブラウザが、IdPと通信する
- eの選択肢: ア
- ①
- eの選択肢: イ
- ③
- eの選択肢: ウ
- ⑤
- eの選択肢: エ
- ⑥
- eの選択肢: オ
- ⑨
解答・解説を表示
解答
設問1: a=カ, b=イ, c=ウ; 設問2: d=エ, e=イ
解説
まず要点:SAMLを使った認証の連携では、IdP(認証を代わりに行うサーバ)が作った認証情報に署名を付け、ブラウザを通してB社へ届けます。パスワードは外部サービスへ送らず、送るのは利用者IDなどです。社内LANにIdPを置けば、社外からはIdPに届かないので、B社側にIP制限がなくても社内からしか使えません。
解き方
- 設問1: A社の認証情報のうちB社へ渡さないのはパスワード(a=カ)。署名で確かめるのは改ざんの有無(b=イ)。確認に使うのはIdPの公開鍵(c=ウ)。
- 設問2: 図2ではブラウザがIdPへアクセス要求を送る(d=エ)。社外の端末から社内LANのIdPへの要求(手順③)はファイアウォールで止められ、認証に失敗する(e=イ)。
小問ごとの答え
- 小問 設問1 a:カ
- 利用者認証情報は「利用者IDとパスワード」の二つであり、B社には利用者IDのみが渡されパスワードは送信されません。
- 小問 設問1 b:イ
- ディジタル署名はメッセージの真正性と改ざんの有無を検証するために用いられます。
- 小問 設問1 c:ウ
- 送信者(IdP)が秘密鍵で署名を生成するため、受信者(B社)側で署名を検証するにはIdPの公開鍵が必要です。
- 小問 設問2 d:エ
- 手順③・⑤に示されるように、認証プロセスにおいてWebブラウザがIdPと直接通信する必要があります。
- 小問 設問2 e:イ
- 社外にいるブラウザから社内LANにあるIdPへのアクセス要求(③)は、外部からの通信を遮断するファイアウォールによって失敗します。
覚えるポイント
- SAMLではSPとIdP間をブラウザのリダイレクト(HTTP POST等)により仲介する。
- ディジタル署名の検証には、署名者の公開鍵を利用してハッシュ値の一致を検証する。
間違えやすいところ
- 署名を確認する鍵として、送る側の秘密鍵を渡すと勘違いすること。
- SAMLの連携でB社とIdPが直接通信すると誤解し、ブラウザ経由という点を見落とすこと。
出題の前提:2019年度春期基本情報技術者試験午後問1の出題条件に基づく
出典:IPA『2019年度 春期 午後』
公式問題冊子 p.5 ↗(www.ipa.go.jp) / 公式問題冊子 p.6 ↗(www.ipa.go.jp) / 公式問題冊子 p.7 ↗(www.ipa.go.jp) / 公式問題冊子 p.8 ↗(www.ipa.go.jp)
仮想記憶方式
ソフトウェア · ページング方式 / ページテーブル / ページフォールト / FIFO / LRU
仮想記憶方式(ページング方式)に関する次の記述を読み、設問1〜3に答えよ。 〔ページング方式の管理〕 仮想アドレス空間と物理アドレス空間はそれぞれ仮想ページ、物理ページに分割され、ページテーブルで対応管理される。存在ビットが1のとき主記憶上に存在し、物理ページ番号が登録されている。 〔設問1〕 図1において、仮想ページ1〜4に格納されているデータはそれぞれA, B, C, Dである。図1の物理アドレス空間を見ると、データAは物理ページ2、データBは物理ページ5、データCは物理ページ7、データDは物理ページ3に格納されている。このときページテーブルの a1〜a4 に入る物理ページ番号の組合せとして正しいものを選べ。 〔設問2〕 ページフォールト割込み処理の記述中の空欄 b1, b2, c1, c2 に入る適切な語句の組合せを選べ。 空きページがなかった場合、空きページにする [ b1 ] ページを一つ選び、その選んだページに格納されているデータを [ b2 ]。その後、対応するページテーブルの存在ビットを0にして空きページを確保する。 空きページにプログラムの実行に必要な [ c1 ] ページに格納されているデータを [ c2 ]。その後、対応するページテーブルの要素に物理ページ番号を登録して存在ビットを1にする。 〔設問3〕 仮想ページの参照順が「4 → 2 → 1 → 5 → 4 → 2 → 3 → 4 → 2 → 1 → 5 → 3 → 5」であるときを考える。 (1) FIFOを用いた場合、物理ページ数が3のときのページフォールト発生回数は9回である。物理ページ数が4のとき、発生回数は3のときと比べて [ d ]。 (2) LRUを用いた場合、物理ページ数が3のときのページフォールト発生回数は10回である。物理ページ数が4のとき、発生回数は3のときと比べて [ e ]。
- 設問1: ア
- a1=1, a2=2, a3=3, a4=4
- 設問1: イ
- a1=2, a2=3, a3=5, a4=7
- 設問1: ウ
- a1=2, a2=5, a3=7, a4=3
- 設問1: エ
- a1=5, a2=1, a3=4, a4=7
- 設問1: オ
- a1=5, a2=2, a3=7, a4=3
- 設問2(b): ア
- b1=仮想, b2=補助記憶装置から読み込む
- 設問2(b): イ
- b1=仮想, b2=補助記憶装置に書き出す
- 設問2(b): ウ
- b1=物理, b2=補助記憶装置から読み込む
- 設問2(b): エ
- b1=物理, b2=補助記憶装置に書き出す
- 設問2(c): ア
- c1=仮想, c2=補助記憶装置から読み込む
- 設問2(c): イ
- c1=仮想, c2=補助記憶装置に書き出す
- 設問2(c): ウ
- c1=物理, c2=補助記憶装置から読み込む
- 設問2(c): エ
- c1=物理, c2=補助記憶装置に書き出す
- 設問3(d,e): ア
- 1回増える
- 設問3(d,e): イ
- 1回減る
- 設問3(d,e): ウ
- 2回増える
- 設問3(d,e): エ
- 2回減る
- 設問3(d,e): オ
- 3回増える
- 設問3(d,e): カ
- 3回減る
- 設問3(d,e): キ
- 4回増える
- 設問3(d,e): ク
- 4回減る
- 設問3(d,e): ケ
- 変わらない
解答・解説を表示
解答
設問1: a=ウ; 設問2: b=エ, c=ア; 設問3: d=ア, e=エ
解説
まず要点:ページング方式では、ページテーブルを使って仮想アドレスと物理アドレスを対応づけます。空きがなければFIFOやLRUといった決まりでページを追い出し、新しいページを入れます。FIFOでは枠を増やしてもページフォールトが増えることがあります(Beladyの変則)。
解き方
- 設問1: 仮想ページ番号1〜4のデータA〜Dが物理アドレス空間の何番にあるかを図1で確かめ、2, 5, 7, 3の並びを選びます。
- 設問2: ページの入れ替えでは「物理」ページを選んで補助記憶へ「書き出し」(b=エ)、使いたい「仮想」ページのデータを補助記憶から「読み込み」ます(c=ア)。
- 設問3のFIFO(4枠): 参照順をたどるとページフォールトは計10回になり、9回から「1回増える」となります(d=ア)。
- 設問3のLRU(4枠): たどるとページフォールトは計8回になり、10回から「2回減る」となります(e=エ)。
小問ごとの答え
- 小問 設問1 a:ウ
- 仮想ページ1のデータAは物理ページ2、仮想ページ2のデータBは物理ページ5、仮想ページ3のデータCは物理ページ7、仮想ページ4のデータDは物理ページ3に対応するため、a1=2, a2=5, a3=7, a4=3です。
- 小問 設問2 b:エ
- 主記憶が満杯のとき、空きを作るために「物理」ページを選んで追い出し、そのデータを補助記憶装置に書き出します(ページアウト)。
- 小問 設問2 c:ア
- 空き物理ページに対して、実行に必要な「仮想」ページに対応するデータを補助記憶装置から読み込みます(ページイン)。
- 小問 設問3 d:ア
- FIFO・枠4個でシミュレーションするとページフォールトは計10回発生します。3個のときの9回より1回増えます(Beladyの変則)。
- 小問 設問3 e:エ
- LRU・枠4個でシミュレーションするとページフォールトは計8回発生します。3個のときの10回より2回減ります。
覚えるポイント
- FIFOでは物理ページ枠数を増やしてもページフォールト数が増加する現象(Beladyの変則・アノマリ)が起こり得る。
- LRU(Least Recently Used)はスタック型アルゴリズムのためBeladyの変則は生じない。
間違えやすいところ
- ページ枠を増やせば必ずページフォールトが減ると早合点し、FIFOの計算をせずに「減る」を選んでしまう誤り。
- LRUの追跡で、参照があったページの最終参照順を更新し忘れ、最も古い要素の選び方を誤るミス。
出題の前提:2019年度春期基本情報技術者試験午後問2の出題条件に基づく
出典:IPA『2019年度 春期 午後』
公式問題冊子 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 / 参照整合性制約 / 外部結合 / COUNT関数とNULL
中学校の定期健康診断データを管理する関係データベースに関する問題である。健診結果表および受診者情報表の定義、これらから作成される測定結果ビューの定義、推移表を出力するSQL文の空欄補充、テーブル間の制約関係、および外部結合を用いた度数分布表作成時の集計関数(COUNT)の誤りとその修正について解答する。
解答・解説を表示
解答
設問1: a=ア, b=ウ, c=ア; 設問2: d=エ, e=ウ; 設問3: f=ア
解説
まず要点:関係データベースでは、主キーや外部キー(他の表を参照する仕組み)でデータの整合性を保ちます。外部結合では、相手の表に合う行がない部分はNULL(値がない状態)になります。COUNT(*)はNULLの行も数えますが、COUNT(列名)はその列がNULLでない行だけを数える点が大切です。
解き方
- 設問1では、WHERE句のあいまい検索(LIKEと1文字を表す_)とORDER BY句の昇順(ASC)を確かめ、条件を組み立てます。
- 設問2では、CREATE TABLE文のPRIMARY KEY句とFOREIGN KEY REFERENCES句から、主キー制約と参照制約を読み取ります。
- 設問3では、RIGHT OUTER JOINで相手の行がないときNULLになることと、COUNT(*)がNULLの行も数えてしまう原因を考え、COUNT(列名)に直します。
小問ごとの答え
- 小問 設問1 a:ア
- 2010年度から2019年度までの10年分を抽出するため、CHAR(4)型の年度列に対して2010〜2019に合致する条件を指定します。SQLのLIKE述語において「_」は任意の一文字を表すワイルドカードであるため、LIKE '201_' と指定することで2010〜2019の年度が過不足なく抽出されます。
- 小問 設問1 b:ウ
- 測定結果ビューの定義において、CASE式によって健診結果表の性別コード(0なら'男'、1なら'女')が文字列に変換されています。ビューの性別列は'男'または'女'となるため、男子生徒を抽出する条件は「性別 = '男'」となります。
- 小問 設問1 c:ア
- 図1の体格推移表では、年度が2010から2019へ昇順、同一年度内では学年が1から3へ昇順に並んでいます。SQLで昇順並べ替えを指定するキーワードはASCであるため、c1(年度の並び順)およびc2(学年の並び順)はともに「ASC」となります。
- 小問 設問2 d:エ
- 健診結果表の定義文には「PRIMARY KEY(年度, 受診者ID)」と指定されており、これは年度と受診者IDの複合「主キー」制約を設定していることを示しています。
- 小問 設問2 e:ウ
- 健診結果表の定義文には「FOREIGN KEY(受診者ID) REFERENCES 受診者情報表(受診者ID)」と指定されており、これは受診者情報表の受診者IDに対する外部キー(参照)制約を設定していることを示しています。
- 小問 設問3 f:ア
- RIGHT OUTER JOINでは、結合条件に合致する生徒が存在しない階級(190cm以上など)でも身長階級表側の行が出力され、測定結果ビュー側の列はNULLとなります。COUNT(*)はNULL値を含む行数全体をカウントするため人数が1と誤認されます。生徒が存在しない場合に0と正しくカウントするには、NULL値を除外して集計する「COUNT(身長)」とする必要があります。
覚えるポイント
- SQLのLIKE述語では、'%'が0文字以上の任意の文字列、'_'が任意の1文字を表すワイルドカードである。
- COUNT(*)はNULLを含むすべての行を数えるが、COUNT(列名)は指定列がNULLの行を除外して数える。
間違えやすいところ
- LIKEを使わず『= '201%'』のように書いても、ワイルドカードとしては働かない点に注意します。
- ビューの検索条件で、元の表のコード値(0など)をそのまま指定してしまう間違いに注意します。
出題の前提:平成31年度春期 基本情報技術者試験 午後 問3
出典:IPA『2019年度 春期 午後』
公式問題冊子 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)
eラーニングシステムの構成変更
ネットワーク · 負荷分散装置 / プロキシサーバ / Cookie / M/M/1待ち行列モデル
全国の教室からプロキシサーバを経由して利用されるeラーニングシステムにおける、応答時間短縮を目的とした負荷分散装置の導入とWebサーバ増強に関する問題である。負荷分散装置およびDNSの設定、IPアドレスベース(L4)とCookieベース(L7)の負荷分散方式の比較、およびM/M/1待ち行列モデルを用いた平均処理待ち時間の計算について解答する。
解答・解説を表示
解答
設問1: a=イ, b=ア, c=ウ; 設問2: ア; 設問3: イ
解説
まず要点:負荷分散装置(ロードバランサ)で、送信元IPアドレスを使うL4方式は、プロキシ経由だと全員のIPが同じに見えるため特定のサーバに偏ります。CookieなどのL7の情報を使えば、利用者ごとに正しく振り分けられます。またM/M/1の待ち行列では、到着率が下がって利用率が低くなると平均待ち時間が大きく減ります。
解き方
- 設問1では、構成図からDNSに登録する負荷分散装置の外側のIP、振り分け先の各アプリサーバのIP、セッション維持に必要なHTTP Cookieを特定します。
- 設問2では、プロキシ経由で送信元IPがまとめられてしまう性質とL4の振り分けの限界を結びつけ、偏りの原因を判断します。
- 設問3では、2台に均等に分けると各サーバの到着率が半分(λ'=1.15)になり、利用率がρ'=0.46になることを求め、M/M/1の式に当てはめて計算します。
小問ごとの答え
- 小問 設問1 a:イ
- クライアントからのアクセス要求を負荷分散装置で受信して配下のサーバへ振り分けるため、DNSサーバにはeラーニングシステムのドメイン名に対応するIPアドレスとして、負荷分散装置のインターネット側IPアドレス「192.0.2.2」を登録します。
- 小問 設問1 b:ア
- 負荷分散装置がリクエストを振り分ける対象はアプリケーションサーバ1と2です。図1より、それぞれの内部IPアドレスは「192.168.0.1 と 192.168.0.2」となります。
- 小問 設問1 c:ウ
- 装置タイプBはレイヤ4以上の情報を基に同一受講者からの要求を同一サーバに維持(セッション維持)します。HTTPヘッダ内でクライアントやセッションを識別するために保持される情報は「セッションIDを示すcookie」です。
- 小問 設問2:ア
- 各教室のクライアントPCは教室内のプロキシサーバを経由してアクセスするため、負荷分散装置から見ると同一教室からの全要求の送信元IPアドレスが当該プロキシサーバのIPアドレスになります。送信元IPアドレスに基づいて振り分ける装置タイプAでは、同一教室の全アクセスが特定の1台に固定され、負荷の偏りが生じます。
- 小問 設問3:イ
- アプリケーションサーバが2台となり要求が均等に交互に振り分けられるため、各サーバへの平均到着率は λ' = 2.30 / 2 = 1.15件/秒となります。平均処理時間は0.40秒(処理率 μ = 2.50件/秒)なので、利用率は ρ' = 1.15 / 2.50 = 0.46です。M/M/1の平均処理待ち時間は (ρ' / (1 - ρ')) × 平均処理時間 = (0.46 / 0.54) × 0.40 ≒ 0.3407秒となり、小数第3位を四捨五入すると0.34秒となります。
覚えるポイント
- プロキシサーバを経由すると、外部から見た送信元IPアドレスはすべてプロキシサーバのIPアドレスに変換される。
- M/M/1の平均処理待ち時間は「ρ / (1 - ρ) × 平均処理時間」(ただしρ = λ / μ)で計算される。
間違えやすいところ
- DNSに登録するアドレスとして、後ろのアプリサーバの個別IPを選ばないように注意します。
- サーバが2台になるときは、全体の利用率ではなく各サーバの到着率(λ/2)と利用率(ρ/2)でM/M/1の式を使う必要があります。
出題の前提:平成31年度春期 基本情報技術者試験 午後 問4
出典:IPA『2019年度 春期 午後』
公式問題冊子 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)
農産物の検査管理システムにおけるWebAPI連携設計
ソフトウェア設計 · WebAPI / システム設計 / リレーショナルデータベース / シーケンス設計
農産物の検査管理システムにおいて、複数サーバに分散したデータベース(申込DB、認証DB、検査結果DB)とWebAPIを利用して業務画面を構築する設計に関する問題です。設問1〜3の空欄 a 〜 e に入る適切なものを、各解答群から選んでください。
- ア
- 設問1 a: 認証情報及び申込者情報 / 設問1 b, c: アクセスID / 設問2 d: 2 / 設問3 e: listOffererInfo, listProductInfo, getResultInfoForProduct
- イ
- 設問1 a: 認証情報及び利用者情報 / 設問1 b, c: 検査ID / 設問2 d: 3 / 設問3 e: listProductInfo, getOffererInfo, getResultInfoForProduct
- ウ
- 設問1 a: 認証情報,申込者情報及び検査農産物情報 / 設問1 b, c: 検査項目名 / 設問2 d: 4 / 設問3 e: listProductInfo, listOffererInfo, getResultInfoForProduct
- エ
- 設問1 a: 検査農産物情報 / 設問1 b, c: 検査農産物ID / 設問2 d: 5 / 設問3 e: listResultInfo, getOffererInfo, getProductInfo
- オ
- 設問1 a: 申込者情報 / 設問1 b, c: 申込者ID / 設問2 d: 6 / 設問3 e: listResultInfo, getProductInfo, getOffererInfo
- カ
- 設問1 a: 申込者情報及び検査農産物情報 / 設問1 b, c: 利用者ID / 設問2 d: 7
- キ
- 設問2 d: 8
解答・解説を表示
解答
設問1: a=カ, b=オ, c=エ; 設問2: d=イ; 設問3: e=オ
解説
まず要点:WebAPIを組み合わせた設計では、各APIの入出力(引数と戻り値)と、データベース同士のつながり(外部キー)を正しくたどる必要があります。そのうえで、必要なデータを取る手順を順序立てて考えます。
解き方
- 設問1:各サーバが提供するWebAPIの仕様と引数・戻り値から、各DBが持つ情報と、それらをつなぐ外部キー(申込者ID、検査農産物ID)を特定します。
- 設問2:図3の画面に出す情報(検査農産物、申込者、検査結果)について、初めに入力された検査農産物IDからたどるために必要なWebAPIの最小の呼び出し回数を数えます。
- 設問3:図4の「検査日の降順」という条件を満たすため、検査日で並べて一覧を取れるAPI(listResultInfo)から始め、外部キーをたどって関連情報を取る順序を決めます。
小問ごとの答え
- 小問 設問1 a:カ
- 表1および図1より、申込情報管理サーバが提供するWebAPIは「申込者情報」と「検査農産物情報」を扱っています。各DBにはそのサーバが提供するWebAPIまたは登録ツールからアクセスできるため、申込DBに格納されている情報は「申込者情報及び検査農産物情報」です。
- 小問 設問1 b:オ
- 図2の検査農産物情報において、どの申込者の農産物であるかを特定するための外部キーが必要です。表1のWebAPI仕様や業務の流れから、検査農産物情報には申込者を特定する「申込者ID」が含まれます。
- 小問 設問1 c:エ
- 図2の検査結果情報において、どの農産物の検査結果であるかを特定するための外部キーが必要です。表1のgetResultInfoForProductの引数が検査農産物IDであることからも、検査結果情報には「検査農産物ID」が含まれます。
- 小問 設問2 d:イ
- 画面(図3)を表示するには、入力された検査農産物IDを基に、①getProductInfoで検査農産物情報(申込者ID含む)を取得、②取得した申込者IDを用いてgetOffererInfoで申込者情報を取得、③検査農産物IDを用いてgetResultInfoForProductで検査結果情報のリストを取得します。合計3回のAPI実行が必要です。
- 小問 設問3 e:オ
- 図4の一覧画面では「検査日の降順」に10件表示します。まずlistResultInfoで検査日の降順に検査結果情報を取得し、得られた検査結果情報内の検査農産物IDを用いてgetProductInfoで検査農産物情報を取得、さらにその中の申込者IDを用いてgetOffererInfoで団体名等の申込者情報を取得するため、順序は「listResultInfo, getProductInfo, getOffererInfo」となります。
覚えるポイント
- 画面表示に必要なWebAPIの呼び出し手順は、既知の入力情報から外部キーを辿って順次データを取得する依存関係を整理して導出します。
間違えやすいところ
- 設問1aで認証DBの担当範囲と申込DBの担当範囲を混同すること。
- 設問2dで検査結果が3件あることからAPIも何度も呼ぶと考え、回数を多く見積もってしまうこと。
出題の前提:平成31年度春期 基本情報技術者試験 午後 問5
出典:IPA『2019年度 春期 午後』
公式問題冊子 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) / 公式問題冊子 p.28 ↗(www.ipa.go.jp) / 公式問題冊子 p.29 ↗(www.ipa.go.jp)
社内システムの仕様変更管理と工数・要員計画
プロジェクトマネジメント · 変更管理 / 工数見積り / 進捗管理 / 要員計画
社内システム刷新プロジェクトにおける仕様変更の取扱手順、および仕様変更に伴う影響調査・追加工数・必要要員数の算出に関する問題です。設問1、2の空欄 a 〜 h に入る適切なものを、各解答群から選んでください。
- ア
- 設問1 a: a1=開発チーム, a2=担当PM, a3=プロジェクト管理チーム / 設問1 b: 影響調査を指示 / 設問2 c: 開発チーム1 / 設問2 d: 19 / 設問2 e: 17 / 設問2 f, g: 1 / 設問2 h: 計画1だけが実現可能である
- イ
- 設問1 a: a1=担当PM, a2=開発チーム, a3=プロジェクト管理チーム / 設問1 b: 依頼内容を計画に反映して更新 / 設問2 c: 開発チーム2 / 設問2 d: 23 / 設問2 e: 31 / 設問2 f, g: 2 / 設問2 h: 計画2だけが実現可能である
- ウ
- 設問1 a: a1=担当PM, a2=プロジェクト管理チーム, a3=開発チーム / 設問1 b: 起票経緯を管理チームに確認 / 設問2 c: 開発チーム3 / 設問2 d: 190 / 設問2 e: 32 / 設問2 f, g: 3 / 設問2 h: 両計画とも実現可能である
- エ
- 設問1 a: a1=プロジェクト管理チーム, a2=担当PM, a3=開発チーム / 設問1 b: 起票経緯を利用部門に確認 / 設問2 c: 開発チーム1及び開発チーム2 / 設問2 d: 230 / 設問2 e: 36 / 設問2 f, g: 4 / 設問2 h: 両計画とも実現不可能である
- オ
- 設問2 c: 開発チーム1及び開発チーム3 / 設問2 f, g: 5
- カ
- 設問2 c: 開発チーム2及び開発チーム3 / 設問2 f, g: 6
- キ
- 設問2 c: 全ての開発チーム / 設問2 f, g: 7
- ク
- 設問2 f, g: 8
解答・解説を表示
解答
設問1: a=エ, b=イ; 設問2: c=キ, d=ア, e=ウ, f=オ, g=エ, h=イ
解説
まず要点:プロジェクトの変更管理では、PM・管理チーム・開発チームといった役割分担に沿った手順を守ることが大切です。また変更による追加工数・期間・必要な人数(人月÷月数=人数)を数字で見積もる必要があります。
解き方
- 設問1: 本文の役割(受付窓口=管理チーム、承認・計画更新=PM、調査=開発チーム)からaとbを求めます。
- 設問2c: ルール文(プログラム開発以降は全チームに依頼)から、調査を頼む相手を決めます。
- 設問2d: 追加開発の規模(40kステップ)に各工程の生産性を当てはめ、設計〜結合試験の追加工数の合計(4+10+5=19人月)を計算します。
- 設問2e: 図1のスケジュール(各工程の月数)を週に換算し、総合試験が始まる直前の終了週(第32週の終わり)を求めます。
- 設問2f, g, h: 各計画の月数(4か月、5か月)で19人月を割り、端数を切り上げて必要な人数(5人、4人)を出し、制約(最大4人)と比べて実現できるか判断します。
小問ごとの答え
- 小問 設問1 a:エ
- 取扱手順より、依頼票の受付や窓口を行うa1は「プロジェクト管理チーム」、内容の妥当性を確認し採否を判断するa2は「担当PM」、影響調査を実施するa3は「開発チーム」となります。
- 小問 設問1 b:イ
- 変更管理会議で採用が決定された場合、担当PMの役割は「仕様変更依頼の内容をプロジェクト計画に反映させて更新」することです。
- 小問 設問2 c:キ
- Q社のルールでは「プログラム開発以降の工程では、システム全体への影響を迅速に把握する必要があるので、全ての開発チームに対して影響調査を依頼する」と明記されているため、「全ての開発チーム」となります。
- 小問 設問2 d:ア
- 追加開発規模は400kステップの10%=40kステップ。設計から結合試験までの追加工数は、設計:40/10=4人月、開発:40/4=10人月、結合試験:40/8=5人月となり、合計 4 + 10 + 5 = 19人月です。
- 小問 設問2 e:ウ
- 計画1では総合試験(8か月目開始=第29週開始ではなく、図1より7か月目までが開発、8か月目から総合試験開始=第33週開始)の開始前までに完了する必要があります。1か月=4週なので8か月目開始は第33週開始、その直前の「第32週終了まで」となります。
- 小問 設問2 f:オ
- 計画1の実施期間は第17週初から第32週末までの16週間(4か月間)。必要工数19人月を4か月で割ると 19/4 = 4.75人 となり、各週均等に配置するため少なくとも「5人」必要です。
- 小問 設問2 g:エ
- 計画2の実施期間は第17週初から第36週末までの20週間(5か月間)。必要工数19人月を5か月で割ると 19/5 = 3.8人 となり、各週均等に配置するため少なくとも「4人」必要です。
- 小問 設問2 h:イ
- 追加可能な要員は各週最多4人であるため、少なくとも5人必要な計画1は実現不可能であり、4人で対応可能な「計画2だけが実現可能である」となります。
覚えるポイント
- 1か月=4週換算において、nか月目の開始時点は (n-1)×4 + 1 週目、終了時点は n×4 週目となります。
- 追加要員数の計算では「人月 ÷ 月数」を行い、小数点が残る場合は各週同一要員を維持するために切り上げ(天井関数)を適用します。
間違えやすいところ
- 設問2dで「設計工程から結合試験工程まで」という指示を見落とし、総合試験の工数(40÷10=4人月)まで足して23人月としてしまう誤り。
- 設問2eで「8か月目の開始」を第8週や第28週と間違えてしまう計算ミス。
出題の前提:平成31年度春期 基本情報技術者試験 午後 問6
出典:IPA『2019年度 春期 午後』
公式問題冊子 p.30 ↗(www.ipa.go.jp) / 公式問題冊子 p.31 ↗(www.ipa.go.jp) / 公式問題冊子 p.32 ↗(www.ipa.go.jp) / 公式問題冊子 p.33 ↗(www.ipa.go.jp) / 公式問題冊子 p.34 ↗(www.ipa.go.jp)
製造業における情報システムの統合
システム戦略 · 情報システム統合 / 運用保守コスト / データ連携経路
家電製品メーカT社における、各事業部(P, Q, R, S)が利用する設計システム(A〜C)・需要予測システム(E〜G)と、各製造工場(H〜M)が利用する調達システム(V〜Y)のデータ連携状況、および統合による運用保守コスト削減の検討に関する問題である。各設問の空欄[ a ]〜[ g ]に入る適切な答えを選択せよ。
- 設問1a-ア
- A
- 設問1a-イ
- B
- 設問1a-ウ
- C
- 設問1b-ア
- 2
- 設問1b-イ
- 3
- 設問1b-ウ
- 4
- 設問1b-エ
- 5
- 設問1b-オ
- 6
- 設問1cd-ア
- V
- 設問1cd-イ
- W
- 設問1cd-ウ
- X
- 設問1cd-エ
- Y
- 設問2e-ア
- 19.0
- 設問2e-イ
- 20.2
- 設問2e-ウ
- 21.7
- 設問2e-エ
- 25.2
- 設問2f-ア
- 6.0
- 設問2f-イ
- 6.2
- 設問2f-ウ
- 7.7
- 設問2f-エ
- 9.7
- 設問3g-ア
- Eシステムだけである
- 設問3g-イ
- Fシステムだけである
- 設問3g-ウ
- Eシステム及びFシステムである
- 設問3g-エ
- ない
解答・解説を表示
解答
設問1: a=ア, b=イ, c=ア (順不同), d=ウ (順不同); 設問2: e=ウ, f=ウ; 設問3: g=イ
解説
まず要点:システム統合や連携の見直しでは、事業部とシステム、製造工場と調達システムの対応関係を正しくつかむことが大切です。そして固定の保守費・取扱高に応じた変動費・システム間の連携経路費の3つを分けて、数字で計算します。
解き方
- 表1・2・3から、各工場で作る製品の担当事業部と、対応する設計・需要予測・調達システムの関係を整理します。
- 設問1では、各システムが連携する相手の種類を数え、最大になる組み合わせを探します。
- 設問2では、現状と統合後それぞれの「システム固定費」「取扱高に応じた変動費」「連携経路数×単価」を足して比べます。
- 設問3では、代える対象(Gシステム)がつながる調達システム(VとX)への経路をすでに持つ需要予測システムを探します。
小問ごとの答え
- 小問 設問1 a:ア
- 設計システムAはP事業部とS事業部で使われており、P事業部の製品はI工場(調達W)、S事業部の製品はH工場(調達V)、J工場(調達X)、M工場(調達X)で製造されているため、連携する調達システムはV, W, Xの3種類で最多となります。
- 小問 設問1 b:イ
- 設計システムAが連携している調達システムは、Vシステム、Wシステム、Xシステムの合計3つです。
- 小問 設問1 c:ア
- 調達システムVはH工場(Q事業部・S事業部)で利用され、設計システム{A, B}の2つ、需要予測システム{F, G}の2つの合計4つと連携し、最多タイとなります(cとdは順不同)。
- 小問 設問1 d:ウ
- 調達システムXはJ工場・L工場・M工場(Q事業部・S事業部)で利用され、設計システム{A, B}の2つ、需要予測システム{F, G}の2つの合計4つと連携し、最多タイとなります(cとdは順不同)。
- 小問 設問2 e:ウ
- 固定費は設計3×2=6億円、需要予測3×3=9億円、調達4×1=4億円で計19億円。取扱高比例費は全取扱高1,500億円×0.1%=1.5億円。連携経路はVが4、Wが2、Xが4、Yが2の計12本で12×0.1=1.2億円。合計は19 + 1.5 + 1.2 = 21.7億円となります。
- 小問 設問2 f:ウ
- それぞれ1つに統合された場合、固定費は設計2億円+需要予測3億円+調達1億円=6億円。取扱高比例費は1.5億円。連携経路は統合設計-調達間(1本)と統合需要予測-調達間(1本)の計2本で0.2億円。合計は6 + 1.5 + 0.2 = 7.7億円となります。
- 小問 設問3 g:イ
- Gシステムを利用するS事業部の製品はH工場(調達V)、J・M工場(調達X)で製造されます。FシステムはQ事業部(調達V, X)およびR事業部(調達Y)で既に利用されているため調達VおよびXとの連携経路が既に存在し、新経路作成不要で代替可能です。
覚えるポイント
- 異なる工場であっても同一の調達システム(Xシステム等)を共有している場合、システム間の連携経路は1本としてカウントする点に注意する。
間違えやすいところ
- 工場の数とシステムの数を混同し、同じシステム同士の連携経路を工場ごとに重複して数えてしまう間違いが多い。
出題の前提:問題文および表1、表2、表3の条件に基づく。
出典:IPA『2019年度 春期 午後』
公式問題冊子 p.35 ↗(www.ipa.go.jp) / 公式問題冊子 p.36 ↗(www.ipa.go.jp) / 公式問題冊子 p.37 ↗(www.ipa.go.jp) / 公式問題冊子 p.38 ↗(www.ipa.go.jp)
ハフマン符号化を用いた文字列圧縮
データ構造及びアルゴリズム · ハフマン符号化 / 二分木 / 再帰呼出し / 配列による木構造の表現
ハフマン符号化アルゴリズムによる文字列圧縮に関する問題である。ハフマン木の構築、符号化ビット列の決定と圧縮率の計算、木構造を4つの配列で表現して構築するプログラム1、および再帰呼出しによりビット表現を表示するプログラム2の空欄[ a ]〜[ f ]に入る適切な答えを選択せよ。
- 設問1a-ア
- A: 010, B: 1, C: 00, D: 011
- 設問1a-イ
- A: 010, B: 0, C: 01, D: 111
- 設問1a-ウ
- A: 100, B: 0, C: 101, D: 11
- 設問1a-エ
- A: 100, B: 1, C: 00, D: 01
- 設問1b-ア
- 0.77
- 設問1b-イ
- 0.85
- 設問1b-ウ
- 0.88
- 設問1b-エ
- 0.92
- 設問2c-ア
- nsize ≧ 0
- 設問2c-イ
- nsize ≧ 1
- 設問2c-ウ
- nsize ≧ 2
- 設問2d-エ
- parent[i] < 0
- 設問2d-オ
- parent[i] > 0
- 設問2d-カ
- size ≦ nsize
- 設問2d-キ
- size ≧ nsize
- 設問3e-ア
- k ≧ 0
- 設問3e-イ
- left[k] = -1
- 設問3e-ウ
- left[k] ≧ 0
- 設問3e-エ
- parent[k] = -1
- 設問3e-オ
- parent[k] ≧ 0
- 設問3f-ア
- left[k] = k
- 設問3f-イ
- left[parent[k]] = k
- 設問3f-ウ
- parent[k] = k
- 設問3f-エ
- parent[left[k]] = k
解答・解説を表示
解答
設問1: a=ア, b=イ; 設問2: c=ウ, d=エ; 設問3: e=オ, f=イ
解説
まず要点:ハフマン符号化は、よく出る文字ほど短いビット列、あまり出ない文字ほど長いビット列を割り当てる可変長の符号化です。二分木はparent, left, rightという配列で表せます。再帰呼び出しを使うと、葉から根へ戻る処理と、根から葉へ符号を出す処理を自然に書けます。
解き方
- 各文字の出てくる回数を数え、少ない2つの節を下から順に親の節でまとめていきます。
- 左の枝に0、右の枝に1を付け、根から各葉までのビット列(ハフマン符号)を決めます。
- 固定長の総ビット数と圧縮後の総ビット数(各文字の頻度×符号長)を求めて、圧縮率を計算します。
- 配列で表した二分木の親の探し方と、再帰の終了条件(parent[k] ≧ 0)、左右の判定条件(left[parent[k]] == k)をコードの作りに合わせて特定します。
小問ごとの答え
- 小問 設問1 a:ア
- 出現回数はA:1, B:7, C:3, D:2。規則に従いAとDを結合して値3の親節を作り、次にC(3)と親節(3)を結合して値6の親節を作り、最後に値6とB(7)を結合して根(13)を作ります。左枝に0、右枝に1を割り振ると、A:010, B:1, C:00, D:011となります。
- 小問 設問1 b:イ
- 2ビット固定長の場合の総ビット長は13文字×2=26ビット。ハフマン符号化の総ビット長は1×3 + 7×1 + 3×2 + 2×3 = 22ビット。圧縮率は22÷26≒0.846であり、小数第3位を四捨五入して0.85となります。
- 小問 設問2 c:ウ
- ハフマン木の構築では、親が未作成の節が1つ(根)になるまで2つの節を取り出して親を作成するループを繰り返します。未作成節数nsizeが2以上(nsize ≧ 2)の間処理を継続します。
- 小問 設問2 d:エ
- まだ親が作成されていない節は、初期値である-1がparent配列に設定されたままになっています。したがって抽出条件は parent[i] < 0 となります。
- 小問 設問3 e:オ
- 再帰呼出しにより葉から根に向かって木を遡ります。根のparentは-1であるため、親が存在する(まだ根に到達していない)条件は parent[k] ≧ 0 です。
- 小問 設問3 f:イ
- 再帰から戻った段階で、現在の節kが親の左側の子であるか判定します。親の要素番号parent[k]について、left[parent[k]]が自分自身(k)と等しいかどうかを調べます。
覚えるポイント
- ハフマン符号化の木走査において、葉から根へ遡り、再帰の戻り時に順方向(根から葉)にビットを出力する再帰テクニックを理解しておく。
間違えやすいところ
- 固定長と圧縮後のビット数を計算するとき、文字の種類の数(4種)ではなく、文字の総出現回数(13文字)を掛ける点を見落としやすい。
出題の前提:問題文のハフマン符号化手順および擬似言語仕様に基づく。
出典:IPA『2019年度 春期 午後』
公式問題冊子 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) / 公式問題冊子 p.46 ↗(www.ipa.go.jp)
入力ファイル中の文字の出現回数の印字
ソフトウェア開発 · C言語 / ファイル処理 / バブルソート / 文字コード頻度集計
入力ファイルをバイナリ形式で1バイトずつ読み込んで各文字コード(00~FFの計256種類)の出現回数を集計・印字するC言語プログラム、および出現回数の降順に並べ替えて印字するバブルソートの改良処理について、プログラム中の空欄[ a ]~[ g ]に当てはまる適切な選択肢を答える問題です。
- 設問1 a イ
- cnt
- 設問1 b カ
- i + 192
- 設問1 c イ
- 64
- 設問2 d ウ
- 255
- 設問2 e エ
- ix + 1
- 設問2 f イ
- 行④
- 設問2 g イ
- ih = ix
解答・解説を表示
解答
設問1: a=イ, b=カ, c=イ; 設問2: d=ウ, e=エ, f=イ, g=イ
解説
まず要点:バブルソート(隣り合う値を比べて交換する整列法)では、最後に交換した位置より後ろは整列済みなので、次の走査範囲をそこまでに狭められる。1回の走査で、まだ整列していない部分の一番大きい値(または小さい値)が端まで運ばれる。交換が起きた最後の位置を覚えておけば、無駄な比較を省ける。
解き方
- 設問1:文字コード0~255の256個を64行×4列に並べる規則(行iに対して i, i+64, i+128, i+192)から、bとcの増分と終わり方を求める。
- 設問2:ふつうのバブルソートの繰り返し回数(要素数-1で255回)を確かめ、交換した位置ixを使って走査範囲ihをどう更新するか追う。
小問ごとの答え
- 小問 設問1 a:イ
- fgetc関数で1バイト読み込むごとにcnt++を実行して総バイト数をカウントしているため、印字すべき処理バイト数はcntとなります。
- 小問 設問1 b:カ
- 64行×4列で合計256個の文字コードを出力します。i行目(0~63)において、第1列はi、第2列はi+64、第3列はi+128、第4列はi+192となるため、for文の終了条件はchr <= i + 192です。
- 小問 設問1 c:イ
- 各列の間隔は64文字コード分(0, 64, 128, 192)であるため、同一行内で次の列のコードを指すための増分は chr += 64 となります。
- 小問 設問2 d:ウ
- 要素数256の配列において、要素0~ihの走査をih=255からih=1まで毎回1ずつ狭めて行うため、while (ih > 0) の実行回数は常に255回です。
- 小問 設問2 e:エ
- 最後に交換が行われた位置がixである場合、それ以降の隣接要素(ixとix+1以降)は既に昇順/降順が確定しているため、要素番号ix+1以降は整列済みとなります。
- 小問 設問2 f:イ
- 各パス(走査)ごとに交換が行われたかを検知するため、while文ブロックの先頭(行④の直後)で ix = 0 に初期化する必要があります。
- 小問 設問2 g:イ
- 次の走査範囲の末尾を最後に交換が行われた位置ixに縮めるため、ih--; を ih = ix; に置き換えます(一度も交換がなければix=0となりループが終了します)。
覚えるポイント
- 256要素を縦方向に64行4列で並べる場合、列方向の増分は行数である64になります。
- バブルソートの改良版では、最終交換位置ixを保持することで整列済み領域を一気にスキップできます。
間違えやすいところ
- 設問1(b)で配列の最大番号256などを指定してしまい、範囲外アクセスになる誤り。
- 設問2(e)で整列済みの始まりをixそのものだと思い込み、ix+1を選べない誤り。
出題の前提:平成31年度春期基本情報技術者試験午後問題 問9
出典:IPA『2019年度 春期 午後』
公式問題冊子 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)
学習塾のテスト結果の印字
ソフトウェア開発 · COBOL / 順ファイル処理 / SORT文 / 順位付け・同点処理
学習塾のテスト結果ファイルを読み込み、生徒ごとの5教科の得点合計を計算して降順に整列し、全体順位および校舎別順位を正しく付与して順位リストを印字するCOBOLプログラムについて、空欄[ a ]~[ f ]に当てはまる適切な選択肢を答える問題です。
- 設問1 a エ
- DESCENDING KEY SRT-TOTAL
- 設問1 b ア
- ADD 1 TO ALL-ORD-NO BLD-ORD-NO(SRT-BLD)
- 設問1 c イ
- MOVE ALL-ORD-NO TO ALL-RANK
- 設問1 d カ
- MOVE BLD-ORD-NO(SRT-BLD) TO BLD-RANK(SRT-BLD)
- 設問2 e エ
- 行番号79の後ろ
- 設問2 f ア
- BLD-TOTAL(CNT) / BLD-ORD-NO(CNT)
解答・解説を表示
解答
設問1: a=エ, b=ア, c=イ, d=カ; 設問2: e=エ, f=ア
解説
まず要点:COBOLのSORT文は ASCENDING(小さい順)や DESCENDING(大きい順)でレコードを並べ替える。同じ点数の人がいるときは、1件ごとに増える通番カウンタ(ORD-NO)と、点数が変わったときだけ値を写す順位変数(RANK)を分けて使う。こうすると同点の人は同じ順位になる。
解き方
- 設問1:並べ替えの条件(合計点の大きい順)を確かめ、PRT-PROCで1件ごとに通番を足す処理と、点数が切れたときに順位を更新する処理を探す。
- 設問2:校舎別と全体の平均点に必要な累積合計点を足すタイミング(レコードを出すごと)と、「合計点 ÷ 人数」の式を導く。
小問ごとの答え
- 小問 設問1 a:エ
- 問題文に「合計点の降順に並べた順位リストを印字する」とあるため、SORT文のキー指定は DESCENDING KEY SRT-TOTAL となります。
- 小問 設問1 b:ア
- レコードを1件処理するごとに、全体通番と該当校舎の通番(ORD-NO)を1増やす必要があるため、ADD 1 TO ALL-ORD-NO BLD-ORD-NO(SRT-BLD) を行います。
- 小問 設問1 c:イ
- 直前と合計点が変わった(低くなった)場合、新たな順位として現在の通番(全体人数)を順位に設定するため、MOVE ALL-ORD-NO TO ALL-RANK となります。
- 小問 設問1 d:カ
- 校舎ごとの合計点が変わった場合、該当校舎の通番を校舎内順位に設定するため、MOVE BLD-ORD-NO(SRT-BLD) TO BLD-RANK(SRT-BLD) となります。
- 小問 設問2 e:エ
- 印字対象レコード(PRT-REC)ごとに合計得点を累積加算する必要があるため、PRT-PROC内の出力処理直後である行番号79の後ろに追加します。
- 小問 設問2 f:ア
- 校舎CNTの平均点を求めるには、校舎CNTの総得点を校舎CNTの生徒数で割るため、BLD-TOTAL(CNT) / BLD-ORD-NO(CNT) となります。
覚えるポイント
- COBOLのSORT文において降順はDESCENDING KEY、昇順はASCENDING KEYで指定します。
- 同点タイの順位付け(1位, 2位, 2位, 4位...)は、常にインクリメントする通番と値変化時にのみ代入される順位変数で実現します。
間違えやすいところ
- 設問1(b)で通番(ORD-NO)ではなく順位(RANK)に1を足してしまう誤り。
- 設問2(f)で割る数に生徒数ではなく順位(RANK)を指定してしまう誤り。
出題の前提:平成31年度春期基本情報技術者試験午後問題 問10
出典:IPA『2019年度 春期 午後』
公式問題冊子 p.52 ↗(www.ipa.go.jp) / 公式問題冊子 p.53 ↗(www.ipa.go.jp) / 公式問題冊子 p.54 ↗(www.ipa.go.jp) / 公式問題冊子 p.55 ↗(www.ipa.go.jp) / 公式問題冊子 p.56 ↗(www.ipa.go.jp) / 公式問題冊子 p.57 ↗(www.ipa.go.jp)
迷路と迷路上を移動する駒(Javaプログラム)
ソフトウェア開発(Java) · Java / 列挙型 (Enum) / 2次元座標変換 / List操作
升目を用いて表現された迷路と、迷路上に置かれて外部から操作される駒を表すJavaプログラムを題材にした問題である。プログラム1〜5の空欄 a〜d、およびプログラム5に追加する処理の空欄 e、f に当てはまる適切な字句を選択せよ。
- a, bの選択肢ア
- %
- a, bの選択肢イ
- &
- a, bの選択肢ウ
- *
- a, bの選択肢エ
- +
- a, bの選択肢オ
- -
- a, bの選択肢カ
- /
- a, bの選択肢キ
- ^
- a, bの選択肢ク
- |
- cの選択肢ア
- direction
- cの選択肢イ
- direction.dx, direction.dy
- cの選択肢ウ
- location + direction
- cの選択肢エ
- location.x + direction.dx, location.y + direction.dy
- dの選択肢ア
- (ordinal() + 3) % 4
- dの選択肢イ
- (ordinal() + 3) / 4
- dの選択肢ウ
- (ordinal() - 1) % 4
- dの選択肢エ
- (ordinal() - 1) / 4
- eの選択肢ア
- -1
- eの選択肢イ
- 0
- eの選択肢ウ
- 1
- fの選択肢ア
- i
- fの選択肢イ
- i + 1
- fの選択肢ウ
- i - 1
解答・解説を表示
解答
設問1: a=ウ, b=ア, c=エ, d=ア; 設問2: e=ウ, f=ウ
解説
まず要点:格子状の地図では、2次元の座標(x, y)と1次元の並びの位置は「位置 = y × 横の長さ + x」で行き来できる(xは割った余り、yは割った商)。Javaの余り「%」はマイナスの数だと結果もマイナスになるので、左回転では周期分を足してから割る。リストから続けて消すと、後ろの要素が前に詰まる点にも注意する。
解き方
- 設問1:(loc.x, loc.y)から1次元の文字の位置への式「loc.y * width + loc.x」と、位置からxを出す式「index % width」を確かめる。
- 設問1:nextLocationを作るとき、今のx, yにdirectionのdx, dyを足す式を選ぶ。
- 設問1:列挙型の順番(NORTH=0, EAST=1, SOUTH=2, WEST=3)で、左折は-1(反時計回り)だが、Javaの負の余りを避けるため+3して%4にする。
- 設問2:ループの中でi - 1番目を見ているので、ループのカウンタiの初期値は1になる。
- 設問2:直前(i - 1)と現在(i)の2つを消すとき、先にi - 1を消すと元のi番目がi - 1の位置にずれるので、もう一度i - 1を消す。
小問ごとの答え
- 小問 設問1 a:ウ
- 2次元座標 (x, y) を1次元の文字列インデックスに変換するには、y行目の先頭までの文字数「y * width」にxを加算するため、演算子は「*」となります。
- 小問 設問1 b:ア
- 1次元インデックスから2次元のx座標(行内の列オフセット)を逆算するには、横幅 width で割った余りを求めるため、剰余演算子「%」となります。
- 小問 設問1 c:エ
- Location のコンストラクタは int x, int y を受け取ります。現在位置 location に進行方向 direction の増分を加えるため、「location.x + direction.dx, location.y + direction.dy」となります。
- 小問 設問1 d:ア
- 左に曲がる処理は方角を反時計回りに1つ戻す操作です。Javaの % 演算子は負の被除数に対して負の値を返すため、(ordinal() - 1) % 4 では ordinal() が0のときに負になり例外となります。4の剰余系で-1と合同な+3を用いて「(ordinal() + 3) % 4」と表します。
- 小問 設問2 e:ウ
- ループ内直後の if 文で history.get(i - 1) を参照しているため、インデックス境界外例外を防ぐには i の初期値は 1 以上である必要があります。
- 小問 設問2 f:ウ
- 直前の移動 history.get(i - 1) と現在の移動 history.get(i) が逆向きの場合にこれら2つを除去します。history.remove(i - 1) を2回実行すると、まず i - 1 番目が削除されて元々の i 番目が i - 1 番目に繰り上がるため、連続して i - 1 を削除することで両方が除去されます。
覚えるポイント
- 2次元座標 (x, y) と幅 W からの1次元インデックス変換:idx = y * W + x, x = idx % W, y = idx / W
- Javaの剰余演算子 % は負の数に対して負の値を返すため、循環時は (idx + N - 1) % N を使う
間違えやすいところ
- 左回転で単に (ordinal() - 1) % 4 と書き、0のときに負の番号になってしまう誤り
- Listから続けて要素を消すとき、1つ消すと後ろの要素が前に詰まることを見落とす誤り
出題の前提:平成31年度春期基本情報技術者試験午後問11の問題文・仕様・公式解答に基づく。
出典:IPA『2019年度 春期 午後』
公式問題冊子 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)
ソフトウェア開発(アセンブラ) · アセンブラ (CASL II) / ビット演算 / サブルーチン呼出し / シフト演算
主記憶上のビット領域内の指定されたビット列(対象ビット列)を操作するプログラム1(BITSON)およびプログラム2(SETOP)に関する問題である。プログラム中の空欄 a〜d、およびプログラムの再編成に関する空欄 e、f に当てはまる適切な命令または字句を選択せよ。
- aの選択肢ア
- SLL GR2, 0, GR3
- aの選択肢イ
- SLL GR2, 4
- aの選択肢ウ
- SLL GR2, 4, GR3
- aの選択肢エ
- SRL GR2, 0, GR3
- aの選択肢オ
- SRL GR2, 4
- aの選択肢カ
- SRL GR2, 4, GR3
- b, dの選択肢ア
- ADDL GR5, GR2
- b, dの選択肢イ
- ADDL GR5, GR3
- b, dの選択肢ウ
- ADDL GR5, GR4
- b, dの選択肢エ
- SUBL GR5, GR2
- b, dの選択肢オ
- SUBL GR5, GR3
- b, dの選択肢カ
- SUBL GR5, GR4
- cの選択肢ア
- JNZ FIN
- cの選択肢イ
- JNZ LOOP
- cの選択肢ウ
- JPL FIN
- cの選択肢エ
- JPL LOOP
- cの選択肢オ
- JZE FIN
- cの選択肢カ
- JZE LOOP
- eの選択肢ア
- BITSON
- eの選択肢イ
- BITSOP
- eの選択肢ウ
- SETOP
- fの選択肢ア
- 0, GR5
- fの選択肢イ
- BITSON, GR5
- fの選択肢ウ
- 0, GR6
- fの選択肢エ
- BITSON, GR6
- fの選択肢オ
- 0, GR7
- fの選択肢カ
- BITSON, GR7
解答・解説を表示
解答
設問1: a=オ, b=オ, c=オ, d=カ; 設問2: e=イ, f=オ
解説
まず要点:COMET IIでは1語は16ビットなので、ビットの位置は「語番号」と「語の中の何ビット目か」に分けられる。16で割った商(4ビット右シフト:SRL)が語番号、16で割った余り(下位4ビット)が語内の位置になる。レジスタに入れた副プログラムの番地を呼ぶときは「CALL 0, GRx」の形を使う。
解き方
- 設問1 a:GR3のビット位置を16で割った商をGR2(語番号)にしたいので、4ビット右シフトする SRL GR2, 4 を選ぶ。
- 設問1 b:最初の語で操作するビット数は「16 - ビット位置(GR3)」なので、GR5(16)からGR3を引く SUBL GR5, GR3 を選ぶ。
- 設問1 c:まだ処理していないビット長(GR4)が0のときに終わらせたいので、JZE FIN を選ぶ。
- 設問1 d:最後の語のマスクを作るとき、右詰めのマスク(GR4ビット)を上に寄せる左シフト量を出すため、GR5から残りビット数GR4を引く SUBL GR5, GR4 を選ぶ。
- 設問2 e, f:プログラム3の呼び出し先のラベルがBITSOPなのでプログラム1の入り口名はBITSOP、GR7に入れた番地を呼ぶため CALL 0, GR7 にする。
小問ごとの答え
- 小問 設問1 a:オ
- ビット位置から語の相対アドレスを求めるには、16(2の4乗)で割る必要があります。直前で LD GR2, GR3 されたビット位置を右へ4ビット論理シフトするため「SRL GR2, 4」となります。
- 小問 設問1 b:オ
- 最初の語で処理対象となるビット数は、16からビットインデックス(GR3)を引いた値となります。GR5にはBITSPW(16)がロードされているため、「SUBL GR5, GR3」を実行します。
- 小問 設問1 c:オ
- 残りのビット長が0であれば処理を終了するため、LD GR4, GR4 の直後にゼロ判定で分岐する「JZE FIN」が入ります。
- 小問 設問1 d:カ
- 最後の語で残った未処理ビット(GR4個)を左端寄せマスクにするための左シフト量を計算します。16 - GR3 からさらに GR4 を減算する必要があるため、「SUBL GR5, GR4」となります。
- 小問 設問2 e:イ
- プログラム3の呼び出し元(CALL BITSOP)および問題文の記述から、再編成後のプログラム1の入口名は「BITSOP」となります。
- 小問 設問2 f:オ
- 新BITSONおよびBITSOFFでは呼び出したい副プログラムのアドレスがGR7に設定されてBITSOPに渡されます。間接呼び出しを行うため、CALL命令のオペランドは「0, GR7」となります。
覚えるポイント
- COMET II の1語は16ビットなので、4ビット右シフトで16の商、#000Fとの論理積で16の剰余が得られる
- レジスタに格納されたアドレスへのサブルーチン呼出しは CALL 0, GRx と記述する
間違えやすいところ
- ビット位置から語番号を出すときに、左シフト(SLL)と右シフト(SRL)を間違える誤り
- 再編成後の呼び出しで固定のラベルBITSONを指定してしまい、間接呼び出しに気づかない誤り
出題の前提:平成31年度春期基本情報技術者試験午後問12の問題文・CASL II仕様・公式解答に基づく。
出典:IPA『2019年度 春期 午後』
公式問題冊子 p.64 ↗(www.ipa.go.jp) / 公式問題冊子 p.65 ↗(www.ipa.go.jp) / 公式問題冊子 p.66 ↗(www.ipa.go.jp) / 公式問題冊子 p.67 ↗(www.ipa.go.jp) / 公式問題冊子 p.68 ↗(www.ipa.go.jp)
販売促進活動における販売データの利用
ソフトウェア開発(表計算) · 表計算 / 照合検索 / 表引き / バブルソート / マクロ
小売販売のZ店における販売促進活動を題材に、ワークシート「販売データ」「会員管理」「分類表」及び特定商品を購入した会員の集計を行うマクロ「manageMembers」を用いた処理に関する問題です。ワークシート「会員管理」の各セルに入力する計算式中の空欄 a 〜 c、並びにマクロ中の空欄 d 〜 f に当てはまる適切な字句を選択してください。
- a-ア
- 照合検索(A4, 販売データ!C$2:C$9999, 販売データ!A$2:A$9999)
- a-イ
- 照合検索(A4, 販売データ!C$2:C$9999, 販売データ!B$2:B$9999)
- a-ウ
- 照合検索(A4 * 1000 + 1, 販売データ!H$2:H$9999, 販売データ!A$2:A$9999)
- a-エ
- 照合検索(A4 * 1000 + 1, 販売データ!H$2:H$9999, 販売データ!B$2:B$9999)
- a-オ
- 照合検索(A4 * 1000 + C4, 販売データ!H$2:H$9999, 販売データ!A$2:A$9999)
- a-カ
- 照合検索(A4 * 1000 + C4, 販売データ!H$2:H$9999, 販売データ!B$2:B$9999)
- b-ア
- 照合一致(B4, 分類表!C$4:C$6, 1), 照合一致(C4, 分類表!D$3:F$3, 1)
- b-イ
- 照合一致(B4, 分類表!D$3:F$3, 1), 照合一致(C4, 分類表!C$4:C$6, 1)
- b-ウ
- 照合一致(C4, 分類表!C$4:C$6, 1), 照合一致(B4, 分類表!D$3:F$3, 1)
- b-エ
- 照合一致(C4, 分類表!D$3:F$3, 1), 照合一致(B4, 分類表!C$4:C$6, 1)
- c-ア
- 切捨て(B4, -4) / 50000 * 1000
- c-イ
- 切捨て(B4 * 1000, -8) / 50000
- c-ウ
- 切捨て(B4 / 50000, 0) * 1000
- c-エ
- 切捨て(B4 / 50000 * 1000, 0)
- c-オ
- 切捨て(B4 / 50000 * 1000, -4)
- d-ア
- sumTab[1, index] ← sumTab[1, index] + 相対(販売データ!A1, i, 6)
- d-イ
- sumTab[1, index] ← sumTab[i, index] + 相対(販売データ!A1, index, 6)
- d-ウ
- sumTab[i, 1] ← sumTab[i, 1] + 相対(販売データ!A1, i, 6)
- d-エ
- sumTab[i, 1] ← sumTab[i, 1] + 相対(販売データ!A1, index, 6)
- d-オ
- sumTab[index, 1] ← sumTab[index, 1] + 相対(販売データ!A1, i, 6)
- d-カ
- sumTab[index, 1] ← sumTab[index, 1] + 相対(販売データ!A1, index, 6)
- e-ア
- 論理積(sumTab[j, 1] < sumTab[j + 1, 1], 論理和(sumTab[j, 1] = sumTab[j + 1, 1], sumTab[j, 2] > sumTab[j + 1, 2]))
- e-イ
- 論理積(sumTab[j, 1] > sumTab[j + 1, 1], sumTab[j, 2] > sumTab[j + 1, 2])
- e-ウ
- 論理積(sumTab[j, 1] > sumTab[j + 1, 1], 論理和(sumTab[j, 1] = sumTab[j + 1, 1], sumTab[j, 2] < sumTab[j + 1, 2]))
- e-エ
- 論理和(sumTab[j, 1] < sumTab[j + 1, 1], sumTab[j, 2] > sumTab[j + 1, 2])
- e-オ
- 論理和(sumTab[j, 1] < sumTab[j + 1, 1], 論理積(sumTab[j, 1] = sumTab[j + 1, 1], sumTab[j, 2] > sumTab[j + 1, 2]))
- e-カ
- 論理和(sumTab[j, 1] > sumTab[j + 1, 1], 論理積(sumTab[j, 1] = sumTab[j + 1, 1], sumTab[j, 2] < sumTab[j + 1, 2]))
- f-ア
- 相対(A2, i, j) ← sumTab[i, 1]
- f-イ
- 相対(A2, i, j) ← sumTab[i, j]
- f-ウ
- 相対(A2, i, j + 1) ← sumTab[i, j]
- f-エ
- 相対(A2, j, i) ← sumTab[j, 1]
- f-オ
- 相対(A2, j, i) ← sumTab[j, i]
- f-カ
- 相対(A2, j + 1, i) ← sumTab[j, 1]
解答・解説を表示
解答
設問1: a=カ, b=ウ, c=ウ; 設問2: d=オ, e=オ, f=イ
解説
まず要点:表計算でデータを探すときは、複数の値を組み合わせたキーの作り方と、関数の引数の順番(行・列の位置)を正しく理解する必要がある。マクロでは2次元配列の添字がどの行・列を指すか、主キーと副キーの並べ替え条件、基準セルからの相対参照の指定を正確につかむことが大切。
解き方
- 設問1:販売データは販売日の古い順なので、最終販売日を引くキーとして会員販売通番(会員番号×1000+最後の通番)を作り、表引きの引数(行・列の位置)とクーポンの切捨て式を組み立てる。
- 設問2:会員番号の照合位置indexを特定してその会員の商品販売額に足し、販売額は大きい順・日付は小さい順になる交換条件を論理式で作り、A2を基準にした相対参照でシートに出す。
小問ごとの答え
- 小問 設問1 a:カ
- 最終販売日を得るには、会員販売通番の上位4桁(会員番号A4)と下位3桁(販売回数C4)を合成した「A4 * 1000 + C4」をキーとして列Hを検索し、対応する販売日(列B)を抽出します。
- 小問 設問1 b:ウ
- 関数「表引き」の引数は(セル範囲, 行の位置, 列の位置)です。行は販売回数(C4)を分類表!C$4:C$6から、列は販売額合計(B4)を分類表!D$3:F$3から照合一致で検索します。
- 小問 設問1 c:ウ
- 50,000円ごとに1,000円分のクーポンを発行するため、販売額合計B4を50,000で割った商の整数部「切捨て(B4 / 50000, 0)」に1,000を乗算して総額を算出します。
- 小問 設問2 d:オ
- 配列sumTabの行は会員番号に対応するindexであり、列1は商品販売額です。販売データ(行i、列6)の販売金額を「sumTab[index, 1]」に加算して更新します。
- 小問 設問2 e:オ
- 商品販売額の降順、かつ同額時は商品最終販売日の昇順で整列するため、sumTab[j, 1] < sumTab[j + 1, 1]、または販売額が等しくsumTab[j, 2] > sumTab[j + 1, 2]のときに要素を交換します。
- 小問 設問2 f:イ
- セルA2を基準として、行位置i(1から順に増加)、列位置j(0:会員番号、1:販売額、2:最終販売日)にあるセル「相対(A2, i, j)」に、対応する「sumTab[i, j]」の値を格納します。
覚えるポイント
- 表引き関数の引数順序は「セル範囲, 行の位置, 列の位置」である。
- 複数条件の整列では「主キーで優先判定、等しい場合に副キーで判定」を論理式で表現する。
間違えやすいところ
- 大きい順・小さい順の不等号を取り違えて、大きい順の並べ替え条件を「>」にしてしまうミス。
- 相対(基準セル, 行, 列)の引数の順番を行と列で逆に指定してしまう誤り。
出題の前提:2019年度(平成31年度)春期 基本情報技術者試験 午後 問13
出典:IPA『2019年度 春期 午後』
公式問題冊子 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) / 公式問題冊子 p.76 ↗(www.ipa.go.jp)
2019年度 春期 午後
参照した公式資料
IPAが公開した2019年度 春期 午後の問題・解答資料です。

