問1 命令の実行に関する次の記述を読んで,設問に答えよ。
OP |
R |
X |
I |
D |
adr |
OP : | 命令コードを 8 ビットで指定する。 ここでは,次の三つの命令コードを用いる。 2016 実効アドレスをRで指定された汎用レジスタに設定する。 2116 実効アドレスが指す語の内容をRで指定された汎用レジスタに設定する。 FF16 実行を終了する。 |
R : | 汎用レジスタの番号( 0 〜 3 )を 2 ビットで指定する。 |
X : | 指標レジスタの番号( 1 〜 3 )を 2 ビットで指定する。 指標レジスタには,指定された番号の汎用レジスタを使用する。 ただし0が指定されたときは,指標レジスタによる修飾は行わない。 |
I : | 間接アドレス指定を行うときは 1 を行わないときは0を1ビットで指定する。 |
D : | 拡張用の 3 ビットで,常に 0 である。 |
adr: | アドレスを 16 ビットで指定する。 |
命令語の実効アドレスは,表のとおりに計算される。
表 X ,I と実効アドレスの関係
X |
I |
実効アドレス |
0 |
0 |
adr |
1 〜 3 |
0 |
adr +( X ) |
0 |
1 |
( adr ) |
1 〜 3 |
1 |
( adr +( X )) |
注 ( ):( )内のレジスタ又はアドレスに格納されている内容を示す。
設問 次の記述中の に入れる正しい答えを,解答群の中から選べ。
汎用レジスタ | 0:0003 1:0000 2:0000 3:0000 |
プログラムレジスタ | PR:0100 |
主記憶
アドレス |
+ 0 |
+ 1 |
+ 2 |
+ 3 |
+ 4 |
+ 5 |
+ 6 |
+ 7 |
00F8 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0100 |
2100 |
011B |
20C0 |
0003 |
2170 |
0111 |
21B8 |
011A |
0108 |
FF00 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0110 |
0000 |
0001 |
0002 |
0003 |
0004 |
0005 |
0006 |
0007 |
0118 |
0110 |
0111 |
0112 |
0113 |
0114 |
0115 |
0116 |
0117 |
0120 |
0118 |
0119 |
011A |
011B |
011C |
011D |
011E |
011F |
図 汎用レジスタ,PR と主記憶の値
解答群
ア 000016 イ 000116 ウ 000216
エ 000316 オ 000416 カ 000516
キ 000616 ク 011316 ケ 011516
問2 正規表現の利用に関する次の記述を読んで,設問1〜3に答えよ。
表1 台帳の例
ファイル名 |
種別コード |
版コード |
作成年月日 |
LOGO-T01 |
JPG |
V/R100 |
2002-01-15 |
TITLE-A1 |
GIF |
V/R100 |
2002-01-15 |
REP-JP01 |
HTML |
V/R203 |
2002-01-22 |
OPINION3 |
TXT |
V/R103 |
2003-02-05 |
(1) 各項目の文字列は,JIS X 0201 7ビット及び8ビットの情報交換用符号化文字集合で規定されている英大文字,数字,“-”及び“ / ”からなる。
(2) 表2は,検索条件の正規表現に用いるメタ文字の説明である。メタ文字とは,表現形式を表すための文字である。
表2 正規表現に使用するメタ文字
メタ文字 |
意 味 |
表現記述の例 |
例の説明 |
. |
任意の 1 文字を表す。 | M..N | M で始まり N で終わる4文字の文字列 |
(文字列) |
“ ( ”と“ ) ”で囲まれた文字列を一つのパターンとして扱う。 | (MO) | 文字列 MO のパターン |
+ |
直前の文字又はパターンの1回以上の繰返しを表す。 | ABX+ | AB と,Xの1回以上の繰返し (ABX,ABXX,ABXXX など) |
(MO)+ | パターンMOの1回以上の繰返し (MO,MOMO, MOMOMOなど) | ||
* |
直前の文字又はパターンの0回以上の繰返しを表す。 | ABX* | AB と,Xの0回以上の繰返し (AB,ABX,ABXX など) |
? |
直前の文字又はパターンが0回又は1回現れることを表す。 | ABCD? | ABC 又は ABCD |
\ |
後続する文字をメタ文字ではなく,文字そのものとして扱う。 | AB\* | 文字列 AB* |
| |
文字又はパターンの選択を表す。 | A|B | A 又はB |
(AB)|(CDE) | パターン AB 又はCDE | ||
[m-n] |
mからnまでの連続した文字の群からの任意の1文字の選択を表す。 | [3-5] | 連続した文字の群 3,4,5 のいずれか1文字 |
[W-Z] | 連続した文字の群 W,X,Y,Z のいずれか1文字 |
設問1 台帳には,ファイルの版コードが,次の形式で登録されている。版コードは常に“V/R”という3文字から始まり,その後に版番号を示す1けたの数字(1〜9)が続き,最後は版の枝番号を示す2けたの数字(00〜99)で終わる。例えば,版番号が1で枝番号が03の場合には,版コードは“V/R103”となる。版コードに対する正規表現を用いた検索に関して,解答群の記述の中から誤っているものを選べ。
解答群
ア 枝番号が 01 のファイルを抽出する場合,01 を指定する。
イ 枝番号が 01 のファイルを抽出する場合,R..1 を指定する。
ウ 版番号が 3 以下であるファイルを抽出する場合,R[1-3] を指定する。
エ 版番号が 3 で枝番号が 02 のファイルを抽出する場合,302 を指定する。
オ 版番号が 3 で枝番号が 02 のファイルを抽出する場合,V/R302 を指定する。
設問2 台帳には,ファイルの種別を示す種別コード(3けた又は4けたの文字列)が登録されている。種別コードは,次の8種類である。
GIF HTM HTML JPG JPEG JPN MPEG TXT |
解答群
ア JPEG? イ JPEG* ウ JPE?G
エ JP+G オ JP?G カ JP.G
設問3 台帳には,ファイルの作成年月日が登録されている。作成年月日は,西暦年を表す 4 けたの数字(0001 〜 9999)と,月を表す 2 けたの数字(01 〜 12)と,日を表す 2 けたの数字(01 〜 31)を,この順番に文字“-”で結んだ文字列である。例えば,西暦 2003 年 3 月 20 日のとき,“2003-03-20”となる。次の正規表現を用いて,ファイルの作成年月日の検索を行うことにした。この正規表現による検索で抽出される年月日を,解答群の中からすべて選べ。
..(0(1|2)\-)+.1
解答群
ア 2001-02-10 イ 2001-12-11 ウ 2002-02-21
エ 2002-11-10 オ 2002-12-01 カ 2003-01-10
問3 LAN のアクセス制御に関する次の記述を読んで,設問に答えよ。
CSMA/CD(キャリア検知多重アクセス衝突検出)は,同軸ケーブルを用いたバス型 LAN やツイストペアケーブルとハブを用いたスター型 LAN に用いられるアクセス制御方式である。 CSMA/CD では,フレーム送出時に伝送路に接続されている複数の機器間のキャリア検知と衝突検出を,次のとおりに行っている。
〔フレーム送出手順の説明〕
ステップ 0: | 送出するフレームが発生するまで待つ。送出するフレームが発生したとき,ステップ 1 へ移る。 |
ステップ 1: | 伝送路に他の接続機器からのキャリアを検知したらステップ 2 へ,そうでなければ,ステップ3へ移る。 |
ステップ 2: | 乱数を用いて決めた時間が経過したら,ステップ1へ戻る。 |
ステップ 3: | フレーム送出を開始し,直ちにステップ4へ移る。 |
ステップ 4: | フレーム送出中に衝突がなければ,送信成功としてステップ 0 へ戻る。フレーム送出中に衝突を検出したときは,ステップ5へ移る。
ここで,フレーム送出中に衝突の有無を調べる理由は,伝送路の信号伝搬遅延によって,他の接続機器からのフレーム送出開始をステップ1で検知できない可能性があるからである。 |
ステップ 5: | 送出中のフレームを,衝突の発生を他に知らせる信号に切り替えて,一定時間送出し,ステップ2へ戻る。
この信号によって,他の接続機器は,衝突の発生を知ることができる。 |
設問 次の記述中の に入れる正しい答えを,解答群の中から選べ。
図 CSMA/CD
方式による LAN 接続
a,c に関する解答群
ア 0.0043 イ 0.2 ウ 1
エ 2 オ 10 カ 4300
b,d,e に関する解答群
ア ステップ 0 イ ステップ 1 ウ ステップ 2
エ ステップ 3 オ ステップ 4 カ ステップ 5
問4 次のプログラムの説明,擬似言語の記述形式の説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕逆ポーランド表記法で表された数式を,スタックを用いて計算する副プログラム Calc である。
(1) 逆ポーランド表記法で表された数式は,文字型の 1 次元配列 Ex の各要素 Ex[0],…,Ex[Lp](Lp ≧ 3)に 1 文字ずつ格納されている。
(2) 数式は,正負の整数及び一つ以上の四則演算記号からなる。ただし,正の整数の場合はプラス記号を付けない。
(3) 先頭の整数を除き,整数の前には一つの空白文字を置く。
(4) 計算は実数で行う。計算の途中で次の状態になった場合は,副プログラムAbort() を呼び出してプログラムを終了する。
@ ゼロ除算が行われた。
A スタックの範囲外を参照した。
(5) Calc は,実数をスタックに積む副プログラム Push と,スタックから実数を取り出す副プログラム Pop を使用する。各副プログラムの引数の仕様を表 1 〜 3 に示す。また,数字 1 文字を実数に変換する関数 ToReal も使用する。
(6) 実数型の 1 次元配列 Stack,Stack の最大要素番号を示す定数 MAX,スタックの操作位置を示す変数 Sp が,大域変数として定義されている。 Sp の初期値は 0 である。
(7) 逆ポーランド表記法で表された数式は,正しいものとする。
表1 Calc の引数の仕様
変数名 |
入力/出力 |
意 味 |
Ex[ ] |
入力 |
逆ポーランド表記法の数式が格納された文字型の 1 次元配列 |
Lp |
入力 |
文字型の 1 次元配列 Ex の最後の要素番号(Lp ≧ 3) |
Ret |
出力 |
計算結果 |
表2 Push の引数の仕様
変数名 |
入力/出力 |
意 味 |
T |
入力 |
スタックに積む実数 |
表3 Pop の引数の仕様
変数名 |
入力/出力 |
意 味 |
T |
出力 |
スタックから取り出す実数 |
〔擬似言語の記述形式の説明〕
〔プログラム〕
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア Ex[Cp] = " " イ NumF = false ウ NumF = true
エ T = 0 オ T ≠ 0
b,c に関する解答群
ア NegF ← false イ NegF ← true ウ NumF ← false
エ NumF ← true オ T ← 0
d,e に関する解答群
ア | ・Sp ← Sp + 1 ・Stack[Sp] ← T |
イ | ・Sp ← Sp + 1 ・T ← Stack[Sp] |
ウ | ・Sp ← Sp − 1 ・Stack[Sp] ← T |
エ | ・Sp ← Sp − 1 ・T ← Stack[Sp] |
オ | ・Stack[Sp] ← T ・Sp ← Sp + 1 |
カ | ・Stack[Sp] ← T ・Sp ← Sp − 1 |
キ | ・T ← Stack[Sp] ・Sp ← Sp + 1 |
ク | ・T ← Stack[Sp] ・Sp ← Sp − 1 |
問5 プログラム設計に関する次の記述を読んで,設問 1,2 に答えよ。
商品輸入販売企業の海外発注部門における輸入割当てシステムを設計する。このシステムの概要は,次のとおりである。
〔システムの概要説明〕
(1) 販売部門から,受注した商品の商品コード,受注数及び販売部門が希望する納期の情報を,オンラインで受け取る。受注情報の様式を次に示す。
商品コード |
受注数 |
希望納期 | ||
年 |
月 |
日 |
(2) 海外発注部門の輸入割当てシステムは,受注情報のうち商品コードを基に,その商品を扱っている海外輸入拠点に商品コードを送信し,在庫数を問い合わせる。輸入拠点は世界各地に 50 か所あり,海外発注部門とオンラインで接続されている。輸入拠点によって取り扱う商品が異なり,同一商品を複数の輸入拠点が取り扱う場合もある。
(3) 輸入拠点は,問合せを受けた商品の在庫情報を,即時に海外発注部門へ返信する。在庫がない場合は,在庫数を 0 として返信する。海外発注部門は,返信された在庫情報をいったん在庫情報ファイルへ書き出す。在庫情報の様式を次に示す。
拠点コード |
商品コード |
在庫数 |
(4) 輸入拠点から販売部門への商品配送手段として,船便と航空便の 2 種類がある。同じ輸入拠点でも,船便と航空便とでは,販売部門へ到着するまでに要する日数(配送日数という)が異なる。また,輸入拠点によっても配送日数が異なる。輸入拠点ごとの配送日数は,拠点マスタファイルに格納されている。拠点マスタファイルの様式を次に示す。
拠点コード |
輸入拠点名 |
船便での 配送日数 |
航空便での 配送日数 |
その他の 情報 |
(5) 輸入拠点からの在庫情報と,そこからの船便及び航空便の配送日数を基に,輸入の可否を判断し,各輸入拠点からの輸入数量を決定する。すなわち,まず該当する商品の在庫があり,かつ希望納期に間に合う輸入拠点を調べる。次に,発注する輸入拠点を割り当てる。 1か所の拠点だけでは輸入数量に満たない場合には,複数の輸入拠点を割り当てる。その処理手順を図に示す。輸入拠点の割当ては,@〜Bの優先順位に従って行う。
@ 航空便よりも船便で間に合う輸入拠点を優先する。
A 該当商品の在庫数が多い輸入拠点を優先する。
B 拠点コードが小さい値の輸入拠点を優先する。
(6) 輸入拠点と,そこへの発注数及び配送手段が決定したら,該当輸入拠点へ発注情報を送信する。発注情報の様式を次に示す。様式中の配送手段には,船便か航空便かの区分が格納される。
拠点コード |
商品コード |
発注数 |
配送手段 |
図 発注拠点を割り当てる手順
設問1 図中に示された一時ファイルAに含まれていなければならないデータ項目として正しい答えを,解答群の中から三つ選べ。
解答群
ア 希望納期
イ 拠点コード
ウ 在庫数
エ 商品コード
オ 配送手段
カ 配送日数
キ 発注数
設問2 このシステムをテストしたい。まず,受注情報として,次のテストデータを考える。
商品コード |
受注数 |
希望納期 | ||
年 |
月 |
日 | ||
12345 |
200 |
2003 |
05 |
10 |
このテストデータの希望納期と受注日とを比較して,配送日数の余裕は20日間あるとする。この商品を扱う輸入拠点の在庫数と配送日数のテストデータとして, 7種類のパターンを次の表のとおりに設定した。表中の予想される結果を満足するために, に入れる正しい答えを,解答群の中から選べ。
表 テストパターンの内容と予想される結果
パターン |
拠点 コード |
在庫数 |
航空便での 配送日数 |
船便での 配送日数 |
予想される結果 |
1 |
01 |
500 |
10 |
20 |
拠点コード 01 の輸入拠点に船便で 200 個発注する。 |
2 |
02 |
300 |
8 |
21 |
拠点コード 02 の輸入拠点に航空便で 200 個発注する。 |
3 |
03 |
500 |
21 |
21 |
エラーメッセージを表示する。 |
4 |
04 |
100 |
6 |
19 |
エラーメッセージを表示する。 |
05 |
50 |
7 |
21 | ||
5 |
06 |
70 |
7 |
20 |
拠点コード06の輸入拠点に船便で 70個,拠点コード07の輸入拠点に航空便で70個,拠点コード08の輸入拠点に航空便で60個発注する。 |
07 |
70 |
12 |
30 | ||
08 |
8 |
21 | |||
6 |
09 |
150 |
2 |
21 |
拠点コード09の輸入拠点に航空便で150個,拠点コード10の輸入拠点に航空便で50個発注する。 |
10 |
3 |
22 | |||
11 |
120 |
4 |
23 | ||
7 |
12 |
20 |
40 |
拠点コード12の輸入拠点に航空便で30個,拠点コード13の輸入拠点に船便で160個,拠点コード14の輸入拠点に航空便で10個発注する。 | |
13 |
160 |
10 |
20 | ||
14 |
30 |
15 |
25 |
解答群
ア 20 イ 30 ウ 50
エ 70 オ 100 カ 120
キ 160
問6 次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
〔プログラムの説明〕
(1) 2次元配列を利用して,規則性のある図形を生成するプログラムである。このプログラムでは,表の行0に示した初期値から,図に示すフラクタル図形(シェルピンスキーのギャスケットと呼ばれる)を出力する。ここでは,配列の行数及び列数は33としている。
図 出力結果
表 生成される状態値
(2) 2次元配列sには,状態を示す値(0又は1)が格納される。上の表に示すように,行0に格納されている初期値から,次の規則によって,行1以降の行の状態値を生成する。
@ i 行j列の状態値を s[i][j] で表す。
A 列0の値はすべて0である。
B s[i+1][j] の値(j≧1)は,s[i][j-1] 及び s[i][j] の状態値を基にして,次の表に従って生成する。
基となる状態値 |
生成される状態値 s[i+1][j] | |
s[i][j-1] |
s[i][j] | |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
(3) 2次元配列sの列0及び行32の値は,出力の対象としない。
〔プログラム〕
#include <stdio.h> #define ALIVE 1 #define DEAD 0 #define SZ 33 int stschk( int, int ); main() { int s[SZ][SZ], i, j; for ( i=0; i<SZ; i++ ) s[i][0] = DEAD; for ( j=2; j<SZ; j++ ) s[0][j] = DEAD; s[0][1] = ALIVE; for ( i=0; i<SZ-1; i++ ) { for ( j=1; j<SZ; j++ ) { = stschk( , ); if ( == ALIVE ) printf( "*" ); else printf( " " ); } printf( "\n" ); } } int stschk( int s1, int s2 ) { if ((( s1==DEAD )&&( s2==ALIVE ))|| (( s1==ALIVE )&&( s2==DEAD ))) return ALIVE; else return DEAD; }
設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。
解答群
ア s[i-1][j-1] イ s[i-1][j] ウ s[i-1][j+1]
エ s[i][j-1] オ s[i][j] カ s[i][j+1]
キ s[i+1][j-1] ク s[i+1][j] ケ s[i+1][j+1]
設問2 関数 stschk のif文を変更したところ,次のような図形を出力した。この結果になるif文を解答群の中から選べ。
解答群
ア if (( s1==ALIVE ) || ( s2==ALIVE )) return ALIVE;
else return DEAD;
イ if (( s1==ALIVE ) && ( s2==ALIVE )) return ALIVE;
else return DEAD;
ウ if (( s1==DEAD ) || ( s2==DEAD )) return DEAD;
else return ALIVE;
エ if ((( s1==ALIVE )&&( s2==DEAD ))||
(( s1==DEAD )&&( s2==ALIVE ))) return ALIVE;
else return DEAD;
問7 次の COBOL プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
パソコンの修理状況を記録した修理状況ファイルから故障内容コード別に件数を集計し,故障内容コード別のレコード件数及びその比率を印字するプログラムである。
(1) 修理状況ファイルのレコード様式は,次のとおりである。
受付番号 |
受付日 |
故障内容 |
その他の情報 |
6 けた |
8 けた |
3 けた |
26 けた |
(2) 印字様式は,次のとおりである。
FAULT CODE COUNT PERCENTAGE XXX Z,ZZ9 ZZ9.9 XXX Z,ZZ9 ZZ9.9 XXX Z,ZZ9 ZZ9.9 : : : XXX Z,ZZ9 ZZ9.9 |
@ 故障内容コード別のレコード件数は,9,999 以下とする。
A 比率は,各故障内容コードの件数を修理状況ファイルの総レコード件数で割った百分率とする。小数第2位以下は,切り捨てる。
B 見出しの印字は,最初に1回行う。
〔プログラム〕
DATA DIVISION. FILE SECTION. FD REPAIR-FILE. 01 REPAIR-REC. 02 ORDER-REP PIC X(06). 02 DATE-REP PIC X(08). 02 FAULT-REP PIC X(03). 02 EST-REP PIC X(26). FD PRINT-FILE. 01 PRINT-REC PIC X(29). SD SORT-FILE. 01 SORT-REC PIC X(03). WORKING-STORAGE SECTION. 01 END-ST PIC 9(01). 01 COUNT-T PIC 9(07). 01 FAULT-WRK PIC X(03). 01 COUNT-WRK PIC 9(04). 01 TOP-HEADER PIC X(29) VALUE "FAULT CODE COUNT PERCENTAGE". 01 DATA-PRN. 02 FAULT-PRN PIC X(03). 02 PIC X(09) VALUE SPACE. 02 COUNT-PRN PIC Z,ZZ9. 02 PIC X(07) VALUE SPACE. 02 PER-PRN PIC ZZ9.9. PROCEDURE DIVISION. SORT-RTN. SORT SORT-FILE ON ASCENDING KEY SORT-REC INPUT PROCEDURE IS SELECT-RTN OUTPUT PROCEDURE IS TOTAL-RTN. STOP RUN. SELECT-RTN. OPEN INPUT REPAIR-FILE. INITIALIZE END-ST COUNT-T. PERFORM UNTIL END-ST = 1 READ REPAIR-FILE AT END MOVE 1 TO END-ST NOT AT END RELEASE SORT-REC FROM FAULT-REP COMPUTE COUNT-T = COUNT-T + 1 END-READ END-PERFORM. CLOSE REPAIR-FILE. TOTAL-RTN. OPEN OUTPUT PRINT-FILE. WRITE PRINT-REC FROM TOP-HEADER AFTER PAGE. INITIALIZE END-ST. RETURN SORT-FILE AT END MOVE 1 TO END-ST NOT AT END PERFORM INIT-RTN END-RETURN. PERFORM UNTIL END-ST = 1 RETURN SORT-FILE AT END PERFORM PRINT-RTN MOVE 1 TO END-ST NOT AT END IF COMPUTE COUNT-WRK = COUNT-WRK + 1 ELSE PERFORM PRINT-RTN END-IF END-RETURN END-PERFORM. CLOSE PRINT-FILE. PRINT-RTN. MOVE COUNT-WRK TO COUNT-PRN. . MOVE FAULT-WRK TO FAULT-PRN. . INIT-RTN. MOVE 1 TO COUNT-WRK. .
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア FAULT-WRK = FAULT-REP イ FAULT-WRK = SORT-REC
ウ FAULT-WRK > FAULT-REP エ FAULT-WRK > SORT-REC
オ FAULT-WRK NOT = FAULT-REP カ FAULT-WRK NOT = SORT-REC
b,e に関する解答群
ア MOVE FAULT-REP TO FAULT-WRK
イ MOVE FAULT-WRK TO FAULT-PRN
ウ MOVE FAULT-WRK TO FAULT-REP
エ MOVE FAULT-WRK TO SORT-REC
オ MOVE SORT-REC TO FAULT-PRN
カ MOVE SORT-REC TO FAULT-WRK
キ PERFORM INIT-RTN
ク PERFORM PRINT-RTN
ケ PERFORM SELECT-RTN
コ PERFORM TOTAL-RTN
c に関する解答群
ア COMPUTE PER-PRN = 100 * COUNT-T / COUNT-WRK
イ COMPUTE PER-PRN = 100 * COUNT-WRK / COUNT-T
ウ COMPUTE PER-PRN = COUNT-T / COUNT-WRK
エ COMPUTE PER-PRN = COUNT-T / COUNT-WRK / 100
オ COMPUTE PER-PRN = COUNT-WRK / COUNT-T
カ COMPUTE PER-PRN = COUNT-WRK / COUNT-T / 100
キ MOVE COUNT-T TO PER-PRN
ク MOVE COUNT-WRK TO PER-PRN
d に関する解答群
ア WRITE PRINT-REC
イ WRITE PRINT-REC AFTER 1
ウ WRITE PRINT-REC FROM DATA-PRN AFTER 1
エ WRITE PRINT-REC FROM TOP-HEADER AFTER 1
問8 次のJavaプログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
図形の面積を計算し,その結果を出力するプログラムである。図形は,三角形,長方形及び正方形のいずれかであり,プログラムでは,次の属性をもつ図形オブジェクトとして定める。
三角形:3辺の長さ
長方形:縦と横の2辺の長さ
正方形:1辺の長さ
AreaTest
(1) 三角形,長方形及び正方形のオブジェクトを生成し,配列 figures に設定する。
(2) 各図形の面積を求めて,結果を出力する。ここで,各図形には,正しい図形となる数値が与えられているものとする。
Figure
Triangle
Rectangle
Square
Triangle : sides = 2.0, 3.0, 3.0 : area = 2.8284271247461903
Rectangle : height = 5.0, width = 8.0 : area = 40.0 Square : width = 5.0 : area = 25.0 |
図 実行結果
〔プログラム 1〕 public class AreaTest { public static void main(String args[]) { Figure[] figures = { new Triangle(2, 3, 3), new Rectangle(5, 8), new Square(5)}; for (int i = 0; i < figures.length; i++) { System.out.println(figures[i] + "area = " + figures[i].getArea()); } } } 〔プログラム 2〕 public abstract class Figure { public abstract double getArea(); } 〔プログラム 3〕 public class Triangle extends { double la; double lb; double lc; public Triangle(double la, double lb, double lc) { this.la = la; this.lb = lb; this.lc = lc; } public String toString() { return "Triangle : sides = " + la + ", " + lb + ", " + lc + " : "; } public double getArea() { double s = (la + lb + lc) / 2.0; return Math.sqrt(s * (s - la) * (s - lb) * (s - lc)); } } 〔プログラム 4〕 public class Rectangle extends { double height; double width; public Rectangle(double height, double width) { this.height = height; this.width = width; } public String toString() { return "Rectangle : height = " + height + ", width = " + width + " : "; } public double getArea() { return ; } } 〔プログラム 5〕 public class Square extends { public Square(double width) { ; } public String toString() { return "Square : width = " + width + " : "; } }
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。解答は,重複して選んでもよい。
a,b,d に関する解答群
ア abstract イ Figure ウ getArea
エ Rectangle オ Square カ super
c に関する解答群
ア height イ height * height
ウ height * width エ width
オ width * width
e に関する解答群
ア super(height) イ super(height, height)
ウ super(width) エ super(width, height)
オ super(width, width) カ this.height = height
キ this.height = width ク this.width = height
ケ this.width = width
問9 次のアセンブラプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
〔プログラムの説明〕
連続する16語を4行4列の行列とみなす。副プログラム ROTATE は,行列Xの内容を時計回りに90度回転し,行列Yに格納するプログラムである。
(1) 行列 X の先頭アドレスは GR1に設定されて,主プログラムから渡される。
(2) 行列 Y の先頭アドレスは GR2に設定されて,主プログラムから渡される。
(3) 行列 X と行列 Y が格納されている領域は,重ならないものとする。
(4) 副プログラムから戻るとき,汎用レジスタの内容は元に戻す。
〔プログラム〕
(行番号) 1 ROTATE START ; 2 RPUSH ; 3 LAD GR3,16 ; 4 LOOP0 LAD GR4,4 ; 5 LOOP1 LD GR5,0,GR1 ; 行列Xから行列Yへ 6 ST GR5,3,GR2 ; 1語移動 7 SUBA GR3,=1 ; 8 JZE FIN ; 9 LAD GR1,1,GR1 ;行列Xのポインタを更新 10 SUBA GR4,=1 ; 11 JZE NXTROW ;1行分の処理終了? 12 ; 13 JUMP LOOP1 ; 14 NXTROW ;次の行へ 15 JUMP LOOP0 ; 16 FIN RPOP ; 17 RET ; 18 END ;
設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。
解答群
ア LAD GR2,-16,GR2 イ LAD GR2,-15,GR2
ウ LAD GR2,-14,GR2 エ LAD GR2,-13,GR2
オ LAD GR2,1,GR2 カ LAD GR2,2,GR2
キ LAD GR2,3,GR2 ク LAD GR2,4,GR2
ケ LAD GR2,6,GR2 コ LAD GR2,8,GR2
設問2 次の記述中の に入れる正しい答えを,解答群の中から選べ。
c に関する解答群
ア LOOP1 LD GR5,3,GR1 イ LOOP1 LD GR5,4,GR1
ウ LOOP1 LD GR5,7,GR1 エ LOOP1 LD GR5,8,GR1
オ LOOP1 LD GR5,15,GR1 カ LOOP1 LD GR5,16,GR1
d に関する解答群
ア LAD GR1,-4,GR1 イ LAD GR1,-3,GR1
ウ LAD GR1,-2,GR1 エ LAD GR1,-1,GR1
オ LAD GR1,2,GR1 カ LAD GR1,3,GR1
キ LAD GR1,4,GR1 ク LAD GR1,5,GR1
問10 次の C プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
ある圧電センサ(加えた圧力の大きさに応じて電圧を発生する装置)の温度補正を行うための温度補正係数を求めるプログラムを作成する。この圧電センサは,周囲の温度によって出力特性が変化するので,出力値を補正する必要がある。周囲の温度に対する圧電センサの出力値の変化を実験で調べたところ,表の結果が得られた。この表は,0 ℃での出力値を 1.00 としたときの比率を表したものである。
表 周囲の温度とセンサ出力値比率
温度 |
センサ出力値比率 |
−40 ℃ |
0.20 |
−20 ℃ |
0.60 |
−10 ℃ |
0.80 |
0 ℃ |
1.00 |
10 ℃ |
1.17 |
30 ℃ |
1.50 |
50 ℃ |
1.80 |
(1) 表のデータから温度補正テーブルを作成する。温度補正テーブルは,構造体の配列で実現する。
typedef struct { int Temp; /* 温度 */ double Ratio; /* センサ出力値の比率(実測値) */ double Step; /* 1 ℃当たりの増分 */ } CURVE;
(2) 温度補正テーブルを初期化する関数 SetupCurve と,温度補正係数 K を求める関数 GetK を作成する。
(3) GetK
は,温度 Degree
に対応する温度補正係数Kを求めるため,温度補正テーブルを二分探索法で探索する。温度範囲は,−40℃以上,50℃以下とする。温度補正テーブルに該当する温度値がないときは,温度
Degree に対するセンサ出力値比率を線形補間して求め,この値の逆数をKとして返す。
(4) 主プログラムは,この二つの関数の動作を検証するため,−40〜50℃の温度補正係数Kを,1℃ 刻みで求めて表示するテストプログラムである。表示例は,次のとおりである。
温度 温度補正係数 |
〔プログラム〕
#include <stdio.h> typedef struct { int Temp ; /* 温度 */ double Ratio ; /* センサ出力値の比率(実測値) */ double Step ; /* 1 ℃当たりの増分 */ } CURVE ; void SetupCurve( CURVE * , int ); double GetK ( int , CURVE * , int ); #define ITEMS 7 main() { int Degree ; double k ; CURVE Curve[ ITEMS ] = { { -40 , 0.20 , 0.0 },{ -20 , 0.60 , 0.0 }, { -10 , 0.80 , 0.0 },{ 0 , 1.00 , 0.0 }, { 10 , 1.17 , 0.0 },{ 30 , 1.50 , 0.0 }, { 50 , 1.80 , 0.0 } }; SetupCurve( Curve , ITEMS ); printf( " 温度 温度補正係数\n" ); for( Degree = -40 ; Degree <= 50 ; Degree++ ) { k = GetK( Degree , Curve , ITEMS ); printf( " %3d %4.2f \n" , Degree , k ); } } void SetupCurve( CURVE *p , int Points ) { /* 温度補正テーブルを初期化する */ int i ; for( i = 0 ; i < Points - 1 ; i++ , ){ p->Step = ( ) / ( (p+1)->Temp - p->Temp ); } } double GetK( int Temp , CURVE *p , int Points ) { /* 温度補正係数 K を返却値として返す */ int i,j,n ; i = 0 ; j = Points - 1 ; if ( ( Temp < p->Temp ) || ( Temp > (p+j)->Temp ) ) return 0.0; /* 温度範囲外のときは,0.0 を返す */ /* 温度補正テーブルの最後の要素の温度と一致した場合 */ if ( Temp == ( p+j )->Temp ) return 1.0 / ( p+j )->Ratio ; /* 温度補正テーブルを二分探索法で探索する */ while( 1 ) { n = ; if ( ( Temp >= ( p+n )->Temp ) && ( Temp < ( p+n+1 )->Temp ) ) break ; if ( Temp < ( p+n )->Temp ) j = n ; else ; } p += n ; return 1.0 / ( p->Ratio + p->Step * ( ) ); }
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア p-- イ p++ ウ p->Temp++
エ p += 3 オ p += 7
b に関する解答群
ア (p-1)->Ratio - p->Ratio イ (p-1)->Ratio - (p+1)->Ratio
ウ p->Ratio - (p-1)->Ratio エ p->Ratio - ( p->Ratio - 1 )
オ (p+1)->Ratio - p->Ratio
c に関する解答群
ア ( i + j ) / 2 イ ( i * j ) / 2
ウ ( i % j ) / 2 エ ( i + j ) * 2
オ ( i % j ) * 2
d に関する解答群
ア i = 0 イ i = n - 1 ウ i = n + 1
エ j = n オ j = n + 1
e に関する解答群
ア Temp - p->Step イ Temp - p->Temp ウ Temp + p->Temp
エ p->Temp - n オ p->Temp - Temp
問11 次の COBOL プログラムの説明及びプログラムを読んで,設問に答えよ。
過去の株価情報を使い,次に説明する規則に従って株式の売買をシミュレートするプログラムである。ある銘柄の株式の日々の株価を格納したファイルを読み込み,この規則による売買の記録を出力ファイルに書き出し,最後に一連の売買の結果である損益を表示する。
〔プログラムの説明〕
(1) 株式の売買規則は次のとおりである。
@ 25日移動平均線と75日移動平均線を使う。ここで,n日移動平均線とは,時間軸を移動しながら過去n取引日間の株価の平均値を求めた折れ線グラフである。取引日tの株価をPt とすると,取引日tにおけるn日移動平均MAt(n)は,次の式で求める。
A 移動平均の算出には,株価の終値(その日の最後に売買された値段)を使う。
B 25日移動平均線が75日移動平均線の下から上に交差したら,翌取引日に株式を買う。すなわち,s < t のとき,いったん MAs(25) < MAs(75)になってから,初めて MAt(25) > MAt(75) に変わったら,取引日t+1に株式を買う。
C 25日移動平均線が75日移動平均線の上から下に交差したら,翌取引日に株式を売る。すなわち,s < t のとき,いったん MAs(25) > MAs(75) になってから,初めて MAt(25) < MAt(75) に変わったら,取引日t+1に株式を売る。ただし,既に買った株式がなければ,売ることはできない。
D 株式の売買は,取引日tの高値(売買された最も高い値段)と安値(売買された最も低い値段)の平均値で売買できるものとする。
E 売買に関するその他の費用は,一切発生しないものとする。
F 株式の売買は,1回あたり1株とする。
(2) 入力ファイル(INFILE)は,ある銘柄の株式について, 75 日分以上の取引日の株価データが時系列に格納された順ファイルである。レコード様式は,次のとおりである。
日付 8 けた |
始値 9 けた |
終値 9 けた |
高値 9 けた |
安値 9 けた |
(3) 出力ファイル(OUTFILE)は,入力ファイルの株価データに, (1)の売買規則を適用したときの売買の記録を格納する順ファイルである。レコード様式は,次のとおりである。
日付 8 けた |
フラグ 1 けた |
売買価格 10 けた |
@ 出力ファイル(OUTFILE)に出力するレコードには,売買することを決定した日(取引日t)の日付,フラグ及び売買価格を格納する。
A フラグには,“売り”のとき“S”,“買い”のとき“B”を格納する。
B 売買価格には,小数点以下1けたで値を格納する。
(4) 一連の売買による損益は,小数点以下1けたの符号付き数値で表示する。
〔プログラム〕
DATA DIVISION. FILE SECTION. FD INFILE. 01 I-MARKET-PRICE-REC. 05 I-YYYYMMDD-MARKET PIC X(8). 05 I-OPENING-PRICE PIC 9(9). 05 I-CLOSING-PRICE PIC 9(9). 05 I-HIGHEST-PRICE PIC 9(9). 05 I-LOWEST-PRICE PIC 9(9). FD OUTFILE. 01 O-EXCHANGE-REC. 05 O-YYYYMMDD-EXCHANGE PIC X(8). 05 O-ACTION PIC X. 05 O-PRICE PIC 9(9)V9. WORKING-STORAGE SECTION. 01 SERIES-SIZE PIC 9(4) VALUE 100. 01 RANGE-SHORT PIC 9(4) VALUE 25. 01 RANGE-LONG PIC 9(4) VALUE 75. 01 W-MARKET-PRICE-REC. 05 W-YYYYMMDD-MARKET PIC X(8). 05 W-OPENING-PRICE PIC 9(9). 05 W-CLOSING-PRICE PIC 9(9). 05 W-HIGHEST-PRICE PIC 9(9). 05 W-LOWEST-PRICE PIC 9(9). 01 MARKET-PRICE-SERIES. 05 TBL-MARKET-PRICE-REC OCCURS 100. 10 TBL-YYYYMMDD-MARKET PIC X(8). 10 TBL-OPENING-PRICE PIC 9(9). 10 TBL-CLOSING-PRICE PIC 9(9). 10 TBL-HIGHEST-PRICE PIC 9(9). 10 TBL-LOWEST-PRICE PIC 9(9). 01 SERIES-TOP PIC 9(4). 01 TAIL-LONG PIC 9(4). 01 TAIL-SHORT PIC 9(4). 01 SUM-SHORT PIC 9(12). 01 SUM-LONG PIC 9(12). 01 MA-SHORT PIC 9(9)V9. 01 MA-LONG PIC 9(9)V9. 01 MA-COMPARE-CURRENT PIC X. 88 LONG-LT-SHORT-CUR VALUE "S". 88 SHORT-LT-LONG-CUR VALUE "L". 88 SHORT-EQ-LONG-CUR VALUE "E". 01 MA-COMPARE-PREVIOUS PIC X. 88 LONG-LT-SHORT-PRE VALUE "S". 88 SHORT-LT-LONG-PRE VALUE "L". 88 SHORT-EQ-LONG-PRE VALUE "E". 01 INFILE-EOF-FLG PIC X. 88 INFILE-EOF VALUE "Y". 88 INFILE-NOT-EOF VALUE "N". 01 TRADING-PRICE PIC 9(9)V9. 01 REVENUE PIC S9(9)V9. 01 REVENUE-ED PIC +++++++++9.9. 01 INDX PIC 9(9). 01 TRADING-ACTION PIC S9. 88 FLG-NO-TRADE VALUE 0. 88 FLG-SELL VALUE 1. 88 FLG-BUY VALUE -1. 01 STOCK-HOLDING PIC X. 88 HAS-STOCK VALUE "Y". 88 HAS-NO-STOCK VALUE "N". PROCEDURE DIVISION. MAIN-PARAGRAPH. OPEN INPUT INFILE OUTPUT OUTFILE. PERFORM INIT-MOVING-AVERAGE. IF MA-SHORT = MA-LONG THEN SET SHORT-EQ-LONG-CUR TO TRUE END-IF. PERFORM SET-CURRENT-MA-COMPARISON. MOVE ZERO TO REVENUE. SET HAS-NO-STOCK TO TRUE. SET FLG-NO-TRADE TO TRUE. SET INFILE-NOT-EOF TO TRUE. PERFORM UNTIL INFILE-EOF IF FLG-BUY OR FLG-SELL THEN PERFORM TRADE-STOCK-AND-MAKE-RECORD END-IF READ INFILE INTO W-MARKET-PRICE-REC AT END SET INFILE-EOF TO TRUE NOT AT END PERFORM CALC-NEXT-MOVING-AVERAGE PERFORM DECIDE-TRADING END-READ END-PERFORM. MOVE REVENUE TO REVENUE-ED. DISPLAY "Total Revenue: " REVENUE-ED. CLOSE INFILE OUTFILE. STOP RUN. INIT-MOVING-AVERAGE. PERFORM VARYING SERIES-TOP FROM 1 BY 1 UNTIL RANGE-LONG < SERIES-TOP READ INFILE INTO TBL-MARKET-PRICE-REC(SERIES-TOP) END-PERFORM. COMPUTE TAIL-SHORT = SERIES-TOP - RANGE-SHORT. COMPUTE TAIL-LONG = SERIES-TOP - RANGE-LONG. SUBTRACT 1 FROM SERIES-TOP. MOVE ZERO TO SUM-SHORT. PERFORM VARYING INDX ADD TBL-CLOSING-PRICE(INDX) TO SUM-SHORT END-PERFORM. MOVE SUM-SHORT TO SUM-LONG. PERFORM VARYING INDX ADD TBL-CLOSING-PRICE(INDX) TO SUM-LONG END-PERFORM. COMPUTE MA-SHORT ROUNDED = SUM-SHORT / RANGE-SHORT. COMPUTE MA-LONG ROUNDED = SUM-LONG / RANGE-LONG. SET-CURRENT-MA-COMPARISON. EVALUATE TRUE WHEN MA-SHORT = MA-LONG CONTINUE WHEN MA-SHORT < MA-LONG SET SHORT-LT-LONG-CUR TO TRUE WHEN MA-LONG < MA-SHORT SET LONG-LT-SHORT-CUR TO TRUE END-EVALUATE. TRADE-STOCK-AND-MAKE-RECORD. EVALUATE TRUE WHEN FLG-BUY MOVE "B" TO O-ACTION SET HAS-STOCK TO TRUE WHEN FLG-SELL AND MOVE "S" TO O-ACTION SET HAS-NO-STOCK TO TRUE END-EVALUATE. IF O-ACTION = "B" OR O-ACTION = "S" THEN COMPUTE TRADING-PRICE ROUNDED = ( TBL-HIGHEST-PRICE(SERIES-TOP) + TBL-LOWEST-PRICE(SERIES-TOP) ) / 2 COMPUTE REVENUE = REVENUE + TRADING-PRICE * MOVE TBL-YYYYMMDD-MARKET(SERIES-TOP) TO O-YYYYMMDD-EXCHANGE MOVE TRADING-PRICE TO O-PRICE WRITE O-EXCHANGE-REC END-IF. CALC-NEXT-MOVING-AVERAGE. ADD W-CLOSING-PRICE TO SUM-SHORT SUM-LONG. SUBTRACT TBL-CLOSING-PRICE(TAIL-SHORT) FROM SUM-SHORT. SUBTRACT TBL-CLOSING-PRICE(TAIL-LONG) FROM SUM-LONG. COMPUTE MA-SHORT ROUNDED = SUM-SHORT / RANGE-SHORT. COMPUTE MA-LONG ROUNDED = SUM-LONG / RANGE-LONG. ADD 1 TO SERIES-TOP TAIL-SHORT TAIL-LONG. EVALUATE TRUE WHEN SERIES-SIZE < SERIES-TOP MOVE 1 TO SERIES-TOP WHEN SERIES-SIZE < TAIL-SHORT MOVE 1 TO TAIL-SHORT WHEN SERIES-SIZE < TAIL-LONG MOVE 1 TO TAIL-LONG END-EVALUATE. MOVE W-MARKET-PRICE-REC TO TBL-MARKET-PRICE-REC(SERIES-TOP). DECIDE-TRADING. MOVE MA-COMPARE-CURRENT TO MA-COMPARE-PREVIOUS. PERFORM SET-CURRENT-MA-COMPARISON. SET FLG-NO-TRADE TO TRUE. EVALUATE TRUE WHEN AND LONG-LT-SHORT-CUR SET FLG-BUY TO TRUE WHEN LONG-LT-SHORT-PRE AND SHORT-LT-LONG-CUR SET FLG-SELL TO TRUE END-EVALUATE.
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a,b に関する解答群
ア FROM 1 BY 1 UNTIL SERIES-SIZE < INDX
イ FROM SERIES-TOP - 1 BY -1 UNTIL INDX < TAIL-SHORT
ウ FROM SERIES-TOP BY -1 UNTIL INDX <= TAIL-SHORT
エ FROM TAIL-LONG BY 1 UNTIL TAIL-SHORT <= INDX
オ FROM TAIL-SHORT BY 1 UNTIL SERIES-TOP < INDX
c 〜 e に関する解答群
ア FLG-BUY イ FLG-SELL
ウ HAS-STOCK エ LONG-LT-SHORT-CUR
オ MA-COMPARE-CURRENT カ SHORT-LT-LONG-PRE
キ TRADING-ACTION
問12 次のJavaプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
〔プログラムの説明〕
ある学校の図書館には自習用の席が 30 あり,次の規則で運用されている。
運用規則
(1) 生徒が席を使用するときは受付で申請し,割り当てられた席を使用する。使用終了時には,受付に届ける。
(2) 空席がないときに使用希望者がある場合は, 1時間を超えて最も長く使用している者が使用希望者のために席を空けなければならない。空席がなく,1時間を超えて使用している者がいない場合,使用希望者は席を使用できない。
(3) 1人で同時に複数の席を使用することはできない。
この運用規則に従った自習席管理を支援するためのプログラムを,次のように設計した。
(1) 図に示す双方向リストを実装するためのクラス ListElement を定義する。双方向リストは環状にし,要素の挿入・削除処理で終端を特別扱いしないようにする。 ListElement は,リストのヘッド(先頭)と要素の両方を表現する。 ListElement では,次のメソッドを実装する。
nextElement
この ListElement インスタンスの次の要素を返す。
previousElement
この ListElement インスタンスの前の要素を返す。
insertBefore
この ListElement インスタンスを,引数で指定された要素の前に挿入する。
remove
この ListElement インスタンスをリストから削除する。
図 空のときと要素があるときの双方向リストの状態
(2) 席は,ListElement を拡張したクラス Seat で表す。各席に座席番号が割り振られる。
(3) クラス SeatManager で,運用規則を実現するためのメソッドを実装する。
(4) 空席,使用中の席のリストを,それぞれ freeSeats,occupiedSeats とする。 Seat のインスタンスが各リストの要素となる。
(5) 使用中の席は,occupiedSeats に登録する。リストは使用時間が短いものから長いものへと並ぶように管理する。
(6) SeatManager では,次の public メソッドを実装する。
checkin
引数で指定された使用希望者が既に席を使用中でないことを確認する。 freeSeats(空席リスト)に空きがあればその席を,なければ 1 時間を超えて使われている席を使用希望者に割り当てる。割り当てられた席を occupiedSeats(使用中リスト)の最初の要素として登録し,その Seat インスタンスを返す。使用できる席がなければ null を返す。
checkout
引数で指定された使用者が使っていた席を occupiedSeats から削除して freeSeats へ戻し, true を返す。指定された使用者が occupiedSeats に見つからないときは false を返す。
最初に,クラス ListElement 及びクラス Seat を実装して単体テストを行い,正しく動作することを確認した。次に,クラス SeatManager を実装してテストしたところ, 1人で同時に複数の席が使用できるという不具合が見つかった。それ以外は,正常に動作することを確認した。
〔プログラム 1〕 public class ListElement { private ListElement prev, next; public ListElement() { prev = next = this; } public ListElement nextElement() { return next; } public ListElement previousElement() { return prev; } public void insertBefore(ListElement element) { next = element; prev = element.prev; next.prev = prev.next = ; } public void remove() { = next; = prev; prev = next = this; } } 〔プログラム 2〕 public class Seat extends ListElement { private String userID; // 使用者 private long checkinTime; // 使用開始時刻 private int seatNumber; // 座席番号 public Seat(int seatNumber) { this.seatNumber = seatNumber; } public int getSeatNumber() { return seatNumber; } public String getUserID() { return userID; } public void setUserID(String userID) { this.userID = userID; } public boolean isUsedBy(String userID) { return this.userID.equals(userID); } public long getCheckinTime() { return checkinTime; } public void setCheckinTime(long time) { checkinTime = time; } } 〔プログラム 3〕 public class SeatManager { private static final int NSEATS = 30; // 席数 // 最大使用時間〔ミリ秒〕 private static final int MAXTIME = 60 * 60 * 1000; // 空席リスト private ListElement freeSeats = new ListElement(); // 使用中リスト private ListElement occupiedSeats = new ListElement(); public SeatManager() { for (int i = 1; i <= NSEATS; i++) { Seat seat = new Seat(i); seat.insertBefore(freeSeats); } } // 空席リストに空席があればその Seat インスタンスを空席リストから // 削除し,そのインスタンスを返す。空きがなければ null を返す。 private Seat getFreeSeat() { ListElement le = freeSeats.nextElement(); if (le != freeSeats) { le.remove(); return (Seat) le; } return null; } // 使用中リストを調べ,最大使用時間を超えて席を使用している // 使用者がいれば,その旨出力し,checkout を呼ぶ。 private void vacateExpiredSeat(long time) { ListElement le = ; if (le != occupiedSeats) { Seat seat = (Seat) le; if ((seat.getCheckinTime() + MAXTIME) < time) { System.out.println("Seat#" + seat.getSeatNumber() + " " + seat.getUserID() + " must check out."); checkout(seat.getUserID()); } } } // 使用中リストから指定された使用者が使っている席を探し,見つかれば // その席を,見つからなければ null を返す。 private Seat findUser(String userID) { ListElement le = ; while (le != occupiedSeats) { Seat seat = (Seat) le; if (seat.isUsedBy(userID)) { return seat; } le = le.nextElement(); } return null; } public Seat checkin(String userID) { long now = System.currentTimeMillis(); Seat seat = getFreeSeat(); if (seat == null) { vacateExpiredSeat(now); seat = getFreeSeat(); } if (seat != null) { seat.setCheckinTime(now); seat.setUserID(userID); seat.insertBefore(occupiedSeats.nextElement()); } return seat; } public boolean checkout(String userID) { Seat seat = findUser(userID); if (seat != null) { seat.remove(); seat.setUserID(null); seat.insertBefore(freeSeats); return true; } return false; } }
設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a 〜 c に関する解答群
ア element イ element.next ウ element.prev
エ new ListElement() オ next カ next.prev
キ null ク prev ケ prev.next
コ this
d,e に関する解答群
ア freeSeats
イ freeSeats.nextElement()
ウ freeSeats.previousElement()
エ occupiedSeats
オ occupiedSeats.nextElement()
カ occupiedSeats.previousElement()
設問2 1人で同時に複数の席を使用できないようにプログラム3を修正したい。修正方法として適切なものを,解答群の中から選べ。ただし,プログラム中の 〜 にはすべて正しい答えが入っているものとする。
解答群
ア メソッド checkin で,席の割当て処理をする前に occupiedSeats を調べ,もしこの使用希望者が既に他の席を使用中であればエラーとし,席の割当て処理を行わない。
イ メソッド checkout で,使用を終了した席が occupiedSeats から正しく削除されていないので,occupiedSeats から使用を終了した席を正しく削除する。
ウ メソッド vacateExpiredSeat で,最大使用時間(MAXTIME)を超えて席を使用している者を強制的にチェックアウトさせるために,メソッド checkout を呼び出している。その直後に,その使用者の使っていた席を occupiedSeats から削除する処理を追加する。
問13 次のアセンブラプログラムの説明及びプログラムを読んで,設問1〜3に答えよ。
〔プログラムの説明〕
副プログラム BMOVE は,次に示すように,語1 のビット列A を語2 の B の位置に移動する。 x,y,z はそれぞれビット数を表す。
(1) GR1〜GR5には,それぞれ次の内容が設定されて,主プログラムから呼ばれる。
GR1:語1 のアドレス
GR2:語2 のアドレス
GR3:x
GR4:y
GR5:z
(2) x ≧ 0,y ≧ 0,z ≧ 1 とする。
(3) x + z ≦ 16,y + z ≦ 16 とする。
(4) 語1 と語2 は異なる語である。
(5) 副プログラムから戻るとき,汎用レジスタの内容は元に戻す。
〔プログラム〕
(行番号) 1 BMOVE START ; 2 PUSH 0,GR6 ; レジスタの内容を保存 3 PUSH 0,GR7 ; " 4 LD GR6,=#8000 ; 1のビットをz個並べる 5 ; " 6 LD GR7,GR6 ; 7 SRL GR7,0,GR4 ; 語2の部分Bのビットを 8 XOR GR7,=#FFFF ; ゼロにする 9 AND GR7,0,GR2 ; 10 ; 語1のビット列Aを取り出す 11 AND GR6,0,GR1 ; 12 SLL GR6,0,GR3 ; 取り出したビット列を 13 ; Bの位置にシフト 14 OR GR6,GR7 ; 15 ST GR6,0,GR2 ; 16 POP GR7 ; レジスタの内容を元に戻す 17 POP GR6 ; 18 RET ; 19 END ;
設問1 プログラム中の に入れる正しい答えを,解答群の中から選べ。
解答群
ア SLA GR6,0,GR3 イ SLA GR6,0,GR4
ウ SLL GR6,0,GR3 エ SLL GR6,0,GR4
オ SRA GR6,-1,GR3 カ SRA GR6,-1,GR5
キ SRL GR6,-1,GR5 ク SRL GR6,0,GR3
ケ SRL GR6,0,GR4
設問2 主プログラムから渡された語1,語2,x,y 及び z の内容が次のとき,行番号12 の命令(SLL)実行直後のGR6の内容として正しい答えを,解答群の中から選べ。
語 1 |
0010 |
0110 |
1101 |
0111 |
語 2 |
1100 |
1101 |
0111 |
1010 |
x = 9
y = 3
z = 5
解答群
ア |
| イ |
|
|||||||||
ウ |
| エ |
|
設問3 副プログラム BMOVE を使用して,語1のビット列A と語2 のビット列B を入れ替えるプログラム BSWAP を作成した。 に入れる正しい答えを,解答群の中から選べ。ここで,GR1〜GR5には,BMOVE と同じように各パラメタが設定されて呼ばれる。
(行番号) 1 BSWAP START ; 2 RPUSH ;レジスタを退避 3 LD GR6,0,GR2 ; 4 ST GR6,WORD ;語2 を WORD に保存 5 CALL BMOVE ; 6 LD GR2,GR1 ;語1 のアドレスを語2 のアドレスとする 7 ;WORD のアドレスを語1 のアドレスとする 8 PUSH 0,GR4 ; 9 ; x と y を入れ替える 10 POP GR3 ; 11 CALL BMOVE ; 12 RPOP ;レジスタを復元 13 RET ; 14 WORD DS 1 ; 15 END ;
解答群
ア LAD GR1,WORD イ LAD GR4,WORD
ウ LD GR1,WORD エ LD GR3,GR4
オ LD GR4,GR3 カ LD GR4,WORD
キ POP GR4 ク PUSH 0,GR3