大学2年の息子が基本情報技術者試験を受けるということで試験対策と解答のコツを伝授することにしました。過去問を中心に初心者にもわかりやすく解説します。

H19春午後の解答と解説

機械語命令の実行に関する次の記述を読んで,設問に答えよ。

 (1) 1語は 16 ビットで,命令語は1語長である。命令語の形式は図1のとおりである。


h19sp01p-1.JPG



(2)  op,r 及び v の意味を表1に示す。 レジスタは,1語長で 16 個(レジスタ番号 0 ~ F )ある。 op,r,v 及びレジスタの内容は,16 進数で表示する。

      表1 op,r 及び v の意味

         意味   
  op    命令コード( 00 ≦ op ≦ FF )
  r    レジスタ番号( 0 ≦ r ≦ F )
  v    レジスタ番号又は定数( 0 ≦ v ≦ F )

(3) 命令の仕様(一部)を表2に示す。

    表2 命令の仕様(一部)

名称

op(命令コード)

動作

LR
(Load Register)

10

レジスタ v の内容をレジスタ r に設定する。
AR
(Add Register)

20

レジスタ r とレジスタ v の内容の和を求め,結果をレジ
スタ r に設定する。
OR
(Or Register)

30

レジスタ r とレジスタ v の内容の論理和を求め,結果を
レジスタ r に設定する。
SL
(Shift Left)

40

レジスタ r の内容を定数 v ビットだけ左へシフトする。
シフトした結果,空いたビット位置には0を設定する。
SR
(Shift Right)

50

レジスタ r の内容を定数 v ビットだけ右へシフトする。
シフトした結果,空いたビット位置には0を設定する。

設問 次の記述中の( ) に入れる正しい答えを,解答群の中から選べ。

レジスタ1~5の内容は,図2のとおりとする。

 (レジスタ番号) 

 内容  

1

1234

2

8361

3

5F2A

4

C38B

5

0010

(1)図2の状態で,次の命令語を実行するとレジスタ2の内容は(a)になる。

   命令語: 3021

(2)図2の状態で,次の4個の命令語を順に実行するとレジスタ3の内容は(b)

命令語: 1034
     4038
     5048
     3043

(3)図2の状態で,次の4個の命令語を順に実行するとレジスタ5の内容は 10 倍 になる(レジスタ5:0010 → 00A0)。

命令語: 1065
     4063
     40 (d)
     2056

a に関する解答群

ア 9375      イ 9395      ウ 9575      エ 9595

b ,c に関する解答群

ア 005F      イ 008B      ウ 00C3      エ 2A00
オ 2A5F      カ 8B00      キ 8BC3      ク C38B

d に関する解答群

ア 51       イ 52       ウ 61       エ 62

関係データベースに関する次の記述を読んで,設問1,2に答えよ。

 ある情報システム開発会社は,顧客であるA社の組織情報を関係データベースにすることになり, まず,部門と所属についての設計を行った。 A社の部門は,英字2文字からなる部門コードで一意に識別できる。 A社の社員は,4けたの数字からなる社員番号で一意に識別でき,必ず一つの部門に所属しているものとする。 図1にA社の部門と所属の情報を示す。括弧内は,部門コード又は社員番号である。


h19sp02p-1.JPGh19sp02p-1.JPG

設問1 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。

  情報システム開発会社の初級技術者B君は,案1と案2の二つの関係データベースの構造を考えた。 しかし,上級技術者から,案1と案2の両方で,A社の組織を表すには不都合な(a)という現象が起こり,案1では, 更に(b)という不都合な現象も起こることが指摘された。 そこでB君は,指摘に基づき,案3を考えた。 案1~3を,図2に示す。下線は,その項目が主キーであることを表す。

h19sp02p-2.JPG

解答群

ア 転属した社員の所属部門を,変更することができない

イ 新入社員を,登録することができない

ウ 退職した社員を,削除することができない

エ 同姓同名の社員を,登録することができない

オ 配属者未定の新設部門を,登録することができない

