H19春午後の解答と解説
(1) 1語は 16 ビットで,命令語は1語長である。命令語の形式は図1のとおりである。
(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
ある情報システム開発会社は,顧客であるA社の組織情報を関係データベースにすることになり, まず,部門と所属についての設計を行った。 A社の部門は,英字2文字からなる部門コードで一意に識別できる。 A社の社員は,4けたの数字からなる社員番号で一意に識別でき,必ず一つの部門に所属しているものとする。 図1にA社の部門と所属の情報を示す。括弧内は,部門コード又は社員番号である。
設問1 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。
情報システム開発会社の初級技術者B君は,案1と案2の二つの関係データベースの構造を考えた。 しかし,上級技術者から,案1と案2の両方で,A社の組織を表すには不都合な(a)という現象が起こり,案1では, 更に(b)という不都合な現象も起こることが指摘された。 そこでB君は,指摘に基づき,案3を考えた。 案1~3を,図2に示す。下線は,その項目が主キーであることを表す。
解答群
ア 転属した社員の所属部門を,変更することができない
イ 新入社員を,登録することができない
ウ 退職した社員を,削除することができない
エ 同姓同名の社員を,登録することができない
オ 配属者未定の新設部門を,登録することができない
設問2 次の記述中の( )に入れる正しい答えを, 解答群の中から選べ。
A社の制度が変更され,社員が本務として所属する部門に加え,その他の1部門までの兼務ができることになった。 このたび,新設部門として宣伝(SD)が設置され,本務が営業(EG)である綾瀬恵と本務が 庶務(SM)である上戸満夫が,兼務として宣伝(SD)に配属されることになった。
B君は,これらに対応し,どの項目の内容も空にならない案4を考えた。 案4のデータベース構造において,今回の制度の変更,部門の新設及び配属の後, 兼務の登録件数(行数)は,(c)となる。 案4を図3に示す。下線は,その項目が主キーであることを表す。c に関する解答群
ア 1 イ 2 ウ 3 エ 8 オ 9
d ,e に関する解答群
ア 氏名 イ 社員番号 ウ 部門コード
X社では,業務システムを新規に構築することになった。 この業務システムには,新たなハードウェアの導入とソフトウェアの開発が必要である。 ソフトウェアの開発では,業務プログラム内で共通に利用するプログラム (以下,共通部品という)を業務プログラム本体と分離して,別チームで開発することにした。 今回の開発に関する作業の一覧と必要な日数を表に示す。
表 作業の一覧と必要な日数
作業 ID |
内容 |
日数 |
S1 |
システム方式設計 | 6 |
G1 |
業務プログラムの共通部品の定義 | 2 |
G2 |
業務プログラムの機能設計 | 4 |
G3 |
業務プログラムの詳細設計 | 6 |
G4 |
業務プログラムのコーディング・単体テスト | 6 |
C1 |
共通部品の設計(インタフェース決定) | 6 |
C2 |
共通部品のコーディング・単体テスト | 4 |
H1 |
ハードウェアの調達 | 15 |
H2 |
ハードウェアの環境構築 | 6 |
S2 |
結合テスト | 6 |
S3 |
実機テスト | 4 |
この作業の日程計画を立てるために,図のアローダイアグラムを作成した。 図中の破線は,ダミー作業である。
設問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次元配列の要素 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 | 整数型 | 入力 | 整列する区間の最後の要素番号 |
設問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)。
ア 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) マスタファイル及びトランザクションファイルのレコード様式は同じで,次の項目からなる。
会員番号 |
名前 |
電子メールアドレス |
サービス等級 |
(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 を格納する。
設問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 に関する解答群
ア 更新区分に誤りがある
イ 削除しようとする会員番号をもつレコードがマスタファイルに存在しない
ウ 新規登録しようとする会員番号をもつレコードがマスタファイルに存在する
エ 変更しようとする会員番号をもつレコードがマスタファイルに存在しない
設問3 次の記述中の( )に入れる正しい答えを,解答群の中から選べ。
トランザクションファイル中に同一の会員番号をもつレコードが複数あってもよいようにする。 複数ある場合,レコードの発生順に処理する。 そのために,次の (1),(2) の変更を行うことにした。
(1) トランザクションファイルのレコード様式に発生日時という項目を追加する。
(2) 図2の更新プログラムとは別にトランザクションファイルの処理に,
整列プログラムとレコード集約プログラムを追加して,新たにトランザクションファイルを生成する。
整列プログラムは,レコードを整列キーの昇順に並べ替える。
ここで,第1整列キーは(e),
第2整列キーは(f)である。
レコード集約プログラムの主な機能は,次の二つである。
① 会員番号が同じ入力レコードで,更新区分がすべて"U"のときには, 空白以外の変更項目の内容を作業領域に上書きし,最後の状態を出力する。
② 更新区分が"D"のレコードが見つかったときには,そのレコードを出力する。 それ以降にも同一の会員番号のレコードが存在したときには,それらは処理せずエラーとする。
これらのプログラムの実行順序は,次のとおりである。
実行順序:(g)e,f に関する解答群
ア 会員番号 イ 更新区分 ウ サービス等級 エ 発生日時
g に関する解答群
ア 更新プログラム → 整列プログラム → レコード集約プログラム
イ 更新プログラム → レコード集約プログラム → 整列プログラム
ウ 整列プログラム → 更新プログラム → レコード集約プログラム
エ 整列プログラム → レコード集約プログラム → 更新プログラム
オ レコード集約プログラム → 更新プログラム → 整列プログラム
カ レコード集約プログラム → 整列プログラム → 更新プログラム
〔プログラムの説明〕
(1) 双六(すごろく)のプログラムである。
双六とは,図のような一本道のコース上に升(ます)あるを,"ふりだし"の位置からスタートして,
プレーヤが順番にさいころ2個を振って,出た目の和だけ駒(こま)を進め,
早く"上がり"(ゴール)の位置にたどり着いたプレーヤを勝ちとする遊びである。
(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 )
返却値: なし
設問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
〔プログラムの説明〕
リーグ戦の勝敗表を出力するプログラムである。
(1) 勝敗表の出力例を図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()
機能:勝敗表を出力する。
設問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) TEAMNUM 個の要素をもつポインタ配列 pTeam を定義する。
(2) 配列 team の各要素のアドレスを,先頭要素から順番に配列 pTeam の各要素に格納する。 これによって要素番号iに対応するチームの勝率 team[i].average は,pTeam[i]->average に よっても参照できる。
(3) 配列 team 自体を整列する代わりに配列 pTeam の要素を整列して,勝率順の勝敗表を出力する。
次の関数があらかじめ定義されているものとする。
void sort(RECORD *pTeam[TEAMNUM])
機能:TEAMNUM 個の要素からなり,各要素が RECORD 型の構造体へのポインタで
ある配列 pTeam の要素を,
勝率の降順になるように整列する。
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])