旧制度の午前・午後と、2023年度以降の科目A・科目Bの公開問題を区別しています。現在の試験対策では現行シラバスと科目Bの形式を確認してください。公開問題は本試験の全出題を網羅する資料ではありません。
2008年度 秋期 午後の概要
拠点間IP電話ネットワークにおけるトラフィック計算
ネットワーク · トラフィック理論 / VoIP / ルーティング
本社および3つの支店(X, Y, Z)からなるIP電話網において、通信経路および通信形態の違いによるトラフィック量の変化を求める問題である。各通話のビット速度は送話・受話ともに20kビット/秒とし、制御に伴う通信量は無視する。見直し前は支店間通話も本社ルータを経由し、見直し後は支店同士が直接通信する形態とする。
- ア
- [a]1/4、[b]400、[c]400、[d]1/4倍
- イ
- [a]1/2、[b]800、[c]1,200、[d]1/2倍
- ウ
- [a]2、[b]1,200、[c]1,800、[d]同じ
- エ
- [a]4、[b]2,400、[c]2,400、[d]2倍
- オ
- [d]4倍
解答・解説を表示
解答
設問1 a: ウ, b: イ / 設問2 c: イ, d: ウ
解説
まず要点:本社を中心に全拠点を放射状につなぐスター型(本社を真ん中にした形)の網では、本社の回線に各拠点どうしの通信が集まり、負荷が大きく増えます。支店同士が直接やり取りする形に変えると、本社を通る通信が減り、本社回線の負荷は下がります。一方、各支店の入り口の回線を通る通話の数は、発信と着信の合計で決まるため、見直しの前後で変わりません。
解き方
- それぞれの通話が通る道(上りと下り)をたどり、どの回線を何件の通話が通るか整理します。
- 拠点ごとの同時通話数の表から対象区間の通話数を集め、1通話あたり20kビット/秒をかけて帯域を求めます。
小問ごとの答え
- 小問 設問1 a:ウ
- 支店XとYの通話では、X→Y方向のパケットがxを上り、wを往復(上り+下り)してyを下ります。同時にY→X方向のパケットもyを上り、wを往復(上り+下り)してxを下ります。したがって、xを通るトラフィック(上り1通話分、下り1通話分)に対し、wを通るトラフィックは上り方向・下り方向のそれぞれで2通話分(X→YとY→X)が流れるため、wのトラフィックはxの2倍になります。
- 小問 設問1 b:イ
- 表より、支店Xが関与する同時通話数は、本社-支店X間が20通話、支店X-支店Y間が10通話、支店X-支店Z間が10通話で、合計40通話です。1通話あたり送話・受話ともに20kビット/秒であるため、アクセスポイント間xを流れるピーク時トラフィックは、上り・下りともに 40 × 20kビット/秒 = 800kビット/秒 となります。
- 小問 設問2 c:イ
- 通信形態の見直しにより支店間通話が本社ルータを経由しなくなるため、本社接続wを通過するのは本社と各支店間の通話のみになります。本社-支店間の通話数は本社-Xが20、本社-Yが20、本社-Zが20の計60通話です。したがって、wのトラフィックは上り下りともに 60 × 20kビット/秒 = 1,200kビット/秒 となります。
- 小問 設問2 d:ウ
- 支店間の通信経路が本社ルータ経由から直接通信へ変わっても、各支店(X, Y, Z)を発着する通話自体の本数は変化しません。支店Xを例にすると、本社向け20通話、支店向け20通話の計40通話の送受信トラフィックは同一のままであるため、見直し前と比べて「同じ」となります。
覚えるポイント
- 中継ルータを経由する拠点間通信では、中継回線側で上りと下りの双方が往復して多重化される点に注意する。
間違えやすいところ
- 支店同士が直接通信するようになると、支店側の回線の通信まで減ると勘違いしやすい点です。
出題の前提:問題文に提示された表「ピーク時における各拠点間の同時通話数」および1通話あたり20kビット/秒の条件に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.4 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.5 ↗(cdn.fe-siken.com)
文字列を整形して出力するプログラムの穴埋め
アルゴリズムとプログラミング · 文字列操作 / 配列走査 / 擬似言語
文字列型配列Strに格納された文字列を、左側余白Margin、1行の最大文字数MaxC、1ページの最大行数MaxLの規則に従って整形出力する副プログラムPrintOutおよび関連副プログラム(GetPosition, PutLine)の空欄a~dを埋める問題である。
- ア
- [a]CurrentP: 0, CurrentP < MaxC, 1 / [b]Str[StartP] = EOS / [c]EndP < (StartP + MaxC) / [d]CurrentP: 0, Line[CurrentP] = EOS, 1
- イ
- [a]CurrentP: 0, StartP < EndP, 1 / [b]Str[StartP] = NL / [c]EndP < MaxC / [d]CurrentP: 0, Line[CurrentP] = NL, 1
- ウ
- [a]CurrentP: Margin, CurrentP < MaxC, 1 / [b]Str[StartP] ≠ EOS / [c]StartP < (EndP + MaxC) / [d]CurrentP: 0, Line[CurrentP] ≠ EOS, 1
- エ
- [a]CurrentP: Margin, StartP < EndP, 1 / [b]Str[StartP] ≠ NL / [c]StartP < MaxC / [d]CurrentP: 0, Line[CurrentP] ≠ NL, 1
解答・解説を表示
解答
a: エ, b: イ, c: ア, d: ウ
解説
まず要点:文字を並べる処理では、余白の分だけ書き始めの位置をずらし、行の終わりや文字列の終わりを正しく見つけることが大切です。区切り文字(改行や終端を表す特別な文字)に出会ったときの扱いを間違えると、文字の位置がずれます。
解き方
- PrintOutで余白Marginを設定したあとの書き込み位置(CurrentP)と、文字を写す範囲を確認します。
- 行末を見つける関数GetPositionの終了条件(最大文字数の制限)を逆にして、続ける条件を求めます。
- 改行文字の処理と、行を出力する関数PutLineの終了判定(EOSの検出)を照らし合わせます。
小問ごとの答え
- 小問 a:エ
- 配列Lineには先頭Margin個の空白が格納済みであるため、出力文字列をコピーする開始位置はMarginとなります。また、元の文字列配列StrからStartPからEndP直前までの文字を取り出すため、ループの初期値はCurrentP: Margin、継続条件はStartP < EndP、増分は1となります。
- 小問 b:イ
- 行末位置EndPまで出力した後、その行末が改行文字(NL)であった場合は、次の行の処理を開始するために改行文字を読み飛ばす(StartP ← StartP + 1)必要があります。よって条件式は Str[StartP] = NL となります。
- 小問 c:ア
- GetPositionでは、EOSやNLが見つからず、かつ1行の最大文字数MaxCに達していない間ループを継続します。探索開始位置がStartPであるため、走査中の位置EndPがStartPから数えてMaxC文字未満である条件は EndP - StartP < MaxC、すなわち EndP < (StartP + MaxC) となります。
- 小問 d:ウ
- PutLineは、配列Lineの先頭から文字列の終端記号EOSが現れる直前まで、PutChrで1文字ずつ出力する処理です。したがって、CurrentPを0から始めて、Line[CurrentP] ≠ EOS である間、1ずつ加算して繰り返す必要があります。
覚えるポイント
- 配列のインデックス走査では、文字数制限(相対オフセット)と絶対インデックスの差分を意識して条件式を立てる。
間違えやすいところ
- GetPositionの文字数の判定で、始めの位置StartPを考えずに EndP < MaxC と書いてしまう間違いです。
出題の前提:問題文に示された仕様(Margin, MaxC, MaxL, EOS, NLの定義)および擬似言語の構文規則に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.6 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.7 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.8 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.9 ↗(cdn.fe-siken.com)
関係データベースとSQLによる研修実績の照会
データベース · SQL / 関係データベース / 結合条件 / パターンマッチング
B社における社員や研修に関する関係データベースの構造及び概要を読み、設問1・設問2に答えよ。 〔各表の概要〕 ・社員表(社員コード、氏名、入社年月日、部署コード、役職コード、退職年月日、生年月日、住所、電話番号) 在職中の社員の退職年月日はNULLとする。 ・部署表(部署コード、部署名) ・役職表(役職コード、役職名) ・研修実施表(年度、研修コード、研修名、研修開始年月日、研修終了年月日、研修日数) ・受講表(年度、研修コード、社員コード、受講日数) 受講予定の社員が受講しなかった場合、その研修の受講日数の値は0となる。 ・B社で規定する年度は4月1日から翌年3月31日までである。 設問1:入社2年目の社員(2007年度入社で在職中)が入社以来1日でも受講した研修名を重複なく検索するSQL文の空欄に入る条件を3つ選べ。 設問2:役職名に「部長」を含む社員が同所属部署の受講実績を照会できるようにするためのSQL文の説明の空欄[ a ]〜[ d ]に入る適切な字句を選べ。
- 設問1 ア
- 研修実施表.研修コード = 受講表.研修コード
- 設問1 イ
- 研修実施表.年度 = '2007'
- 設問1 ウ
- 研修実施表.年度 = 受講表.年度
- 設問1 エ
- 研修日数 > 0
- 設問1 オ
- 受講日数 > 0
- 設問1 カ
- 受講表.年度 = '2007'
- 設問2 a ア
- SELECT 役職コード FROM 役職表 WHERE 役職名 = '部長'
- 設問2 a イ
- SELECT 役職コード FROM 役職表 WHERE 役職名 = '部長' OR 役職名 = '副部長' OR 役職名 = '部長代理'
- 設問2 a ウ
- SELECT 役職コード FROM 役職表 WHERE 役職名 IN ('部長', '副部長', '部長代理')
- 設問2 a エ
- SELECT 役職コード FROM 役職表 WHERE 役職名 LIKE '%部長%'
- 設問2 a オ
- SELECT 役職コード FROM 役職表 WHERE 役職名 LIKE '部長%'
- 設問2 b~d ア
- 研修コード
- 設問2 b~d イ
- 研修実施表
- 設問2 b~d ウ
- 社員コード
- 設問2 b~d エ
- 社員表
- 設問2 b~d オ
- 部署コード
- 設問2 b~d カ
- 部署表
- 設問2 b~d キ
- 役職コード
- 設問2 b~d ク
- 役職表
解答・解説を表示
解答
設問1: ア, ウ, オ / 設問2 a: エ, b: ウ, c: オ, d: エ
解説
まず要点:複数の表を組み合わせるときは、両方の表に共通するキー(行を見分ける項目)をすべて結び付ける必要があります。複合キー(2つ以上の項目を合わせたキー)で結ぶときは、その全部を指定しないと正しく結び付きません。また「〜を含む」検索にはLIKEとワイルドカード(% などの任意の文字を表す記号)を使います。
解き方
- 設問1:受講表と研修実施表を(年度、研修コード)で結ぶ条件(ア、ウ)と、「受講日数 > 0」の条件(オ)を見つけます。
- 設問2 a:役職名に「部長」を含むという条件を、部分一致のLIKE '%部長%' で表すSQLを選びます。
- 設問2 b〜d:受講表の社員コードから所属部署(部署コード)を導くために通る表(社員表)と各項目を対応付けます。
小問ごとの答え
- 小問 設問1:ア, ウ, オ
- 受講表と研修実施表を正しく結合するために主キーの構成要素である「研修実施表.研修コード = 受講表.研修コード」(ア)と「研修実施表.年度 = 受講表.年度」(ウ)の両方が必要です。また「1日でも受講した」という条件を満たすため「受講日数 > 0」(オ)を指定します。
- 小問 設問2 a:エ
- 役職名の中に「部長」という文字列を含むすべての役職を検索するためには、文字列の部分一致を表すLIKE演算子と任意の文字列を表すワイルドカード「%」を前後に挟んだ「LIKE '%部長%'」を用います。
- 小問 設問2 b:ウ
- 受講表が直接保持している社員の識別情報は「社員コード」です。したがってbには社員コードが入ります。
- 小問 設問2 c:オ
- 同じ所属部署であるかを判別するために必要となる情報は「部署コード」です。したがってcには部署コードが入ります。
- 小問 設問2 d:エ
- 受講表の社員コードを基に所属部署を特定するためには、社員コードと部署コードの両方を保持する「社員表」を結合する必要があります。
覚えるポイント
- 複合主キーで参照関係がある場合は、主キーを構成する全ての列を結合条件に指定する。
- 任意の部分文字列を含む検索にはLIKE演算子と「%文字列%」を用いる。
間違えやすいところ
- 受講表と研修実施表を研修コードだけで結び、年度の一致を忘れてしまうこと。
- 「入社2年目の社員」という条件につられて、受講表の年度まで2007年度に絞ってしまうこと。
出題の前提:問題文に記載された表構造、および標準SQLの文法規約に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.10 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.11 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.12 ↗(cdn.fe-siken.com)
ダイクストラ法による最短経路アルゴリズム
アルゴリズム · 最短経路問題 / ダイクストラ法 / グラフ理論 / 擬似言語
地点数Nの有向グラフにおいて、出発地点から各地点までの最短距離を求めるアルゴリズムShortestLengthに関する説明及び図を読み、設問1・設問2に答えよ。 配列の仕様: ・Dt[i][j]:地点iから地点jまでの距離(直接の経路がない場合は∞) ・Sd[i]:地点1から地点iまでの仮最短距離(初期値は∞、確定時に最短距離となる) ・Pe[i]:地点iが処理済(最短距離確定)かどうかを表す論理型配列(初期値はfalse) 設問1:アルゴリズムの説明中にある空欄[ a ]および[ b ]に入れる正しい答えを選べ。 設問2:図8のグラフにおいて出発地を地点1として実行したとき、最短距離が確定する順番[ c ]、並びに各地点の最短距離 Sd[3][ d ]、Sd[5][ e ]、Sd[6][ f ]の値をそれぞれ選べ。
- 設問1 a ア
- Sd[i] + Dt[i][k]
- 設問1 a イ
- Sd[i] + Dt[k][i]
- 設問1 a ウ
- Sd[k] + Dt[i][k]
- 設問1 a エ
- Sd[k] + Dt[k][i]
- 設問1 b ア
- 30
- 設問1 b イ
- 40
- 設問1 b ウ
- 50
- 設問1 b エ
- 60
- 設問2 c ア
- 地点2, 地点4, 地点3, 地点5
- 設問2 c イ
- 地点2, 地点4, 地点5, 地点3
- 設問2 c ウ
- 地点4, 地点2, 地点3, 地点5
- 設問2 c エ
- 地点4, 地点2, 地点5, 地点3
- 設問2 d~f ア
- 30
- 設問2 d~f イ
- 40
- 設問2 d~f ウ
- 50
- 設問2 d~f エ
- 60
- 設問2 d~f オ
- 70
- 設問2 d~f カ
- 80
- 設問2 d~f キ
- 90
- 設問2 d~f ク
- 100
解答・解説を表示
解答
設問1 a: エ, b: ウ / 設問2 c: エ, d: ウ, e: ア, f: エ
解説
まず要点:ダイクストラ法は、始点から各地点までの最短距離を順に決めていく方法です。まだ決まっていない地点のうち、始点からの仮の距離が一番小さい地点を確定し、そこから直接行ける地点の仮の距離を「今の距離」と「確定した地点の距離+枝の長さ」の小さい方に更新します。これを繰り返すと最短距離が求まります。
解き方
- 設問1 a:すぐ前の「Sd[3]=Sd[2]+Dt[2][3]」から、確定した地点kから未確定の地点iへの式が「Sd[k] + Dt[k][i]」だと導きます。
- 設問1 b:手順⑤の地点6の更新式 min(Sd[6], Sd[3] + Dt[3][6]) = min(50, 30 + 30) を計算して50を得ます。
- 設問2:図8にダイクストラ法を当てはめ、最初の状態(Sd[2]=20、Sd[4]=10)から最小の地点4を確定し、順に確定する順番と値を追います。
小問ごとの答え
- 小問 設問1 a:エ
- 新たに確定した地点kを経由して地点iへ到達する距離は、地点kまでの最短距離Sd[k]に地点kから地点iへの移動距離Dt[k][i]を加えた「Sd[k] + Dt[k][i]」となります。
- 小問 設問1 b:ウ
- 手順④終了時点でSd[6]=50となっています。手順⑤で地点3(Sd[3]=30)から地点6への移動(Dt[3][6]=30)を経由すると30+30=60となりますが、現在の値50の方が小さいため更新されず、Sd[6]の値は50のままとなります。
- 小問 設問2 c:エ
- 未処理地点の仮最短距離Sdを順次確定していくと、地点4 (Sd=10) → 地点2 (Sd=20) → 地点5 (Sd=30) → 地点3 (Sd=50) の順に確定します。
- 小問 設問2 d:ウ
- 地点3の確定最短距離Sd[3]は、地点1→地点2→地点3(20+30)の経路による「50」となります。
- 小問 設問2 e:ア
- 地点5の確定最短距離Sd[5]は、地点1→地点4→地点5(10+20)の経路による「30」となります。
- 小問 設問2 f:エ
- 地点6へは地点5経由(30+40=70)よりも、地点3経由(50+10=60)の方が短いため、最終的な確定値Sd[6]は「60」となります。
覚えるポイント
- ダイクストラ法では常に「未処理の中で仮最短距離が最小のノード」を選択して確定する。
- 仮最短距離の更新式は「min(現在の距離, 確定ノードの距離 + 確定ノードからの枝の重み)」である。
間違えやすいところ
- 仮の距離を更新するとき、新しい経路の方が大きくても間違って上書きしてしまうこと。
- 有向グラフの矢印の向きを見落とし、逆向きの経路で計算してしまうこと。
出題の前提:問題文に提示されたShortestLengthアルゴリズムの定義及びグラフ理論の一般原理に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.13 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.14 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.15 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.16 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.17 ↗(cdn.fe-siken.com)
楽曲ダウンロードシステムの設計と機能追加
ソフトウェア設計 · モジュール設計 / ファイル処理 / データ突合せ / 集計処理
楽曲ダウンロードシステムに関する記述を読み、設問1〜3に答えよ。 〔システムの概要〕 ・楽曲管理ファイル:楽曲番号(キー)、曲名、演奏者名、演奏時間、制作会社、ジャンル、楽曲データの大きさ、楽曲データの格納場所 ・会員ファイル:会員番号(キー)、暗号化したパスワード、氏名、入会日 ・ダウンロード実績ファイル:会員番号、ダウンロード日付、ダウンロード時刻、楽曲番号(4項目で主キー) 〔設問1〕会員が1日にダウンロードできる楽曲数を制限する機能を追加する。ログインした会員の [ a ] と現在日付の二つをキーとしてダウンロード実績ファイルを検索して件数を数える。日付変更を考慮すると、このダウンロード件数を求めるモジュールは [ b ] モジュールの直前に実行する必要がある。 〔設問2〕楽曲選択画面に最終ダウンロード日付を追加する。抽出した楽曲がダウンロード済であるかは、ダウンロード実績ファイルを [ c ] で検索すれば判明する。この検索において該当する実績の件数は [ d ] である。 〔設問3〕全会員の入会後1週間におけるジャンル別ダウンロード件数表(図6)を作成するため、各処理(図7・表)を行う。処理4で突合せるファイル [ e ] と、処理5で並べ替えるキー [ f ] を選べ。
- 設問1 a ア
- 会員番号
- 設問1 a イ
- 楽曲データの大きさ
- 設問1 a ウ
- 楽曲番号
- 設問1 a エ
- ダウンロード日付
- 設問1 a オ
- 入会日
- 設問1 a カ
- パスワード
- 設問1 b ア
- 会員ファイルの検索
- 設問1 b イ
- 楽曲管理ファイルの検索
- 設問1 b ウ
- 楽曲検索画面の表示
- 設問1 b エ
- 楽曲選択画面の表示
- 設問1 b オ
- 楽曲のダウンロード
- 設問2 c ア
- 会員番号
- 設問2 c イ
- 会員番号と楽曲番号
- 設問2 c ウ
- 会員番号と楽曲番号とダウンロード日付
- 設問2 c エ
- 会員番号とダウンロード日付
- 設問2 c オ
- 楽曲番号
- 設問2 c カ
- 楽曲番号とダウンロード日付
- 設問2 c キ
- ダウンロード日付
- 設問2 d ア
- 0件
- 設問2 d イ
- 0件以上
- 設問2 d ウ
- 0件又は1件
- 設問2 d エ
- 1件
- 設問2 d オ
- 2件以上
- 設問3 e ア
- 会員ファイル
- 設問3 e イ
- 楽曲管理ファイル
- 設問3 e ウ
- ダウンロード実績ファイル
- 設問3 f ア
- 会員番号
- 設問3 f イ
- 楽曲データの大きさ
- 設問3 f ウ
- 楽曲番号
- 設問3 f エ
- ジャンル
- 設問3 f オ
- ダウンロード件数
解答・解説を表示
解答
設問1 a: ア, b: オ / 設問2 c: イ, d: イ / 設問3 e: イ, f: エ
解説
まず要点:業務システムの機能追加やバッチ集計では、各ファイルがどんな項目を持ち、何がキー(レコードを見分ける項目)かを正確に押さえることが基本です。足りない項目は突合せ(キーをそろえて別のファイルと照らし合わせること)で補い、集計する単位に合わせて事前に並べ替えます。
解き方
- ダウンロード実績ファイルの項目(会員番号、ダウンロード日付、時刻、楽曲番号)から、当日の件数を数えるのに必要な条件を洗い出します。
- 日付が変わることを考えると、実際のダウンロード処理の直前に行うのがよいと、モジュールの並びから判断します。
- 特定の会員が特定の曲を落としたかを調べるのに必要な組み合わせキー(会員番号と楽曲番号)と、件数の範囲(0件以上)を導きます。
- バッチ処理の流れで、ジャンル別の集計に必要なジャンル名を持つ楽曲管理ファイルを突合せの対象とし、集計のキーであるジャンルで並べ替える流れを確認します。
小問ごとの答え
- 小問 設問1 a:ア
- ログイン中の特定会員による当日のダウンロード実績を抽出するためには、「会員番号」と「現在日付(ダウンロード日付)」を条件としてダウンロード実績ファイルを検索する必要があります。
- 小問 設問1 b:オ
- ログイン後に日付をまたいだ場合でも正確に当日の件数を判定するには、実際にダウンロード処理を行う直前である「楽曲のダウンロード」モジュールの手前で件数チェックを実行する必要があります。
- 小問 設問2 c:イ
- ログインしている会員がその楽曲を過去にダウンロードしたかを確認するには、「会員番号」と検索結果の「楽曲番号」の2項目をキーにしてダウンロード実績ファイルを検索します。
- 小問 設問2 d:イ
- 同一会員が同一楽曲を一度もダウンロードしていなければ0件、複数回ダウンロードしていれば複数件の実績が存在し得るため、「0件以上」となります。
- 小問 設問3 e:イ
- 中間ファイルには楽曲番号別の集計件数が記録されていますが、最終的な帳票には「ジャンル」が必要です。ジャンル情報を保持している「楽曲管理ファイル」と楽曲番号で突き合わせる必要があります。
- 小問 設問3 f:エ
- 後続の処理6でジャンルごとのレコード集計を行うため、処理5ではあらかじめ「ジャンル」をキーとしてレコードを整列(ソート)しておく必要があります。
覚えるポイント
- バッチ処理でグループごとの集計を行う前には、必ずその集計キーでソート(整列)する。
間違えやすいところ
- 主キーに日付が入る実績表では、同じ会員・同じ曲のレコードが複数あり得る点を見落としやすいこと。
出題の前提:平成20年度秋期基本情報技術者試験午後問5の出題条件に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
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) / IPA公式問題冊子(第三者保管の保存版) p.22 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.23 ↗(cdn.fe-siken.com)
整数を3桁区切り形式の文字列に変換するCプログラム
プログラミング · C言語 / 文字列操作 / 基数変換・数値変換 / 配列の反転
整数を3桁区切り形式の文字列に変換する関数 convert のプログラムを読み、空欄 [ a ] 〜 [ c ] に入る適切な記述を選べ。 〔プログラムの説明〕 (1) 整数値が負の場合、先頭にマイナス符号を付ける。 (2) 数値の下位から3けたごとにコンマを挿入する。 〔プログラム(抜粋)〕 do { str[j++] = table[num % 10]; num [ a ]; i++; if ([ b ] == 0 && num != 0) { str[j++] = ','; } } while (num != 0); if (minus != 0) { str[j++] = '-'; } str[j--] = '\0'; for (i = 0; [ c ]) { tmp = str[i]; str[i] = str[j]; str[j] = tmp; }
- a ア
- %= 10
- a イ
- *= -1
- a ウ
- *= -10
- a エ
- *= 10
- a オ
- /= 10
- b ア
- (i + 1) % 3
- b イ
- (i + 2) % 3
- b ウ
- (j + 1) % 3
- b エ
- (j + 2) % 3
- b オ
- i % 3
- b カ
- j % 3
- c ア
- i != j; i++
- c イ
- i != j; i++, j--
- c ウ
- i < j; i++
- c エ
- i < j; i++, j--
解答・解説を表示
解答
a: オ, b: オ, c: エ
解説
まず要点:数を下の桁から順に取り出すときは、10で割った余り(% 10)で1桁を取り、10で割った商(/= 10)でその桁を消します。できた文字列は逆順になるので、両端の位置(iとj)を内側に狭めながら交換して反転させます。
解き方
- 一番下の桁を取った後のnumの更新として、桁を1つ減らす処理(num /= 10)を選びます。
- 処理した桁数カウンターiをもとに、3桁ごとにカンマを入れる条件式(i % 3 == 0)を導きます。
- 配列の両端を交換する反転ループで、終了条件(i < j)と添字の更新(i++, j--)を確かめます。
小問ごとの答え
- 小問 a:オ
- numの最下位桁(num % 10)を取り出した後、次の桁を処理するために10で割って商を代入する必要があるため、「/= 10」となります。
- 小問 b:オ
- 変数iは処理済みの桁数を表し、1桁処理するごとにインクリメントされます。3桁ごとにカンマを入れるため、3の倍数桁(i % 3 == 0)かつまだ上位桁が残っている(num != 0)ときにカンマを付加します。
- 小問 c:エ
- 文字列の両端から中央に向かって文字を反転させるため、先頭側添字iを増やし末尾側添字jを減らす「i++, j--」を行い、継続条件は「i < j」とします(i != j だと偶数長のときにすれ違って無限ループになります)。
覚えるポイント
- 両端から挟み込む配列の反転ループでは、偶数長でのすれ違いを防ぐため継続条件に i != j ではなく i < j を使用する。
間違えやすいところ
- 文字配列の位置 j(カンマを含む)と桁数カウンター i(数字だけ)の役割を混同しやすいこと。
出題の前提:平成20年度秋期基本情報技術者試験午後問6の出題条件に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.24 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.25 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.26 ↗(cdn.fe-siken.com)
COBOLによるコピー機利用実績の集計とグラフ表示
プログラミング · COBOL / 集計処理 / 配列操作 / 帳票出力
事業所で共有利用されているコピー機の利用実績ファイル(COPY-FILE)から、部署ごとの用紙使用枚数を集計して棒グラフとして出力するCOBOLプログラム、および両面コピー率を算出して50%未満の場合に警告記号を出力するプログラム変更に関する問題です。空欄 a ~ d に当てはまる適切な語句を選択してください。
- ア
- 設問1空欄a: ADD 1 TO DEPT-TOTAL(CP-DEPT) / 設問1空欄b: COMPUTE MARK-CNT = DEPT-TOTAL(DEPT-CNT) / 100 / 設問2空欄c: 行番号30と31 / 設問2空欄d: COMPUTE BOTH-RATE = DEPT-BOTH(DEPT-CNT) * 100 / DEPT-TOTAL(DEPT-CNT)
- イ
- 設問1空欄a: ADD CP-CNT TO DEPT-TOTAL(CP-DEPT) / 設問2空欄c: 行番号31と32 / 設問2空欄d: COMPUTE BOTH-RATE = DEPT-BOTH(DEPT-CNT) / 100
- ウ
- 設問1空欄b: COMPUTE MARK-CNT = (DEPT-TOTAL(DEPT-CNT) + 99) / 100 / 設問2空欄c: 行番号35と36 / 設問2空欄d: COMPUTE MARK-CNT = DEPT-TOTAL(DEPT-CNT) / 100
- エ
- 設問2空欄c: 行番号37と38 / 設問2空欄d: MOVE DEPT-BOTH(DEPT-CNT) TO BOTH-RATE
- オ
- 設問1空欄a: MOVE CP-CNT TO DEPT-TOTAL(CP-DEPT) / 設問2空欄d: MOVE DEPT-TOTAL(DEPT-CNT) TO MARK-CNT
- カ
- 設問1空欄b: MOVE DEPT-TOTAL(DEPT-CNT) TO MARK-CNT
解答・解説を表示
解答
設問1 a: イ, b: ウ / 設問2 c: ウ, d: ア
解説
まず要点:COBOLの集計では、入力レコードからキーを取り出し、対応する配列の要素へ足し込んでいきます。整数だけで割り算をするとき、切り上げたい場合は割る数より1小さい数(100で割るなら99)を足してから割るのが定石です。百分率は、先に100をかけてから割らないと整数の割り算で0になってしまいます。
解き方
- ファイル読み込みのループとCNT-PROCの呼び出し関係を確かめ、集計する項目と集計先の配列を特定します。
- 棒グラフの*の個数を求める切り上げ条件(100枚未満を切り上げ)に対応する割り算の式を導きます。
- 設問2の追加ロジックがレコードごとの集計であることからCNT-PROCの中(行番号35と36の間)と特定し、百分率の計算の順序を確かめます。
小問ごとの答え
- 小問 設問1 a:イ
- CNT-PROCでは読み込んだ1レコードの使用枚数 CP-CNT を該当部署の集計領域 DEPT-TOTAL(CP-DEPT) に加算するため、ADD CP-CNT TO DEPT-TOTAL(CP-DEPT) が適切です。
- 小問 設問1 b:ウ
- 仕様として100枚未満を切り上げて*印を表示するため、整数除算において切上げを行う計算式 (DEPT-TOTAL(DEPT-CNT) + 99) / 100 を代入します。
- 小問 設問2 c:ウ
- 両面コピーの集計処理は入力ファイルを1レコード読み込むごとに実行する必要があるため、CNT-PROC内の処理である行番号35と36の間に追加します。
- 小問 設問2 d:ア
- 両面利用比率(%)は整数演算で先に100を掛けてから合計枚数で割る必要があるため、COMPUTE BOTH-RATE = DEPT-BOTH(DEPT-CNT) * 100 / DEPT-TOTAL(DEPT-CNT) となります。
覚えるポイント
- 整数除算におけるN単位の切り上げ計算は (X + N - 1) / N で求める。
- 整数の百分率計算はゼロ除算・桁落ちを防ぐため先に100を掛けてから割る。
間違えやすいところ
- 回数のカウント(ADD 1)と枚数の集計(ADD 項目値)を取り違えてしまう間違い。
- 比率の計算で先に割り算をしてしまい、整数の割り算で結果が0になる間違い。
出題の前提:平成20年度秋期基本情報技術者午後問7の問題文およびプログラム仕様
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.27 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.28 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.29 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.30 ↗(cdn.fe-siken.com)
Javaによる電話帳クラスの実装とプレフィックス検索
プログラミング · Java / コレクション / Map / Set
名前(String)に対して複数の電話番号(Set<String>)を対応付けて管理するPhoneBookクラスの実装、および名前の前方一致検索を行う追加メソッドmethodXの機能に関する問題です。空欄 a ~ c に入る適切なコード、および設問2の記述として正しいものを選択してください。
- ア
- 設問1空欄a: add(name) / 設問2: 電話帳に登録されている電話番号のうち、引数varで与えられた文字列で始まるすべての電話番号の集合を返す。
- イ
- 設問1空欄a: add(phoneNumber) / 設問2: 電話帳に登録されている名前のうち、引数varで与えられた文字列で始まるすべての名前の集合を返す。
- ウ
- 設問1空欄b: put(name, numbers) / 設問2: 引数varで与えられた文字列で始まる電話番号に対応付けられたすべての名前の集合を返す。
- エ
- 設問1空欄b: put(name, phoneNumber) / 設問2: 引数varで与えられた文字列で始まる名前に対応付けられたすべての電話番号の集合を返す。
- オ
- 設問1空欄b: put(numbers, name)
- カ
- 設問1空欄b: put(phoneNumber, name)
- キ
- 設問1空欄c: remove(name)
- ク
- 設問1空欄c: remove(phoneNumber)
解答・解説を表示
解答
設問1 a: イ, b: ウ, c: ク / 設問2: イ
解説
まず要点:JavaのMapは、キー1つに対して値1つを対応させます。1つの名前に複数の電話番号を持たせたいときは、値の側にSet(重複を許さない集合)を入れます。MapのkeySet()はキー(ここでは名前)の集まりを返し、StringのstartsWithは指定した文字で始まるかを調べます。
解き方
- addメソッドの中を確かめ、Setへの要素の追加(add)とMapへの登録(put)を見分けます。
- removeメソッドの中を確かめ、Setから特定の電話番号を消す呼び出し(remove)を特定します。
- 設問2のmethodXで繰り返しの対象がbook.keySet()(名前)であり、返すSetに足されているのがキーそのものだと読み取ります。
小問ごとの答え
- 小問 設問1 a:イ
- 変数numbersはSet<String>型であり、指定された電話番号を集合に追加するため numbers.add(phoneNumber) と呼び出します。
- 小問 設問1 b:ウ
- Map型のbookに対してキー名と電話番号の集合を登録・更新するため、book.put(name, numbers) と呼び出します。
- 小問 設問1 c:ク
- 指定された名前の電話番号集合から特定の電話番号を削除するため、numbers.remove(phoneNumber) を実行します。
- 小問 設問2:イ
- methodXはbook.keySet()からキー(名前)を取り出し、startsWith(var)で判定して合致した名前をretに追加して返しているため、「電話帳に登録されている名前のうち、引数varで与えられた文字列で始まるすべての名前の集合を返す」が正解です。
覚えるポイント
- Map<K, Set<V>> の構造では、キーごとの集合を取り出してSetのメソッドを操作する。
- Map.keySet() はキーの集合を返し、String.startsWith() は接頭辞判定を行う。
間違えやすいところ
- methodXが返す集合が「名前に対応する電話番号」なのか「名前そのもの」なのかを混同する間違い。
- Mapのputでキーと値の引数の順序を逆にしてしまう間違い。
出題の前提:平成20年度秋期基本情報技術者午後問8の問題文およびJavaプログラム仕様
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.31 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.32 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.33 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.34 ↗(cdn.fe-siken.com)
ビット操作によるマスクパターンの生成
アセンブラ言語 (CASL II) · CASL II / ビット演算 / シフト演算 / マスクパターン生成
COMET II / CASL II による1語(16ビット)のマスクパターン生成プログラムに関する次のプログラムの説明およびプログラムを読んで、設問1・設問2に答えよ。 〔プログラムの説明〕 1語のマスクパターンを生成するプログラムである。 (1) プログラムと生成するマスクパターンの対応は次のとおりである。 ・PTN1:最上位ビットから与えられたビット番号(0~15)までのビットを1、それ以外を0に設定 ・PTN2:最上位ビットから与えられたビット番号までのビットを0、それ以外を1に設定 ・PTN3:与えられたビット番号のビットを1、それ以外を0に設定 (2) プログラムは、ビット番号(0~15)をGR1に設定して呼び出され、生成したマスクパターンをGR2に格納して主プログラムに戻る。 (3) プログラムから戻るとき、汎用レジスタGR1の内容は元に戻す。 設問1:プログラム1~3中の空欄 a ~ c に入れる正しい答えを選べ。 設問2:PTN1、PTN2を使用して、与えられたビット番号B1からB2(15 > B1 ≧ B2 > 0)までのビットを0、それ以外を1に設定するプログラムPTN4を作成した。プログラム4中の空欄 d に入れる正しい答えを選べ。
- ア
- 設問1: #0001 / 設問2: AND GR2,GR1
- イ
- 設問1: #0FFF / 設問2: OR GR2,GR1
- ウ
- 設問1: #8000 / 設問2: SLL GR2,0,GR1
- エ
- 設問1: #FFF0 / 設問2: SRA GR2,0,GR1
- オ
- 設問1: #FFFF / 設問2: SRL GR2,0,GR1
- カ
- 設問2: XOR GR2,GR1
解答・解説を表示
解答
設問1 a: ウ, b: オ, c: ア / 設問2 d: カ
解説
まず要点:COMET IIの1語は16ビットで、最上位ビットが15、最下位ビットが0です。SRAは最上位ビットの値を保ったまま右へずらすので、#8000を右へずらすと上位から1が連続します。SRLは空いた上位に0を入れるので、#FFFFを右へずらすと上位が0・下位が1になります。2つのパターンで片方だけ1の部分を取り出すには排他的論理和(XOR)を使います。
解き方
- PTN1〜PTN3が使うシフト命令の種類(SRA・SRL・SLL)と回数から、シフト前に用意すべきビットの初期値を求める。
- PTN4でPTN1(引数B2)とPTN2(引数B1+1)が作る1と0の並びを比べ、目的のパターンにする論理演算(XOR)を導く。
小問ごとの答え
- 小問 設問1 a:ウ
- PTN1では最上位ビット(ビット15)から指定ビット番号kまでの(16-k)個のビットを1にします。GR2に15を入れ、GR1(k)を減算してGR1 = 15 - k とします。その後SRA GR2,0,GR1(算術右シフト)を実行します。COMET IIの算術右シフトは符号ビット(最上位ビット)を保持して空いたビットに符号ビットと同じ値を補います。初期値の最上位ビットが1で、15-k回シフトしたとき空いた上位ビットすべてに1が入るためには、初期値GR2の最上位ビットが1であり、かつ他のビットが0である必要があります(15-k回シフト後に指定範囲外へ1が漏れないようにするため)。したがって初期値は #8000 (1000 0000 0000 0000_2) となります。
- 小問 設問1 b:オ
- PTN2では最上位ビットから与えられたビット番号kまでのビットを0、それ以外(下位側)を1にします。プログラム2ではGR2に16を設定し、SUBL GR2,GR1により GR1 = 16 - k(0番のときは16回、k番のときは16-k回)をシフト回数として設定しています。SRL GR2,0,GR1(論理右シフト)を行うと、上位の空いたビットには0が入り、GR2の元データが右に押し出されます。右シフト後に下位側の残りのビットがすべて1になるためには、シフト前のGR2の全16ビットが1である必要があります。よって空欄bには全ビットが1の #FFFF が入ります。
- 小問 設問1 c:ア
- PTN3は与えられたビット番号kのビットのみを1とし、それ以外を0にします。SLL GR2,0,GR1(論理左シフト)によって、最下位ビットにあった1をkビット分だけ左にシフトさせてビット番号kの位置に配置します。したがってシフト前の初期値GR2はビット0のみが1で他が0である #0001 となります。
- 小問 設問2 d:カ
- PTN4はB1からB2までの範囲のビットを0にし、それ以外を1にするマスクパターンを生成します。まずPTN1にB2を設定して呼び出すと、ビット15〜B2が1、それ以外が0のパターンが得られ、これをスタックに保存します。次にGR1にB1をセットし、LAD GR1,1,GR1で「B1+1」に調整してPTN2を呼び出すと、最上位〜(B1+1)が0、B1〜0が1のパターンが得られます(GR2に格納)。POP GR1によって保存していたPTN1の結果(15〜B2が1、B2-1〜0が0)を取り出します。現在、GR1は「15〜B2が1」、GR2は「B1〜0が1」です。15〜B1+1ではGR1=1, GR2=0で合成結果1、B1〜B2では両方1(GR1=1, GR2=1)なので排他的論理和(XOR)をとると0になり、B2-1〜0ではGR1=0, GR2=1で合成結果1となります。したがって XOR GR2,GR1 を実行することでB1からB2のみが0、それ以外が1のパターンが完成します。
覚えるポイント
- SRA(算術右シフト)は符号ビット(ビット15)と同じ値が上位ビットに補填される。
- SRL(論理右シフト)はシフトによって空いた上位ビットに常に0が補填される。
- 2つの集合の重なり合う共通部分のみを反転(0に)させたいときはXOR演算が有効である。
間違えやすいところ
- PTN1で#FFFFを選んでしまうミス(#FFFFをSRAしても全ビット1のままになる)。
- PTN4の論理演算で、重複区間を0にしたいのにANDやORを選んでしまうミス。
出題の前提:基本情報技術者試験(午後)アセンブラ言語CASL II仕様に基づく出題。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.35 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.36 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.37 ↗(cdn.fe-siken.com)
2次元換字表による文字列の暗号化
ソフトウェア開発 (C言語) · C言語 / 文字列処理 / 暗号化アルゴリズム / 2次元配列
換字表を用いて平文を暗号文に変換するC言語プログラムに関する次の説明及びプログラムを読んで、設問1・設問2に答えよ。 〔プログラムの説明〕 与えられた平文を、換字表を用いて暗号文に変換する関数 encrypt_text である。 (1) 換字表は平文に含まれる92種類の文字を格納した4行23列の2次元文字型配列 ctbl[ROWS][COLS] である。 (2) 平文の先頭から2文字ずつ取り出し、文字数が奇数の場合は末尾に空白文字を付加して2文字とする。 (3) 取り出した2文字について、換字表の位置(行・列)に応じて以下の規則で置き換える。 ・2文字が同じ位置(同一文字)の場合:それぞれの文字の右下(1行下で1列右)の文字に置き換える(最下行・最右列の次はそれぞれ最上行・最左列に循環)。 ・2文字が同じ行にある場合:それぞれの右隣(同じ行の1列右)に置き換える。 ・2文字が同じ列にある場合:それぞれの直下(1行下の同じ列)に置き換える。 ・その他の場合:それぞれの文字と同じ行で、他方の文字と同じ列にある文字に置き換える。 設問1:プログラム中の空欄 a ~ d に入れる正しい答えを選べ。 設問2:平文に含まれる改行文字を除いた文を従来の換字規則で暗号化し、平文と同じ位置に改行文字を挿入する仕様変更を行う。表の変更内容中の空欄 e に入れる正しい答えを選べ。
- ア
- 設問1 a: ch[0] != ' ' / b, c: ch[0] != ch[1] / d: ctbl[(col[0]+1)%ROWS][(row[0]+1)%COLS] / 設問2: 行番号53と54の間
- イ
- 設問1 a: ch[0] != ch[1] / b, c: ch[0] == ch[1] / d: ctbl[col[0]+1][row[0]+1] / 設問2: 行番号54と55の間
- ウ
- 設問1 a: ch[0] == ' ' / b, c: col[0] != col[1] / d: ctbl[col[0]][row[0]] / 設問2: 行番号55と56の間
- エ
- 設問1 a: ch[0] == ch[1] / b, c: col[0] == col[1] / d: ctbl[(row[0]+1)%ROWS][(col[0]+1)%COLS] / 設問2: 行番号56と57の間
- オ
- 設問1 a: sts != EOF / b, c: row[0] != row[1] / d: ctbl[row[0]+1][col[0]+1] / 設問2: 行番号57と58の間
- カ
- 設問1 a: sts == EOF / b, c: row[0] == row[1]
解答・解説を表示
解答
設問1 a: カ, b: カ, c: エ, d: エ / 設問2 e: イ
解説
まず要点:2次元の換字表を使い、2文字の位置関係で置き換え先を変える暗号方式です。行と列が両方同じ(同一文字)、行だけ同じ、列だけ同じ、どちらも違うの4通りに分けて処理します。境界をまたぐときは剰余演算子(%)で先頭や末尾へ折り返します。改行などの制御文字は、元の文字の間の位置を保つように出力します。
解き方
- fgetcの戻り値とEOF判定から、文字数が奇数か偶数かを分ける条件(空欄a)を求める。
- 入れ子になった条件分岐の構造(同一文字・同一行・同一列・その他)から、行と列の一致条件(空欄b,c)を筋道立てて導く。
- 換字規則(1行下・1列右で折り返し)に従い、2次元配列の行と列の添字の計算式(空欄d)を組み立てる。
- 平文の1文字目と2文字目の間にあった改行を出すべきタイミング(空欄e)を特定する。
小問ごとの答え
- 小問 設問1 a:カ
- 平文から2文字目を取得するために sts = fgetc(ifp); を実行した際、ファイルの末尾に達していると sts の値は EOF になります。このとき「文字数が奇数の場合、最後の1文字について、後ろに空白文字1文字を追加して2文字にして処理を行う」という仕様を満たすため、ch[1] に空白文字 ' ' を設定します。したがって条件式は sts == EOF となります。
- 小問 設問1 b:カ
- プログラムの構造を見ると、行番号40の if(b) の内側で「2文字が同一の場合」と else「2文字が同じ行にある場合」に分岐しています。同一文字である場合も含めて両者は「2文字が同じ行にある」という共通点を持っています(同一文字ならば当然 row[0] == row[1])。したがって外側の if(b) では row[0] == row[1] を判定します。
- 小問 設問1 c:エ
- 行番号40で row[0] == row[1](同じ行)であることが判定されているため、行番号41の if(c) で「2文字が同一の場合」を判定するには、列番号も一致していること、すなわち col[0] == col[1] を調べます。また行番号47の else if(c) では行番号40の条件(同じ行)が偽の場合に来るため、col[0] == col[1] で「2文字が同じ列にある場合」を正しく判定できます。
- 小問 設問1 d:エ
- 2文字が同一位置にある場合、仕様により「右下(1行下で1列右)にある文字に置き換える」とあります。さらに最下行・最右列を越えたときの循環は余り演算(% ROWS, % COLS)で行います。行インデックスは (row[0] + 1) % ROWS、列インデックスは (col[0] + 1) % COLS です。配列の添字順序は ctbl[行][列] であるため、ctbl[(row[0]+1) % ROWS][(col[0]+1) % COLS] が正解です。
- 小問 設問2 e:イ
- 変更後のプログラムでは、2文字目の読み取り直前に現れた改行文字の個数が cnt2 にカウントされています。平文における文字の順序は「1文字目 → 改行文字(複数可) → 2文字目」であるため、暗号文を出力する際にも「暗号化された1文字目の出力(行番号54: fputc(ch[0], ofp);)」と「暗号化された2文字目の出力(行番号55: fputc(ch[1], ofp);)」の間に、挟まれていた改行文字を cnt2 個だけ出力する必要があります。したがって挿入位置は行番号54と55の間になります。
覚えるポイント
- fgetc() はファイルの終端に達すると EOF(一般に -1)を返す。
- 2次元配列 ctbl[行][列] の添字循環には、(index + 1) % サイズ を用いる。
- 文字と文字の間に挟まれた改行を出力するときは、1文字目の出力直後かつ2文字目の出力直前の位置に挿入する。
間違えやすいところ
- 配列の添字を[row][col]とすべきところを[col][row]と取り違えてしまうミス。
- 奇数文字の判定で、1文字目自体が空白かどうかを判定してしまうミス。
出題の前提:基本情報技術者試験(午後)C言語プログラミング問題に基づく出題。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.38 ↗(cdn.fe-siken.com) / 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)
論理式評価プログラムの動作検証用文字列生成(COBOL)
ソフトウェア(COBOL) · COBOL / 論理式 / テストデータ生成 / 構文チェック
論理式評価プログラムEVAL-EXPの動作を検証するため、論理式を構成するすべてのパターンの文字列を自動生成するプログラムGEN-EXPおよびその構文チェック機能の追加に関する問題である。プログラムGEN-EXPの空欄[ a ]〜[ c ]、および構文チェック機能追加における表2の空欄[ d ]、[ e ]に入る適切な字句を選択せよ。
- 設問1 a ア
- ADD 1 TO NUM-TBL(WK-I)
- 設問1 a イ
- ADD 1 TO WK-I
- 設問1 a ウ
- MOVE 1 TO NUM-TBL(WK-I)
- 設問1 a エ
- SUBTRACT 1 FROM WK-I
- 設問1 b オ
- UNTIL EXIT-SW = 1
- 設問1 b カ
- UNTIL WK-I < 1
- 設問1 b キ
- UNTIL WK-I > EXP-L
- 設問1 c ア
- ADD 1 TO NUM-TBL(WK-I)
- 設問1 c イ
- ADD 1 TO WK-I
- 設問1 c ウ
- MOVE 1 TO NUM-TBL(WK-I)
- 設問1 c エ
- SUBTRACT 1 FROM WK-I
- 設問2 d ア
- "&" OR "|" OR ")"
- 設問2 d イ
- "T" OR "F" OR "("
- 設問2 d ウ
- "T" OR "F" OR ")"
- 設問2 e エ
- ADD 1 TO NEST-LEVEL
- 設問2 e オ
- SUBTRACT 1 FROM NEST-LEVEL
解答・解説を表示
解答
設問1 a: ウ, b: カ, c: ア / 設問2 d: イ, e: エ
解説
まず要点:n進数のカウンタと同じ仕組みで文字列の全組み合わせを作り、文法の規則を満たすか1つずつ確かめます。隣り合ってよい文字の種類の制約と、括弧の深さが負にならないという条件を確認します。
解き方
- 設問1では、EXP-RECとNUM-TBLの初期化処理、最下位けたからの加算と繰り上がりのループ制御条件を特定する。
- 設問2では、文法規則表(表1)の遷移の制約からエラー条件を導き、開き括弧に対するスタックの深さの加算操作を特定する。
小問ごとの答え
- 小問 設問1 a:ウ
- 作業領域の初期化処理であり、長さEXP-Lの論理式の全桁に対応するNUM-TBLの各要素を初期値である1に設定するため、MOVE 1 TO NUM-TBL(WK-I)が入ります。
- 小問 設問1 b:カ
- 長さEXP-L桁のすべての組み合わせを生成するループです。最上位桁(WK-I = 1)から繰り上がりが生じた場合にWK-Iから1引かれて0(WK-I < 1)となるため、UNTIL WK-I < 1が終了条件となります。
- 小問 設問1 c:ア
- 最下位桁(WK-I = EXP-L)から数値をカウントアップする処理であるため、対象桁の数値を1加算するADD 1 TO NUM-TBL(WK-I)が適切です。
- 小問 設問2 d:イ
- 左側が「T, F又は)」の場合、表1より右側として許されるのは「&, |又は)」のみです。したがって構文エラーとなる条件は右側が「T, F又は(」の場合なので、"T" OR "F" OR "("が入ります。
- 小問 設問2 e:エ
- 括弧の対応をチェックするため、開き括弧「(」が現れた際にはネストレベルを1増加させる必要があるので、ADD 1 TO NEST-LEVELが適切です。
覚えるポイント
- 多桁の全パターン生成では、最下位桁から順に加算し、最大値超過時にけた上がりを行うアルゴリズムを用います。
間違えやすいところ
- 構文チェックのIF文で、「許される条件」と「エラーとする条件(許されない条件)」の論理を逆にしないよう注意が必要。
出題の前提:平成20年度秋期基本情報技術者午後問11
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.44 ↗(cdn.fe-siken.com) / 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)
正規表現パターン照合プログラム(Java)
ソフトウェア(Java) · Java / 正規表現 / デザインパターン / オブジェクト指向
文字列照合用パターン(正規表現の簡易版)を解析し、与えられた文字列と照合するプログラムに関する問題である。各パターン要素をインタフェースPatternElementの実装クラスとして表現している。設問1の空欄[ a ]〜[ e ]に入れる正しい答え、および設問2の仕様変更に関する記述として適切なものをそれぞれ選べ。
- 設問1 a ア
- str.charAt(index) != ch
- 設問1 a イ
- str.charAt(index) < ch
- 設問1 a ウ
- str.charAt(index) == ch
- 設問1 a エ
- str.charAt(index) > ch
- 設問1 b ア
- str.length() < index
- 設問1 b イ
- str.length() <= index
- 設問1 b ウ
- str.length() > index
- 設問1 b エ
- str.length() >= index
- 設問1 c ア
- AnyChar('.')
- 設問1 c イ
- AnyChar()
- 設問1 c ウ
- AnyChar(c)
- 設問1 d エ
- AnyChar(i)
- 設問1 d オ
- OneChar('.')
- 設問1 d カ
- OneChar()
- 設問1 d キ
- OneChar(c)
- 設問1 d ク
- OneChar(i)
- 設問1 e ア
- !pattern.equals(str)
- 設問1 e イ
- !pattern.matches(str)
- 設問1 e ウ
- pattern.equals(str)
- 設問1 e エ
- pattern.matches(str)
- 設問2 ア
- 文字'^'は、常に通常文字として扱われる。
- 設問2 イ
- 文字'^'は、引数patternの先頭にあるときだけメタ文字として扱われ、それ以外のときは、通常文字として扱われる。
- 設問2 ウ
- 文字'^'は、引数patternの先頭にあるときだけメタ文字として扱われ、それ以外のときは、無視される。
- 設問2 エ
- 文字'^'は、引数patternの先頭にあるときだけメタ文字として扱われ、それ以外のときは、例外が発生する。
解答・解説を表示
解答
設問1 a: ウ, b: ウ, c: イ, d: キ, e: エ / 設問2: イ
解説
まず要点:照合パターンを構成する要素(通常文字・任意の1文字・先頭や末尾を表すアンカー)を別々のクラスにして、共通のインタフェースで扱います。リストを前から順にたどって文字列と照合します。
解き方
- 設問1では、各PatternElement実装クラス(OneChar, AnyChar)の照合条件式、compileメソッド内での要素の生成、Patternの使い方を順に導く。
- 設問2では、compileループ内の条件分岐に変更(i == 0の追加)を加えたときの分岐先の変化(先頭以外はelse節へ移る)を追う。
小問ごとの答え
- 小問 設問1 a:ウ
- OneCharクラスの一致判定であり、対象文字列のindex番目の文字が保持する文字chと一致しているかを比較するため、str.charAt(index) == chとなります。
- 小問 設問1 b:ウ
- AnyCharクラスは任意の一文字に一致するため、文字列strの位置indexに1文字以上残っている条件(str.length() > index)を判定します。
- 小問 設問1 c:イ
- '.'は任意の一文字を表すメタ文字なので、引数なしコンストラクタでAnyCharインスタンスを生成するAnyChar()が入ります。
- 小問 設問1 d:キ
- メタ文字以外の通常文字はOneCharクラスで保持するため、読み取った文字cを渡して生成するOneChar(c)が入ります。
- 小問 設問1 e:エ
- Patternクラスのmatchesメソッドを呼び出して文字列全体または部分一致を判定し、trueなら"matches"を出力するため、pattern.matches(str)となります。
- 小問 設問2:イ
- 条件文がc == '^' && i == 0に変更されると、インデックス0(先頭)の時のみBeginningOfStringが生成され、それ以外の位置にある'^'はelse節に流れて通常の文字としてOneChar('^')が生成されます。
覚えるポイント
- 正規表現のメタ文字'^'や'$'は、特定の位置条件(index == 0 や index == str.length())のみを検証し、文字列の長さ消費を0とするパターン要素としてモデル化できます。
間違えやすいところ
- JavaのStringのインデックスは0からstr.length()-1までで、str.length()は文字が存在しない位置(末尾)を指すことに注意が必要。
出題の前提:平成20年度秋期基本情報技術者午後問12
出典: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) / IPA公式問題冊子(第三者保管の保存版) p.55 ↗(cdn.fe-siken.com)
アンケート集計と棒グラフ出力プログラムの解析
ソフトウェア(アセンブラ) · CASL II / 論理シフト / フラグレジスタ / 集計処理 / グラフ出力
アンケートに対するn人分の回答(1人分は16ビットの1語で、左端から項目1〜16に対応し、1が「はい」、0が「いいえ」を表す)を集計し、棒グラフとして出力する副プログラム SUMMARY について、プログラム中の空欄 a 〜 d に入る正しい字句および設問2の空欄 e, f に入る数値を答えよ。
- ア
- 設問1 a: LAD GR5,1,GR5 / b: JMI ON / c: LAD GR1,-1,GR1 / d: JPL LOOP4 / 設問2: 4
- イ
- 設問1 a: LAD GR5,2,GR5 / b: JNZ ON / c: LAD GR1,1,GR1 / d: JPL LOOP5 / 設問2: 6
- ウ
- 設問1 a: LAD GR5,3,GR5 / b: JOV ON / c: LAD GR2,-1,GR2 / d: JZE LOOP4 / 設問2: 11
- エ
- 設問1 a: LAD GR5,4,GR5 / b: JPL ON / c: LAD GR2,1,GR2 / d: JZE LOOP5 / 設問2: 16
- オ
- 設問2: 17
- カ
- 設問2: 20
- キ
- 設問2: 48
解答・解説を表示
解答
設問1 a: ウ, b: ウ, c: イ, d: ア / 設問2 e: カ, f: イ
解説
まず要点:CASL IIの論理左シフト(SLL)では、押し出されたビットがフラグレジスタのOFに入るので、JOV命令で最上位ビットが1だったかを判定できます。出力バッファを消さずに上の行から下の行へ'*'を書き足す方式では、各項目の棒グラフの先端の行だけに'*'を書くことで無駄な上書きを防ぎます。
解き方
- 設問1:初期化ループの増分(3文字単位)、ビット判定(SLL後のOF判定)、ポインタの更新(次の語へ+1)、グラフ出力ループの継続条件(減算結果が正の間続ける)をそれぞれ文脈から特定する。
- 設問2 e:3人分の回答ビット列について、SLL命令が実行される回数を追う。残りビットが0になった直後のSLL(GR2が0となりJZEで分岐)まで数える。
- 設問2 f:行44のST命令が実行される条件を整理し、「はい」の回答数が1以上の項目数と同じであることに気づいて項目数を数える。
小問ごとの答え
- 小問 設問1 a:ウ
- PBUFは全48文字(16項目×各3文字)であり、LOOP1の各反復で3文字分の初期化(ST命令3回)を行うため、ポインタGR5を3進める LAD GR5,3,GR5 が適切です。
- 小問 設問1 b:ウ
- SLL命令で左シフトした際、押し出された最上位ビットの値がOF(オーバーフローフラグ)に設定されます。「はい(1)」のときONへ分岐するためには、OFが1で分岐する JOV ON を指定します。
- 小問 設問1 c:イ
- 1人分の回答の集計を終えた後、次の人の回答(次の語)を参照するため、回答領域の先頭アドレスを指すポインタGR1を1加算する LAD GR1,1,GR1 が適切です。
- 小問 設問1 d:ア
- グラフの1行を出力後、高さを示すGR5から1を減算(SUBA GR5,=1)します。減算結果が正(GR5 > 0)であれば次の行を出力するためにLOOP4へ戻る必要があるため、JPL LOOP4 が適切です。
- 小問 設問2 e:カ
- 各回答で最上位から順にシフトし、残りのビットが0になった次の回のSLL後にJZEでループを抜けます。1人目は8回、2人目は5回、3人目は7回実行され、合計で20回(カ)となります。
- 小問 設問2 f:イ
- 行44のST命令は、各項目の「はい」の人数が走査行の高さGR5と一致した瞬間に1回だけ実行されます。回答が1人以上ある項目は項目1, 2, 3, 4, 6, 7の6項目存在するため、合計実行回数は6回(イ)となります。
覚えるポイント
- CASL IIのSLL命令では、最後に押し出されたビットがOFに設定されるためJOVで1か判定できる
- グラフ出力バッファをクリアせず上書き維持するアルゴリズムでは、各棒の最大値の高さでのみ文字設定が行われる
間違えやすいところ
- SLL後のJZE判定でループを抜けるとき、最後の1ビットを処理した次のSLL(結果が0になるシフト)も1回として数え忘れること
- 行44のST命令を、グラフ出力全体の'*'の総数(各項目の人数合計)と混同し、各項目1回だけ設定されることを見落とすこと
出題の前提:平成20年度秋期 基本情報技術者試験 午後 問13
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2008年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.56 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.57 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.58 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.59 ↗(cdn.fe-siken.com)
2008年度 秋期 午後
参照した公式資料
IPA(PDF保管先:基本情報技術者試験ドットコム)が公開した2008年度 秋期 午後の問題・解答資料です。
- IPA公式問題冊子(第三者保管の保存版) ↗ — cdn.fe-siken.com(PDF・72ページ)
- IPA公式解答例(第三者保管の保存版) ↗ — cdn.fe-siken.com(PDF・4ページ)