設問2 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。

A社の制度が変更され,社員が本務として所属する部門に加え,その他の1部門までの兼務ができることになった。 このたび,新設部門として宣伝(SD)が設置され,本務が営業(EG)である綾瀬恵と本務が 庶務(SM)である上戸満夫が,兼務として宣伝(SD)に配属されることになった。

B君は,これらに対応し,どの項目の内容も空にならない案4を考えた。 案4のデータベース構造において,今回の制度の変更,部門の新設及び配属の後, 兼務の登録件数(行数)は,(c)となる。 案4を図3に示す。下線は,その項目が主キーであることを表す。

h19sp02p-3.JPG

c に関する解答群

ア 1       イ 2       ウ 3       エ 8       オ 9

d ,e に関する解答群

ア 氏名        イ 社員番号        ウ 部門コード


システム開発の計画立案に関する次の記述を読んで,設問1,2に答えよ。

X社では,業務システムを新規に構築することになった。 この業務システムには,新たなハードウェアの導入とソフトウェアの開発が必要である。 ソフトウェアの開発では,業務プログラム内で共通に利用するプログラム (以下,共通部品という)を業務プログラム本体と分離して,別チームで開発することにした。 今回の開発に関する作業の一覧と必要な日数を表に示す。

   表 作業の一覧と必要な日数

作業 ID

内容

日数

S1

システム方式設計

6

G1

業務プログラムの共通部品の定義

2

G2

業務プログラムの機能設計

4

G3

業務プログラムの詳細設計

6

G4

業務プログラムのコーディング・単体テスト

6

C1

共通部品の設計(インタフェース決定)

6

C2

共通部品のコーディング・単体テスト

4

H1

ハードウェアの調達

15

H2

ハードウェアの環境構築

6

S2

結合テスト

6

S3

実機テスト

4


この作業の日程計画を立てるために,図のアローダイアグラムを作成した。 図中の破線は,ダミー作業である。

h19sp03p-1.JPG

設問1 作業日程はアローダイアグラムに従うものとして, 作業の依存関係に関する記述として正しい答えを,解答群の中から二つ選べ。

解答群

ア 業務プログラムの詳細設計(G3)は,共通部品のコーディング・単体テスト(C2) が終了しないと開始できない。

イ 業務プログラムのコーディング・単体テスト(G4)は, 共通部品のコーディング・単体テスト(C2)が終了しないと開始できない。

ウ 業務プログラムの詳細設計(G3)は,業務プログラムの機能設計(G2)が終了すると開始できる。

エ 共通部品は実機がなくてもコーディング・単体テスト(C2)を開始できるが, 業務プログラムは実機がなくてはコーディング・単体テスト(G4)を開始できない。

オ ハードウェアの調達(H1)は,システム方式設計(S1)の完了後に行う。

設問2 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。

この業務システムの開発におけるクリティカルパスは(a), 最短所要日数は(b)日である。 また,全体の開発期間は,(c)を短縮することで短縮できる。

a に関する解答群

ア ① → ② → ③ → ⑤ → ⑥ → ⑦ → ⑧ → ⑨ → ⑩

イ ① → ② → ③ → ⑤ → ⑦ → ⑧ → ⑨ → ⑩

ウ ① → ② → ③ → ⑥ → ⑦ → ⑧ → ⑨ → ⑩

エ ① → ② → ④ → ⑨ → ⑩

b に関する解答群

ア 31      イ 32      ウ 33

エ 34      オ 35      カ 36

c に関する解答群

ア 共通部品の設計(C1)

イ 共通部品のコーディング・単体テスト(C2)

ウ 業務プログラムの機能設計(G2)

エ ハードウェアの調達(H1)


次のプログラムの説明及びプログラムを読んで,設問1~3に答えよ。

〔プログラムの説明〕

整数型の1次元配列の要素 A[0],... ,A[N](N > 0)を, 挿入ソートで昇順に整列する副プログラム InsertSort である。

