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

1 語が 16 ビットで,主記憶の容量が 65,536 語の計算機がある。 4 個の汎用レジスタ(0 〜 3)とプログラムレジスタ(以下,PR という)をもつ。命令語(2 語長)の形式は次のとおりである。

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 ))

注 ( ):( )内のレジスタ又はアドレスに格納されている内容を示す。

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

汎用レジスタと主記憶の内容が図に示す値(値は 16 進数)のとき, PR に 010016 を設定してプログラムを実行した。ここで,010016 番地の命令は,011B16 番地(下線)の内容 011316 を汎用レジスタ 0 に設定している。実行終了時には,汎用レジスタ 0 に ,汎用レジスタ 1 に ,汎用レジスタ 2 に ,汎用レジスタ 3 に が設定される。

汎用レジスタ     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の例のように,文書,画像などのファイル情報を管理している台帳がある。ファイル情報は4項目(ファイル名,種別コード,版コード,作成年月日)からなり,各項目の内容は文字列である。この台帳の各項目について検索する。検索条件は,正規表現で指定する。

     表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   

種別コードが JPG 又は JPEG となっているファイルをすべて抽出したい。種別コード検索用の正規表現として正しい答えを,解答群の中から選べ。

解答群

ア 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へ戻る。
この信号によって,他の接続機器は,衝突の発生を知ることができる。

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

図のとおりに接続されている LAN がある。接続機器 Xと接続機器 Y との間の伝送路の距離は,230 mである。また,この伝送路の信号伝搬速度は,230 m/マイクロ秒である。今,接続機器 X からのフレームの送出が開始された。
この送出開始から, マイクロ秒経過する前に,接続機器 Y から送出するフレームが発生したとき,接続機器 Y は,ステップ 1 を経て に移る。その後,接続機器 Y は,衝突を検出する。
接続機器 X が,衝突を検出するまでにかかる時間は,後から送出を開始した接続機器 Y からの送出開始との時間差によって,最も長い場合,接続機器 X からのフレーム送出開始から マイクロ秒経過後となる。
この時間が経過するより前に,接続機器 X からの送出を終えてしまうと,接続機器 X は, から に移り,衝突を検出できないことになる。ここで,接続機器は両端のターミネータ間の任意の位置に取り付けることができるとすると,この検出方法では,1 フレームの送出にかかる時間は,伝送路のターミネータ間の信号の往復時間以上でなければならないことが分かる。


  図 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

メソッド main をもつクラスである。このクラスは,次の処理を行う。

(1) 三角形,長方形及び正方形のオブジェクトを生成し,配列 figures に設定する。

(2) 各図形の面積を求めて,結果を出力する。ここで,各図形には,正しい図形となる数値が与えられているものとする。

Figure

図形の抽象クラスである。このクラスは,面積を計算してその結果を返す抽象メソッド getArea を宣言している。

Triangle

三角形のクラスである。このクラスは,属性を文字列にして返すメソッド toString と三角形の面積をへロンの公式によって計算してその結果を返すメソッド getArea を定義している。

Rectangle

長方形のクラスである。このクラスは,属性を文字列にして返すメソッド toString と長方形の面積を計算してその結果を返すメソッド getArea を定義している。

Square

正方形のクラスである。このクラスは,属性を文字列にして返すメソッド toString を定義している。 プログラム1の実行結果を図に示す。

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  次の記述中の に入れる正しい答えを,解答群の中から選べ。

行列 X の内容を反時計回りに 90度回転し,行列 Y に格納するように変更するには,行番号5 を に,行番号9 を に,それぞれ変更すればよい。

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

圧電センサの出力値を,測定時の周囲の温度に依存しない値に補正するため,この表のデータを基にして温度補正係数Kを求める。圧電センサの出力値にKを乗算することによって温度補正を行う。

(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℃ 刻みで求めて表示するテストプログラムである。表示例は,次のとおりである。

温度  温度補正係数
-40 5.00
-39 4.55
-38 4.17
-37 3.85
-36 3.57
-35 3.33
-34 3.13
-33 2.94
-32 2.78
-31 2.63
-30 2.50
-29 2.38
-28 2.27
-27 2.17
-26 2.08
-25 2.00
   :

〔プログラム〕


#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

解答群

ア 

0000

0000

0001

0101

  イ 

0000

0000

0101

0100

ウ 

0001

0101

0000

0000

  エ 

1010

1000

0000

0000

設問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