旧制度の午前・午後と、2023年度以降の科目A・科目Bの公開問題を区別しています。現在の試験対策では現行シラバスと科目Bの形式を確認してください。公開問題は本試験の全出題を網羅する資料ではありません。
2008年度 春期 午後の概要
ハードディスク装置のアクセス時間とディスクキャッシュ
コンピュータシステム · ハードディスク装置 / アクセス時間 / 回転待ち時間 / ディスクキャッシュ / ヒット率
製品Aと製品Bの仕様(記憶容量、回転数、平均位置決め時間、データ転送速度)に基づく平均アクセス時間の比較計算、およびディスクキャッシュを搭載した製品Cにおける平均アクセス時間の計算に関する問題である。各空欄[ a ]〜[ d ]に入る数値を求めよ。なお、1Gバイト=1,000Mバイト、1Mバイト=1,000kバイトとし、解答は小数第2位以下を切り捨てるものとする。 【製品A・製品Bの仕様】 ・製品A:回転数 4,200回/分、平均位置決め時間 14.0ミリ秒、データ転送速度 20Mバイト/秒 ・製品B:回転数 5,400回/分、平均位置決め時間 12.0ミリ秒、データ転送速度 30Mバイト/秒 【設問1】 製品Aでは、平均回転待ち時間は[ a ]ミリ秒であり、100kバイトのデータを転送する時間は[ b ]ミリ秒である。一方、製品Bでは、平均回転待ち時間が5.5ミリ秒であり、100kバイトのデータを転送する時間が3.3ミリ秒であることから、100kバイトの平均アクセス時間は、製品Aに比べて[ c ]ミリ秒短い。 【設問2】 読取り時のアクセス時間を短縮するため、ディスクキャッシュを搭載した製品Cを開発した。ディスクキャッシュへの書込みと読取りは2kバイトのブロック単位で行う。ディスクキャッシュを検索する平均時間は1.0ミリ秒、ディスクキャッシュの平均ヒット率は0.4、ディスクキャッシュからの1ブロック当たりのデータの平均読取り時間は0.4ミリ秒とする。ディスクキャッシュがヒットしなかったとき、磁気ディスクからの1ブロック当たりのデータの平均読取り時間は、ディスクキャッシュ上の最も古いブロックのデータと交換する時間も含めて17.0ミリ秒とする。このとき、製品Cの1ブロック当たりの読取り時の平均アクセス時間は[ d ]ミリ秒となる。
- ア
- 設問1: 3.3 / 設問2: 7.0
- イ
- 設問1: 5.0 / 設問2: 8.0
- ウ
- 設問1: 5.3 / 設問2: 10.3
- エ
- 設問1: 5.5 / 設問2: 11.3
- オ
- 設問1: 7.1 / 設問2: 13.2
- カ
- 設問1: 11.1 / 設問2: 14.2
- キ
- 設問1: 14.2
解答・解説を表示
解答
設問1: a-オ, b-イ, c-ウ; 設問2: d-エ
解説
まず要点:ハードディスクの平均アクセス時間は「平均位置決め時間(シーク時間)+平均回転待ち時間+データ転送時間」を足して求めます。平均回転待ち時間はディスクが半回転するのにかかる時間です。ディスクキャッシュがあるときは、必ずかかるキャッシュ検索時間に、ヒットした場合とミスした場合の加重平均を足して計算します。
解き方
- 製品Aの1回転にかかる時間を求め、その半分を計算して小数第2位以下を切り捨て、平均回転待ち時間aを出します。
- 製品Aの転送速度(20Mバイト/秒=20,000kバイト/秒)から、100kバイトの転送時間bをミリ秒で求めます。
- 製品Aと製品Bの平均アクセス時間をそれぞれ合計し、その差cを計算します。
- 製品Cについて、キャッシュ検索時間1.0ms、ヒット時0.4ms(確率0.4)、ミス時17.0ms(確率0.6)から加重平均のアクセス時間dを求め、小数第2位以下を切り捨てます。
小問ごとの答え
- 小問 設問1 a:オ
- 製品Aの回転数は毎分4,200回転であるため、1回転にかかる時間は (60秒 / 4,200) × 1,000 ≒ 14.285ミリ秒です。平均回転待ち時間は半回転分なので、14.285 / 2 ≒ 7.142ミリ秒となります。小数第2位以下を切り捨てると 7.1ミリ秒(選択肢オ)となります。
- 小問 設問1 b:イ
- 製品Aの転送速度は20Mバイト/秒(=20,000kバイト/秒)です。100kバイトのデータを転送する時間は、100kバイト / 20,000kバイト/秒 = 0.005秒 = 5.0ミリ秒(選択肢イ)となります。
- 小問 設問1 c:ウ
- 製品Aの平均アクセス時間は、位置決め時間14.0ミリ秒 + 回転待ち時間7.1ミリ秒 + 転送時間5.0ミリ秒 = 26.1ミリ秒です。一方、製品Bの平均アクセス時間は、12.0ミリ秒 + 5.5ミリ秒 + 3.3ミリ秒 = 20.8ミリ秒です。製品Aと製品Bの差は 26.1 - 20.8 = 5.3ミリ秒(選択肢ウ)短くなります。
- 小問 設問2 d:エ
- 製品Cの平均アクセス時間は、キャッシュ検索時間 + ヒット率 × キャッシュ読取り時間 + (1 - ヒット率) × 磁気ディスク読取り時間 で求められます。1.0 + 0.4 × 0.4 + (1 - 0.4) × 17.0 = 1.0 + 0.16 + 0.6 × 17.0 = 1.0 + 0.16 + 10.2 = 11.36ミリ秒となります。小数第2位以下を切り捨てると 11.3ミリ秒(選択肢エ)となります。
覚えるポイント
- 平均回転待ち時間は「1回転の時間 ÷ 2」で算出する。
- キャッシュ利用時のアクセス時間は、検索時間 + ヒット率×ヒット時時間 + (1-ヒット率)×ミス時時間 で求める。
間違えやすいところ
- 平均回転待ち時間のところで、1回転の時間そのものを答えてしまう間違い。
- 単位換算で 1Mバイト=1,000kバイト を 1,024kバイト と混同して計算してしまう誤り(本問では注記で1,000kバイトと指定)。
- キャッシュ検索時間(1.0ミリ秒)を、ヒット時やミス時とは別に足すのを忘れてしまう間違い。
出題の前提:問題文中の注記および仕様(1Gバイト=1,000Mバイト、1Mバイト=1,000kバイト、小数第2位以下切り捨て)。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.4 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.5 ↗(cdn.fe-siken.com)
文字列探索アルゴリズムの終了条件とポインタ更新
ソフトウェア · 文字列探索 / 擬似言語 / ループ終了条件 / ポインタ操作
長さがTextlenの文字列SourceTextの中で、長さがPatlenの文字列Patternと一致する部分文字列の出現回数を数える関数MatchCounterに関する問題である。 【擬似言語プログラムの処理概要】 ・SourceTextの比較開始位置iを先頭(添字0)から順に1文字ずつ後ろにずらしながら、長さPatlenの文字列とPatternが一致するかを判定する。 ・外側の繰返し条件(空欄[ a ])では、SourceTextの末尾を超えて比較しないように制御する。 ・内側の繰返しでは、k < Patlen かつ Matchflg = true の間、Pattern[k] と SourceTextの対応する位置の文字(空欄[ b ])を比較する。 【設問1】 プログラム中の空欄[ a ]、[ b ]に入れる正しい答えを選択肢から選べ。 【設問2】 Patternと一致した部分文字列は以降の検索対象から外すように、プログラムのα部分(一致判定および開始位置iの更新処理)を変更する。変更内容として正しい答えを選択肢から選べ。
- ア
- 設問1 a: i + Patlen ≦ Textlen / 設問1 b: SourceText[i] = Pattern[k] / 設問2: 常に i ← i + Patlen とする処理
- イ
- 設問1 a: i + Patlen < Textlen / 設問1 b: SourceText[j] = Pattern[k] / 設問2: 一致時に i ← i + Patlen とし、外側ループで追加更新なしとする処理
- ウ
- 設問1 a: i + Textlen ≦ Patlen / 設問1 b: SourceText[k] = Pattern[i] / 設問2: 一致時に i ← i + Patlen、不一致時に i ← i + 1 とする処理(正解)
- エ
- 設問1 a: i + Textlen < Patlen / 設問1 b: SourceText[k] = Pattern[j] / 設問2: 一致時に i ← i + 1、不一致時に i ← i + Patlen とする処理
解答・解説を表示
解答
設問1: a-ア, b-イ; 設問2: ウ
解説
まず要点:文字列探索(力まかせ法)では、テキストの開始位置iからパターンと同じ長さPatlen分を、先頭から1文字ずつ比べます。比べ始められる一番後ろの位置は「テキスト長-パターン長」です。一度見つけた部分を重複して数えない場合は、一致したときはパターンの長さ分、一致しなかったときは1文字だけ、開始位置を進めます。
解き方
- 開始位置iから長さPatlenの文字列を取り出すときの末尾の添字が、SourceTextの末尾の添字(Textlen - 1)を超えない条件式を整理し、空欄aを導きます。
- 内側のループで使う走査用の添字jとkの役割から、比べる配列の組み合わせを特定し、空欄bを導きます。
- 一致した部分文字列を以降の対象から外す例('gxg'が見つかったら次は一致した末尾の次から比べる)をたどり、一致時と不一致時でiに足す値(Patlenまたは1)の分岐を選択肢から選びます。
小問ごとの答え
- 小問 設問1 a:ア
- SourceTextの添字は0からTextlen - 1までです。比較開始位置iから長さPatlenの部分文字列を比較する場合、比較する最後の文字の添字は i + Patlen - 1 です。これが末尾添字 Textlen - 1 以下である必要があるため、i + Patlen - 1 ≦ Textlen - 1、すなわち i + Patlen ≦ Textlen(選択肢ア)となります。
- 小問 設問1 b:イ
- 内側のループでは、比較開始位置iを初期値とする変数jを1文字ずつインクリメント(j ← j + 1)しながら、Patternのk番目の文字(Pattern[k])と比較します。したがって、比較すべき条件は SourceText[j] = Pattern[k](選択肢イ)となります。
- 小問 設問2:ウ
- Patternと一致した場合(k = Patlenのとき)は、その部分文字列をスキップするために比較開始位置を i ← i + Patlen と更新する必要があります。一方、一致しなかった場合は次の1文字から再開するため i ← i + 1 と更新する必要があります。したがって、分岐で k = Patlen のときは Counter を加算して i ← i + Patlen を行い、そうでなければ i ← i + 1 を行う「選択肢ウ」が正しい処理です。
覚えるポイント
- 配列の添字が0始まりの場合、長さLの文字列の末尾添字は開始位置iに対して i + L - 1 となる。
- 一致部分文字列の重複を許さない場合、一致時はパターン長分ポインタを進め、不一致時は1進める。
間違えやすいところ
- 空欄aで不等号を「<」にしてしまい、最後の1回分を比べずにループを抜けてしまう誤り。
- 空欄bで、固定の開始位置であるiと変わるkを比べて(SourceText[i] = Pattern[k])しまう間違い。
- 設問2で、一致時も不一致時も外側のループで共通に i ← i + 1 が実行され、一致時に意図せず i + Patlen + 1 進んでしまうような構造を選んでしまう間違い。
出題の前提:問題文中のプログラム仕様および図・表に記載されたアルゴリズム記述。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.6 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.7 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.8 ↗(cdn.fe-siken.com)
データファイルのバックアップ方式と復旧時間
システム運用・保守 · バックアップ / 差分バックアップ / 増分バックアップ / リストア時間
Y社における業務系システムのデータバックアップに関する問題である。全データ容量は18Gバイト(月〜土の曜日ファイル群各曜日分と共通ファイル0.6Gバイト)であり、月曜〜土曜の営業日には共通ファイル全体(0.6Gバイト)と各曜日の曜日ファイル群の一部(0.6Gバイト)の計1.2Gバイトが更新される。日曜日にフルバックアップを実施し、平日には方式A(日曜フルバックアップ以降の全更新データを保存する差分方式)または方式B(前日バックアップ以降の更新データのみを保存する増分方式)を実施する。転送速度は2Mバイト/秒(1Gバイト=1,000Mバイト)である。バックアップ所要時間および障害復旧時間に関する設問に答えよ。
- ア
- 設問1: 5 / 設問2(c,d): 1 / 設問2(e): 38
- イ
- 設問1: 10 / 設問2(c,d): 2 / 設問2(e): 183
- ウ
- 設問1: 30 / 設問2(c,d): 6 / 設問2(e): 185
- エ
- 設問1: 35 / 設問2(c,d): 7 / 設問2(e): 188
- オ
- 設問1: 145 / 設問2(c,d): 8 / 設問2(e): 193
- カ
- 設問1: 150
解答・解説を表示
解答
設問1: a-エ, b-イ; 設問2: c-イ, d-エ, e-エ
解説
まず要点:差分バックアップ(方式A)は、直近のフルバックアップ以降に変わったデータを毎回すべて保存します。復旧はフルと最新の差分の2本で済みますが、日が経つほど時間がかかります。増分バックアップ(方式B)は前回のバックアップ以降の変更分だけを保存するので、日々の時間は短く一定ですが、復旧にはフルと障害前までのすべての増分媒体が必要です。
解き方
- 日々更新されるデータ量を整理し、共通ファイル(0.6Gバイト・同じファイルに上書き)と曜日別ファイル(月〜土で各0.6Gバイトが独立)の積み上がり方を把握します。
- 方式A(差分)と方式B(増分)の定義にしたがって、各曜日のバックアップデータ量から転送速度2Mバイト/秒で時間を計算します。
- 障害が起きたときの復旧手順を整理し、必要なテープ本数、それぞれの復元時間とテープ交換時間を合計して最大復旧時間を求めます。
小問ごとの答え
- 小問 設問1 a:エ
- 方式A(差分バックアップ)で最もデータ量が累積するのは土曜日です。共通ファイル全体0.6Gバイト(毎日上書き)に加え、月曜から土曜までの各曜日ファイル群の更新0.6Gバイト×6日=3.6Gバイトの合計4.2Gバイト(4,200Mバイト)を保存します。転送速度は2Mバイト/秒なので、4,200÷2=2,100秒=35分となります。
- 小問 設問1 b:イ
- 方式B(増分バックアップ)では、前日以降に更新されたデータのみを保存します。毎営業日に更新されるデータ量は共通ファイル0.6Gバイト+各曜日のファイル0.6Gバイト=1.2Gバイト(1,200Mバイト)で一定です。したがって所要時間は1,200÷2=600秒=10分となります。
- 小問 設問2 c:イ
- 方式A(差分方式)での復旧には、直近の日曜日に取得したフルバックアップ磁気テープ1本と、障害直前の最新の差分バックアップ磁気テープ1本の計2本が必要となります。
- 小問 設問2 d:エ
- 方式B(増分方式)での復旧には、日曜日のフルバックアップテープ1本に加え、月曜日から土曜日までの日々の増分バックアップテープがすべて必要となるため、最大で1+6=7本となります。
- 小問 設問2 e:エ
- 方式Aを採用して最長となるのは、土曜日のバックアップ完了後に障害が発生した場合です。フルバックアップ18Gバイトの復旧に18,000÷2=9,000秒(150分)、テープ交換に3分、土曜差分バックアップ4.2Gバイトの復旧に4,200÷2=2,100秒(35分)を要するため、合計復旧時間は150+3+35=188分となります。
覚えるポイント
- 差分バックアップの復旧に必要な媒体は「フル+最新の差分1本」の計2本である。
- 増分バックアップの復旧に必要な媒体は「フル+障害発生までの全増分」である。
間違えやすいところ
- 毎営業日更新される共通ファイル(0.6Gバイト)は同じ場所への上書きなので、累積の差分計算で毎日足してしまわないよう注意します。
- テープ交換時間は最初と最後にはかからないため、2本使うときの交換回数が1回(3分)になるのを見落としやすいです。
出題の前提:平成20年度春期基本情報技術者試験午後問3
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.9 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.10 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.11 ↗(cdn.fe-siken.com)
自己組織化探索リストの作成とポインタ操作
アルゴリズム・データ構造 · 線形リスト / 自己組織化探索 / ポインタのつなぎ替え / トレース
配列を用いた単方向リストにおいて、リストを生成する副プログラムMakeListと、探索された要素を先頭に移動させる自己組織化探索関数OrganizingSearchの動作に関する問題である。MakeListおよびOrganizingSearchの空欄a〜dを埋めるとともに、特定の順序で文字列を探索した際のポインタ追跡変数Tempの遷移をトレースせよ。
- ア
- 設問1 a: First / 設問1 b〜d: Current / 設問2: cgi, cpu, usb
- イ
- 設問1 a: First + 1 / 設問1 b〜d: First / 設問2: usb, cgi, cpu
- ウ
- 設問1 a: First - 1 / 設問1 b〜d: List[Current].Next / 設問2: usb, cgi, usb, cgi, cpu, usb, cgi, cpu, dos
- エ
- 設問1 a: Listsize / 設問1 b〜d: List[First].Next / 設問2: usb, cgi, usb, cpu, cgi
- オ
- 設問1 a: Listsize + 1 / 設問1 b〜d: List[Temp].Next / 設問2: usb, cgi, usb, cpu, cgi, usb
- カ
- 設問1 a: Listsize - 1 / 設問1 b〜d: Temp / 設問2: usb, usb, cgi, usb, cgi, cpu
解答・解説を表示
解答
設問1: a-エ, b-オ, c-イ, d-ア; 設問2: オ
解説
まず要点:単方向リストでノードを先頭へ移すには、3段階でポインタを付け替えます。①対象ノードの1つ前のノードのポインタを、対象ノードの次のノードへつなぎます。②対象ノードのポインタを、今の先頭ノードへつなぎます。③先頭ポインタを対象ノードへ更新します。
解き方
- 配列でリストを表すとき、各ノードのNextに入る値が配列の添字であることを確認します。
- リスト末尾への追加処理(MakeList)で、1つ前のノードのNextを更新する式(a)を導きます。
- リスト内のノードを先頭へ移すポインタの付け替え手順を順に整理し、b、c、dを特定します。
- 設問2の探索順序('cgi'→'cpu'→'dos')にしたがってリストの状態の移り変わりを書き出し、行αでTempに退避される要素の値を探索ごとに記録します。
小問ごとの答え
- 小問 設問1 a:エ
- MakeListでは、既に要素がある場合(Listsize ≠ 0)、直前の末尾要素であるList[Listsize - 1]のNextポインタに、これから新規追加する要素の添字Listsizeを設定します。したがって空欄aにはListsizeが入ります。
- 小問 設問1 b:オ
- 見つかった要素Currentを先頭へ移動させる際、直前の要素Tempの後続ポインタをつなぎ替えるため、List[Temp].NextにCurrentの次の要素であるList[Current].Nextを代入します。したがって空欄bはList[Temp].Nextです。
- 小問 設問1 c:イ
- Currentを新たな先頭にするため、CurrentのNextポインタを従来の先頭要素を指すFirstに更新します。したがって空欄cにはFirstが入ります。
- 小問 設問1 d:ア
- リスト全体の先頭ポインタFirstを、新しく先頭となった要素の添字Currentに更新します。したがって空欄dにはCurrentが入ります。
- 小問 設問2:オ
- 各探索において行α(Temp←Current)が実行された直後のList[Temp].Valueを記録します。'cgi'探索時は先頭'usb'のみ不一致で実行され[usb]。リストはcgi→usb→cpu→dos→fatとなります。次に'cpu'探索時は'cgi'と'usb'で不一致となり[cgi, usb]が実行。リストはcpu→cgi→usb→dos→fatとなります。最後に'dos'探索時は'cpu','cgi','usb'で不一致となり[cpu, cgi, usb]が実行されます。順に並べると'usb, cgi, usb, cpu, cgi, usb'となり、オが正解です。
覚えるポイント
- 自己組織化探索(先頭移動法)では、アクセスされたノードをリスト先頭へ移動させることで、頻出要素へのアクセスを高速化する。
- 単方向リストからノードを切り離すには「直前のノード」の参照を保持しておく必要がある。
間違えやすいところ
- 要素を先頭に移したあと、リスト全体の並びが変わることを見落とし、2回目以降の探索を最初のリストのままたどってしまう間違いが多いです。
- 行α(Temp←Current)は、対象ノードと一致した(探索が当たった)ときには実行されずループを抜ける点に注意します。
出題の前提:平成20年度春期基本情報技術者試験午後問4
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.12 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.13 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.14 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.15 ↗(cdn.fe-siken.com)
販売構成一覧作成プログラムの設計とバッチ処理フロー
ソフトウェア設計 · バッチ処理 / データフロー / コントロールブレーク / 整列
小売企業A社における販売構成一覧作成プログラムの設計に関する問題である。集計期間・集計種別(商品カテゴリ又はメーカ)を指定し、販売ファイルと商品ファイルから中間ファイルを生成して集計・順位付け・構成比率の算出を行うフロー図(図5、図6)の空欄 a〜g に当てはまる適切な語句を選択せよ。
- 設問1 ア
- 集計開始日付,集計終了日付
- 設問1 イ
- 集計開始日付,集計終了日付,構成比率
- 設問1 ウ
- 集計開始日付,集計終了日付,集計種別
- 設問1 エ
- 集計開始日付,集計終了日付,順位
- 設問2 a ウ
- 集計項目
- 設問2 b ア
- 合計した販売金額
- 設問3 c エ
- 中間ファイルBの様式への変換
- 設問3 d ウ
- 集計種別 = “店舗”
- 設問4 e ウ
- 順位の付与
- 設問4 f ア
- 構成比率の算出
- 設問4 g ア
- 構成比率の算出
解答・解説を表示
解答
設問1: ウ; 設問2: a-ウ, b-ア; 設問3: c-エ, d-ウ; 設問4: e-ウ, f-ア, g-ア
解説
まず要点:バッチ処理の設計では、あとの集約処理や順位付けが正しく動くように、適切なキーでソート(整列)を前もって置きます。また、不要な外部参照(マスターとの突合せ)は通さずに処理を飛ばし、効率を上げるのが基本です。
解き方
- 業務の要件と入出力の仕様から、利用者が指定すべき入力パラメータ(集計期間、集計種別)を特定します。
- 処理フロー内の各集約・整列のステップで、集計の単位となるキー項目と、順位付けの基準となる金額項目を特定します。
- 追加仕様(店舗別集計)で、販売トランザクション自体が持つ属性を活かして突合せ処理を飛ばす条件分岐を設計します。
- 表示の絞り込み要件(上位10位、比率5%以上)と多重キーソートの要件の追加位置を、フローの依存関係から論理的に決めます。
小問ごとの答え
- 小問 設問1:ウ
- 問題文(4)に『利用者は,販売データの集計期間を指定する』『集計種別として商品カテゴリ又はメーカのどちらかを指定する』とあり、集計開始日付・集計終了日付・集計種別の3つが必要です。
- 小問 設問2 a:ウ
- 中間ファイルBから集計項目ごとの合計を求めるため、整列2では集計項目をキーとして昇順ソートを行います。
- 小問 設問2 b:ア
- 問題文(5)⑤に『集計項目ごとに合計した販売金額の高い順に順位を付ける』とあるため、整列3のキーは合計した販売金額の降順となります。
- 小問 設問3 c:エ
- 販売データには既に店舗コードが含まれているため商品ファイルとの突合せは不要であり、店舗コードを集計項目とした中間ファイルBの様式へ直接変換します。
- 小問 設問3 d:ウ
- 集計種別が店舗の場合は商品ファイル突合せ処理をバイパスするため、分岐条件は『集計種別 = “店舗”』となります。
- 小問 設問4 e:ウ
- 順位が10位までのデータだけを出力するためには、順位を判定・付与する『順位の付与』処理で10位以下を抽出して中間ファイルEに出力するのが最も効率的です。
- 小問 設問4 f:ア
- 構成比率が5%以上のレコードのみを出力するためには、構成比率を計算・判定する『構成比率の算出』処理で5%以上のレコードのみを出力するのが適切です。
- 小問 設問4 g:ア
- 順位が同じデータを販売数降順で並べ替える整列4は、順位が付与された後かつ最終帳票を出力する前、すなわち『構成比率の算出』の直前に追加します。
覚えるポイント
- コントロールブレーク集計の前には必ず集約キーでの整列が必要となる。
- 不要なマスタ突合せはデータフロー上で分岐させて回避することで処理効率を向上させる。
間違えやすいところ
- 順位や構成比率のように、プログラムの計算結果として出る項目を、利用者が入力する項目と混同すること。
- 絞り込み条件の追加位置を早すぎたり遅すぎたりして、まだ計算されていない項目で判定しようとすること。
出題の前提:平成20年度春期 基本情報技術者試験 午後 問5
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.16 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.17 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.18 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.19 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.20 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.21 ↗(cdn.fe-siken.com)
C言語による文書中の参考資料名の参照番号化と一覧出力プログラム
プログラミング · C言語 / 文字列処理 / ファイル入出力 / 線形探索
文書ファイルから参考資料名(バックスラッシュ記号で囲まれた文字列)を抽出し、初出順に1から始まる参照番号 [n] へ置換するとともに、文書末尾に参考文献一覧を追加出力するC言語プログラムの空欄 a〜d に当てはまる適切なコードを選択せよ。
- a エ
- ch != MARK
- b イ
- ref_name[i]
- c エ
- i >= ref_num
- d ア
- i + 1
解答・解説を表示
解答
a-エ, b-イ, c-エ, d-ア
解説
まず要点:C言語の文字列はナル終端文字列なので、1文字ずつバッファに入れたあと、末尾に必ず'\0'を書く必要があります。まだ登録されていないデータかどうかは、線形探索のループが終わったときのカウンタが要素数に達したか(i >= ref_num)で判定します。
解き方
- 1文字読み込むループで、区切り文字(MARK)か普通の文字かを判定し、普通の文字をそのまま出力する条件式(空欄a)を特定します。
- 区切り文字を見つけたあとの参考資料名の読み込みで、文字列の末尾にナル文字を入れる配列要素の指定(空欄b)を決めます。
- 登録済みの表を探索するループが終わったあと、その文字列が未登録である(breakされずに最後まで着いた)ことを示す判定条件(空欄c)を導きます。
- 0から始まる添字を1から始まる参照番号に変換して書式出力する式(空欄d)を特定します。
小問ごとの答え
- 小問 a:エ
- 囲み文字MARK('\\')以外の通常文字である場合はそのまま出力ファイルに書き出すため、条件は ch != MARK となります。
- 小問 b:イ
- MARKまで読み込んだ参考資料名文字列の終端にナル文字'\0'を付加するため、forループ終了時のインデックスを用いて ref_name[i] = '\0'; とします。
- 小問 c:エ
- 既存の ref_name_tbl 内を探索し、一致が見つからずにループが終了した場合(i >= ref_num)に新規登録処理を実行します。
- 小問 d:ア
- 参照番号は1から始まる番号として出力するため、テーブルの0始まりのインデックス i に対し i + 1 を出力します。
覚えるポイント
- C言語で文字列を組み立てる際は、ループ直後に末尾ナル文字'\0'の付加が必須である。
- 探索ループでbreakされなかったかの判定には、ループカウンタが終端値(上限サイズ)以上になったかの比較を用いる。
間違えやすいところ
- 空欄cで、一致してbreakされた場合と、探索に失敗してループが終わった場合のカウンタ値iの条件を逆に捉えてしまうこと。
- 空欄dで、登録済み件数ref_numと今の要素番号iを混同してref_num + 1を出力してしまうこと。
出題の前提:平成20年度春期 基本情報技術者試験 午後 問6
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.22 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.23 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.24 ↗(cdn.fe-siken.com)
アンケート結果の集計処理を行うCOBOLプログラム
プログラミング · COBOL / 表操作 / 条件分岐 / 集計処理
工場のイベント参加者が提出したアンケート結果を集計するCOBOLプログラムである。アンケート結果ファイルは順ファイルで、従業員番号と5つのイベントに対する回答(楽しかったイベントは1、それ以外は0)が記録されている。楽しかったイベントが2つ以下のレコードを有効回答とし、各イベントの選択回数を集計する。3つ以上選択された場合は無効票として集計から除外する。設問1では有効票の判定および集計を行う空欄a・bを埋め、設問2では無効票数(INV-CNT)をカウントして出力するための追加コードと挿入位置を示す空欄c・dを埋める。
- a-ア
- COMPUTE CHOICE-CNT = CHOICE-CNT + EVENT(WK-CNT)
- a-イ
- COMPUTE CHOICE-CNT = CHOICE-CNT + EVENT-TOTAL(WK-CNT)
- a-ウ
- COMPUTE EVENT-TOTAL(WK-CNT) = EVENT-TOTAL(WK-CNT) + CHOICE-CNT
- a-エ
- COMPUTE EVENT-TOTAL(WK-CNT) = EVENT-TOTAL(WK-CNT) + EVENT(WK-CNT)
- a-オ
- MOVE EVENT(WK-CNT) TO CHOICE-CNT
- a-カ
- MOVE EVENT(WK-CNT) TO EVENT-TOTAL(WK-CNT)
- b-ア
- COMPUTE CHOICE-CNT = CHOICE-CNT + EVENT(WK-CNT)
- b-イ
- COMPUTE CHOICE-CNT = CHOICE-CNT + EVENT-TOTAL(WK-CNT)
- b-ウ
- COMPUTE EVENT-TOTAL(WK-CNT) = EVENT-TOTAL(WK-CNT) + CHOICE-CNT
- b-エ
- COMPUTE EVENT-TOTAL(WK-CNT) = EVENT-TOTAL(WK-CNT) + EVENT(WK-CNT)
- b-オ
- MOVE EVENT(WK-CNT) TO CHOICE-CNT
- b-カ
- MOVE EVENT(WK-CNT) TO EVENT-TOTAL(WK-CNT)
- c-ア
- ADD 1 TO INV-CNT
- c-イ
- MOVE CHOICE-CNT TO INV-CNT
- c-ウ
- MOVE EVENT-TOTAL(WK-CNT) TO INV-CNT
- c-エ
- MOVE WK-CNT TO INV-CNT
- d-ア
- 行番号32と33の間
- d-イ
- 行番号36と37の間
- d-ウ
- 行番号41と42の間
- d-エ
- 行番号45の次
解答・解説を表示
解答
設問1: a-ア, b-エ; 設問2: c-ア, d-エ
解説
まず要点:アンケート集計では、まず1件ずつ条件を満たすか(選んだ数が2個以内か)を調べ、条件を満たしたものだけを全体の集計表へ足し込みます。無効票は別に数えておき、すべての集計結果を表示し終えたあとにその件数を出力します。
解き方
- 1レコード読み込むたびにCNT-PROCを呼び出し、PERFORMループで5つのイベントの選択数(1の個数)をCHOICE-CNTに合計します。
- CHOICE-CNTが2以下の有効なデータなら、もう一度ループを回して各イベントの累計用配列EVENT-TOTALに足します。
- 3つ以上選ばれた無効なデータは、ELSE節で無効票カウンタINV-CNTに1を足します。
- PRT-PROCで5項目すべての集計結果を出した直後(行番号45の次)に、無効票数を表示するDISPLAY文を置きます。
小問ごとの答え
- 小問 設問1 a:ア
- 空欄aは1レコード中の選択イベント数を算出する処理であり、各項目の値(0または1)を作業変数CHOICE-CNTに順次加算するアが正しいです。
- 小問 設問1 b:エ
- 空欄bはCHOICE-CNTが2以下の有効回答について、各イベントの総選択数配列EVENT-TOTALに該当項目の回答値(0または1)を加算するため、エが正しいです。
- 小問 設問2 c:ア
- 空欄cはIF CHOICE-CNT <= 2 THENのELSE節であり、無効票の総数INV-CNTを1カウントアップするためADD 1 TO INV-CNTとするアが正解です。
- 小問 設問2 d:エ
- 無効データ数はすべてのイベントの集計結果の表示が終わった後に出力するため、表示ループの終了である行番号45の直後に追加するエが正解です。
覚えるポイント
- COBOLのPERFORM VARYINGは指定範囲の反復処理を行う構文です。
- 集計処理では、各レコード内の条件精査と全体累計の更新処理を明確に分離して記述します。
間違えやすいところ
- 空欄aとbで足す対象の変数を混同しないよう、作業用カウンタと累計用配列を区別する必要があります。
- 無効票の表示をレコードごとの処理ブロックの中に置いてしまう誤りに注意が必要です。
出題の前提:平成20年度春期 基本情報技術者試験 午後問題 問7
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.25 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.26 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.27 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.28 ↗(cdn.fe-siken.com)
Stateパターンによる電気ポットの状態遷移Javaプログラム
プログラミング · Java / Stateパターン / 例外処理 / クラスの継承
電気ポットの状態遷移(休止状態Idleと加熱中状態Heating)を表現したJavaプログラムである。State抽象クラスとその具象サブクラスIdle、Heatingを用いて状態ごとの振る舞いを定義している。ElectricPotクラスは現在の状態(currentState)と水量(content)を保持し、沸騰ボタン押下(heat)時は水があれば加熱中に遷移し、水がなければ例外を投げて警告を表示する。沸騰完了(boiled)時は休止状態に戻る。プログラム中の空欄a〜dに入る適切なコードを選択する。
- a-ア
- isEmpty()
- a-イ
- !isEmpty()
- a-ウ
- pot.isEmpty()
- a-エ
- !pot.isEmpty()
- a-オ
- pot == null
- a-カ
- pot != null
- b-ア
- return "No Water!"
- b-イ
- System.out.println("No Water!")
- b-ウ
- throw "No Water!"
- b-エ
- throw new Exception("No Water!")
- c-ア
- extends Exception
- c-イ
- extends Object
- c-ウ
- extends State
- c-エ
- implements Exception
- c-オ
- implements Object
- c-カ
- implements State
- d-ア
- currentState
- d-イ
- State
- d-ウ
- super
- d-エ
- this
解答・解説を表示
解答
a-ウ, b-エ, c-ウ, d-ア
解説
まず要点:Stateパターンでは、状態によって変わる動きを、状態を表すクラスたちに任せます。文脈となるクラス(ElectricPot)は状態オブジェクト(currentState)への参照を持ち、操作の呼び出しをその状態オブジェクトへ委譲します。これで状態が変わったときの動きの違いを表せます。
解き方
- Stateクラスのheat(ElectricPot pot)メソッドで、引数potの水の量が空かをpot.isEmpty()で判定します(空欄a)。
- 水がないときは例外を投げる必要があり、mainメソッドのcatchブロックでe.getMessage()を出力しているので、throw new Exception("No Water!")を実行します(空欄b)。
- IdleクラスとHeatingクラスは抽象クラスStateのサブクラスとして定義するため、extends Stateで継承します(空欄c)。
- ElectricPotのheat()やboiled()では、現在の状態を持つフィールドcurrentStateのメソッドを呼び出して処理を任せます(空欄d)。
小問ごとの答え
- 小問 a:ウ
- heatメソッド内で引数として渡されたpotインスタンスに水が入っているかを判定するため、pot.isEmpty()とするウが正解です。
- 小問 b:エ
- 水がない場合は例外を投げ、呼び出し元でe.getMessage()として文字列を取得するため、throw new Exception("No Water!")とするエが正解です。
- 小問 c:ウ
- Idle及びHeatingは抽象クラスStateを継承したサブクラスであるため、クラス定義の後ろにはextends Stateを記述するウが正解です。
- 小問 d:ア
- ElectricPotのheatおよびboiledメソッドでは、現在の状態オブジェクトcurrentStateへ処理を委譲するためアが正解です。
覚えるポイント
- クラスの継承にはextends、インタフェースの実装にはimplementsを使用します。
- 例外を発生させるにはthrow new Exception(...)のようにThrowableのインスタンスをthrowします。
間違えやすいところ
- Stateがabstract classなのにimplementsを選んでしまう誤りに注意が必要です。
- 委譲先のメソッド呼び出しでthisを呼び、無限に再帰してしまう混同に注意が必要です。
出題の前提:平成20年度春期 基本情報技術者試験 午後問題 問8
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.29 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.30 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.31 ↗(cdn.fe-siken.com)
単語切り出し副プログラム(CASL II)
ソフトウェア · CASL II / アセンブラ / 文字列処理 / テーブル操作
文字列から英数字の単語を切り出し、単語管理テーブルに先頭アドレス・長さ・属性を格納する副プログラムTOKENに関するプログラム中の空欄 a 〜 c に入る正しい答えを選択せよ。
- a-ア
- JNZ ACHK
- a-イ
- JNZ ALNUM
- a-ウ
- JNZ LP
- a-エ
- JZE ACHK
- a-オ
- JZE ALNUM
- a-カ
- JZE LP
- b-ア
- JMI ALNUM
- b-イ
- JMI LP
- b-ウ
- LD GR3,=0
- b-エ
- LD GR3,=1
- b-オ
- LD GR3,0
- b-カ
- LD GR3,1
- c-ア
- LAD GR1,1,GR1
- c-イ
- LAD GR1,3,GR1
- c-ウ
- LAD GR2,1,GR2
- c-エ
- LAD GR2,3,GR2
- c-オ
- LD GR1,GR6
- c-カ
- LD GR2,GR6
解答・解説を表示
解答
a: イ, b: ウ, c: エ
解説
まず要点:文字列から単語を切り出す処理では、いま単語の途中にいるかどうかをフラグ(状態を覚えておく印)で管理し、区切り文字が現れたら単語の情報を表に登録します。空白以外の文字が来たら英数字の判定処理へ進み、新しい単語が始まったらまず数字だけだと仮定して印に0を入れます。表の1件は3語からなるので、次に進むときはポインタを3つ分進めます。
解き方
- 空白かどうかを調べた後、空白以外の文字なら英数字の判定処理 ALNUM へ進む分岐命令を選びます。
- 新しい単語の始まりに気づいたら、まず数字だけと仮定してフラグ GR3 に0を入れ、先頭アドレスを控えます。
- SETTKN が表に3語分を入れた後、GR2 を3語分進めるアドレス加算命令を求めます。
小問ごとの答え
- 小問 a:イ
- CPL GR4, =' ' で空白文字と比較後、空白でない(非ゼロ)場合は単語の構成文字であるため ALNUM へ分岐する JNZ ALNUM が適切です。
- 小問 b:ウ
- 新たな単語の検出開始時、単語属性フラグ GR3 を初期値として「数字だけの単語」を示す 0(LD GR3, =0)に設定し、直後の英字判定に備えます。
- 小問 c:エ
- 単語管理テーブルには1単語につき先頭アドレス・長さ・属性の3語を書き込むため、次の単語格納に向けてポインタ GR2 を 3 進める LAD GR2, 3, GR2 を実行します。
覚えるポイント
- CASL IIでテーブルポインタを進めるときは LAD r, d, r を用い、1レコードの語数分を加算する。
間違えやすいところ
- LD 命令で定数を入れるとき、=0 のような書き方と番地0を混同しやすいので注意します。
出題の前提:平成20年度春期基本情報技術者午後問9の仕様及びアセンブラ言語仕様COMET II/CASL IIに基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.32 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.33 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.34 ↗(cdn.fe-siken.com)
有限小数・循環小数の既約分数変換プログラム(C言語)
プログラミング · C言語 / 循環小数 / 既約分数 / 最大公約数 / ポインタ走査
正の有限小数又は循環小数を既約分数に変換して表示する関数 tofraction に関するプログラム中の空欄 a 〜 f に入る正しい答えを選択せよ。
- a-ア
- *str != '\0'
- a-イ
- *str != '0'
- a-ウ
- str != '\0'
- a-エ
- str != '0'
- b-ア
- *= 10
- b-イ
- += 10
- b-ウ
- /= 10
- b-エ
- -= 10
- b-オ
- %= 10
- c-ア
- (*str)++
- c-イ
- (*str)--
- c-ウ
- str++
- c-エ
- str--
- d-ア
- != 0
- d-イ
- != 1
- d-ウ
- != 2
- d-エ
- == 0
- d-オ
- == 1
- d-カ
- == 2
- e-ア
- power10(k)
- e-イ
- power10(n) * power10(k)
- e-ウ
- (power10(n) - 1) * power10(k)
- e-エ
- power10(n) * (power10(k) - 1)
- f-ア
- denominator / power10(n)
- f-イ
- denominator / power10(k)
- f-ウ
- numerator / power10(n)
- f-エ
- numerator / power10(k)
解答・解説を表示
解答
a: ア, b: ア, c: ウ, d: ウ, e: エ, f: エ
解説
まず要点:循環小数を分数にするときは、小数全体を10の(循環しない桁+循環節の桁)乗倍した数から、10の(循環しない桁)乗倍した数を引くと、繰り返し部分が消えます。そのうえで出てきた分子と分母を最大公約数で割れば、既約分数になります。
解き方
- 文字列を1文字ずつ見て、数字・小数点・循環節の始まりの括弧に応じて桁数を数え、全体の数値を組み立てます。
- flag の値から循環小数かどうかを判断し、有限小数・整数の場合と循環小数の場合で分母と分子の式を分けて求めます。
- 求めた分子と分母の最大公約数 gcd を求めて約分します。
小問ごとの答え
- 小問 a:ア
- 文字列の末尾であるヌル文字 '\0' に到達するまでループを継続するため、間接参照による *str != '\0' が適切です。
- 小問 b:ア
- 新たな数字を末尾に追加して数値を組み立てるため、既存の値を10倍する numerator *= 10 が適切です。
- 小問 c:ウ
- 文字列ポインタを次の文字位置へ進めるため、ポインタ変数をインクリメントする str++ が適切です。
- 小問 d:ウ
- 循環節が現れた場合は flag が 2 に設定されるため、有限小数(flag=1)または整数(flag=0)を判定する条件は flag != 2 となります。
- 小問 e:エ
- 循環節を除く桁数 n、循環節の桁数 k のとき、分母は 10^(n+k) - 10^n = 10^n * (10^k - 1) と表されるため、power10(n) * (power10(k) - 1) です。
- 小問 f:エ
- 10^(n+k)X から引くべき 10^nX の整数部は、循環節 k 桁分を取り除いた値となるため numerator / power10(k) を減算します。
覚えるポイント
- 循環小数の分数化公式:分母は 10^(n+k) - 10^n = 10^n * (10^k - 1) である。
間違えやすいところ
- ポインタを進める str++ と、指す先の文字を変える (*str)++ を混同しやすいので注意します。
出題の前提:平成20年度春期基本情報技術者午後問10の仕様に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.35 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.36 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.37 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.38 ↗(cdn.fe-siken.com)
ドント式比例代表選挙の議席配分プログラムとブレーク処理
ソフトウェア設計・プログラミング · COBOL / ソート / 表操作 / コントロールブレーク
比例代表選挙において、ドント式によって政党別獲得議席数を計算し出力するCOBOLプログラム、および同点判定メッセージを追加する改修に関する問題である。 ドント式では各政党の得票数を1, 2, 3, …で除算した商(S-VPOINT)を求め、商の大きい順に議席定数(NUM-SEATS)に達するまで議席を配分する。 〔設問1〕 プログラム中の空欄 [ a ] 〜 [ d ] に入れる正しい答えを、それぞれの解答群から選べ。 ・空欄 a:SORT SORT-F [ a ] INPUT PROCEDURE ... ・空欄 b:PERFORM VARYING SEAT-CNT FROM 1 BY 1 [ b ] RETURN SORT-F ... ・空欄 c:既存政党が見つかったときの獲得議席数加算処理 ・空欄 d:未登録の政党をテーブルに新規追加した際の獲得議席数初期設定処理 〔設問2〕 最終当選順位と次点以降の商が等しい場合、同点警告メッセージを出力するように改修する。表2中の空欄 [ e ]、[ f ] に入れる正しい答えを、解答群(ア〜オ)の中から選べ。 ・空欄 e:PERFORM SET-BREAK を追加する位置 ・空欄 f:PERFORM CHECK-EQUAL を追加する位置
- ア
- 設問1a: ASCENDING KEY S-PARTY-NAME/設問1b: UNTIL EOF-SW = 1/設問1c・d: ADD 1 TO R-SEATS(R-CNT)/設問2: 行番号 34 と 35 の間
- イ
- 設問1a: ASCENDING KEY S-VPOINT/設問1b: UNTIL SEAT-CNT >= NUM-SEATS/設問1c・d: ADD 1 TO R-SEATS(WK-I)/設問2: 行番号 50 と 51 の間
- ウ
- 設問1a: DESCENDING KEY S-PARTY-NAME/設問1b: UNTIL SEAT-CNT > NUM-SEATS OR EOF-SW = 1/設問1c・d: MOVE 1 TO R-SEATS(R-CNT)/設問2: 行番号 52 と 53 の間
- エ
- 設問1a: DESCENDING KEY S-VPOINT/設問1b: UNTIL SEAT-CNT <= NUM-SEATS/設問1c・d: MOVE 1 TO R-SEATS(WK-I + 1)/設問2: 行番号 56 と 57 の間
- オ
- 設問1c・d: MOVE 1 TO R-SEATS(WK-I - 1)/設問2: 行番号 58 と 59 の間
解答・解説を表示
解答
設問1: a-エ, b-ウ, c-イ, d-ウ; 設問2: e-エ, f-オ
解説
まず要点:ドント式では、各政党の得票数を1、2、3…で割った商を大きい順に並べ、議席定数に達するまで議席を配ります。COBOLのSORT文では商 S-VPOINT を降順(大きい順)に指定します。集計の表は既存の政党を探し、見つかればその議席数を1増やし、なければ末尾に追加して議席数1を入れます。
解き方
- 商の大きい順に議席を配るため、S-VPOINT を降順(DESCENDING)に並べ替える条件を選びます。
- PERFORM VARYING の終了判定 UNTIL で、議席定数を超えたか、またはファイルが終わったという複合条件を求めます。
- 表を探して見つかれば添字 WK-I の議席数を増やし、登録がなければ末尾 R-CNT に議席数1を入れます。
- 改修では、当選レコードごとの集計 SET-BREAK をレコード取得の直後に、最終判定 CHECK-EQUAL を配分ループの直後に置きます。
小問ごとの答え
- 小問 設問1 a:エ
- ドント式では各政党の得票数を整数で除算した商が大きい順に議席を割り当てるため、ソートファイル SORT-F の商項目 S-VPOINT を降順(大きい順)に並べ替える必要があります。したがって「DESCENDING KEY S-VPOINT」が適切です。
- 小問 設問1 b:ウ
- SEAT-CNT は 1 から始まり議席定数 NUM-SEATS 個のレコードを取り出します。UNTIL 指定の条件が真になったときにループを終了するため、終了条件は SEAT-CNT が NUM-SEATS を超えたとき、またはファイルが終了したときを表す「UNTIL SEAT-CNT > NUM-SEATS OR EOF-SW = 1」となります。
- 小問 設問1 c:イ
- テーブル R-TBL 中に既に該当政党名が存在する場合、その政党の添字はループカウンタ WK-I で示されています。獲得議席数を1つ増やすため、「ADD 1 TO R-SEATS(WK-I)」を実行します。
- 小問 設問1 d:ウ
- 該当政党がテーブルにまだ登録されていない場合、R-CNT を 1 加算して新規エントリを作成し、政党名を格納した上で、初期の獲得議席数として 1 を設定するため「MOVE 1 TO R-SEATS(R-CNT)」を実行します。
- 小問 設問2 e:エ
- SET-BREAK は、ソート結果から取り出した各レコードの商について、同点数のカウントや開始順位を記録する処理です。RETURN SORT-F 文でレコードが正常に取得された直後、すなわち行番号 56(NOT AT END PERFORM REGIST-RTBL)と行番号 57(END-RETURN)の間に追加して呼び出します。
- 小問 設問2 f:オ
- CHECK-EQUAL は、議席配分ループ(行番号 53〜58 の PERFORM ループ)が終了した後に、次点以降の商を取り出して最終当選者と同点であるかを確認・警告表示する処理です。したがってループ完了後の行番号 58 と 59 の間に追加します。
覚えるポイント
- COBOLのPERFORM UNTILは条件が「真」になったときに終了するため、上限値を超える「>」を指定する。
- テーブルの線形探索では、既存時はカウンタ添字(WK-I)、新規追加時は登録位置(R-CNT)を操作する。
間違えやすいところ
- UNTIL 条件で「>=」を使うと最後の議席(NUM-SEATS 回目)を配らずに終わる誤りです。
- 既存レコードを更新するとき、新規追加用の添字 R-CNT を誤って更新してしまうミスです。
出題の前提:問題文およびCOBOL言語仕様に準拠。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.39 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.40 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.41 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.42 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.43 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.44 ↗(cdn.fe-siken.com)
インタフェースとアダプタクラスによる出力形式の統一と機能拡張
ソフトウェア設計・プログラミング · Java / インタフェース / クラスの継承 / Adapterパターン / 多態性
キーと値の組を「キー=値」のプロパティ形式やタグ形式(<entry key="...">...</entry>)で出力するJavaプログラムに関する問題である。 プログラムを共通インタフェース KeyValueWriter を用いて統一的に扱えるように設計変更し、さらにコメント出力機能を追加する。 〔設問1〕 プログラム中の空欄 [ a ] 〜 [ d ] に入れる正しい答えを、解答群の中から選べ。 ・空欄 a:インタフェース KeyValueWriter で宣言する write メソッドの仮引数仕様 ・空欄 b:プログラム2-4において、KeyValueWriterAdapter を継承して ToProperties を定義するクラス宣言 ・空欄 c:プログラム2-5の共通メソッド write の仮引数型 ・空欄 d:各ペア要素からキーと値を取り出して out.write() に渡す実引数 〔設問2〕 与えられた文字列をコメントとして出力するメソッド writeComment を拡張する。表に示された各コードの追加先プログラム(プログラム2-1〜2-4)を、解答群(ア〜エ)の中から選べ。 ・空欄 e:プロパティ形式のコメント「# comment」を出力するメソッド ・空欄 f:タグ形式のコメント「<!-- comment -->」を出力するメソッド ・空欄 g:インタフェースにおける抽象メソッド宣言「public void writeComment(String comment);」 ・空欄 h:アダプタクラスにおける空のデフォルト実装「public void writeComment(String comment) { }」
- ア
- 設問1a: K key, V value/設問1b: abstract class ToProperties extends KeyValueWriterAdapter/設問1c: KeyValueWriter/設問1d: pair[0], pair[1]/設問2: プログラム 2-1
- イ
- 設問1a: Object key, Object value/設問1b: class ToProperties extends KeyValueWriterAdapter/設問1c: KeyValueWriterAdapter/設問1d: pair[1], pair[0]/設問2: プログラム 2-2
- ウ
- 設問1a: String key, String value/設問1b: class ToProperties extends ToTags/設問1c: Test2/設問1d: pair[i], pair[i + 1]/設問2: プログラム 2-3
- エ
- 設問1a: String[] key, String[] value/設問1b: class ToProperties implements KeyValueWriter/設問1c: ToProperties/設問1d: pairs[][0], pairs[][1]/設問2: プログラム 2-4
- オ
- 設問1b: class ToProperties implements ToTags/設問1c: ToTags/設問1d: pairs[][1], pairs[][0]
解答・解説を表示
解答
設問1: a-ウ, b-イ, c-ア, d-ア; 設問2: e-エ, f-イ, g-ア, h-ウ
解説
まず要点:共通のインタフェースを用意すると、出力形式の違うクラスを同じメソッドで扱えます(これを多態性、別名ポリモーフィズムといいます)。実装しなくてよいメソッドの負担を減らすには、中身が空のアダプタクラスを用意し、サブクラスは必要なメソッドだけを上書きします。
解き方
- 既存クラスの書き方のそろい具合を見て、インタフェースのメソッド宣言 a とクラスの継承宣言 b を求めます。
- 多態性を使う呼び出し側メソッドの引数型 c に共通インタフェースを指定し、拡張 for 文で取り出す要素 d を決めます。
- 追加するコードの役割(プロパティ形式、タグ形式、抽象メソッド宣言、アダプタの空実装)を確かめ、対応するプログラム2-1〜2-4に割り当てます。
小問ごとの答え
- 小問 設問1 a:ウ
- 元のプログラム1-1における write メソッドの引数は「String key, String value」であり、プログラム2-2や2-4でも同一のシグネチャで実装されているため、インタフェースの引数宣言も「String key, String value」となります。
- 小問 設問1 b:イ
- 説明(4)より「プログラム1-1をクラス KeyValueWriterAdapter に適用できるように変更したもの」であるため、クラス ToProperties は KeyValueWriterAdapter を継承します。具象クラスとしてインスタンス化されるため「class ToProperties extends KeyValueWriterAdapter」が正解です。
- 小問 設問1 c:ア
- メソッド write 内では ToProperties と ToTags の両方のインスタンスを受け取って統一的に扱っています。したがって引数の型には、両者が実装している共通インタフェースである「KeyValueWriter」を指定します。
- 小問 設問1 d:ア
- 拡張for文「for (String[] pair : pairs)」により、pair は各エントリの文字列配列(要素0がキー、要素1が値)を参照しています。write メソッドにはキーと値を順に渡すため「pair[0], pair[1]」が正解です。
- 小問 設問2 e:エ
- 「# 」を行頭に付加して出力するのはプロパティ形式の仕様です。したがって、プロパティ出力クラスである ToProperties(プログラム2-4)に追加します。
- 小問 設問2 f:イ
- 「<!-- 」と「 -->」で囲んで出力するのはタグ形式の仕様です。したがって、タグ形式出力クラスである ToTags(プログラム2-2)に追加します。
- 小問 設問2 g:ア
- 末尾がセミコロンで終わるメソッド宣言「public void writeComment(String comment);」は抽象メソッドの定義です。これは共通インタフェース KeyValueWriter(プログラム2-1)に追加します。
- 小問 設問2 h:ウ
- メソッド本体が空の実装「{ }」となっているものは、アダプタクラスにおける省略時(デフォルト)実装です。したがって KeyValueWriterAdapter(プログラム2-3)に追加します。
覚えるポイント
- インタフェースはメソッドの仕様(宣言)のみを定義し、具象クラスやアダプタクラスがその振る舞いを実装する。
- アダプタクラスはインタフェースの全メソッドを空実装しておくことで、派生クラスでの不要な実装コードを省く役割を持つ。
間違えやすいところ
- インタフェース(プログラム2-1)に足す抽象メソッドと、アダプタクラス(プログラム2-3)に足す空実装 { } を取り違えるミスです。
- 拡張 for 文で取り出した1次元配列 pair に対して、二重添字 pairs[][] を書いてしまうミスです。
出題の前提:問題文およびJava言語仕様に準拠。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.45 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.46 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.47 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.48 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.49 ↗(cdn.fe-siken.com)
CASL IIによる数値列の統計値算出と入出力処理
ソフトウェア(アセンブラ) · CASL II / COMET II / 基数変換 / 除算サブルーチン / サブルーチン呼出し
入力ファイル中の数字列(1〜3桁)を読み込み、それらを10進数値とみなしたときの最大値、最小値および平均値を計算して出力するアセンブラ(CASL II)プログラムに関する問題である。 プログラムは、主プログラムMAINと副プログラムINPUT、DIVIDE、PRINTから構成される。 - 副プログラムINPUTは、入力レコードの数字列を2進数に変換してGR0に格納して戻る。ファイルの終わりのときはGR0に-1を設定する。 - 副プログラムDIVIDEは、被除数をGR2、除数をGR1に設定して呼び出すと、商をGR3、剰余をGR2に設定して戻る(GR1>0, GR2≧0)。 - 副プログラムPRINTは、GR1に設定された2進数nを3桁の10進数字列に変換し、右詰めで左側に空白文字を補って出力する。 各プログラム中の空欄 [ a ] 〜 [ f ] に入れる正しい答えを選択肢の中から選べ。
- a-ア
- LD GR1,GR0
- a-イ
- LD GR1,GR2
- a-ウ
- LD GR1,GR3
- a-エ
- LD GR2,GR0
- a-オ
- LD GR2,GR1
- a-カ
- LD GR2,GR3
- b-ア
- SLL GR5,1
- b-イ
- SLL GR5,2
- b-ウ
- SLL GR5,3
- b-エ
- SRL GR5,1
- b-オ
- SRL GR5,2
- b-カ
- SRL GR5,3
- c-ア
- JMI FIN2
- c-イ
- JMI LOOP2
- c-ウ
- JPL FIN2
- c-エ
- JPL LOOP2
- c-オ
- JZE FIN2
- c-カ
- JZE LOOP2
- d-ア
- JMI FIN3
- d-イ
- JNZ FIN3
- d-ウ
- JPL FIN3
- d-エ
- JZE FIN3
- e-ア
- JMI FIN4
- e-イ
- JMI LOOP4
- e-ウ
- JNZ FIN4
- e-エ
- JNZ LOOP4
- e-オ
- JPL FIN4
- e-カ
- JZE LOOP4
- f-ア
- JMI FIN4
- f-イ
- JMI LOOP4
- f-ウ
- JNZ FIN4
- f-エ
- JNZ LOOP4
- f-オ
- JPL FIN4
- f-カ
- JZE LOOP4
解答・解説を表示
解答
a: ウ, b: ウ, c: イ, d: ア, e: エ, f: ア
解説
まず要点:CASL IIでは、副プログラムに渡す引数や戻り値をどの汎用レジスタ(GR)に入れるかの決まりを正確に追う必要があります。また、CPA などの比較命令は結果に応じて符号やゼロのフラグを立てるので、条件分岐命令(JMI、JNZ、JPL、JZE)の成り立つ条件とループの動きを結びつけて考えます。
解き方
- 各副プログラム(INPUT、DIVIDE、PRINT)が使う入出力のレジスタと受け渡しの決まりを確認します。
- MAIN での除算呼び出しの結果(商 GR3)と、PRINT の引数が GR1 であることから空欄 a を求めます。
- 10進文字列を数値にする処理で、10倍を「2倍+8倍」のシフトと加算で作る手順から空欄 b を決めます。
- CPA の比較結果(大小)と分岐先のラベルから、ループの継続・終了を決める分岐命令 c、d を判断します。
- PRINT で商が0になるまでの判定(空欄 e)と、上位桁に空白を埋めるループの終了判定(空欄 f)を追います。
小問ごとの答え
- 小問 a:ウ
- プログラム1のFIN1ではCALL DIVIDEにより合計(GR2)をレコード件数(GR1)で除算し、商(平均値)がGR3に返されます。続くCALL PRINTへ渡す引数はGR1でなければならないため、LD GR1,GR3として商をGR1に設定します。
- 小問 b:ウ
- プログラム2でこれまでの数値GR4を10倍する処理です。GR5にGR4を退避後、bでGR5を左に3ビットシフト(8倍)し、SLL GR4,1(2倍)と足し合わせる(ADDA GR4,GR5)ことで、2倍+8倍=10倍を実現しています。したがってbはSLL GR5,3です。
- 小問 c:イ
- プログラム2では桁数カウンタGR1と総桁数GR0をCPA GR1,GR0で比較しています。GR1<GR0(まだ全桁を処理していない)のときは差が負になりSF=1となるため、JMI LOOP2により次の文字の処理ループへ分岐します。
- 小問 d:ア
- プログラム3(DIVIDE)では減算による除算を行います。CPA GR2,GR1で被除数GR2と除数GR1を比較し、GR2<GR1(被除数が除数より小さくなった)ときは差が負となり除算終了なので、JMI FIN3でループを抜けます。
- 小問 e:エ
- プログラム4(PRINT)のLOOP4では数値を10で割り続け、各桁の数字をOBUFに格納します。商がGR2に入り、商が0でない間は上位桁の抽出を繰り返すため、直前のLD GR2,GR3のフラグ結果を見て非ゼロの場合にJNZ LOOP4でループを継続します。
- 小問 f:ア
- プログラム4のLOOP5では出力桁数GR4をデクリメント(SUBA GR4,=1)しながら先頭の空き桁に空白文字を詰めます。GR4が0未満(負)になったとき全3桁の処理が完了したことを表すため、JMI FIN4によりループを終了します。
覚えるポイント
- 10倍の計算は「(x << 3) + (x << 1)」のように8倍と2倍の和で高速に実現できる。
- CPA命令は(第1オペランド - 第2オペランド)の結果に応じてフラグを設定する。
間違えやすいところ
- 副プログラムの入出力レジスタの決まりを取り違え、違うレジスタに引数を入れてしまうミスです。
- 比較命令の後のジャンプ命令で、小なり(<)の判定に JZE や JNZ を選んでしまうミスです。
出題の前提:平成20年度春期基本情報技術者試験 午後問題 問13およびアセンブラ仕様
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 春期 午後』
IPA公式問題冊子(第三者保管の保存版) p.50 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.51 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.52 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.53 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.54 ↗(cdn.fe-siken.com)
2008年度 春期 午後
参照した公式資料
IPA(PDF保管先:基本情報技術者試験ドットコム)が公開した2008年度 春期 午後の問題・解答資料です。
- IPA公式問題冊子(第三者保管の保存版) ↗ — cdn.fe-siken.com(PDF・64ページ)
- IPA公式解答例(第三者保管の保存版) ↗ — cdn.fe-siken.com(PDF・4ページ)

