旧制度の午前・午後と、2023年度以降の科目A・科目Bの公開問題を区別しています。現在の試験対策では現行シラバスと科目Bの形式を確認してください。公開問題は本試験の全出題を網羅する資料ではありません。
2007年度 秋期 午後の概要
IEEE 754形式による単精度浮動小数点数の表現と加算
基礎理論 · 浮動小数点数 / IEEE 754 / 正規化 / 2進数 / 仮数部の桁合わせ
IEEE 754規格による単精度浮動小数点数(符号部1ビット、指数部8ビット、仮数部23ビット)の表現規則および加算処理に関する問題である。設問1では10進数 -0.75 をIEEE 754形式に変換したときの符号部 a、指数部 b、仮数部上位8けた c を求める。設問2では与えられた2つの単精度浮動小数点数を加算した結果を求める。
- ア
- 設問1: 0 / 設問2: 指数部 10000000, 仮数部上位 10010
- イ
- 設問1: 1 / 設問2: 指数部 10000000, 仮数部上位 11100
- ウ
- 設問1: 01111110 / 設問2: 指数部 10000010, 仮数部上位 10010
- エ
- 設問1: 01111111 / 設問2: 指数部 10000010, 仮数部上位 11100
- オ
- 設問1: 10000000
- カ
- 設問1: 11000000
解答・解説を表示
解答
設問1: a=イ, b=ウ, c=オ; 設問2: ウ
解説
まず要点:IEEE 754(浮動小数点数の表し方を定めた国際規格)の単精度では、符号1ビット・指数8ビット・仮数23ビットで数を表します。指数には決まった下駄(バイアスと呼ぶ127)を足して入れます。仮数は1.xxxxの形にそろえ(正規化)、先頭の1は省略します。足し算では、小さい方の指数を大きい方に合わせてから仮数を足し、最後にそろえ直します。
解き方
- 数を2進数に直し、1以上2未満の形になるように仮数部と指数部へ正規化します。
- 符号(正は0、負は1)、127を足した指数部、先頭の1を省いた仮数部を決めます。
- 足し算では、指数の小さい方の仮数をずらして大きい方にそろえてから足します。
小問ごとの答え
- 小問 設問1 a:イ
- 変換対象の数値 -0.75 は負の数であるため、符号部(ビット31)は 1 となります。
- 小問 設問1 b:ウ
- -0.75 は2進数で -0.11(2) であり、正規化すると -1.1(2) × 2^(-1) となります。指数 B = -1 にバイアス値 127 を加えると 126 となり、8ビット2進数表記で 01111110 となります。
- 小問 設問1 c:オ
- 正規化した仮数 1.1(2) から整数部の 1 を除いた小数部分は .1(2) です。これをビット22から順に格納するため、仮数部上位8けたは 10000000 となります。
- 小問 設問2:ウ
- 数1は指数部128(B=1)で仮数が1.01(2)、数2は指数部130(B=3)で仮数が1.01(2)です。指数を大きい方の3に揃える桁合わせを行うと、数1は 0.0101(2) × 2^3 となります。加算すると (0.0101 + 1.0100)(2) × 2^3 = 1.1001(2) × 2^3 となり、指数部は 3 + 127 = 130 (10000010)、仮数部上位5ビットは 10010 となるためウが正解です。
覚えるポイント
- IEEE 754単精度では指数に127を加えた値を格納し、仮数の先頭の1(ケントビット)は省略します。
- 浮動小数点数の加算では、必ず指数の大きい方に合わせて仮数部を右シフトする桁合わせを行います。
間違えやすいところ
- 指数部に127を足し忘れたり、2の補数と混同したりする間違いがあります。
- 正規化で先頭の1を省かずにそのまま入れてしまうミスが多いです。
出題の前提:平成19年度秋期基本情報技術者試験午後問1出題条件
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.5 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.6 ↗(cdn.fe-siken.com)
運送業の集配管理における関係データベースとSQL
データベース · SQL / COUNT関数 / 副問合せ / IN述語 / MAX関数
運送事業における支店、集配センタ、配達地域、配達品、移送履歴の関係データベースを対象に、集配センタが管理する支店数の集計(設問1)、特定支店が受付・直接配達した配達品の一覧抽出SQL(設問2)、および最新移送履歴を抽出するSQL文の実行意図の解析(設問3)を行う問題である。
- ア
- 設問1: SELECT COUNT(支店コード) ... NOT IN ('A01') / 設問2: 移送履歴表 / 設問3: 預り番号が0000004である配達品が最も長い期間保管されていた支店
- イ
- 設問1: SELECT COUNT(支店コード) ... WHERE 集配センタコード = 'A01' / 設問2: 支店表 / 設問3: 預り番号が0000004である配達品の依頼元
- ウ
- 設問1: SELECT COUNT(支店コード) ... WHERE 支店コード = 'A01' / 設問2: 配達地域表 / 設問3: 預り番号が0000004である配達品のすべての移送履歴
- エ
- 設問1: SELECT 支店コード ... WHERE 集配センタコード = 'A01' / 設問2: 配達品表 / 設問3: 預り番号が0000004である配達品の最新の集配場所と日時
- オ
- 設問1: SELECT 集配センタコード ... / 設問2: AND / 設問3: 預り番号が0000004である配達品を受付けてから配達するまでに経過した日数と時間
- カ
- 設問2: IN
- キ
- 設問2: NOT IN
- ク
- 設問2: OR
解答・解説を表示
解答
設問1: イ; 設問2: a=エ, b=オ, c=カ; 設問3: エ
解説
まず要点:関係データベースのSQLでは、行数を数えるCOUNT関数、複数の条件を同時に満たすAND、副問合せの結果と照合するIN述語を使います。履歴のように時系列で並ぶ表から最新の1件を取るには、まずMAX(最大値)で一番新しい日時を求め、それと同じ日時の行を選び出します。
解き方
- 各表がどんな列を持ち、主キーと外部キーでどうつながるかを確認します。
- 必要に応じて使う表、つなぐ条件(AND/OR)、比べる述語(IN)を選びます。
- MAXを使った副問合せの意味を読み取り、主問合せで取り出される最新行を判断します。
小問ごとの答え
- 小問 設問1:イ
- 集配センタA01が管理する支店数を求めるには、支店表から WHERE 集配センタコード = 'A01' の条件で抽出し、COUNT(支店コード)で件数を数えます。
- 小問 設問2 a:エ
- 届け先住所、届け先氏名、受付支店コードを属性として持つテーブルは配達品表であるため、FROM句には配達品表が入ります。
- 小問 設問2 b:オ
- 受付支店がS11である条件と、届け先がS11の管轄地区である条件の両方を満たす必要があるため、論理積であるANDで結合します。
- 小問 設問2 c:カ
- 支店S11が受け持つ管轄地区は複数存在する可能性があり、副問合せが複数行を返すため、比較述語にはINを用います。
- 小問 設問3:エ
- 副問合せで預り番号0000004の最大(最新)の通過日時を取得し、主問合せでその日時の通過店コードと入出区分を取得しているため、最新の集配場所と日時が分かります。
覚えるポイント
- 副問合せが複数の値を返す可能性がある場合は「=」演算子ではなく「IN」演算子を使用します。
- MAX(日時)を副問合せで取得してWHERE句で一致させるパターンは、履歴データから最新状態を取得する定番の技法です。
間違えやすいところ
- 支店表の主キーの支店コードと、外部キーの集配センタコードを混同するミスがあります。
- 副問合せが返す値は1つだけだと思い込み、INではなく=(等号)を選ぶ誤りがあります。
出題の前提:平成19年度秋期基本情報技術者試験午後問2出題条件
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.7 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.8 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.9 ↗(cdn.fe-siken.com)
通信回線のバスタブ曲線と信頼性評価(MTBF・MTTR)
テクノロジ系 · バスタブ曲線 / 信頼性特性値 / MTBF / MTTR
A社の通信回線X、Y、Z(同一のバスタブ曲線に従う)の運用状況およびバスタブ曲線の特性に関する記述に基づき、YとZの両方の故障頻度が安定する時期(今年から数えた年数aと継続期間b)、ならびに昨年のXのMTBF(c)とYの故障時間の合計(d)を求める。
解答・解説を表示
解答
a: ウ, b: ウ, c: イ, d: イ
解説
まず要点:機械の故障率は、初期故障・偶発故障・摩耗故障の3つの時期をたどるバスタブ曲線で表されます。信頼性の目安として、MTBF(平均してどのくらい故障せずに動くかを示す時間)は「動いた時間の合計÷故障した回数」、MTTR(故障してから直るまでの平均時間)は「止まった時間の合計÷故障した回数」で求めます。
解き方
- XとYの実績から、初期故障(1〜3年目)、偶発故障(4〜11年目)、摩耗故障(12年目以降)の時期を読み取ります。
- 今年を1年目とし、2つの回線が偶発故障に入る年と終わる年を比べて、そろう開始年aと続く年数bを求めます。
- YのMTTRと故障回数からYの故障時間の合計dを計算し、その6倍からXの故障時間と回数を求めます。
- Xの運用時間から故障時間を引いて稼働時間を出し、故障回数で割ってMTBFのcを求めます。
小問ごとの答え
- 小問 a:ウ
- 回線Yの記述より、導入4年目から故障頻度が安定したため初期故障期間は3年間です。回線Zは今年導入2年目であるため、偶発故障期間(4年目)に入るのは今年から数えて3年目(今年=1年目、来年=2年目、再来年=3年目)となります。
- 小問 b:ウ
- 回線Xの記述より導入12年目から故障頻度が増加したため、偶発故障期間は11年目までです。今年7年目の回線Yは今年から数えて5年目(11年目)まで安定します。したがってZとYがともに安定するのは、今年から数えて3年目から5年目までの3年間となります。
- 小問 c:イ
- Yの故障時間合計が12時間であるため、Xの故障時間合計はその6倍の72時間です。XのMTTRが6時間より故障回数は72÷6=12回です。稼働時間は6,240-72=6,168時間となり、MTBFは6,168÷12=514時間となります。
- 小問 d:イ
- MTTR=故障時間合計÷故障回数の関係式より、Yの故障時間合計=MTTR×故障回数=4時間×3回=12時間と求まります。
覚えるポイント
- MTBFの算出に用いる分子は運用時間全体ではなく、故障時間を差し引いた「実稼働時間」である。
- バスタブ曲線における偶発故障期間は故障率が低く安定している期間を指す。
間違えやすいところ
- MTBFを計算するとき、運用時間から故障時間を引かずに故障回数で割ってしまう間違いです。
- 「今年から数えて何年目」を数えるとき、今年を1年目と数え間違えるミスがあります。
出題の前提:平成19年度秋期基本情報技術者試験 午後 問3
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.10 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.11 ↗(cdn.fe-siken.com)
実数値を10進数字列に変換するプログラム(スタックの活用)
テクノロジ系 · 擬似言語 / スタック / 基数変換 / 文字列処理
実数値を10進数字列に変換する副プログラム FloatFormat について、整数部を上位桁へ進める代入文(a)、整数部が0の場合の小数点の前の文字処理条件(b)、小数部を1桁ずつ抽出・更新する処理(c, d)、および Float = -0.012, Num = 2 で呼び出した際の処理αとβの実行回数(e, f)を求める。
解答・解説を表示
解答
設問1: a=エ, b=ウ, c=エ, d=ア; 設問2: e=ア, f=ウ
解説
まず要点:数を文字列に直すとき、整数部は10で割った余りとして下の桁から順に求まります。そこでスタック(後から入れたものを先に出す仕組み)にためてから取り出すと、上の桁から正しい順に並べられます。小数部は10倍して整数部を取り出し、残った小数部を残す処理を繰り返します。
解き方
- 整数部の処理で、一番下の桁を取り出した後に次の桁へ進めるための割り算の式aを見つけます。
- 正の0.xと負の-0.xのそれぞれで、小数点の前に'0'を出すべき条件式bを考えます。
- 小数部を取り出すループで、10倍する処理cと整数部を引く処理dを決めます。
- 入力-0.012とNum=2の場合を手で追いかけ、処理αとβが通る回数e, fを数えます。
小問ごとの答え
- 小問 設問1 a:エ
- 整数部を1の位から上位桁へ進めるため、10で割った整数の商をFintに代入します。擬似言語の整数同士の除算は商を返すため「Fint ÷ 10」が適切です。
- 小問 設問1 b:ウ
- 整数部が0の場合に文字'0'を格納する条件です。正数で整数部が0ならL=0であり、負数で整数部が0ならOut[0]='-'が格納されてL=1となっているため、「L = 0 or (L = 1 and Out[0] = "-")」となります。
- 小問 設問1 c:エ
- 小数部から1桁ずつ数字を抽出するため、Fdecを10倍して最上位の小数を整数部に繰り上げる「Fdec × 10」を行います。
- 小問 設問1 d:ア
- 10倍した値から整数部分(抽出済みの数字)を取り除くため、Fdecからその整数部を減算する「Fdec - Int(Fdec)」を実行して次の桁の処理に備えます。
- 小問 設問2 e:ア
- Float = -0.012 のとき F = 0.012 となり、Fint = Int(F) = 0 です。ループ条件「Fint > 0」が初めから偽となるため、ループ内のαの部分は1回も実行されず0回(ア)となります。
- 小問 設問2 f:ウ
- Num = 2 より小数部ループ「N: 1, N <= Num, 1」は N=1 と N=2 の2回反復されます。ループの先頭にあるβの部分は各反復で必ず1回実行されるため、合計実行回数は2回(ウ)となります。
覚えるポイント
- 下位桁から順に取り出される数値を正順に並べる典型的なデータ構造としてスタックが有効である。
- 小数の各桁抽出は「10倍して整数部を記録し、小数部を残す」手順を桁数分繰り返す。
間違えやすいところ
- 整数部が0で負の数のとき、配列の先頭にマイナス記号があるのを見落として判定を誤ります。
- Fintが0のとき「Fint > 0」の判定でループが一度も回らず、αを1回と勘違いする点に注意です。
出題の前提:平成19年度秋期基本情報技術者試験 午後 問4
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
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)
通信販売システムにおける関連商品表示プログラムの設計
ソフトウェア設計 · プログラム設計 / フローチャート / 関係データベースの突合せ処理
通信販売システムにおいて、会員の購入実績を基にお勧め商品を表示する「新規登録商品の表示機能」および「検索した商品に関連する商品の表示機能」の設計に関する説明と流れ図を読み、各設問(設問1〜設問3)に答えよ。
- ア
- 中間表A:会員ID、中間表B:商品カテゴリ
- イ
- 中間表A:会員ID、中間表B:商品名
- ウ
- 中間表A:商品コード、中間表B:商品価格
- エ
- 中間表A:商品コード、中間表B:商品カテゴリ
- オ
- 中間表A:商品コード、中間表B:商品名
解答・解説を表示
解答
設問1: エ; 設問2: a=ア; 設問3: b=イ, c=イ, d=ア
解説
まず要点:関係データベースを使ったまとめ処理の設計では、処理と処理の間でデータを渡す中間表の項目(スキーマ)の決め方と、主キー・外部キーで表を結び付ける手順を理解することが大切です。後ろの処理で何を手がかりに突き合わせるかを先に考え、中間表に必要な項目を決めます。
解き方
- 図3の流れ図と説明から、中間表A・Bが次の処理でどのキーとして使われるかを読み取ります。
- 最新購入実績の抽出で、購入表から対象会員の一番新しい購入日時の行を取る条件を導きます。
- 図4の流れ図と説明から、購入明細表と購入表をたどる順(商品コード→購入明細表→購入番号→購入表→会員ID)を確かめます。
小問ごとの答え
- 小問 設問1:エ
- 「商品カテゴリの抽出」では中間表Aと商品表を商品コードで突き合わせるため中間表Aには商品コードが必要です。「登録商品の抽出」では中間表Bの商品カテゴリと商品表の商品カテゴリを突き合わせるため中間表Bには商品カテゴリが必要です。
- 小問 設問2 a:ア
- 新規登録商品の表示機能の説明(1)①に「その会員の最も新しい購入の実績をすべて取り出す」とあり、購入表から該当会員の最新の購入日時のレコードを1件抽出します。
- 小問 設問3 b:イ
- 中間表Gの商品コードを用いて該当商品が買われた履歴を調べるため、商品コードを外部キーとしてもつ購入明細表(b=イ)を検索します。
- 小問 設問3 c:イ
- 購入明細表から取得するのは「購入番号」(c=イ)です。これを用いてどの購入取引で買われたかを特定します。
- 小問 設問3 d:ア
- 取得した購入番号ごとに購入表(d=ア)を検索し、その購入者がログイン中の会員IDと一致するかどうかを判定します。
覚えるポイント
- データフロー図や中間表を伴う設計問題では、直後の突合せ処理で参照されるキー項目に着目して中間構造を決定します。
間違えやすいところ
- 購入表(取引の単位)と購入明細表(商品の単位)の役割を逆にして、探す表を間違えるミスに注意です。
出題の前提:平成19年度秋期基本情報技術者試験午後問5の出題条件に基づく
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
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)
2次元文字パターンの回転および反転処理プログラム
プログラミング · C言語 / 2次元配列 / 画像・文字パターンの幾何変換
8文字×6文字の2次元配列に格納された文字パターンを、引数 invtype に応じて90度右回転・90度左回転・上下反転・左右反転して標準出力へ出力するC言語プログラム中の空欄 a 〜 c に入る適切な式を答えよ。
- ア
- invtype == 1
- イ
- invtype == 2
- ウ
- invtype == 3
- エ
- invtype == 4
- オ
- (invtype == 1) || (invtype == 2)
- カ
- (invtype == 3) || (invtype == 4)
解答・解説を表示
解答
a=オ, b=カ, c=エ
解説
まず要点:2次元配列の座標変換では、変換する前と後で「行」と「列」の番号がどう対応するかを式で表し、ループの変数と結び付けます。90度回転では行と列の数が入れ替わりますが、上下反転・左右反転では入れ替わりません。
解き方
- 回転では元の配列のサイズCSZ×RSZがRSZ×CSZに変わることを手がかりに、空欄aを決めます。
- 90度左回転で、出力の行iと列jが元配列in[行][列]のどの添字になるかを具体例で確かめます。
- 左右反転で、各行iの列添字がj→RSZ-1-jと逆になることを確認して空欄cを決めます。
小問ごとの答え
- 小問 a:オ
- 行数と列数の入替えが発生するのは、90度右回転(invtype==1)および90度左回転(invtype==2)のときであるため、条件式は (invtype == 1) || (invtype == 2) となります。
- 小問 b:カ
- 90度左回転後の第i行・第j列の文字は、元のパターンの第j行・第(RSZ - i - 1)列に対応するため、in[j][RSZ - i - 1] となります。
- 小問 c:エ
- 左右反転では行数・列数の入替えはなく、同一行iの中で列番号jが左右対称(RSZ - j - 1)となるため、in[i][RSZ - j - 1] となります。
覚えるポイント
- 2次元配列の90度回転では行数と列数の上限が入れ替わること、および0始まりインデックスでの反転添字が「サイズ - 1 - インデックス」になることを覚えておきます。
間違えやすいところ
- C言語の2次元配列in[CSZ][RSZ]で、第1添字が行・第2添字が列であることを逆にする間違いに注意です。
出題の前提:平成19年度秋期基本情報技術者試験午後問6の出題条件に基づく
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.22 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.23 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.24 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.25 ↗(cdn.fe-siken.com)
COBOLによる健康診断マスタファイルの更新処理
ソフトウェア · COBOL / 索引ファイル / レコード更新 / 配列操作
定期健康診断結果を過去5年分保持する索引ファイル形式のマスタファイル(主キー:従業員番号)に対し、順ファイルである今年度の診断結果を反映するCOBOLプログラムがある。過去の診断結果を1年分シフトして今年度のデータを格納する処理、および前年比で体重が5kg以上増減した従業員をチェックして出力する変更について、プログラム中の空欄を埋めよ。
- 設問1-ア
- MOVE MAST-HEALTH(CNT + 1) TO MAST-HEALTH(CNT)
- 設問1-イ
- MOVE MAST-HEALTH(CNT - 1) TO MAST-HEALTH(CNT)
- 設問1-ウ
- MOVE MAST-HEALTH(CNT) TO MAST-HEALTH(CNT + 1)
- 設問1-エ
- MOVE MAST-HEALTH(CNT) TO MAST-HEALTH(CNT - 1)
- 設問1-オ
- MOVE YEAR-ENO TO MAST-ENO
- 設問1-カ
- MOVE YEAR-HEALTH TO MAST-HEALTH
- 設問1-キ
- MOVE YEAR-HEALTH TO MAST-HEALTH(CNT)
- 設問2(c)-ア
- 行番号26と27の間
- 設問2(c)-イ
- 行番号30と31の間
- 設問2(c)-ウ
- 行番号37と38の間
- 設問2(c)-エ
- 行番号39と40の間
- 設問2(d)-ア
- MAST-WEIGHT(1) <= MAST-WEIGHT(2) - 5
- 設問2(d)-イ
- MAST-WEIGHT(1) >= MAST-WEIGHT(2) - 5
- 設問2(d)-ウ
- YEAR-WEIGHT <= MAST-WEIGHT(1) - 5
- 設問2(d)-エ
- YEAR-WEIGHT >= MAST-WEIGHT(1) - 5
解答・解説を表示
解答
設問1: a=オ, b=ウ; 設問2: c=エ, d=ウ
解説
まず要点:索引ファイルから特定のレコードをランダムに読む(READ)ときは、先に主キーの項目へ探したいキー値を入れておく必要があります。また、配列で世代管理する履歴データを更新するときは、新しい値で上書きする前に古い世代を後ろへ順にずらします。ずらす前に、消える前のデータを使った比較や判定を済ませておくことが大切です。
解き方
- 空欄aでは、READで索引ファイルを探す前に、入力のYEAR-ENOを主キーMAST-ENOへ移す文を特定します。
- 空欄bでは、CNTを4から1へ減らすループで、MAST-HEALTH(CNT)をMAST-HEALTH(CNT+1)へ移すことを確かめます。
- 空欄cでは、昨年の体重MAST-WEIGHT(1)が上書きやずらしで消える前の時点(UPDT-PROC開始直後)を特定します。
- 空欄dでは、増加の条件は既にあるので、減少の条件「今年度の体重<=昨年の体重-5」を組み立てます。
小問ごとの答え
- 小問 設問1 a:オ
- マスタファイルをキー指定でREADする直前に、主レコードキーであるMAST-ENOへ今年度レコードの従業員番号YEAR-ENOを設定する必要があります。
- 小問 設問1 b:ウ
- 過去データを古い方へ順次退避させるため、CNT(4から1まで減少)番目の要素をCNT+1番目へ転記するMOVE MAST-HEALTH(CNT) TO MAST-HEALTH(CNT + 1)を行います。
- 小問 設問2 c:エ
- MAST-WEIGHT(1)が昨年の体重を保持しているのは、過去データ退避ループが始まる直前であるため、UPDT-PROCの先頭である行39と40の間に挿入します。
- 小問 設問2 d:ウ
- 5kg以上の減少を判定するには、今年度の体重YEAR-WEIGHTが前年の体重MAST-WEIGHT(1)から5kgを引いた値以下であるかを比較するため、YEAR-WEIGHT <= MAST-WEIGHT(1) - 5が適切です。
覚えるポイント
- 索引ファイルのREAD前には主レコードキーへの値設定が必須であること
- 配列の要素シフトでは上書き破壊を防ぐために末尾側から順にコピーすること
間違えやすいところ
- ずらす処理の後に判定文を置くと、昨年の体重が今年度のデータで上書き済みになる点を見落とすこと。
出題の前提:平成19年度秋期基本情報技術者試験午後問7
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.26 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.27 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.28 ↗(cdn.fe-siken.com)
Javaによる重み付き待ち行列の実装
ソフトウェア · Java / LinkedList / コレクションフレームワーク / 待ち行列 / キュー
正の整数の重みを持つ要素を扱う待ち行列クラスWeightedQueueについて、要素挿入メソッドofferおよび要素取出メソッドpollの実装を完成させる問題である。要素挿入位置は、末尾からの要素の重みの合計が挿入要素の重み未満となる最も先頭寄りとし、取り出し時は常に先頭から取り出す。プログラム中の空欄を埋め、メソッドpollの動作仕様として正しいものを選択せよ。
- 設問1(a)-ア
- pos
- 設問1(a)-イ
- pos - 1
- 設問1(a)-ウ
- pos + 1
- 設問1(a)-エ
- sum
- 設問1(a)-オ
- sum - 1
- 設問1(a)-カ
- sum + 1
- 設問1(b)-ア
- !=
- 設問1(b)-イ
- <=
- 設問1(b)-ウ
- ==
- 設問1(b)-エ
- >=
- 設問1(c)-ア
- new QueueElement(element, sum)
- 設問1(c)-イ
- new QueueElement(element, weight)
- 設問1(c)-ウ
- QueueElement(element, sum)
- 設問1(c)-エ
- QueueElement(element, weight)
- 設問2-ア
- 待ち行列の先頭要素の取得及び削除をする。ただし,待ち行列に要素がないときはnullを返す。
- 設問2-イ
- 待ち行列の先頭要素の取得及び削除をする。ただし,待ち行列に要素がないときは例外を投げる。
- 設問2-ウ
- 待ち行列の先頭要素を取得する。要素の削除はしない。ただし,待ち行列に要素がないときはnullを返す。
- 設問2-エ
- 待ち行列の先頭要素を取得する。要素の削除はしない。ただし,待ち行列に要素がないときは例外を投げる。
解答・解説を表示
解答
設問1: a=イ, b=エ, c=イ; 設問2: ア
解説
まず要点:LinkedList(つながった要素の並び)を中身に持つキューの実装では、0から始まる添字で末尾の要素はsize-1番目になります。また、java.util.LinkedListのpoll()は先頭の要素を取り出して削除し、中身が空のときは例外を投げずにnullを返します。
解き方
- 空欄aでは、pos = queue.size()から始まるループで末尾の要素を見るため、添字pos-1を指定します。
- 空欄bでは、コメント「末尾からの重みの合計がweight以上になるか」に合わせ、breakの条件をsum>=weightにします。
- 空欄cでは、queue.add(pos, ...)の第2引数にnew QueueElement(element, weight)を渡します。
- 設問2では、内部で呼ぶqueue.poll()のJava APIの仕様(先頭の取得と削除、空ならnull)を確かめます。
小問ごとの答え
- 小問 設問1 a:イ
- 待ち行列の末尾から先頭に向かって走査するため、posが要素数(size)のとき末尾要素のインデックスはpos - 1となります。
- 小問 設問1 b:エ
- 末尾からの重みの累計が挿入要素の重みweight以上になった時点で前方走査を停止するため、比較演算子は>=となります。
- 小問 設問1 c:イ
- LinkedListに追加するオブジェクトはQueueElement型であり、newを用いて要素と重みweightを渡して生成します。
- 小問 設問2:ア
- LinkedListのpollメソッドは先頭要素を取得して削除し、空の場合はnullを返すため、記述アが正しいです。
覚えるポイント
- LinkedListのインデックスは0からsize - 1までであること
- LinkedListのpoll()は先頭の取得・削除を行い、空リスト時はnullを返すこと
間違えやすいところ
- 0から始まる添字で末尾の要素をget(pos)としてしまい、範囲外エラーを起こすこと。
- poll()とpeek()の違い(削除するかどうか)を取り違えること。
出題の前提:平成19年度秋期基本情報技術者試験午後問8
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.29 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.30 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.31 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.32 ↗(cdn.fe-siken.com)
垂直パリティと水平パリティの設定プログラム
ソフトウェア · アセンブラ / パリティチェック / CASL II / ビット演算
連続するN語のブロックに格納された各語に対して偶数パリティビットを設定し、ブロックの直後に1語の水平偶数パリティを設定する副プログラムSETPARに関する問題である。各語のビット15を垂直パリティとし、主プログラム呼び出し時には各語のビット15に0が格納されている。プログラム中の空欄 a、b に入る命令および、仕様変更時の空欄に入る設定値として正しいものをそれぞれ選べ。
- ア
- #0001
- イ
- #7FFF
- ウ
- #8000
- エ
- #8001
- オ
- #FFFE
- カ
- #FFFF
解答・解説を表示
解答
設問1: a=カ, b=カ; 設問2: ウ
解説
まず要点:偶数パリティは、1の個数が偶数になるようにパリティビットを決める仕組みです。ビットの反転は排他的論理和(XOR、2つのビットが違うときだけ1になる計算)で表せます。初期値を0にして、1のビットが現れるたびに反転をくり返すと、全体の1の個数が偶数か奇数かを求められます。
解き方
- 1語の中のビットをSLLで左へずらし、符号ビットの変化(正なら0、負なら1)を見てパリティビットを反転するか決めます。
- 水平パリティは、ブロック全体の全語についてビットごとにXORを累積して計算します。
- 奇数パリティへの変更は、反転の初期状態に最上位ビットが1の#8000をプリセットすると実現できます。
小問ごとの答え
- 小問 設問1 a:カ
- 行8でSLL GR1,1を実行するとビット14が符号ビット(ビット15)へ移動します。このビットが0であれば演算結果は正となりSFは0となるため、JPLにより行11のビット反転処理をスキップしてLP2へ戻る「JPL LP2」が適切です。
- 小問 設問1 b:カ
- 水平パリティは全語の同一ビット位置の排他的論理和によって求められます。行5で初期化された累積レジスタGR4に対し、確定した1語分のデータ(パリティビット含む)が格納されているGR7をビットごとにXORする「XOR GR4,GR7」が入ります。
- 小問 設問2:ウ
- 1の個数が奇数のとき0、偶数のとき1とする奇数パリティにするには、パリティ計算用レジスタGR7の初期状態を行7でビット15が1である「#8000」に設定しておくことで、反転処理の偶奇が反転します。
覚えるポイント
- CASL IIのSLLは送り出されたビットがOFに入り、結果のビット15に応じてSFが設定される。
間違えやすいところ
- SLLの直後の判定でOFを見るJOV命令を選びがちですが、シフト直後のビット15の状態はSF(JPL/JMI)で判定します。
出題の前提:平成19年度秋期基本情報技術者試験午後問9
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.33 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.34 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.35 ↗(cdn.fe-siken.com)
配送物の配送種別及び配送料金計算プログラム
プログラム言語 · C言語 / 条件分岐 / 配列検索 / 料金計算
配送物の重量(weight)、大きさ(size: 縦横高さの合計)、配送先までの距離区分(dist_mode)から、配送種別(class)および配送料金(price)を求めるC言語関数calc_carriageに関する問題である。提示されたテーブルおよび条件判定ロジックに従い、各空欄に入る配送料金や配送種別の値を求めよ。
- ア
- 1,600
- イ
- 1,750
- ウ
- 1,900
- エ
- 2,100
- オ
- 2,300
解答・解説を表示
解答
設問1: a=エ; 設問2: b=エ, c=イ, d=ア, e=イ, f=オ
解説
まず要点:if文を入れ子にした多分岐では、外側の条件から順に絞り込んでいきます。各テーブルの上限値の配列をループで探し、条件に合うインデックスを特定して計算式に当てはめます。
解き方
- 配送物の重量とサイズをif文の閾値(1,000g、10,000g、40cm、150cmなど)と比べ、当てはまる処理ブロック(class)を決めます。
- 選んだブロックの中のテーブル探索ループをたどってインデックスiを求め、対応する料金計算式に代入して金額を出します。
小問ごとの答え
- 小問 設問1 a:エ
- sizeが60cm超100cm以下ではi=1となりMag_tbl[1]=3です。中距離(dist_mode=1)の配送料金は(Base_price + 1 * Ext_price) * 3 = (600 + 100) * 3 = 2,100円となります。
- 小問 設問2 b:エ
- 重量600gはWeight_tbl2[3](1000g)以下ですが、大きさ180cmは規定サイズ(20〜40cm)外であるため内側のelse節に進み、配送種別は2(エ)となります。
- 小問 設問2 c:イ
- 重量3,000gは1000gを超え10000g以下ですが、大きさ180cmはSize_tbl[2](150cm)を超えるため内側のelse節に進み、受付不可の配送種別-1(イ)となります。
- 小問 設問2 d:ア
- 重量12,000gはMax_weight(10,000g)を超えているため最外側のelse節に進み、受付不可の配送種別-2(ア)となります。
- 小問 設問2 e:イ
- 重量80gかつ大きさ30cmは規定サイズ内のclass=1です。80gはWeight_tbl1の25g超60g超100g以下なのでi=2となり、Price_tbl[2]の150円(イ)となります。
- 小問 設問2 f:オ
- 重量400gかつ大きさ30cmはclass=2です。400gはWeight_tbl2の100g超500g以下なのでi=2となり、Weight_tbl2[2] * Unit_price = 500 * 2 = 1,000円(オ)となります。
覚えるポイント
- C言語のforループによるテーブル探索では、条件式を超えた瞬間のインデックスがそのまま適用される。
間違えやすいところ
- 設問2(f)で、サイズが30cmだからと安易にclass=1と決めず、重量400gがWeight_tbl1[2](100g)を超えるためclass=2に分かれる点を見落とさないようにします。
出題の前提:平成19年度秋期基本情報技術者試験午後問10
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.36 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.37 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.38 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.39 ↗(cdn.fe-siken.com)
COBOLによる入金確認リスト作成とマッチング処理
ソフトウェア · COBOL / ファイル突合せ / 整列 (SORT)
銀行からの振込データ(BANK-F)と社内の請求データ(ACCOUNT-F)を突合せ、入金確認リストを出力するCOBOLプログラムに関する設問に答えよ。 〔プログラムの説明〕 ・振込データBANK-F(振込日昇順)を、突合せキーである請求書コードの昇順に整列して突合せを行う。 ・請求データACCOUNT-Fはあらかじめ請求書コード昇順で整列されている。 ・マッチング処理では、両ファイルのキーを比較し、一致した場合は金額差を判定(OKまたはUNMATCH)、請求データのみ存在する場合は未入金(NOT PAID)、振込データのみ存在する場合は請求なし(NO BILL)を出力する。 設問1:プログラム中の空欄 a 〜 e に入る正しい答えを選択肢群から選べ。 設問2:一部の大口取引について振込手数料を自社負担とする仕様変更に伴い、請求金額から手数料を差し引く処理を追加する。追加すべき適切な2箇所(f, g:順不同)を選択肢群から選べ。
- 設問1 a ア
- BANK-AMOUNT
- 設問1 a イ
- BANK-BILL-CD
- 設問1 a ウ
- BANK-CUSTOMER-NM
- 設問1 a エ
- BANK-DATE
- 設問1 b〜e ア
- MOVE "NO BILL" TO P-MESSAGE
- 設問1 b〜e イ
- MOVE "NOT PAID" TO P-MESSAGE
- 設問1 b〜e ウ
- MOVE "UNMATCH" TO P-MESSAGE
- 設問1 b〜e エ
- PERFORM READ-ACCOUNT
- 設問1 b〜e オ
- PERFORM RETURN-BANK
- 設問2 ア
- 行番号47と48の間
- 設問2 イ
- 行番号49と50の間
- 設問2 ウ
- 行番号56と57の間
- 設問2 エ
- 行番号70と71の間
解答・解説を表示
解答
設問1: a=イ, b=イ, c=ウ, d=ア, e=オ; 設問2: f=イ, g=ウ(順不同)
解説
まず要点:順ファイル同士の突合せ(マッチング)では、2つのレコードを同じキーで昇順に並べておく必要があります。キーの大小関係(一致・キー1が大・キー2が大)に応じて、それぞれのレコードの処理と読み進め方を切り替えます。
解き方
- 整列処理(SORT)のキー項目を特定し、突合せキーである請求書コードを指定します。
- EVALUATE TRUEのキー比較の各分岐(>、=、<)に、それぞれメッセージの設定とファイルの読出し処理を割り当てます。
- 仕様変更で請求金額の補正が必要になる分岐(請求データがある分岐)を特定し、挿入する位置を選びます。
小問ごとの答え
- 小問 設問1 a:イ
- 振込データと請求データは請求書コードで突き合わせるため、SORT文のASCENDING KEYには整列用レコードの請求書コード項目であるBANK-BILL-CDを指定します。
- 小問 設問1 b:イ
- 振込キー > 請求キーの場合は振込のない未入金状態であるため、メッセージにNOT PAIDを設定するMOVE "NOT PAID" TO P-MESSAGEが入ります。
- 小問 設問1 c:ウ
- キーが一致し、振込金額と請求金額が不一致の場合の処理であるため、メッセージにUNMATCHを設定するMOVE "UNMATCH" TO P-MESSAGEが入ります。
- 小問 設問1 d:ア
- 振込キー < 請求キーの場合は請求のない振込データであるため、メッセージにNO BILLを設定するMOVE "NO BILL" TO P-MESSAGEが入ります。
- 小問 設問1 e:オ
- 振込キー側のみ処理が進んだため、次の振込レコードを整列結果から読み出すPERFORM RETURN-BANKを実行します。
- 小問 設問2 f:イ
- 請求データが存在する未入金処理の分岐(行番号49と50の間)で請求金額から手数料を減算する必要があります。
- 小問 設問2 g:ウ
- キーが一致した突合せ処理の分岐(行番号56と57の間)で請求金額から手数料を減算する必要があります(fと順不同)。
覚えるポイント
- マージ・マッチング処理では、小さい方のキーを持つファイルを次のレコードへ進める。
- SORT文のOUTPUT PROCEDURE内ではRETURN文でソート済みレコードを1件ずつ取り出す。
間違えやすいところ
- 未入金(振込なし)と請求なしの大小比較の向きを取り違える。
- 手数料計算ルーチンを、請求データがない分岐まで含めて挿入してしまう。
出題の前提:平成19年度秋期基本情報技術者午後問11の出題条件およびCOBOL規格による。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
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による反復子(Iterator)パターンの実装
ソフトウェア · Java / Iteratorパターン / ジェネリクス
指定された条件に合致する要素のみを順次抽出して返す汎用的な反復子(Iterator)の実装プログラムに関する設問に答えよ。 設問1:プログラム1中の空欄 a 〜 d に入れる正しい答えを選択肢群から選べ。 設問2:文字列中に重複した文字が含まれているかを検査する新たな条件クラスAnEvaluator(プログラム5)を用いたとき、抽出される文字列として正しいものを二つ選べ。 抽出対象のリスト:{"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"}
- 設問1 a ア
- !=
- 設問1 a イ
- &&
- 設問1 a ウ
- ==
- 設問1 a エ
- ||
- 設問1 b ア
- !found
- 設問1 b イ
- found
- 設問1 b ウ
- element != null
- 設問1 b エ
- element == null
- 設問1 c ア
- false
- 設問1 c イ
- hasNext()
- 設問1 c ウ
- iterator.hasNext()
- 設問1 c エ
- true
- 設問1 d ア
- E
- 設問1 d イ
- element
- 設問1 d ウ
- iterator.next()
- 設問1 d エ
- next()
- 設問2 ア
- "one"
- 設問2 イ
- "two"
- 設問2 ウ
- "three"
- 設問2 エ
- "four"
- 設問2 オ
- "five"
- 設問2 カ
- "six"
- 設問2 キ
- "seven"
- 設問2 ク
- "eight"
解答・解説を表示
解答
設問1: a=イ, b=イ, c=ア, d=イ; 設問2: ウ, キ
解説
まず要点:Iteratorパターンを絞り込みに使うときは、hasNext()の呼び出し時に条件に合う要素を先に探して保持(先読み)しておきます。そしてnext()でその要素を返し、同時に探索の状態フラグをリセットします。
解き方
- hasNext()メソッド内のwhile文の続ける条件を調べ、要素が未発見で元のコレクションに残りがある条件(!found && iterator.hasNext())を見つけます。
- next()メソッドで返すべき変数(element)と、次回呼び出しのためのフラグ初期化(found = false)を確かめます。
- プログラム5のevaluateメソッドの仕組み(同じ文字の重複検出)を読み解き、対象の単語の中から同じ文字を2つ以上含む単語(three, seven)を選び出します。
小問ごとの答え
- 小問 設問1 a:イ
- 条件に合致する要素がまだ見つかっておらず(!found)、かつ元の反復子に次の要素が存在する間(iterator.hasNext())ループを継続するため、論理積演算子「&&」が入ります。
- 小問 設問1 b:イ
- hasNext()メソッドは条件を満たす未参照要素が存在するかを返すため、ループ終了時のフラグ変数foundの値をそのまま返します。
- 小問 設問1 c:ア
- next()で要素を返却した後、次回のhasNext()呼出しで新たな要素探索を行わせるため、フラグfoundを初期状態のfalseにリセットします。
- 小問 設問1 d:イ
- hasNext()によって条件に合致することが確認され保持されていた要素であるelementを返却します。
- 小問 設問2:ウ, キ
- AnEvaluatorは2重ループにより文字列内の任意の異なる2文字を比較し、同一の文字が存在すればtrueを返します。リストのうち"three"('e'が重複)と"seven"('e'が重複)が条件を満たします。
覚えるポイント
- IteratorのhasNext()は状態を変更せず、next()で返すべき要素の有無だけを確認できるように実装する。
- ルックアヘッド方式では、next()で値を返却する際に探索フラグをリセットして次回の探索を可能にする。
間違えやすいところ
- hasNext()内で見つけた要素をnext()で再び読もうとして、元のiterator.next()を呼んでしまうミス。
- AnEvaluatorの2重ループが文字の重複検査(charAt(i) == charAt(j))をしていることを見落とす。
出題の前提:平成19年度秋期基本情報技術者午後問12の出題条件およびJava SE言語仕様に基づく。
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
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)による2次元ビット配列の検査とカウント
プログラミング · CASL II / ビット演算 / 論理シフト / 2次元配列
16語からなる16×16ビットの2次元配列において、ビット値1が16個並んでいる行、列、対角線の本数を数える副プログラムBTESTおよびSETGR0に関する問題である。プログラム中の空欄 a 〜 h に当てはまる正しい答えを選択せよ。
- ア
- JMI LOOP1
- イ
- JNZ CHECK
- ウ
- JNZ NWORD
- エ
- JPL LOOP1
- オ
- JZE CHECK
- カ
- JZE NWORD
解答・解説を表示
解答
設問1: a=ウ, b=オ; 設問2: c=イ, d=ウ, e=ア, f=ア; 設問3: g=イ, h=エ
解説
まず要点:ビット列の論理積(AND、両方が1のときだけ1になる計算)を使うと、決まった位置のビットが1のままかを判定できます。行の全ビットが1かは#FFFFとの比較(CPL)で調べ、列の全ビットが1かは初期値#FFFFに全行の値を論理積していき、最後に残った1の個数を数えます。対角線は、検査用のビットを各行ごとに1ビットずつずらしながら論理積をとって判定します。
解き方
- 設問1:CPL命令で全ビットが1かを判定すると不一致のときZF=0になるのでJNZ NWORD、ループカウンタGR5の終了判定(GR5=0)ではJZE CHECKを見つけます。
- 設問2:図のビット配列から、全ビットが1の行(語12の1行だけ)、対角線(左下がりはすべて1で#8000、右下がりは語1で途切れて#0000)、全行で1の列(ビット9とビット3で#0208)を読み取ります。
- 設問3:SETGR0内でシフトして1の個数を数える処理では、まだ残るビットがある間(ZF=0)ループするのでJNZ LOOP2とし、ビット15にある対角線の結果をビット0へ移すためにSRL GR2,15を選びます。
小問ごとの答え
- 小問 設問1 a:ウ
- 行12でGR6と#FFFFを論理比較(CPL)し、すべてのビットが1でなければ等しくないためZF=0となります。すべて1でない場合は行カウント(行14)をスキップして次の語の処理(NWORD)へ分岐させる必要があるため、JNZ NWORDが適切です。
- 小問 設問1 b:オ
- 行15でSUBA GR5,=1を実行してループカウンタを減算します。16語すべての処理を終えるとGR5が0となりZF=1となるため、全語処理済みの判定としてJZE CHECKにより行21のCHECKへ分岐します。
- 小問 設問2 c:イ
- GR0には全ビットが1である行の数が加算されます。図の配列例において16ビットすべてが1である行は語12の1行のみであるため、行番号21の直前でのGR0の値は#0001となります。
- 小問 設問2 d:ウ
- GR2は左下がり対角線の検査用ビットで初期値は#0001(ビット0)です。図の例では左下がりの対角線上のビット(語0のビット0から語15のビット15)がすべて1であるため、毎回のSLL GR2,1によってビット15まで左シフトされた値#8000が保持されます。
- 小問 設問2 e:ア
- GR3は右下がり対角線の検査用ビットで初期値は#8000(ビット15)です。語1のビット14が0であるため、語1処理時のAND GR3,GR6によってGR3のビット14が0となり、レジスタ全体が#0000となります。
- 小問 設問2 f:ア
- GR4は全行の論理積(AND)を保持します。図の配列例において全16語すべてで1となっている列はビット9とビット3の2本のみです。2進数で表すと0000 0010 0000 1000となり、16進数表記では#0208となります。
- 小問 設問3 g:イ
- SLL GR4,1によってビットが左シフトされ、あふれなかった場合は空欄gを実行します。GR4の中にまだ1のビットが残っていれば(GR4!=0、すなわちZF=0であれば)LOOP2に戻って次のビットを検査するため、JNZ LOOP2が入ります。
- 小問 設問3 h:エ
- GR2には左下がり対角線がすべて1の場合に最上位ビット(ビット15)のみが1となった#8000が残っています。これをカウントとしてGR0に加算するためには、ビット0の位置へ15ビット論理右シフトして1とする必要があるため、SRL GR2,15を実行します。
覚えるポイント
- CPLによる比較では一致時にZF=1となり、不一致時にはZF=0となる。
- 特定ビット位置の検査結果をカウント(数値1)として加算する際は、シフト命令でビット0(最下位ビット)へ移動させる。
間違えやすいところ
- 左下がり対角線のフラグGR2が、初期値のビット0から15回シフトされてビット15(#8000)にあることを見落とし、そのまま足すと誤った値になります。
- 16語のループでは、最後の語(語15)の処理の後は行15の引き算ですぐ終了分岐するため、最後の行17・18のシフトは実行されない点を確かめます。
出題の前提:平成19年度秋期 基本情報技術者試験 午後 問13
出典:IPA(PDF保管先:基本情報技術者試験ドットコム)『2007年度 秋期 午後』
IPA公式問題冊子(第三者保管の保存版) p.50 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.51 ↗(cdn.fe-siken.com) / IPA公式問題冊子(第三者保管の保存版) p.52 ↗(cdn.fe-siken.com)
2007年度 秋期 午後
参照した公式資料
IPA(PDF保管先:基本情報技術者試験ドットコム)が公開した2007年度 秋期 午後の問題・解答資料です。
- IPA公式問題冊子(第三者保管の保存版) ↗ — cdn.fe-siken.com(PDF・64ページ)
- IPA公式解答例(第三者保管の保存版) ↗ — cdn.fe-siken.com(PDF・4ページ)