(1) 挿入ソートの手順は,次のとおりである。

① まず,A[0] と A[1] を整列し,次に A[0] から A[2] までを整列し, その次にA[0] から A[3] までというように,整列する区間の要素を一つずつ増やしていき, 最終的に A[0] からA[N] までを整列する。

② 整列する区間が A[0] から A[M](1 ≦ M ≦ N)までのとき, A[M] を既に整列された列 A[0],...,A[M-1] 中の適切な位置に挿入する。 その手順は次のとおりである。

(a) A[M] の値を,作業領域 Tmp に格納する。

(b) A[M-1] から A[0] に向かって Tmp と比較し, Tmp よりも大きな値を順次隣(要素番号の大きい方)に移動する。

(c) (b) で最後に移動した値の入っていた配列要素に Tmp の内容を格納する。 (b) で移動がなかった場合には A[M] に格納する。

(2) 副プログラム InsertSort の引数の仕様を表に示す。

     表 InsertSort の引数の仕様

  引数   

データ型

入力/出力

意味

A[ ] 整数型 入出力 整列対象の1次元配列
N 整数型 入力 整列する区間の最後の要素番号

h19sp04p-1.JPG

設問1 プログラム中の( )に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア Idx1        イ Idx1 + 1        ウ Idx1 - 1

b,c に関する解答群

ア A[Idx2] ← A[Idx2+1]      イ A[Idx2] ← A[Idx2-1]

ウ A[Idx2] ← Tmp            エ A[Idx2+1] ← A[Idx2]

オ A[Idx2+1] ← Tmp         カ A[Idx2-1] ← A[Idx2]

キ A[Idx2-1] ← Tmp

設問2 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。

1 次元配列 A[ ] の内容例を図に示す。 プログラム中のβの行が実行される回数は,図の例1では(d)回,例2では(e)回となる。 また,プログラム中のαの条件式を A[Idx2] ≧ Tmp とした場合, 例3のように配列要素の中に同じ値が複数含まれるときには(f)。

h19sp04p-2.JPG


d,e に関する解答群

ア 2        イ 3        ウ 4

エ 19        オ 20       カ 21

f に関する解答群

ア 整列が正しく行われなくなる

イ 整列は正しく行われ,元の条件式の場合と比べて実行ステップ数は多くなる

ウ 整列は正しく行われ,元の条件式の場合と比べて実行ステップ数は変わらない

エ 整列は正しく行われ,元の条件式の場合と比べて実行ステップ数は少なくなる

設問3 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。

n 個のランダムなデータを整列する場合, 挿入ソートの計算量は O n 2 ), クイックソートの平均的な計算量は O n log 2 n )なので, n の値が大きくなるとクイックソートの計算量の方が総じて小さくなる。

InsertSort のほかに,クイックソートで昇順に整列する副プログラム QuickSort を作成し, ランダムな 1,000 個のデータを何組か用意して,それぞれの組に対して InsertSort と QuickSort の実行時間を測定したところ,QuickSort の平均実行時間が InsertSortの1/10であった。 この結果を基にして,1,000,000 個のデータを整列したときの平均的な実行時間を計算すると, QuickSort が InsertSort の約1/(g)と推定できる。
ここで,log 2 1000 ≒ 10,log 2 1000000 ≒ 20 とする。

解答群

ア 500         イ 1,000       ウ 5,000

エ 10,000       オ 50,000       カ 500,000


プログラム設計に関する次の記述を読んで,設問1~3に答えよ。

ある会員情報が入ったマスタファイルの内容を,毎月末にトランザクションファイルの内容によって更新し, 新マスタファイルに出力する更新プログラムを作成する。

〔ファイルの説明〕

(1) マスタファイル及びトランザクションファイルのレコード様式は同じで,次の項目からなる。

会員番号

 名前 

電子メールアドレス

サービス等級

(2) 会員番号は,5けたの数字であり,必須の項目である。 最大値 99999 の会員番号をもつ会員は存在しない。

