旧制度の午前・午後と、2023年度以降の科目A・科目Bの公開問題を区別しています。現在の試験対策では現行シラバスと科目Bの形式を確認してください。公開問題は本試験の全出題を網羅する資料ではありません。
2014年度 秋期 午後の概要
ネットワークセキュリティとファイアウォール設定
ネットワークセキュリティ · パケットフィルタリング / ファイアウォール / SSH公開鍵認証 / Web会員登録
A社におけるWebサイトを通じた会員登録およびメールマガジン配信システム、ならびに外部委託先からのリモート保守環境に関する記述を読み、ファイアウォール(動的パケットフィルタ)のルール設定、会員登録フローのセキュリティ上の意図、およびSSH公開鍵認証の仕組みについて答えよ。
- ア
- 設問1: 他人のメールアドレスや間違ったメールアドレスが登録されないようにする。
- イ
- 設問1: 通信を暗号化し,登録希望者の会員情報が第三者に漏れないようにする。
- ウ
- 設問1: 登録希望者が会員情報DBにアクセスできないようにする。
- エ
- 設問1: 間違った会員情報(メールアドレスは含まない)が登録されないようにする。
解答・解説を表示
解答
設問1: ア, 設問2 a: エ, 設問2 b: ウ, 設問3 c: ア, 設問4 d: イ
解説
まず要点:ファイアウォールは、通す通信を必要な組み合わせだけに絞り込んで許可する。具体的には、送信元と送信先のIPアドレス(ネットワーク上の住所)やポート番号(通信の入口番号)を最小限だけ通す。また公開鍵認証では、秘密鍵(自分だけが持つ鍵)を外部に送らず、手元で作った署名を相手が確かめるので安全に本人確認できる。
解き方
- 設問1:2段階登録プロセスの効果として、受信確認を挟むことでメールアドレスの正当性確認(アクティベーション)が行われることを確認する。
- 設問2:各サーバの配置ゾーン(DMZ/LAN)とIPアドレス、プロトコルに対応する待受けポート番号を突き合わせてフィルタルールを決定する。
- 設問3:委託先PC(送信元IP指定)からWebサーバ(送信先IP・SSHポート22)宛てのルールを記述形式に従い組み立てる。
- 設問4:公開鍵認証方式のセキュリティ特性(秘密鍵の非送信)を理解し空欄を埋める。
小問ごとの答え
- 小問 設問1:ア
- 仮登録としてメールアドレスのみを受け付け、その宛先に届いた個別URLから本登録を行わせることで、実在する本人の正当なメールアドレスであることを検証し、虚偽や誤入力による登録を防止できます。
- 小問 設問2 a:エ
- 会員情報入力WebページへのHTTPSアクセスを許可するため、送信元if0(インターネット側)からWebサーバ「203.0.113.2」、待受けポート番号「443」を指定します。
- 小問 設問2 b:ウ
- Webサーバ(203.0.113.2)からLAN内の会員管理サーバ(192.168.0.3)の会員情報DB(ポート4194)へのアクセスを許可するため、「192.168.0.3, 4194」を指定します。
- 小問 設問3 c:ア
- 委託先PCの送信元IPアドレス「198.51.100.2」から、DMZのWebサーバ「203.0.113.2」のSSHサービス(待受けポート22)への接続を許可するため、「198.51.100.2, 203.0.113.2, 22」となります。
- 小問 設問4 d:イ
- SSH公開鍵認証方式では、クライアントは秘密鍵で作成した署名と公開鍵をサーバへ送信して認証を行うため、ネットワーク上にパスワードや「秘密鍵」を送信する必要がありません。
覚えるポイント
- 動的パケットフィルタリングは戻りのパケットを自動的に許可するため、往路の許可ルールのみを定義する。
- 公開鍵暗号方式による認証では、秘密鍵をクライアント側に厳重保持し、ネットワーク上には決して流さない。
間違えやすいところ
- Webサーバから会員管理サーバへの通信許可において、送信先をルータのIF(if2等)やWebサーバ自身と混同してしまう。
- 公開鍵認証方式でネットワーク上に流してはいけない対象として、公開鍵と秘密鍵を取り違えてしまう。
出題の前提:問題文中に示された「動的パケットフィルタの設定規則(送信元, 送信先, 通信ポート)」および表1のプロトコルポート定義に従う。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.5 ↗(www.ipa.go.jp) / 公式問題冊子 p.6 ↗(www.ipa.go.jp) / 公式問題冊子 p.7 ↗(www.ipa.go.jp) / 公式問題冊子 p.8 ↗(www.ipa.go.jp) / 公式問題冊子 p.9 ↗(www.ipa.go.jp)
JKフリップフロップの動作と2進カウンタの構成
コンピュータシステム · JKフリップフロップ / 順序回路 / 2進カウンタ / 真理値表
JKフリップフロップの真理値表に基づき、特定の結線回路におけるクロック立ち下がり時の出力動作、状態変化に対する入力条件(ドントケアを含む真理値関係)、および1個のJKフリップフロップを用いた2進カウンタの各種構成方法について答えよ。
- ア
- 設問1: 0のままである / 設問2(b): 0, 任意 / 設問2(c): 0, 任意 / 設問3: 1, 1
- イ
- 設問1: 0→1と変化する / 設問2: 1, 1 / 設問3: 1, Q
- ウ
- 設問1: 0→1, 1→0と変化する / 設問2: 1, 任意 / 設問3: 1, not(Q)
- エ
- 設問1: 0→1, 1→0の変化を繰り返す / 設問2: 任意, 0 / 設問3: Q, 1
- オ
- 設問2: 任意, 1 / 設問3: Q, not(Q)
- カ
- 設問3: not(Q), Q
解答・解説を表示
解答
設問1 a: ア, 設問2 b: ア, 設問2 c: エ, 設問3 d: ア, 設問3 e: イ, 設問3 f: カ (d, e, f は順不同)
解説
まず要点:JKフリップフロップは、JとKの入力の組み合わせで出力をセット(1)・リセット(0)・保持・反転に切り替える回路。J=1・K=0で1、J=0・K=1で0、J=0・K=0で前の状態を保ち、J=1・K=1で出力が反転(トグル)する。2進カウンタ(1ビットを数える回路)を作るには、クロックごとに出力が反転するようJとKをうまくつなぐ。
解き方
- 設問1:初期状態Q=0(Qバー=1)からJとKの値を求め、表1の真理値表を参照して次状態Q2を特定する。
- 設問2:表1から状態遷移Q1→Q2(0→0および1→1)に対応する行を抽出し、一意に決まる入力とドントケア(任意)の入力を整理する。
- 設問3:表3の条件(Q=0のときJ=1・K=任意、Q=1のときJ=任意・K=1)を満たすJとKの信号の組み合わせ(定数1、Q、Qバー)を導出する。
小問ごとの答え
- 小問 設問1 a:ア
- 初期値Q=0のときQバー=1であり、J=Q=0、K=Qバー=1が入力されます。CLK立ち下がり時にJ1=0, K1=1, Q1=0となるため、真理値表よりQ2=0のまま変化しません。
- 小問 設問2 b:ア
- Qが0→0となるのは、真理値表より(J,K,Q1)=(0,0,0)または(0,1,0)のときです。したがってJ1=0が確定し、K1は0でも1でもよいため「0, 任意」となります。
- 小問 設問2 c:エ
- Qが1→1となるのは、真理値表より(J,K,Q1)=(0,0,1)または(1,0,1)のときです。したがってK1=0が確定し、J1は0でも1でもよいため「任意, 0」となります。
- 小問 設問3 d:ア
- 2進カウンタではQが0→1のときJ=1, K=任意K、1→0のときJ=任意J, K=1が必要です。Jとして常に1、Kとして常に1を入力する(J,K)=(1,1)は条件を満たします。
- 小問 設問3 e:イ
- Q=0のときJ=1、Q=1のときK=1を満たすため、J=1、K=Qとする(J,K)=(1, Q)の構成も2進カウンタとして正しく動作します。
- 小問 設問3 f:カ
- Q=0のときJ=Qバー=1となり、Q=1のときK=Q=1となるため、(J,K)=(Qバー, Q)の構成も2進カウンタとして成立します。
覚えるポイント
- JKフリップフロップのJ=K=1はトグル(反転)動作となるため、2進カウンタの基本原理となる。
- 状態遷移表から励振条件を導出する際は、未定義・不問の入力値を「任意(ドントケア)」として扱う。
間違えやすいところ
- 設問1でQ=0から一度0→1に反転した後に0に戻ると誤認し、トグル動作を繰り返すと答えてしまう。
- 設問3の構成案で、問題文に示された(Qバー, 1)の対称形である(1, Qバー)も動作すると安易に誤解してしまう。
出題の前提:問題文に与えられた表1(真理値表)およびクロックの立ち下がりエッジトリガ動作に基づく。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.10 ↗(www.ipa.go.jp) / 公式問題冊子 p.11 ↗(www.ipa.go.jp) / 公式問題冊子 p.12 ↗(www.ipa.go.jp) / 公式問題冊子 p.13 ↗(www.ipa.go.jp) / 公式問題冊子 p.14 ↗(www.ipa.go.jp)
OSにおけるプロセスのスケジューリング
ソフトウェア · プロセスの状態遷移 / 到着順方式 / ラウンドロビン方式 / 残余処理時間順方式 / ターンアラウンドタイム
OSにおけるプロセスのスケジューリング(到着順方式、ラウンドロビン方式、残余処理時間順方式)に関する記述を読み、設問1〜3に答えよ。コンピュータのCPUは1つであり、同時に1つのプロセスしか実行できないものとする。 【設問1】プロセスX(①前処理(CPU)→②データ入力→③計算処理(CPU)→④データ出力→⑤後処理(CPU))を到着順方式で実行したときの状態遷移((a)実行可能→実行、(b)実行→実行可能、(c)実行→待ち、(d)待ち→実行可能)の発生回数の組合せとして正しいものを答えよ。 【設問2】プロセスA〜D(到着時刻/処理時間:A(0ms/120ms), B(10ms/90ms), C(30ms/60ms), D(50ms/30ms))をタイムクウォンタム20msのラウンドロビン方式で実行する。プロセスDが最初に実行状態になったとき、待ち行列の先頭からのプロセスの並び順を答えよ。 【設問3】プロセスA〜Dを残余処理時間順方式(10msごとに残余処理時間を比較し最短のプロセスにCPUを割り当てる方式)で実行した場合、プロセスA, B, Cのターンアラウンドタイム(最初に待ち行列に登録されてから処理が完了するまでの時間)[a], [b], [c](ミリ秒)を答えよ。
- 設問1-ア
- (a): 3, (b): 0, (c): 1, (d): 1
- 設問1-イ
- (a): 3, (b): 0, (c): 1, (d): 2
- 設問1-ウ
- (a): 3, (b): 0, (c): 2, (d): 2
- 設問1-エ
- (a): 3, (b): 1, (c): 1, (d): 1
- 設問1-オ
- (a): 3, (b): 1, (c): 1, (d): 2
- 設問1-カ
- (a): 3, (b): 1, (c): 2, (d): 2
- 設問2-ア
- A, B, C
- 設問2-イ
- A, C, B
- 設問2-ウ
- B, A, C
- 設問2-エ
- B, C, A
- 設問2-オ
- C, A, B
- 設問2-カ
- C, B, A
- 設問3-ア
- 60
- 設問3-イ
- 80
- 設問3-ウ
- 90
- 設問3-エ
- 100
- 設問3-オ
- 120
- 設問3-カ
- 180
- 設問3-キ
- 300
解答・解説を表示
解答
設問1: ウ, 設問2: イ, 設問3 a: キ, 設問3 b: カ, 設問3 c: ウ
解説
まず要点:プロセス(実行中のプログラム)の状態は「実行可能」「実行」「待ち」の3つを行き来する。CPUの割り当て方には、到着順に完了まで実行するFCFS(先着順)、一定時間ごとに切り替えるラウンドロビン、残りのCPU時間が最短のものを優先する残余処理時間順などがある。方式ごとに待ち行列の動きとターンアラウンドタイム(完了時刻-到着時刻)が変わる。
解き方
- 設問1:入出力処理を伴うプロセスの各フェーズ(CPU処理開始、入出力要求、入出力完了)における状態遷移の矢印を特定し、各遷移の回数を数える。
- 設問2:タイムクウォンタム20msおよび各プロセスの到着時刻に基づき、時間経過に伴う実行プロセスと待ち行列の変化を時系列でシミュレーションする。
- 設問3:10msごとの各プロセスの残余処理時間を比較し、最短プロセスにCPUを割り当てて各プロセスの完了時刻を算出し、到着時刻との差からターンアラウンドタイムを求める。
小問ごとの答え
- 小問 設問1:ウ
- 到着順方式ではCPU割当て時間超過による中断は生じないため、実行から実行可能への遷移(b)は0回です。CPU処理(①前処理、③計算処理、⑤後処理)の開始時に実行可能から実行への遷移(a)が3回発生します。データ入出力(②データ入力、④データ出力)の開始時に実行から待ちへの遷移(c)が2回、入出力完了時に待ちから実行可能への遷移(d)が2回発生するため、(a)=3, (b)=0, (c)=2, (d)=2となります。
- 小問 設問2:イ
- 時刻0msでA実行(待ち行列:[])、10msでB到着(待ち行列:[B])。20msでA中断・再登録されB実行(待ち行列:[A])。30msでC到着(待ち行列:[A, C])。40msでB中断・再登録されA実行(待ち行列:[C, B])。50msでD到着(待ち行列:[C, B, D])。60msでA中断・再登録されC実行(待ち行列:[B, D, A])。80msでC中断・再登録されB実行(待ち行列:[D, A, C])。100msでB中断・再登録され待ち行列は[D, A, C, B]となり、先頭のDが取り出されて実行状態になります。このときの待ち行列は先頭からA, C, Bの順です。
- 小問 設問3 a:キ
- プロセスAは時刻0msに到着し、他のプロセスの処理が終わった後の時刻190msから残り110msを実行して時刻300msに完了します。ターンアラウンドタイムは300 - 0 = 300ミリ秒です。
- 小問 設問3 b:カ
- プロセスBは時刻10msに到着し、時刻10〜30ms(20ms実行)、時刻120〜190ms(70ms実行)で合計90ms実行して時刻190msに完了します。ターンアラウンドタイムは190 - 10 = 180ミリ秒です。
- 小問 設問3 c:ウ
- プロセスCは時刻30msに到着し、時刻30〜50ms(20ms実行)、時刻80〜120ms(40ms実行)で合計60ms実行して時刻120msに完了します。ターンアラウンドタイムは120 - 30 = 90ミリ秒です。
覚えるポイント
- ターンアラウンドタイムは「処理完了時刻-到着時刻」で計算する。
- 到着順方式(FCFS)ではCPU使用権の横取り(プリエンプション)は起きない。
間違えやすいところ
- ターンアラウンドタイムを完了時刻そのものと勘違いして到着時刻を引き忘れるミス。
- ラウンドロビン方式で新しいプロセスの到着とタイムスライスの満了による再登録の順序を取り違えるミス。
出題の前提:基本情報技術者試験 午後問題の出題条件およびOSのプロセス管理仕様に基づく。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.15 ↗(www.ipa.go.jp) / 公式問題冊子 p.16 ↗(www.ipa.go.jp) / 公式問題冊子 p.17 ↗(www.ipa.go.jp) / 公式問題冊子 p.18 ↗(www.ipa.go.jp) / 公式問題冊子 p.19 ↗(www.ipa.go.jp)
書籍を管理する関係データベースの設計及び運用
データベース · テーブル設計 / 履歴管理 / SQL(結合・GROUP BY・WHERE) / インデックスによる性能改善
書籍を管理する関係データベースの設計及び運用に関する記述を読み、設問1〜4に答えよ。 【設問1】従来の書籍表(書籍番号、書籍名、著者、出版社、貸出日、返却予定日、社員番号)及び社員表からは検索できない情報を、解答群の中から二つ選べ。なお返却時には貸出日・返却予定日・社員番号にnullが設定される。 【設問2】再構築後のデータベース(書籍表、貸出表)において、運用開始後に延滞したことがある利用者の社員番号と書籍名を社員番号の昇順に表示するSQL文の空欄 [ a ] に入る条件式を選べ。なお延滞とは返却日が返却予定日を超えているか、未返却で返却予定日を過ぎている場合である。 【設問3】貸出回数が多い順に書籍番号、書籍名及び貸出回数を表示するSQL文の空欄 [ b ] に入る集計関数を選べ。 【設問4】書籍名を入力して貸出中か否かを表示する処理でレスポンス低下が顕著化した(書籍表865件、貸出表10,382件)。インデックスの設定によって最も検索性能の向上が期待できる項目を選べ。
- 設問1-ア
- 現在、貸出中でない書籍の一覧
- 設問1-イ
- 現在、貸出中の書籍の一覧
- 設問1-ウ
- 現在、書籍を貸出中の利用者の連絡先
- 設問1-エ
- 書籍ごとの累積貸出回数
- 設問1-オ
- 返却予定日を過ぎても貸出中の書籍の一覧
- 設問1-カ
- 利用者ごとの貸出履歴
- 設問2-ア
- 書籍表.書籍番号 = 貸出表.書籍番号 AND (貸出表.返却日 > 貸出表.返却予定日 OR (貸出表.返却日 IS NULL AND 貸出表.返却予定日 < CURRENT_DATE))
- 設問2-イ
- 書籍表.書籍番号 = 貸出表.書籍番号 AND (貸出表.返却日 BETWEEN 貸出表.貸出日 AND 貸出表.返却予定日 OR 貸出表.返却日 IS NULL OR 貸出表.返却予定日 < CURRENT_DATE)
- 設問2-ウ
- 書籍表.書籍番号 = 貸出表.書籍番号 AND 貸出表.返却日 != 貸出表.返却予定日
- 設問2-エ
- 書籍表.書籍番号 = 貸出表.書籍番号 AND 貸出表.返却日 IS NOT NULL
- 設問3-ア
- COUNT(*)
- 設問3-イ
- MAX(書籍表.書籍番号)
- 設問3-ウ
- SUM(貸出表.貸出番号)
- 設問3-エ
- 貸出表.貸出番号
- 設問3-オ
- 書籍表.書籍番号
- 設問4-ア
- 書籍表.書籍名
- 設問4-イ
- 貸出表.書籍番号
- 設問4-ウ
- 貸出表.社員番号
- 設問4-エ
- 貸出表.貸出日
- 設問4-オ
- 貸出表.返却日
解答・解説を表示
解答
設問1: エ, カ, 設問2 a: ア, 設問3 b: ア, 設問4: イ
解説
まず要点:関係データベースでは、上書きで過去のデータが消えないよう、履歴は別の表(貸出表など)に分けて残す設計が大切。また、件数の多い表を結合・検索するときは、外部キー(他の表を参照する列)などにインデックス(索引)を付けると検索が速くなる。
解き方
- 設問1:返却時にnullで上書き更新される仕様から、過去データの蓄積を要する項目(履歴、回数)を特定する。
- 設問2:両テーブルの結合キーと、「返却済み延滞」または「未返却延滞」の論理条件を整理してSQL条件式を導く。
- 設問3:GROUP BY句によるグループ単位の件数を算出する適切な集計関数(COUNT)を選択する。
- 設問4:テーブルの件数規模(書籍表865件 vs 貸出表10,382件)と検索手順(書籍番号による貸出表の参照)から、インデックスを適用すべき最も効果的な列を判定する。
小問ごとの答え
- 小問 設問1:エ, カ
- 従来の設計では返却時に貸出日・返却予定日・社員番号がnullで上書きされてしまうため、過去に返却された貸出の記録が残りません。したがって「書籍ごとの累積貸出回数(エ)」および「利用者ごとの貸出履歴(カ)」は検索できません。
- 小問 設問2 a:ア
- 書籍表と貸出表の結合条件「書籍表.書籍番号 = 貸出表.書籍番号」に加え、延滞条件は「返却済みで返却日が返却予定日より後(返却日 > 返却予定日)」または「未返却で返却予定日を過ぎている(返却日 IS NULL AND 返却予定日 < CURRENT_DATE)」のいずれかを満たすことなので、アが適切です。
- 小問 設問3 b:ア
- 書籍ごとにグループ化(GROUP BY)された各書籍の貸出回数を求めるには、結合された貸出レコードの行数を数える必要があるため、COUNT(*)を用います。
- 小問 設問4:イ
- 書籍名から貸出中か否かを確認する処理では、まず書籍表(865件)から該当書籍の書籍番号を取得し、その書籍番号を条件にして件数の多い貸出表(10,382件)を検索します。貸出表の書籍番号にインデックスを設定することで、フルスキャンを回避でき最も検索性能の向上が期待できます。
覚えるポイント
- 1対多の履歴情報を管理するには、親テーブルを直接更新せず子テーブルに履歴レコードを追加する。
- 結合や検索条件で参照される件数の多いテーブルの外部キー列にインデックスを作成すると効果的である。
間違えやすいところ
- 延滞の判定において「返却済みだが遅れた場合」と「未返却で現在遅れている場合」の片方を見落とすミス。
- インデックス作成先として、件数の少ない書籍表の列(書籍名など)を選んでしまうミス。
出題の前提:基本情報技術者試験 午後問題の出題条件およびSQL標準仕様に基づく。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.20 ↗(www.ipa.go.jp) / 公式問題冊子 p.21 ↗(www.ipa.go.jp) / 公式問題冊子 p.22 ↗(www.ipa.go.jp) / 公式問題冊子 p.23 ↗(www.ipa.go.jp)
共通ライブラリのオブジェクト指向設計(UMLクラス図とIteratorパターン)
ソフトウェア設計 · UML / クラス図 / デザインパターン / Iteratorパターン / Compositeパターン
共通ライブラリのオブジェクト指向設計に関する次の記述を読み、設問1・設問2に答えよ。 システムインテグレータのT社では、組織階層から特定の社員を探す社員検索機能を共通ライブラリとして設計している。組織階層は木構造で管理され、組織と社員を共通に扱えるようにするために組織エントリとして扱う。 〔設問1〕分析のためのクラス図(図2)の中の空欄 a~d に入れる適切な字句または多重度を選択せよ。 〔設問2〕組織エントリリストの見直しに関する記述中の空欄 e, f に入れる適切な字句を選択せよ。
- ア
- 設問1 a,b: 親組織 / c,d: 0 / 設問2 e: クライアント / f: BaseList と BaseIterator を継承して処理をオーバライド
- イ
- 設問1 a,b: クライアント / c,d: 0..1 / 設問2 e: 属性 / f: BaseList と BaseIterator を継承してメソッドを追加
- ウ
- 設問1 a,b: 子組織 / c,d: 0..* / 設問2 e: メソッド / f: BaseList と BaseIterator を実装して処理をオーバライド
- エ
- 設問1 a,b: 社員 / c,d: 1 / 設問2 e: リスト自身 / f: BaseList と BaseIterator を実装してメソッドを追加
- オ
- 設問1 a,b: 組織 / c,d: 1..* / 設問2 f: List と Iterator を継承して処理をオーバライド
- カ
- 設問1 a,b: 組織エントリ / 設問2 f: List と Iterator を継承してメソッドを追加
- キ
- 設問1 a,b: 組織階層 / 設問2 f: List と Iterator を実装して処理をオーバライド
- ク
- 設問2 f: List と Iterator を実装してメソッドを追加
解答・解説を表示
解答
設問1 a: カ, 設問1 b: オ, 設問1 c: ウ, 設問1 d: イ, 設問2 e: エ, 設問2 f: ア
解説
まず要点:木構造のデータを扱うときは、全体と部分を同じ仲間として扱うComposite(合成)パターンが役立つ。組織と社員を共通の「組織エントリ」としてまとめ、親子の関係を再帰的に表す。また、集まりを順にたどる処理はIterator(反復子)パターンで、たどり方のしくみを中の作りから切り離して拡張しやすくする。
解き方
- 組織階層の再帰的関係から、組織と社員を抽象化した汎化クラスが a(組織エントリ)、集約を持つ具象クラスが b(組織)であることを特定する。
- 組織に含まれる構成要素の多重度 c(0..*)と、親組織側の多重度 d(0..1)を決定する。
- リスト走査処理において、Iteratorが要素を取得するために必要な参照 e(リスト自身)を確認する。
- ライブラリの拡張設計として、既存具象クラスを継承してメソッド処理をオーバライドする f の記述を選択する。
小問ごとの答え
- 小問 設問1 a:カ
- 組織と社員を同一視して扱うためのスーパークラスとして「組織エントリ」が汎化元となります。
- 小問 設問1 b:オ
- 組織エントリ(子組織や所属社員)を集約して内部に保持できるのは「組織」クラスです。
- 小問 設問1 c:ウ
- 組織に含まれる組織エントリの数は下限が0で上限に制限がないため、多重度は「0..*」となります。
- 小問 設問1 d:イ
- 組織エントリが属する親組織は、トップ組織の場合は存在せず(0)、存在する場合は必ず1つなので「0..1」となります。
- 小問 設問2 e:エ
- イテレータがリストの各要素にアクセスして走査するためには、イテレータ生成時に対象となる「リスト自身」を登録する必要があります。
- 小問 設問2 f:ア
- 標準とは異なる走査順序や抽出条件を実現する場合、既存の実装クラスであるBaseListとBaseIteratorを継承し、走査処理をオーバライドします。
覚えるポイント
- Compositeパターンでは個別の葉(社員)と複合体(組織)を同一の抽象基底型(組織エントリ)として扱う。
- Iteratorパターンでは集約体自身をイテレータに渡して走査状態を別オブジェクトで管理する。
間違えやすいところ
- 木構造の親側の多重度で、ルートノードには親が存在しない(0となる)例外を失念して1固定と誤認しやすい。
- クラスの拡張において、interfaceに対する「実装」と具象クラスに対する「継承・オーバライド」の用語を混同しやすい。
出題の前提:平成26年度秋期基本情報技術者試験午後問5(共通ライブラリのオブジェクト指向設計)
出典:IPA『2014年度 秋期 午後』
公式問題冊子 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) / 公式問題冊子 p.30 ↗(www.ipa.go.jp)
サービスデスクにおける問合せ対応の分析と改善効果見積り
サービスマネジメント · サービスデスク / SLA・目標達成率 / 問合せ管理 / FAQ効果見積り
販売情報システムに関するサービスデスクの問合せ対応業務について、次の記述を読んで設問1~3に答えよ。 サービスデスクでは、受付内容を「ログイン」「操作」「接続」「目標管理」「販売実績」「その他」に分類している。このうち「ログイン」と「操作」はサービスデスク自身が回答し、受付から30分以内の完了を目標としている。それ以外は各主管部門へ引き継ぐ。 〔設問1〕表2の抽出データから、サービスデスク目標の達成率(%)を求めよ。 〔設問2〕表3の問合せ件数推移から、空欄 a~d に当てはまる記述を選択せよ。 〔設問3〕業務改善(過去同種問合せのサービスデスク直接回答、およびFAQの導入)に伴う第5週の見積りに関して、空欄 e~g に入る適切な数値を求めよ。
- ア
- 設問1: 25 / 設問2 a: 操作と販売実績 / b: 営業課 / c: 第3週から元の要員数に戻している / d: ログイン,操作とも毎週上がっている / 設問3 e: 95 / f: 320 / g: 8
- イ
- 設問1: 33 / 設問2 a: 操作と目標管理 / b: 企画課 / c: 第4週から元の要員数に戻している / d: ログイン,操作とも週によって上がり下がりがある / 設問3 e: 108 / f: 330 / g: 12
- ウ
- 設問1: 50 / 設問2 a: 目標管理と販売実績 / b: サービスデスク / c: 第5週から元の要員数に戻す / d: ログインは週によって上がり下がりがあるものの,操作は毎週上がっている / 設問3 e: 111 / f: 400 / g: 16
- エ
- 設問1: 67 / 設問2 a: ログインと操作 / b: システム課 / c: 第5週も1名増員したままである / d: ログインは毎週上がっているものの,操作は週によって上がり下がりがある / 設問3 e: 113 / f: 470 / g: 24
- オ
- 設問1: 75 / 設問2 a: ログインと販売実績 / 設問3 e: 116 / f: 480 / g: 32
- カ
- 設問1: 100 / 設問2 a: ログインと目標管理 / 設問3 e: 119 / f: 500 / g: 48
解答・解説を表示
解答
設問1: オ, 設問2 a: オ, 設問2 b: イ, 設問2 c: イ, 設問2 d: エ, 設問3 e: エ, 設問3 f: ア, 設問3 g: イ
解説
まず要点:サービスデスクの評価では、目標時間内に対応できた割合などの数字を測って分析する。過去の事例を再利用して引き継ぎを減らす効果や、FAQで問合せ自体を減らす効果は、件数をもとにした計算で見積もる。
解き方
- サービスデスクの担当範囲(ログイン・操作)を識別し、表2から対象問合せ4件のうち30分以内完了が3件であることを算出して達成率75%を求める。
- 表3から各区分の推移、担当部門別の件数合計、要員削減条件(第3週で達成したため第4週に戻る)および達成率の傾向を分析する。
- 第5週の区分別想定件数を足し合わせて総数113件(e)を計算する。
- サービスデスク直接回答に切り替わる過去同種件数(計32件)に10分を掛けて短縮時間320分(f)を算出する。
- 第5週の過去同種問合せ総数(計48件)に対してFAQ適用率50%と削減率50%を順に掛けて削減数12件(g)を算出する。
小問ごとの答え
- 小問 設問1:オ
- 表2中のサービスデスク問合せは4件(11842, 11860, 11865, 11866)。このうち30分以内に回答完了したものは3件(所要時間3分、26分、12分)なので、達成率は 3/4 = 75% となります。
- 小問 設問2 a:オ
- 第1週と比べ第4週で半数以下になった区分は、ログイン(40→3件)と販売実績(82→4件)の2つです。
- 小問 設問2 b:イ
- 第4週の問合せ数は、サービスデスクが23件、システム課が12件、企画課が48件、営業課が12件であり、企画課が最多です。
- 小問 設問2 c:イ
- サービスデスク問合せ数が30件以下になったのは第3週(5+18=23件)なので、ルールに従い「第4週から元の要員数に戻している」となります。
- 小問 設問2 d:エ
- 目標達成率は、ログインが第1~4週にかけて70.0%→75.0%→80.0%→100%と毎週上昇していますが、操作は80.0%→77.3%→88.9%→85.0%と変動しています。
- 小問 設問3 e:エ
- 第5週想定数は、操作(25)+目標管理(60)+販売実績(5)+ログイン(3)+接続(12)+その他(8) = 113件です。
- 小問 設問3 f:ア
- サービスデスク問合せ以外の過去同種件数は、接続5件、目標管理20件、販売実績5件、その他2件の計32件。1件あたり10分短縮のため、32×10 = 320分短縮できます。
- 小問 設問3 g:イ
- 第5週の全区分での過去同種件数は48件。この50%がFAQ対象(24件)となり、FAQにより50%削減されるため、24×0.5 = 12件削減されます。
覚えるポイント
- サービスデスク問合せ(一次対応)と他部門引き継ぎ問合せの区分を業務定義から正確に分離する。
- FAQ削減件数などの効果試算では「対象となる母集団の絞り込み」と「効果の発生割合」を順次乗算する。
間違えやすいところ
- 設問1で表2の全問合せを分母にしてしまい、サービスデスク以外の引継ぎ案件を含めてしまうミスが多い。
- 設問2 cで「第4週に初めて満たした場合は第5週も維持」という例外規定に引きずられ、第3週ですでに条件を満たしていることを見落としやすい。
出題の前提:平成26年度秋期基本情報技術者試験午後問6(サービスデスクにおける問合せ対応)
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.31 ↗(www.ipa.go.jp) / 公式問題冊子 p.32 ↗(www.ipa.go.jp) / 公式問題冊子 p.33 ↗(www.ipa.go.jp) / 公式問題冊子 p.34 ↗(www.ipa.go.jp) / 公式問題冊子 p.35 ↗(www.ipa.go.jp)
受発注システムの改修と在庫引当・発注方式の検討
システム戦略 · 受発注管理 / 在庫引当 / 定量発注方式 / 業務改善
事務用品卸売業のC社における、現状の受発注システムと業務分析、および要求納期遵守率を向上させるためのシステム改修に関する記述を読み、設問1・2に答えよ。 〔現状のシステムと業務〕 ・注文受付時間(9:00〜16:00)に受注情報を入力すると、システムは通番で受注番号を採番し、即座に在庫引当を行う。 ・在庫不足時は引当可能在庫分だけ引き当て、不足分は仕入先からの入庫後に受注入力順に引当を行う。 ・発注は定量発注方式で、引当可能在庫が発注点(90個)以下になった日の注文受付時間終了後に一定数量(300個)を発注する。調達リードタイムは7日間。 ・6月末の引当可能在庫は270個。 設問1:C社の業務に関する説明として適切なものを解答群の中から選べ。 設問2:記述中の空欄[ a ]〜[ e ]に入れる正しい答えを解答群の中から選べ。
- ア
- 仕入先への発注は、商品ごとに一定の日日にち間隔で行われる。
- イ
- 受注情報を入力すると、納入リードタイムに関係なく、システムは在庫引当を行う。
- ウ
- 引当可能在庫の数量がゼロの場合、受注情報を入力することはできない。
- エ
- 引当可能在庫の数量はマイナスになることがある。
解答・解説を表示
解答
設問1: イ, 設問2 a: ウ, 設問2 b: ア, 設問2 c: イ, 設問2 d: ア, 設問2 e: ウ
解説
まず要点:定量発注方式は、在庫が発注点を下回ったときに決まった量を発注するしくみ。納入までの日数が調達にかかる日数より長い注文に、今ある在庫をすぐ引き当てると、すぐ必要な注文に使う在庫が足りなくなる。そこで、そのような注文は在庫引当から外して個別に発注する改修が有効。
解き方
- 業務フローを整理し、現状の在庫引当ルールと定量発注のトリガー条件(引当可能在庫≦発注点)を確認する。
- 表1の受注データをもとに各日の引当可能在庫数を時系列で計算し、発注日および欠品・納期遅れが発生する受注番号を特定する。
- 納期遅れの原因(余裕のある受注への早期引当)を把握し、改修仕様(納入リードタイムが調達リードタイム以上なら引当除外・個別発注)に基づいて表2の在庫推移を再計算する。
小問ごとの答え
- 小問 設問1:イ
- 現状のシステムでは、受注情報を入力した時点で納入リードタイムの長短にかかわらず即座に在庫引当が行われます。
- 小問 設問2 a:ウ
- 6月末在庫270個から各日の受注(7/3: 35個、7/7: 30個、7/8: 30個、7/12: 40個、7/17: 25個、7/19: 35個)を引いていくと、7/17引当後は110個、7/19引当後に75個となり発注点90個を下回るため、発注処理は7月19日に行われます。
- 小問 設問2 b:ア
- 7月19日発注分の入庫は調達リードタイム7日後(7月26日)です。7/23受注の130156(45個引当後残30個)に対して、同日受注の130168(要求40個)は30個のみ引当され10個不足、7/24受注の130169(要求35個)は全く引当できず、ともに要求納期7月25日に間に合いません。7/26受注の130175は入庫後引当で間に合うため、納品できなかったのは130168と130169です。
- 小問 設問2 c:イ
- 納入リードタイムが調達リードタイム(7日)以上ある受注に在庫を即座に引き当ててしまうと、それ以降に入った要求納期の短い直近の受注に対して在庫を割り当てられなくなってしまいます。
- 小問 設問2 d:ア
- 改修案では納入リードタイムが調達リードタイム以上の受注については、個別に仕入先へ発注して入庫品を充てるため、受注入力時に既存の引当可能在庫からの在庫引当を行わないようにします。
- 小問 設問2 e:ウ
- 改修後、納入リードタイムが7日以上ある受注(130144: 8日、130148: 7日、130175: 1日←これは納入LT1日なので個別発注ではない。納入LT7日以上は130121: 8日、130144: 8日、130148: 7日)は在庫引当対象外となります。これにより7/23の130156引当後残高は130個あり、130168(40個)を全量引き当てた後の残数量は 130 - 40 = 90個となります。
覚えるポイント
- 定量発注方式は発注点管理(在庫≦発注点で一定量発注)、定期発注方式は一定周期発注である点。
- 納入リードタイム(受注日〜要求納期)が調達リードタイム(発注日〜入庫日)以上の場合は、即時在庫引当せず入庫品を充当することで在庫有効活用ができる点。
間違えやすいところ
- 納入リードタイムの計算(要求納期-受注日)と調達リードタイム(7日)の大小比較を見誤ること。
- 引当可能在庫の引き当て順序と、入庫完了日(発注日+7日)の前後関係を取り違えて納期遅れの受注を誤判定すること。
出題の前提:問題文の業務仕様記述(〔受注に関する処理〕、〔発注に関する処理〕、〔入庫に関する処理〕)に基づく。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.36 ↗(www.ipa.go.jp) / 公式問題冊子 p.37 ↗(www.ipa.go.jp) / 公式問題冊子 p.38 ↗(www.ipa.go.jp) / 公式問題冊子 p.39 ↗(www.ipa.go.jp) / 公式問題冊子 p.40 ↗(www.ipa.go.jp)
エディットグラフを用いた文字列の編集距離の算出
データ構造及びアルゴリズム · 編集距離 / 動的計画法 / エディットグラフ / 最短経路問題
文字列の差異を測る編集距離の算出に関して、エディットグラフを用いたアルゴリズムおよび擬似言語プログラムを読んだ上で、設問1・2に答えよ。 1文字の追加または削除操作を繰り返し適用して一方の文字列を他方に変換する最小操作回数を編集距離という。変換元文字列Str1(長さStr1Len)、変換先文字列Str2(長さStr2Len)に対して格子グラフを考え、(X, Y)から(X+1, Y)および(X, Y+1)への移動距離を1、Str1[X]==Str2[Y]のときの対角線(X+1, Y+1)への移動距離を0として、(0, 0)から(Str1Len, Str2Len)への最短移動距離を動的計画法で求める。 設問1:プログラム中の空欄[ a ],[ b ]に入れる正しい答えを選べ。 設問2:Str1="peace", Str2="people"の場合のエディットグラフ[ c ]、およびCalcEditDistance実行時の行α・行βの実行回数[ d ],[ e ]、戻り値[ f ]を選べ。
- ア
- Str1[X - 1] = Str2[Y - 1]
- イ
- Str1[X - 1] ≠ Str2[Y - 1]
- ウ
- Str1[X] = Str2[Y]
- エ
- Str1[X] ≠ Str2[Y]
- オ
- Str1[X - 1] = Str1[X] and Str2[Y - 1] = Str2[Y]
- カ
- Str1[X - 1] ≠ Str1[X] and Str2[Y - 1] ≠ Str2[Y]
解答・解説を表示
解答
設問1 a: ア, 設問1 b: ウ, 設問2 c: ウ, 設問2 d: ウ, 設問2 e: カ, 設問2 f: イ
解説
まず要点:編集距離は、文字の追加や削除を何回行えば一方の文字列を他方に変えられるかを表す数。格子グラフ(マス目)上で、横・縦の移動をコスト1、同じ文字どうしの斜め移動をコスト0とし、動的計画法(小さい問題から順に解く方法)で始点から終点までの最短の道のりとして求める。
解き方
- エディットグラフの定義から、対角線が引かれる条件(Str1[X-1] == Str2[Y-1])および格子の終点座標(Str1Len, Str2Len)を確認する。
- 変換元・変換先の文字列間で一致する文字のインデックスの組み合わせを洗い出し、対角線の本数(行αの実行回数)と全セル数から行βの実行回数を算出する。
- DPの漸化式に従って(0, 0)から(Str1Len, Str2Len)までの最小コストを順次計算し、最終的な編集距離を導出する。
小問ごとの答え
- 小問 設問1 a:ア
- エディットグラフにおいて(X-1, Y-1)から(X, Y)へコスト0の対角線移動ができるのは、文字列の該当文字が一致する場合です。添字が0から始まるため、(X-1)番目と(Y-1)番目の文字を比較する条件式は「Str1[X - 1] = Str2[Y - 1]」となります。
- 小問 設問1 b:ウ
- (0, 0)から右上の(Str1Len, Str2Len)までの最短移動距離が求める編集距離であるため、配列の要素「D[Str1Len, Str2Len]」を返却します。
- 小問 設問2 c:ウ
- Str1="peace"(長さ5)、Str2="people"(長さ6)において一致する文字のペア(X, Y)は、p同士(0, 0), (0, 3)、e同士(1, 1), (1, 5), (4, 1), (4, 5)の合計6箇所です。これらに対応して対角線が引かれているグラフは「ウ」です。
- 小問 設問2 d:ウ
- 行αは空欄aの条件が真のとき、すなわち対角線が存在するセルで実行されます。文字が一致するペアは6箇所あるため、実行回数は6回です。
- 小問 設問2 e:カ
- 二重ループ全体の繰り返し回数は X(1〜5)×Y(1〜6)=30回です。行αが6回実行されたので、else側である行βの実行回数は 30 - 6 = 24回となります。
- 小問 設問2 f:イ
- エディットグラフ上の最短経路を辿ると、(0,0)→(1,1)[対角線0]→(1,2)[下1]→(2,2)[右1]→(3,2)[右1]→(4,2)[右1]→(4,5)[右へ移動しつつ対角線など]等を考慮し、DPテーブルを計算するとD[5, 6] = 5 となります。
覚えるポイント
- 編集距離(追加・削除のみの場合)では、文字一致時の対角線遷移コストは0、水平・垂直移動のコストは1となる点。
- 擬似言語のループ添字が1〜Nの場合、0始まりの文字列配列へアクセスする添字は[変数 - 1]となる点。
間違えやすいところ
- 配列添字の0始まりとループ範囲(1〜StrLen)のズレに気づかず、Str1[X]を選択してしまうミス。
- 一致する文字の組み合わせを数える際に、同じ文字が複数回出現するケース(例: 'e'や'p'の重複)を数え漏らすこと。
出題の前提:問題文のエディットグラフ定義および擬似言語プログラムに基づく。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 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)
利用者IDの管理状況の確認(C言語)
ソフトウェア開発 · C言語 / ファイル突合せ / ビット演算 / 文字列比較
利用者ID一覧を保持する最新ファイル(NewFile)と1世代前のファイル(OldFile)を読み込み、利用者IDの追加・削除や特権(システム特権S、オペレーション特権O)の変更内容の差異を突合して印字するCプログラム、および利用状況を検証する拡張に関する次の設問に答えよ。 〔設問1〕プログラム中の空欄 [ a ] ~ [ d ] に入れる正しい答えを、それぞれの解答群の中から選べ。 〔設問2〕次の記述中の空欄 [ e ], [ f ] に入れる正しい答えを、解答群の中から選べ。
- 設問1 a ア
- (NewEof != EOF) && (OldEof != EOF)
- 設問1 a イ
- (NewEof != EOF) || (OldEof != EOF)
- 設問1 a ウ
- NewEof != OldEof
- 設問1 a エ
- NewEof == OldEof
- 設問1 b ア
- ((NewAttr & OldAttr) & (BitS + BitO)) != 0x00
- 設問1 b イ
- ((NewAttr | OldAttr) & (BitS + BitO)) != 0x00
- 設問1 b ウ
- (NewAttr & (BitS + BitO)) != (OldAttr & (BitS + BitO))
- 設問1 b エ
- (NewAttr | (BitS + BitO)) != (OldAttr | (BitS + BitO))
- 設問1 c ア
- ReadNewRecord();
- 設問1 c イ
- ReadNewRecord(); ReadOldRecord();
- 設問1 c ウ
- ReadOldRecord();
- 設問1 d ア
- (NewAttr & (BitS + BitO)) != 0x00
- 設問1 d イ
- NewAttr > OldAttr
- 設問1 d ウ
- strcmp(NewID, OldID) < 0
- 設問1 d エ
- strcmp(NewID, OldID) > 0
- 設問2 e, f ア
- (NewAttr & BitR) != (OldAttr & BitR)
- 設問2 e, f イ
- (NewAttr & BitR) == BitR
- 設問2 e, f ウ
- strcmp(NewDate, OldDate) == 0
- 設問2 e, f エ
- strcmp(NewID, OldID) == 0
- 設問2 e, f オ
- strcmp(NewID, OldID) == 0 && (NewAttr & BitR) == BitR
- 設問2 e, f カ
- strcmp(NewID, OldID) == 0 && strcmp(NewDate, OldDate) == 0
解答・解説を表示
解答
設問1 a: イ, 設問1 b: ウ, 設問1 c: イ, 設問1 d: ウ, 設問2 e: イ, 設問2 f: カ
解説
まず要点:順番に並べた2つのファイルを先頭から1件ずつ比べて、追加・削除・変更を洗い出します。キー(識別するための値)の大小を比べ、一致すれば変更、新が小さければ追加、新が大きければ削除と判断します。どちらか一方にまだ処理するデータが残っている限りループを続け、ビットマスク演算で特権などのフラグの変化を調べます。
解き方
- ループを続ける条件は、どちらか一方のファイルにまだ処理するレコードが残っていること(論理和OR)です。
- IDが一致したら、特権マスク (BitS + BitO) をかけたビット積どうしが違うかで特権の変更を判定し、両方のレコードを読み進めます。
- IDが違うときはキーを比べ、NewIDの方が小さければ新規追加(New側だけ読進め)、OldIDの方が小さければ削除(Old側だけ読進め)とします。
- 使用状況の検証では、ビットrの判定にBitRとの論理積を使い、両ファイルに存在して日付が等しい条件には同一IDと日付文字列一致の判定を組み合わせます。
小問ごとの答え
- 小問 設問1 a:イ
- 2つのファイルの突合せ処理では、両方のファイルが同時に終了するとは限らず、どちらか一方に未処理レコードが残っている間はループを継続する必要があるため、条件は (NewEof != EOF) || (OldEof != EOF) となる。
- 小問 設問1 b:ウ
- 同一利用者IDが存在する場合、特権Sまたは特権Oの付加状況が変化したか否かを判定する。各属性から特権ビットのみをマスク抽出した (NewAttr & (BitS + BitO)) と (OldAttr & (BitS + BitO)) を比較し、不一致であれば特権が変更されたと判定できる。
- 小問 設問1 c:イ
- strcmp(NewID, OldID) == 0 のブロックでは、新旧両方のファイルに同じ利用者IDのレコードが存在して処理を完了したため、次のレコードに進めるために ReadNewRecord() と ReadOldRecord() の双方を呼び出す必要がある。
- 小問 設問1 d:ウ
- IDが不一致(else節)のとき、NewID < OldID(strcmp(NewID, OldID) < 0)であれば、最新ファイルにのみ存在する新規利用者IDであるため「利用者ID 追加」の処理を行い、最新ファイル側のみ1件進める。
- 小問 設問2 e:イ
- 条件①「NewFile中にあって属性のビットrが1である利用者ID」を判定するため、最新属性とマスク BitR の論理積をとり (NewAttr & BitR) == BitR で判定する。
- 小問 設問2 f:カ
- 条件②「NewFile及びOldFileの両方にあって最終使用日の値が等しい利用者ID」を判定するため、同一IDであること(strcmp(NewID, OldID) == 0)と、最終使用日文字列が一致すること(strcmp(NewDate, OldDate) == 0)を論理積で結合する。
覚えるポイント
- ファイルの突合せループの継続条件は、未処理データが存在する限り回すためOR(||)を用いる。
- ビット判定では、対象ビットマスクとのAND演算結果がマスク値と一致するかでフラグのONを判定する。
間違えやすいところ
- whileのループ条件でAND(&&)を選び、片方のファイルが先に終わると残りが未処理になるミス。
- strcmpの戻り値の正負(s1 < s2 で負、s1 > s2 で正)の意味を逆に覚えてしまうミス。
出題の前提:平成26年度秋期 基本情報技術者試験 午後 問9(C言語)
出典:IPA『2014年度 秋期 午後』
公式問題冊子 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 / 売上集計 / Zチャート / 配列操作 / 添字参照
2年分(24か月)の売上ファイルを読み込み、月ごとの売上金額を集計してグラフ印字するCOBOLプログラム、およびZチャートを表示するように改修する変更内容に関する次の設問に答えよ。 〔設問1〕プログラム中の空欄 [ a ] ~ [ c ] に入れる正しい答えを、それぞれの解答群の中から選べ。 〔設問2〕表1中の空欄 [ d ] ~ [ f ] に入れる正しい答えを、解答群の中から選べ。
- 設問1 a, b ア
- ADD 1 TO CR-MONTH
- 設問1 a, b イ
- ADD S-AMOUNT TO AMOUNT-MONTH(IX-COL)
- 設問1 a, b ウ
- MOVE 1 TO CR-MONTH
- 設問1 a, b エ
- MOVE S-AMOUNT TO AMOUNT-MONTH(CR-MONTH)
- 設問1 a, b オ
- MOVE S-MM TO CR-MONTH
- 設問1 a, b カ
- MOVE S-MM TO IX-LINE IX-COL
- 設問1 c ア
- PRINT-ELM(IX-COL, IX-LINE)
- 設問1 c イ
- PRINT-ELM(IX-LINE, IX-COL)
- 設問1 c ウ
- PRINT-MK(IX-COL, IX-LINE)
- 設問1 c エ
- PRINT-MK(IX-LINE, IX-COL)
- 設問2 d~f ア
- ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-TOTAL
- 設問2 d~f イ
- ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-YEAR
- 設問2 d~f ウ
- ADD Z-TOTAL TO Z-YEAR
- 設問2 d~f エ
- COMPUTE Z-YEAR = Z-YEAR + AMOUNT-MONTH(IX-AMOUNT) - AMOUNT-MONTH(IX-AMOUNT - 12)
- 設問2 d~f オ
- COMPUTE Z-YEAR = Z-YEAR + Z-TOTAL + AMOUNT-MONTH(IX-COL - 1)
- 設問2 d~f カ
- MOVE AMOUNT-MONTH(IX-COL) TO Z-TOTAL
解答・解説を表示
解答
設問1 a: オ, 設問1 b: イ, 設問1 c: エ, 設問2 d: イ, 設問2 e: ア, 設問2 f: エ
解説
まず要点:COBOLの多次元テーブル(配列)は、外側のOCCURSから順に添字を並べて指定します。Zチャートは月別売上・売上累計・移動年計(過去1年間の売上合計)の3つを重ねて描きます。移動年計は、今月の売上を足し、12か月前の売上を引く差分更新で求めます。
解き方
- 設問1: 月が変わったことを見つけたらキー項目 CR-MONTH を今のレコードの月で更新する文(MOVE S-MM TO CR-MONTH)を選びます。
- 設問1: その月の売上配列の要素に金額を足し、2次元の印字テーブル(行、列)の構造から正しい修飾名と添字の順(IX-LINE, IX-COL)を導きます。
- 設問2: 起点となる最初の12か月分の売上合計をループで前もって計算する文 d を選びます。
- 設問2: 2年目の各月のループで、累計値 Z-TOTAL への加算(文 e)と、移動年計 Z-YEAR を当月足して12か月前を引く更新式(文 f)を導きます。
小問ごとの答え
- 小問 設問1 a:オ
- 売上レコードの月(S-MM)が変わったときの処理であり、現在の月を保持する変数 CR-MONTH に読み込んだレコードの月 S-MM を設定するため、MOVE S-MM TO CR-MONTH とする。
- 小問 設問1 b:イ
- 対象商品の売上金額 S-AMOUNT を、該当する月の集計配列要素に加算するため、ADD S-AMOUNT TO AMOUNT-MONTH(IX-COL) とする。
- 小問 設問1 c:エ
- 集計値に応じた行位置 IX-LINE、月位置 IX-COL に印字記号を設定する。PRINT-TABLE の階層定義は PRINT-LINE(行)の下に PRINT-ELM(列)があり、その項目が PRINT-MK なので、添字順は上位から順に (IX-LINE, IX-COL) となり、PRINT-MK(IX-LINE, IX-COL) となる。
- 小問 設問2 d:イ
- Zチャートの起点となる2013年4月時点における過去1年間の売上合計(2012年4月~2013年3月の12か月分)を初期計算するため、ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-YEAR を12回繰り返す。
- 小問 設問2 e:ア
- 起点(2013年4月)からの売上累計 Z-TOTAL を計算するため、各月の売上金額を加算する ADD AMOUNT-MONTH(IX-AMOUNT) TO Z-TOTAL を実行する。
- 小問 設問2 f:エ
- 各月における過去1年間の売上合計 Z-YEAR は、前月の年間合計に当月の売上を加算し、1年前(12か月前)の同月売上を減算することで求められるため、COMPUTE Z-YEAR = Z-YEAR + AMOUNT-MONTH(IX-AMOUNT) - AMOUNT-MONTH(IX-AMOUNT - 12) とする。
覚えるポイント
- COBOLの多次元テーブルの添字は、外側の集団項目(上位次元)から順に指定する。
- Zチャートの移動年計(過去1年間合計)は、当月値を足して12か月前の値を引くことで逐次更新する。
間違えやすいところ
- 多次元配列の添字の順を、座標の感覚(列, 行)で指定してしまい行・列の順を間違えるミス。
- 移動年計(過去1年合計)の更新で、過去の値を引かずに累計を足してしまうミス。
出題の前提:平成26年度秋期 基本情報技術者試験 午後 問10(COBOL)
出典:IPA『2014年度 秋期 午後』
公式問題冊子 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) / 公式問題冊子 p.58 ↗(www.ipa.go.jp) / 公式問題冊子 p.59 ↗(www.ipa.go.jp)
Javaにおける可変オブジェクトの保護と期間クラスの実装・テスト
ソフトウェア開発 (Java) · 不変クラス / 防御的コピー / クラスリテラル / 単体テスト
期間を表すクラス Period およびそのテストプログラム PeriodTest に関するプログラム1〜2、ならびに可変オブジェクト(java.util.Date)への対策に関する設問1・2に答えよ。
- ア
- 設問1(a〜c): != / 設問1(d, e): IllegalArgumentException / 設問2(f): (Date) start.clone() / 設問2(g): 0
- イ
- 設問1(a〜c): < / 設問1(d, e): IllegalArgumentException.class / 設問2(f): null / 設問2(g): DELTA
- ウ
- 設問1(a〜c): <= / 設問1(d, e): IllegalArgumentException.getClass() / 設問2(f): start.clone() / 設問2(g): DELTA * 2
- エ
- 設問1(a〜c): == / 設問1(d, e): new IllegalArgumentException() / 設問2(f): start.getTime() / 設問2(g): DELTA * 3
- オ
- 設問1(a〜c): > / 設問1(d, e): new NullPointerException() / 設問2(f): start.setTime(start.getTime()) / 設問2(g): DELTA / 2
- カ
- 設問1(a〜c): >= / 設問1(d, e): NullPointerException / 設問2(g): DELTA / 3
- キ
- 設問1(d, e): NullPointerException.class
- ク
- 設問1(d, e): NullPointerException.getClass()
解答・解説を表示
解答
設問1 a: ウ, 設問1 b: オ, 設問1 c: イ, 設問1 d: キ, 設問1 e: イ, 設問2 f: ア, 設問2 g: イ
解説
まず要点:Javaでクラスを不変(イミュータブル)にするには、中身を勝手に変えられないように守る必要があります。フィールドを final にするだけでは足りず、Date のような可変オブジェクトを渡されたときや返すときには、防御的コピー(中身を複製して渡すこと)を行います。これにより、外部から内部状態を直接書き換えられるのを防ぎます。
解き方
- 設問1では、Period クラスの仕様(始点は含み終点は含まない半開区間、遡る場合は終点 < 日時 ≦ 始点)をもとに contains の比較演算子 a, b を決め、例外テストの引数型をクラスリテラルから導きます。
- 設問2では、可変オブジェクトが外へ漏れないよう clone() で複製してキャストして返すこと、修正前後で不変性が保たれているかを確かめるため元の引数と同じ期待値 DELTA を指定することを確認します。
小問ごとの答え
- 小問 設問1 a:ウ
- 過去へ遡る期間(isBackward()がtrue、すなわち終点 < 始点)の場合、期間に含まれる判定は「終点より後かつ始点以下(終点 < time ≦ 始点)」となります。time.compareTo(start) は time が start 以下のとき 0 以下を返すため、条件式は <= 0 となり「ウ」が正解です。
- 小問 設問1 b:オ
- 過去へ遡る期間において、判定対象日時 time は終点より後でなければなりません。time.compareTo(end) は time が end より後のときに正(> 0)となるため、記号は「>」となり「オ」が正解です。
- 小問 設問1 c:イ
- 期間の長さ length は end.getTime() - start.getTime() で計算されます。終点が始点より前のとき length は負となり、かつ isBackward() は true を返します。したがって isBackward() の結果と一致すべき比較条件は length < 0 であるため「イ」が正解です。
- 小問 設問1 d:キ
- testException メソッドの第3引数は Class<? extends RuntimeException> 型を求めています。引数に null が渡された際に発生が期待される例外型は NullPointerException であり、クラスリテラル形式で渡すため「NullPointerException.class」である「キ」が正解です。
- 小問 設問1 e:イ
- エポック(1970年1月1日午前0時)より前の日時は負の値で表現され、このとき仕様により IllegalArgumentException が投げられます。期待されるクラス型をクラスリテラルで指定するため「IllegalArgumentException.class」の「イ」が正解です。
- 小問 設問2 f:ア
- 内部で保持している可変な Date インスタンスの参照をそのまま外部に返すと外部から変更されるリスクがあるため、複製を返して防御します。clone() メソッドの戻り値は Object 型なので (Date) へのキャストが必要であり、「(Date) start.clone()」の「ア」が正解です。
- 小問 設問2 g:イ
- 修正前のテストで period は start(now)と end(now + DELTA)で生成されており、期間の長さは DELTA でした。外部から start や end を改変しても period 内部の状態が守られていることを確認するため、元の設計通り DELTA と比較する「イ」が正解です。
覚えるポイント
- 可変オブジェクトをフィールドに持つ不変クラスでは、コンストラクタおよびゲッターで防御的コピーを行う。
- クラスの Class オブジェクトを参照する際は クラス名.class というクラスリテラルを用いる。
間違えやすいところ
- 時間を遡る場合の判定で、始点を含むので「<=」となるべきところを「<」と間違えてしまう。
- clone() の戻り値が Object 型なので、キャストが必要であることを忘れてしまう。
出題の前提:平成26年度秋期基本情報技術者試験午後問11の問題文・解答例に基づく。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.60 ↗(www.ipa.go.jp) / 公式問題冊子 p.61 ↗(www.ipa.go.jp) / 公式問題冊子 p.62 ↗(www.ipa.go.jp) / 公式問題冊子 p.63 ↗(www.ipa.go.jp) / 公式問題冊子 p.64 ↗(www.ipa.go.jp) / 公式問題冊子 p.65 ↗(www.ipa.go.jp)
バブルソートと数字列・2進化10進数変換のアセンブラ実装
ソフトウェア開発 (アセンブラ) · CASL II / COMET II / バブルソート / 2進化10進数 (BCD)
副プログラム SORT(バブルソートで配列の要素を昇順に並べ替える)および主プログラム MAIN(入力された数字列を2進化10進数に変換してソートし出力する)に関する設問1〜3に答えよ。
- ア
- 設問1 a: JMI CONT / 設問2 c: 1 / 設問3 e: AND GR0,=#000F
- イ
- 設問1 a: JMI LOOP1 / 設問2 c: 2 / 設問3 e: AND GR3,=#000F
- ウ
- 設問1 a: JPL CONT / 設問2 c: 3 / 設問3 e: SLL GR0,4
- エ
- 設問1 a: JPL LOOP1 / 設問1 b: JMI LOOP1 / 設問2 c: 4 / 設問3 e: SLL GR3,4
- オ
- 設問1 a: JZE CONT / 設問2 c: 5 / 設問3 f: SRL GR0,4
- カ
- 設問1 a: JZE LOOP1 / 設問2 c: 6 / 設問3 f: SRL GR3,4
解答・解説を表示
解答
設問1 a: ア, 設問1 b: エ, 設問2 c: カ, 設問2 d: ウ, 設問3 e: イ, 設問3 f: オ
解説
まず要点:バブルソートは隣り合う要素を比べ、順序が逆なら入れ替える整列方法です。要素数nに対して比較回数は n(n-1)/2 回になります。CASL IIでは、各桁4ビットの2進化10進数(BCD:0〜9を4ビットで表す方式)を文字コードに変えるとき、論理積(AND)でビットを取り出し、論理シフト(SRL)を組み合わせて1桁ずつ処理します。
解き方
- 設問1では、CPL命令とフラグレジスタ(SF, ZF)の動きを確かめ、昇順ソートで入れ替えが不要な条件(左 <= 右)での正しい分岐先(CONT)と条件付き分岐命令(JMI)を決めます。
- 設問2では、要素数4のときの総比較回数を計算し、初期データ [2, 4, 1, 3] の各パスで何回入れ替わるかを追いかけて交換回数を求めます。
- 設問3では、2進化10進数を下位の桁から順に文字へ変える処理を追い、下位4ビットを取り出すマスク(AND)と右シフト(SRL)を特定します。
小問ごとの答え
- 小問 設問1 a:ア
- 行番号7で CPL GR5,1,GR4(GR5の値とGR4+1番地の内容を論理比較)を実行しています。昇順ソートでは、GR5の内容が次の要素より小さいまたは等しい(GR5 <= 配列要素)場合は入れ替え不要なので、比較結果が負(GR5 < 配列要素)または等しい場合に次の比較(CONT)へ分岐します。CPLでは (r) < (実効アドレス) のとき SF=1 (負) となるため、負で分岐する JMI CONT の「ア」が正解です。
- 小問 設問1 b:エ
- 外側ループのカウンタ GR2 を 1 減算した直後であり、GR2 が 0 より大きければ外側の繰り返しを継続する必要があります。SUBA実行後の値が正(1以上)であれば分岐するため、JPL LOOP1 の「エ」が正解です。
- 小問 設問2 c:カ
- 要素数 n=4 のバブルソートにおいて、比較命令 CPL の実行回数は (4-1) + (4-2) + (4-3) = 3 + 2 + 1 = 6 回となります。よって「カ」が正解です。
- 小問 設問2 d:ウ
- 初期状態は [2, 4, 1, 3] です。第1パスで [2, 1, 3, 4](入れ替え2回: (4,1), (4,3))、第2パスで [1, 2, 3, 4](入れ替え1回: (2,1))、第3パスで入れ替えなし(0回)となります。したがって入れ替えに伴う行番号11の ST 命令の実行回数は 2 + 1 + 0 = 3 回となり、「ウ」が正解です。
- 小問 設問3 e:イ
- 各桁の数字を出力バッファにセットする処理です。GR3 には GR0 の値がロードされており、下位4ビットを抽出して文字コード(#0030を加算)に変換するため、AND GR3,=#000F を行う「イ」が正解です。
- 小問 設問3 f:オ
- 次の桁の数字を処理するため、元の2進化10進数データ(GR0)を右に4ビット論理シフトして次の4ビットを下位に持ってくる必要があります。したがって SRL GR0,4 の「オ」が正解です。
覚えるポイント
- バブルソートの比較回数は n(n-1)/2 回で固定だが、交換回数はデータの初期並び順に依存する。
- 2進化10進数から1桁ずつ数値を取り出す際は、下位4ビットをマスク(AND #000F)し、右へ4ビット論理シフト(SRL 4)する。
間違えやすいところ
- 昇順ソートのCPL比較で、入れ替えが起きない条件を取り違え、JPLやJMIの分岐判定を逆にしてしまう。
- シフト命令でGR3側をシフトしてしまい、元のデータが入っているGR0をシフトし忘れてしまう。
出題の前提:平成26年度秋期基本情報技術者試験午後問12の問題文・解答例に基づく。
出典:IPA『2014年度 秋期 午後』
公式問題冊子 p.66 ↗(www.ipa.go.jp) / 公式問題冊子 p.67 ↗(www.ipa.go.jp) / 公式問題冊子 p.68 ↗(www.ipa.go.jp) / 公式問題冊子 p.69 ↗(www.ipa.go.jp)
表計算ソフトを用いた鉄道運賃の計算および運賃体系改定マクロ
ソフトウェア開発 · 表計算 / 照合一致関数 / 条件付合計関数 / 相対参照と絶対参照 / マクロ処理
鉄道会社Y社において、乗車駅と降車駅を入力すると駅間の乗車距離および運賃を算出するワークシート、ならびに運賃体系改定に伴って各区間の上限距離を見直すマクロを作成する問題である。提示されたワークシートの仕様、計算式、およびマクロ記述中の空欄 a 〜 g に当てはまる最も適切なものを解答群から選べ。
- a-ア
- 論理積
- a-イ
- 論理和
- b-ア
- 照合一致(A2, A$2〜A$33, 0) < 最小(C$34〜C$35)
- b-イ
- 照合一致(A2, A$2〜A$33, 0) ≦ 最小(C$34〜C$35)
- b-ウ
- 照合一致(A2, A$2〜A$33, 0) > 最小(C$34〜C$35)
- b-エ
- 照合一致(A2, A$2〜A$33, 0) ≧ 最小(C$34〜C$35)
- c-ア
- 照合一致(A2, A$2〜A$33, 0) < 最大(C$34〜C$35)
- c-イ
- 照合一致(A2, A$2〜A$33, 0) ≦ 最大(C$34〜C$35)
- c-ウ
- 照合一致(A2, A$2〜A$33, 0) > 最大(C$34〜C$35)
- c-エ
- 照合一致(A2, A$2〜A$33, 0) ≧ 最大(C$34〜C$35)
- d-ア
- B5
- d-イ
- E5
- d-ウ
- 合計(B$5〜B5)
- d-エ
- 合計(B$5〜B$8)
- d-オ
- 合計(E5〜E$8)
- d-カ
- 合計(E$5〜E5)
- e-ア
- 切上げ(B5, 0) / C5 * D5
- e-イ
- 切上げ(B5 / C5, 0) * D5
- e-ウ
- 切上げ(E5, 0) / C5 * D5
- e-エ
- 切上げ(E5 / C5, 0) * D5
- e-オ
- 切捨て(B5 / C5 + 1, 0) * D5
- e-カ
- 切捨て(E5 / C5 + 1, 0) * D5
- f-ア
- J : 0, J ≦ 4
- f-イ
- J : 1, J ≦ 4
- f-ウ
- J : 0, J ≦ 5
- f-エ
- J : 1, J ≦ 5
- f-オ
- J : 0, J ≦ 31
- f-カ
- J : 1, J ≦ 31
- g-ア
- g1: Dist2, g2: Dist3
- g-イ
- g1: (Dist2 - B5), g2: (Dist3 - B6)
- g-ウ
- g1: (Dist2 - Dist1), g2: (Dist3 - Dist2)
- g-エ
- g1: (Dist2 - B5 + 1), g2: (Dist3 - B6 + 1)
- g-オ
- g1: (Dist2 - Dist1 + 1), g2: (Dist3 - Dist2 + 1)
解答・解説を表示
解答
設問1 a: ア, 設問1 b: エ, 設問1 c: ア, 設問1 d: カ, 設問1 e: エ, 設問2 f: イ, 設問2 g: イ
解説
まず要点:表計算で区間を取り出すときは、開始と終了の大小関係に左右されないよう、最小値・最大値関数と比較演算子を組み合わせ、論理積(AND)で範囲を指定します。区分ごとの計算では、前の区分までの累積合計を、絶対参照と相対参照を組み合わせたセル範囲(例: E$5〜E5)で引くのが基本です。マクロでは、ループの前後の初期化と繰り返し回数をきちんと合わせることが大切です。
解き方
- 乗車駅と降車駅の前後関係を気にせず済むよう、C34とC35の最小値・最大値を求め、自駅が最小値以上かつ最大値未満であることを論理積で判定し、乗車区間の隣接距離を特定します。
- 区分運賃の計算では、各区間の距離を上限値と比べて前区分までの累積距離を引き、単位距離で割って小数以下を切り上げた商に単位運賃を掛ける式を組み立てます。
- マクロでは、5区間の合計距離を求めるループの開始値・終了値を確かめ、新しい上限距離の式で直前区間の上限距離からの増分を切り上げて足す式を導きます。
小問ごとの答え
- 小問 設問1 a:ア
- 乗車区間の判定は、自駅の行位置が乗車駅・降車駅の小さい方の位置以上であり、かつ大きい方の位置より小さいという2つの条件を同時に満たす必要があるため、論理積を用います。
- 小問 設問1 b:エ
- 乗車区間に含まれる駅は、乗車駅と降車駅の位置のうち小さい方の駅を含むため、「照合一致(A2, A$2〜A$33, 0) ≧ 最小(C$34〜C$35)」となります。
- 小問 設問1 c:ア
- 隣接駅間距離は次駅までの距離を表すため、大きい方の駅の位置にある行の距離は含めません。したがって「照合一致(A2, A$2〜A$33, 0) < 最大(C$34〜C$35)」となります。
- 小問 設問1 d:カ
- 区分番号2〜4の区分距離は、その区分の上限距離または乗車距離から、直前までの区分距離の合計を差し引いて求めます。複写に対応させるため「合計(E$5〜E5)」とします。
- 小問 設問1 e:エ
- 区分運賃は「切上げ(区分距離 ÷ 単位距離, 0) × 単位運賃」で計算されるため、対応するセル参照を用いて「切上げ(E5 / C5, 0) * D5」となります。
- 小問 設問2 f:イ
- 5つ離れた駅までの距離(5区間分)を求める際、繰返しの直前ですでに1区間分をSum2に代入しているため、繰返し内では残り4区間を加算します。したがって「J : 1, J ≦ 4」となります。
- 小問 設問2 g:イ
- 新たな上限距離は直前の区分の上限距離に単位距離の倍数を加えた値とするため、基準となる超過距離は「Dist2 - B5」および「Dist3 - B6」となります。
覚えるポイント
- 区間距離の集計では、着駅の隣接駅間距離を含めないため「未満(<)」で終端を指定する。
- 累積控除式では「合計(E$5〜E5)」のように開始行のみ絶対参照にして複写可能にする。
間違えやすいところ
- 乗車区間の終わりを着駅の行まで含めてしまい、1区間分多く距離を合計してしまう。
- マクロのループ回数で、ループの外で足し済みの最初の要素を考えず、繰り返しを1回多く設定してしまう。
出題の前提:平成26年度秋期基本情報技術者試験午後問13問題文および公式解答例
出典:IPA『2014年度 秋期 午後』
公式問題冊子 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) / 公式問題冊子 p.77 ↗(www.ipa.go.jp)
2014年度 秋期 午後
参照した公式資料
IPAが公開した2014年度 秋期 午後の問題・解答資料です。