(3) マスタファイル及びトランザクションファイルは,会員番号をキーとして,昇順に整列されている。

(4) マスタファイルには,同一の会員番号をもつレコードが複数存在することはない。 トランザクションファイルにも,同一の会員番号をもつレコードが複数存在することはない。

(5) トランザクションファイルは,新規会員追加に用いるレコード及び既に登録されている会員の 会員情報変更に用いるレコードからなる。

(6) 会員情報変更に用いるレコードは,変更する項目に空白以外のデータが格納され, 変更しない項目には,空白が格納されている。

〔処理の説明〕

マスタファイルのレコードを M,トランザクションファイルのレコードを T として,次のキー突合せ処理を行う。

(1) M と同一の会員番号をもつ T があるとき,T の空白以外の項目で M の対応する項目を更新し, T の空白の項目に対応したMの項目は更新せずに新マスタファイルに出力する。

(2) M と同一の会員番号をもつ T がないとき,M をそのまま新マスタファイルに出力する。

(3) T と同一の会員番号をもつ M がないとき,T を新マスタファイルに出力する。 更新プログラムの流れを図1に示す。

突合せキー KM 及び KT には,それぞれ, M の会員番号の値及び T の会員番号の値,又はそれぞれのファイルを読み終わったことを 表す最大値 99999 を格納する。

h19sp05p-1.JPG

設問1 図1において,キー突合せによるマスタファイルの更新処理は, 破線で囲んだ部分で実現している。

図1中の( )に入れる正しい答えを,解答群の中から選べ。

解答群

ア M'入力処理        イ M 入力処理        ウ T 入力処理

設問2 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。

この更新プログラムに会員情報の削除処理を追加するため,次の (1) ~ (5) を行う。

(1) トランザクションファイルのレコード様式に,更新区分という項目を追加する。

(2) 更新区分が"U"の場合を新規登録及び変更とし,"D"の場合を削除とする。

(3) 図1のαβの処理を,(1) のレコード様式の変更に対応するように変更する。

(4) 主処理を図2のとおりに変更する。

(5) T 入力処理については,ファイルを読み終わったとき,更新区分に"U"を代入する処理を追加する。

ここで,図2のエラー処理1及び2は,エラーとなったレコードに関する情報を表示する。 条件 X2 は,(c)である。 エラー処理2は,(d)場合に実行される。

c に関する解答群

ア 更新区分="D"

イ 更新区分="U"

ウ 更新区分≠"D"

エ 更新区分≠"U"

オ (更新区分≠"D")AND(更新区分≠"U")

カ (更新区分≠"D")OR(更新区分≠"U")

d に関する解答群

ア 更新区分に誤りがある

イ 削除しようとする会員番号をもつレコードがマスタファイルに存在しない

ウ 新規登録しようとする会員番号をもつレコードがマスタファイルに存在する

エ 変更しようとする会員番号をもつレコードがマスタファイルに存在しない

h19sp05p-2.JPG

設問3 次の記述中の( )に入れる正しい答えを,解答群の中から選べ。

トランザクションファイル中に同一の会員番号をもつレコードが複数あってもよいようにする。 複数ある場合,レコードの発生順に処理する。 そのために,次の (1),(2) の変更を行うことにした。

(1) トランザクションファイルのレコード様式に発生日時という項目を追加する。

(2) 図2の更新プログラムとは別にトランザクションファイルの処理に, 整列プログラムとレコード集約プログラムを追加して,新たにトランザクションファイルを生成する。

整列プログラムは,レコードを整列キーの昇順に並べ替える。 ここで,第1整列キーは(e), 第2整列キーは(f)である。 レコード集約プログラムの主な機能は,次の二つである。

① 会員番号が同じ入力レコードで,更新区分がすべて"U"のときには, 空白以外の変更項目の内容を作業領域に上書きし,最後の状態を出力する。

② 更新区分が"D"のレコードが見つかったときには,そのレコードを出力する。 それ以降にも同一の会員番号のレコードが存在したときには,それらは処理せずエラーとする。

これらのプログラムの実行順序は,次のとおりである。

 実行順序:(g)

e,f に関する解答群

ア 会員番号        イ 更新区分        ウ サービス等級         エ 発生日時

g に関する解答群

ア 更新プログラム → 整列プログラム → レコード集約プログラム

イ 更新プログラム → レコード集約プログラム → 整列プログラム

ウ 整列プログラム → 更新プログラム → レコード集約プログラム

エ 整列プログラム → レコード集約プログラム → 更新プログラム

オ レコード集約プログラム → 更新プログラム → 整列プログラム

カ レコード集約プログラム → 整列プログラム → 更新プログラム


次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

(1) 双六(すごろく)のプログラムである。 双六とは,図のような一本道のコース上に升(ます)あるを,"ふりだし"の位置からスタートして, プレーヤが順番にさいころ2個を振って,出た目の和だけ駒(こま)を進め, 早く"上がり"(ゴール)の位置にたどり着いたプレーヤを勝ちとする遊びである。

h19sp06p-1.JPG

(2) 双六の進め方は,次のとおりである。

① プレーヤは"ふりだし"の升に各自の駒を置き,さいころを振る順番を決める。

② 順番にさいころを振って,出た目の和だけ"上がり"方向に駒を進める。

③ "上がり"の升に到達すると,そのプレーヤの勝ちとなり,そこでプログラムが終了する。 目の和だけ駒を進めた結果が"上がり"の升を超えた場合も,"上がり"とする。

④ 升には順番に番号が割り当てられている。 番号0の升が"ふりだし"であり,番号 23 の升が"上がり"である。

⑤ 升には番号のほかに,到達時の動作指示が割り当てられているものがある。 動作指示には,次の2種類があり,その指示に従う。

(a) 移動の指示: 指示された番号の升に駒を移動する。移動先の升に動作指示 がある場合は,その指示に従う。

(b) 1回休みの指示: 次に順番が回ってきたとき,"さいころを振る番"を1回休む。

(3) プレーヤは,4人とする。

(4) 動作指示は,配列 actype 及び celinf に設定されている。

(5) 次の関数が,あらかじめ定義されているものとする。

① 関数 dice

機能: 引数で指定されたプレーヤに対してさいころを振る番が来たことを示すメッセージを表示する。 プレーヤが改行キーを入力すると,乱数によって2個のさいころの目の和を決めて, その値を表示し,返却値とする。

呼出し形式: int dice(int playerid);

引数: playerid プレーヤ番号( 0 ~ 3 )

返却値: さいころの目の和( 2 ~ 12 の整数値)

② 関数 prtpiece

機能: 引数で指定されたプレーヤの駒が現在置かれている升の番号と, 升に割り当てられている動作指示の内容を表示する。

呼出し形式: void prtpiece(int playerid);

引数: playerid プレーヤ番号( 0 ~ 3 )

返却値: なし

h19sp06p-2.JPG

設問1 プログラム中の( )に入れる正しい答えを, 解答群の中から選べ。

a ,b に関する解答群

ア actype[curpos[playerid]] != 0

イ actype[curpos[playerid]] <= 3

ウ curpos[playerid] == 0

エ curpos[playerid] >= CELLS - 1

オ gamestatus == 0

カ gamestatus == 1

キ playmode[playerid] == PLAY

ク playmode[playerid] == WAIT

c に関する解答群

ア playerid = playerid % PLAYERS + 1

イ playerid = playerid % (PLAYERS + 1)

ウ playerid = (playerid + 1) % PLAYERS

エ playerid += 1

オ playerid += playerid / (PLAYERS - 1)

設問2 到達時の動作指示として, "続けてさいころを振り,駒を進める"を追加することにした。 そのために switch 文での actype[curpos[playerid]] の値が3のときに,次の処理群を挿入する。( )に入れる正しい答えを,解答群の中から選べ。


case 3: /* 続けてさいころを振り,駒を進める。 */

    (d);
prtpiece(playerid);
break;


解答群

ア curpos[playerid] = celinf[curpos[playerid]]

イ curpos[playerid] = celinf[curpos[playerid]] + dice(playerid)

ウ curpos[playerid] += celinf[curpos[playerid] + dice(playerid)]

エ curpos[playerid] += dice(playerid)

オ playmode[playerid] = PLAY


次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。

〔プログラムの説明〕

リーグ戦の勝敗表を出力するプログラムである。

(1) 勝敗表の出力例を図1に示す。>


チーム名 勝ち 負け 勝率
Bishops 27 23 0.540
Kings 33 17 0.660
Knights 27 23 0.540
Pawns 12 38 0.240
Queens 32 18 0.640
Rooks 19 31 0.380
    図1 勝敗表の出力例


(2) チームの勝敗情報は構造体 RECORD で表現する。引き分けはないものとする。

 typedef struct { /* 勝敗情報 */
   char name[MAX_LENGTH+1]; /* チーム名 */
   int wins; /* 勝ち数 */
   int losses; /* 負け数 */
   double average; /* 勝率 */
 } RECORD;

全チームの勝敗情報は構造体 RECORD の配列 team に格納されている。 チーム名,勝ち数,負け数はあらかじめ格納されているが,勝率は格納されていない。


(3) プログラム中の関数 calcAverage と print の仕様は次のとおりである。

 void calcAverage()
    機能:全チームの勝率を計算し,それぞれのメンバ average に格納する。試合数が0の場合,勝率は 0.0 とする。

 void print()
    機能:勝敗表を出力する。

h19sp10p-1.JPG

設問1 プログラム1中の( )に入れる正しい答えを, 解答群の中から選べ。

a に関する解答群

ア team[i].average < 0.0   イ team[i].average > 0.0

ウ total != 0            エ total == 0

b に関する解答群

ア (double)team[i].average = team[i].wins / total

イ team[i].average = (double)(team[i].wins / total)

ウ team[i].average = (double)team[i].wins / total

エ team[i].average = team[i].wins / total


設問2 順位の項目を加え,勝率の高いチームから順に出力する関数 printRank を作成した。 勝率順の勝敗表の出力例を図2に示す。勝率が同率の場合は同順位とする。


順位 チーム名 勝ち 負け 勝率
1 Kings 33 17 0.660
2 Queens 32 18 0.640
3 Bishops 27 23 0.540
3 Knights 27 23 0.540
5 Rooks 19 31 0.380
6 Pawns 12 38 0.240
    図2 勝率順の勝敗表の出力例
 
処理手順は次のとおりである。

(1) TEAMNUM 個の要素をもつポインタ配列 pTeam を定義する。

(2) 配列 team の各要素のアドレスを,先頭要素から順番に配列 pTeam の各要素に格納する。 これによって要素番号iに対応するチームの勝率 team[i].average は,pTeam[i]->average に よっても参照できる。

(3) 配列 team 自体を整列する代わりに配列 pTeam の要素を整列して,勝率順の勝敗表を出力する。

次の関数があらかじめ定義されているものとする。

   void sort(RECORD *pTeam[TEAMNUM])
     機能:TEAMNUM 個の要素からなり,各要素が RECORD 型の構造体へのポインタで ある配列 pTeam の要素を, 勝率の降順になるように整列する。

プログラム2中の ( )に入れる正しい答えを,解答群の中から選べ。

h19sp10p-2.JPG


c に関する解答群

 ア pTeam[i] = &team[i]     イ pTeam[i] = team
 ウ team[i] = **pTeam      エ team[i] = *pTeam[i]

 d に関する解答群

 ア rank++        イ rank = i
 ウ rank = i + 1     エ rank = TEAMNUM - (i + 1)
 オ rank = TEAMNUM - i

 e に関する解答群

 ア (&team[i])     イ (&team[rank])

公認情報システム監査人(CISA)
システム監査技術者
趣味:読書、美術鑑賞
キーワード