平成13年度 秋期 基本情報技術者試験午後問題
問1〜問5までは必須問題です。全問解答してください。

問1

命令語に関する次の記述を読んで,設問に答えよ。 次に示す形式の命令語がある。

(1) 命令語は 2 語(32 ビット)で 1 命令を表す。1 語は 16 ビットである。

(2) 各部の意味は,次のとおりである。

 命令部(ビット番号 0 〜 7)

命令コード α が格納されている。

 レジスタ部(ビット番号 8 〜 11)

レジスタ番号 β が格納されている(0≦β≦15)。
 修飾部(ビット番号 12 〜 15)
アドレス部の修飾方式を示す γ が格納されている(0≦γ≦15)。

 アドレス部(ビット番号 16 〜 31)

主記憶の語のアドレス δ が格納されている。

(3) 実効アドレスは,γ に対応して,次のとおりである。

γ の値

実効アドレス

0

δ

1 〜 15

レジスタ γ の内容+δ

(4) 16 進数で表す命令コードの一部とその意味を次に示す。

命令コード

命令コードの意味

4A

実効アドレスをレジスタ β に設定する。

4B

実効アドレスが指す語の内容をレジスタ β に設定する。

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

次の二つの命令語がある。これらの命令語の実行直前の各レジスタ及び主記憶の内容は,それぞれ図 1 及び図 2 に示すとおりとする。各内容は,16 進数で表している。

命令語 1   4A3001A0
命令語 2   4B450003

(1) 命令語 1 の γ の値は, である。

(2) 命令語 1 を実行すると,レジスタ が設定される。

(3) 命令語 2 を実行すると,レジスタ 4 に が設定される。

a,b に関する解答群

ア 0    イ 1    ウ 3    エ 4
オ 5    カ A    キ B

c,d に関する解答群

ア 0000    イ 0002    ウ 0003    エ 019E
オ 019F    カ 01A0    キ 01A1    ク 01A2
ケ 01A3    コ 01A4  
 
解答欄a
ア  
イ 
ウ 
エ 
   
解答欄b
ア  
イ 
ウ 
エ 
   
解答欄c
ア  
イ 
ウ 
エ 
   
解答欄d
ア  
イ 
ウ 
エ 
 

問2

 次のプログラムの説明,擬似言語の記述形式の説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

整数値を,指定された書式に従って 10 進の数字列に変換する副プログラムである。

(1) 副プログラム Format は,配列 Ctrl に格納されている書式文字に従って,変数 Val に格納されている整数値を 10 進の数字列に変換し,配列 Out に格納する。

Format の引数の仕様を表 1 に示す。

表1 引数の仕様

変数名

入力/出力

意味

Val

入力

変換対象の整数値
Ctrl[]

入力

書式文字が格納されている文字型の配列
Out[]

出力

変換結果を格納する文字型の配列

要素数は配列 Ctrl と同じ

(2) 配列 Ctrl の各要素には,表 2 に示す書式文字だけが格納されている。 Format は,配列 Ctrl の最後の要素から最初に向かって,各書式文字の意味する処理を行い,配列 Out の対応する位置に結果を格納する。

表2 書式文字の種類と意味

書式文字

意味

“ # ”

10 進数字の 1 けた又は負符号を格納する。 ただし,整数値の変換が終わっている場合は,空白文字を格納する。

“ , ”

けた区切りのコンマ又は負符号を格納する。 ただし,整数値の変換が終わっている場合は,空白文字を格納する。

“ ”

空白文字を格納する。

(3) 変数 Val の整数値が正しく変換できない場合は,配列 Out の全要素に“*”を格納する。

(4) 配列 Ctrl には,少なくとも一つの“#”が含まれる。

例:

〔擬似言語の記述形式の説明〕

〔プログラム〕

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

a に関する解答群

ア N ← M − (M * 10)        イ N ← M − (M / 10)
ウ N ← M − ((M * 10) / 10)    エ N ← M − ((M / 10) * 10)

b,c に関する解答群

ア Out[Loop1] ← Ctrl[Loop1]    イ Out[Loop1] ← Digit[N]
ウ Out[Loop1] ← " "        エ Out[Loop1] ← "-"
オ Out[Loop1] ← "0"        カ Out[Loop1] ← ","

d に関する解答群

ア M > 0            イ M > 0 and Sign = "-"
ウ M > 0 or Sign = "-"    エ M > 0 and Zero = false
オ M > 0 or Zero = false
解答欄a
ア  
イ 
ウ 
エ 
   
解答欄b
ア  
イ 
ウ 
エ 
   
解答欄c
ア  
イ 
ウ 
エ 
   
解答欄d
ア  
イ 
ウ 
エ 
 

問3 

 トランザクション処理性能に関する次の記述を読んで,設問に答えよ。

図に示すように 1 個の CPU 及び 2 台のディスク装置から構成されるサーバがある。各ディスクには,図のようにそれぞれデータベース DB1 とデータベース DB2 が格納されている。このサーバにおいて,各ディスクで異なるトランザクションをそれぞれ独立に処理することができる。このトランザクション処理の内容を分析したところ,1 トランザクション当たりのシステム資源の平均使用時間の内訳は,表のとおりであった。

図 サーバの構成

表 1トランザクション当たりのシステム資源の平均使用時間

システム資源

1 トランザクション当たりの平均使用時間

CPU

20 ミリ秒

ディスク 1

80 ミリ秒

ディスク 2

40 ミリ秒

サーバ稼働中のある時点において,1 秒間にそのサーバが処理するトランザクション件数をそのサーバの TPS(Transaction Per Second)と呼ぶ。このとき,サーバの TPS,あるシステム資源の使用率,及び 1 トランザクション当たりのそのシステム資源の平均使用時間(以下,平均使用時間と呼ぶ)の関係は,次のとおりである。

使用率 = TPS × 平均使用時間 ……… 

例えば,あるシステム資源の平均使用時間が 50 ミリ秒であって,その使用率が 80% であるとき,サーバの TPS は次式で計算できる。

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

(1) 図で示す各システム資源の使用率の上限値を 40% とした場合,このサーバの TPS の上限値は である。

(2) 各システム資源の使用率の上限値を 40% としたままで,サーバの TPS の上限値を 4 倍にするためには,少なくとも にしてディスク装置のアクセス時間を短縮させる必要がある。ここで,あるシステム資源を n 倍にした場合,トランザクション処理におけるそのシステム資源のアクセス時間は 1/n になるものとする。

(3) このサーバの TPS が 10 のとき,このトランザクション処理の平均応答時間は,トランザクション処理時間の約 倍である。ここで,各システム資源の平均応答時間は次のとおりとし,トランザクション処理の平均応答時間は各システム資源の平均応答時間の和とする。

(4) 式 及び から,サーバの TPS を上げていくとシステム資源の使用率は高くなり, ことが分かる。

a に関する解答群

ア 0.005    イ 0.01    ウ 0.02
エ 5      オ 10     カ 20

b に関する解答群

ア ディスク 1 の台数を 4 台
イ ディスク 2 の台数を 4 台
ウ ディスク 1 の台数を 2 台,かつディスク 2 の台数を 2 台
エ ディスク 1 の台数を 2 台,かつディスク 2 の台数を 4 台
オ ディスク 1 の台数を 4 台,かつディスク 2 の台数を 2 台

c に関する解答群

ア 0.48    イ 0.95    ウ 1.66
エ 2.86    オ 3.51

d に関する解答群

ア 平均応答時間が増加する    イ 平均応答時間が減少する
ウ 平均使用時間が増加する    エ 平均使用時間が減少する
解答欄a
ア  
イ 
ウ 
エ 
   
解答欄b
ア  
イ 
ウ 
エ 
   
解答欄c
ア  
イ 
ウ 
エ 
   
解答欄d
ア  
イ 
ウ 
エ 
  

問4

 次のプログラムの説明,擬似言語の記述形式の説明及びプログラムを読んで,設問1,2 に答えよ。

〔プログラムの説明〕

配列 M の要素番号 from から len 個の配列要素(これを複写元領域と呼ぶ)の内容を,配列 M の要素番号 to から len 個の配列要素(これを複写先領域と呼ぶ)へ複写する。

(1) 配列 M の要素数は size で,size > 0 である。要素番号は 0 から始まる。

(2) 複写する要素数は len で,len ≧ 0 である。

(3) 処理は,1 要素を読み出して格納する操作を,要素番号の昇順に len 回繰り返す。

(4) 処理の概要を,次に示す。

〔擬似言語の記述形式の説明〕

〔プログラム 1〕

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

プログラム 1 の選択処理では,from,to,len の値が負でないこと,及びプログラムの処理中に配列 M の添字の値が上限を超えないことを判定している。このために指定すべき条件式は, である。

複写元領域と複写先領域とが一部重複していると,プログラム実行前の複写元領域の内容と,プログラム実行後の複写先領域の内容とが一致しない場合が生ずる。例えば,プログラム実行前の複写元領域の内容が,次のとき,

to の値を としてプログラムを実行すると,実行後の複写先領域の内容は,

となる。

一般に,内容の一致が保証できないのは,複写先として格納された要素が,後に複写元の要素として読み出される場合であるから, という条件のときである。

a に関する解答群

ア from < size and to < size
イ from < size and to < size andlen < size
ウ from+len < size and to+len < size
エ from+len ≦ size and to+len ≦ size

b に関する解答群

ア from−1    イ from+len−1
ウ from+1    エ from+len+1

c に関する解答群

ア from < to and to < from+len
イ to < from and from < to+len
ウ from < to and to ≦ from+len
エ to < from and from ≦ to+len
解答欄a
ア  
イ 
ウ 
エ 
   
解答欄b
ア  
イ 
ウ 
エ 
   
解答欄c
ア  
イ 
ウ 
エ 
 
設問2  次のプログラム 2 中の に入れる正しい答えを,解答群の中から選べ。

前に示したプログラムの説明に,次の (5) 〜 (7) を追加して,その仕様を満たすプログラム 2 を作る。

(5) 配列 M の配列要素は,最後尾から先頭へと循環しているものとする。すなわち,複写元領域及び複写先領域のいずれも,M[size−1] の直後に M[0] が続くものとして,処理を継続する。次に示すのは,複写元領域が循環している場合の例である。

(6) 複写する要素数 len の値の範囲は,0 ≦ len < size とする。

(7) プログラム実行前の複写元領域の内容と,プログラム実行後の複写先領域の内容との一致が保証できないときは,複写をせずにエラー処理プログラムを呼ぶ。

〔プログラム 2 〕

解答群

ア from+len ≦ to and to ≦ from
イ from+len ≦ to or to ≦ from
ウ from+len−size ≦ to and to ≦ from
エ from+len−size ≦ to or to ≦ from
解答欄d
ア  
イ 
ウ 
エ 
   
解答欄e
ア  
イ 
ウ 
エ 
 

問5

 ファイルの突合せ処理に関する次の記述を読んで,設問 1 〜 4 に答えよ。

R 社は通信販売業者である。 R 社の顧客管理システムの概要は,次のとおりである。

(1) 広告の実施:毎月 1 回,新聞とダイレクトメール(DM)によって商品の広告をする。 DM は過去に商品を購入したことのある顧客(既存顧客)に郵送する。

(2) 商品購入申込みの受付:DM に同封した専用の申込みはがき(以下,専用はがきと呼ぶ)による商品購入申込みの場合は,既存顧客からの申込みとして処理する。専用はがきには,顧客番号をはじめとする情報があらかじめ印字してある。新聞広告をみて,専用はがきを用いずに商品購入申込みをしてきた場合には,新規顧客として顧客データベースに登録する。顧客データベースの更新処理は,決まった曜日に一括して行う。

R 社の顧客データベースには,顧客の郵便番号,住所,氏名,電話番号,過去 1 年間の申込み実績などが記録されている。 (2) で述べた新規顧客を,顧客データベースに登録する際,顧客カウンタを使って顧客番号を付与する。

顧客データベースに登録されている顧客が,専用はがきを用いずに申し込んできた場合は,新規顧客として顧客データベースに登録されてしまう。その結果,同一顧客が顧客データベース上に別顧客として登録される事例(重複顧客)が発生する。このとき,住所表記の省略の仕方などが異なっている場合がある。

顧客の重複は DM コストの無駄にもなるので,重複顧客の名寄せ(同一人の登録データをまとめること)を行うことにした。

当初は名寄せを,手作業で行うことにした。そのための資料として,顧客データベースの内容を様々な順序(例えば,氏名順,住所順,電話番号順など)で整列して各種のリストを出力した。これらのリストをもとに,同一顧客かどうかの判定をし,重複顧客のデータをまとめた。しかし,現在の顧客データベース更新方式のままでは,期間が経過すると,再び顧客の重複が発生してしまう。

そこで,名寄せキー及び名寄せ用顧客マスタファイルを用いた,図 1 の名寄せキー作成及び顧客データベース更新処理と図 2 の名寄せ用顧客マスタファイル更新処理で,重複の発生防止状況を観察することにした。
図1 名寄せキー作成及び       図2 名寄せ用顧客マスタファイル
    顧客データベース更新処理        更新処理

名寄せキーとは,郵便番号,住所,氏名及び電話番号を一定の形式に変換したものであり,突合せ処理に使用する。手作業での名寄せの経験を基に,例えば,“東京都港区虎ノ門一丁目 16 番 4 号”と“港区虎ノ門 1 − 16 − 4”を同一住所と見なすための工夫が,名寄せキーにはなされている。

名寄せ用顧客マスタファイルは,顧客データベースの内容に名寄せキーを付加し,名寄せキーの順番に並べ替えたものである。

申込みデータ(図 3)を作成するとき,専用はがきによる申込みの場合にだけ顧客番号を入力する。それ以外の場合は,空白にする。また,専用はがきの場合,住所などの変更記入があるときだけ,申込みデータに郵便番号,住所,氏名及び電話番号をすべて入力する。

顧客番号

郵便番号

住所

氏名

電話番号

申込日

備考

申込内容

商品コード

数量

商品コード

数量

図3 申込みデータの様式

設問1  図 1 の処理 4 について,T ファイルのデータを 1 件ずつ読むときの処理として, に入れる正しい答えを,解答群の中から選べ。

(1) 顧客番号のあるデータは, する。

(2) 顧客番号がなく,一致する名寄せキーが名寄せ用顧客マスタファイルに存在した。その場合 し, する。

(3) 顧客番号がなく,一致する名寄せキーが名寄せ用顧客マスタファイルに存在しなかった。その場合 し,変更したデータを U ファイルに出力する。

解答群

ア T ファイルの顧客番号を取得
イ T ファイルの郵便番号,住所,氏名及び電話番号を取得
ウ 顧客カウンタを用いて,新たな顧客番号を取得
エ そのまま U ファイルに出力
オ 名寄せキーを再作成
カ 名寄せ用顧客マスタファイルの顧客番号を取得
キ 名寄せ用顧客マスタファイルの名寄せキーと照合
ク 名寄せ用顧客マスタファイルの郵便番号,住所,氏名及び電話番号を取得
ケ 変更したデータを U ファイルに出力
解答欄a
ア  
イ 
ウ 
エ 
    
解答欄b
ア  
イ 
ウ 
エ 
    
解答欄c
ア  
イ 
ウ 
エ 
    
解答欄d
ア  
イ 
ウ 
エ 
設問2  図 1 の名寄せ用顧客マスタファイルの内容は,当初,顧客データベースの内容をそのまま並べ替えたものとして作成したので,過去 1 年間の申込み実績などこの処理に必要でない項目を含んでいた。名寄せ用顧客マスタファイルの内容として必要な項目の正しい組合せを,解答群の中から選べ。
 顧客番号
 氏名
 住所
 電話番号
 名寄せキー
 郵便番号
  解答群
@      
D
@,A
@,D    
@
@,A,E
@,A,B,C 
@,A,B,D
@,A,D,E
@,A,B,C,D,E 
設問3  図 2 中の に入れる正しい答えを,解答群の中から選べ。
 解答群
ア S ファイル
イ T ファイル
ウ U ファイル
エ V ファイル
オ 顧客カウンタ
カ 名寄せ用顧客マスタファイル
キ 申込みデータ
設問4  図 2 の処理 8 で行う処理を,解答群の中から二つ選べ。
解答群
ア 既存顧客のデータは,そのまま X ファイルに出力する。
イ 既存顧客のデータは,名寄せキーを更新する。

ウ 既存顧客のデータは,抹消する。

エ 既存顧客のデータは,郵便番号,住所,氏名及び電話番号を更新する。

オ 新規顧客のデータは,顧客番号順の該当箇所に挿入する。

カ 新規顧客のデータは,名寄せキー順の該当箇所に挿入する。
キ 新規顧客のデータは,名寄せキーを作成する。
問6〜問9までは、選択問題です。1問のみを選択してください。

問6

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

〔プログラムの説明〕

簡単な構造をもつ文字列を解析して,要素に分解するプログラムを作成した。

(1) タグ付き文字列の構文規則を,次のように定義する。ここで,構文の記述に用いる記号の意味を,表 1 のように定める。また,<,> 及び / は,字句要素である。

、 表1 構文の記述に用いる記号の意味

記号

意味

::=

定義する

|

又は

{ }*

“{”と“}”で囲まれた構文要素の 0 回以上の繰返し
タグ付き文字列 ::= {タグ構造}*
タグ構造 ::= 開始タグ タグの値 {タグ構造}* 終了タグ
開始タグ ::= <タグ名>
終了タグ ::= </タグ名>
タグ名 ::= <,>,/ 及び“\0”を含まない文字列
タグの値 ::= <,>,/ 及び“\0”を含まない文字列 | 空文字列
文字列 ::= {文字}*

(2) プログラムの仕様は,次のとおりである。

 関数 parse_ml_string は,与えられたタグ付き文字列 mlstr を要素に分解して,開始タグの出現順に要素配列 elmtbl に格納する。要素数は,変数 elmnumに格納する。ここで,要素は次の構造体で表す。

typedef struct {
char *tag; /* タグ名 */
int depth; /* 入れ子の深さ(1,2,…) */
char *value; /* タグの値 */
} ELEMENT;

 タグ付き文字列に含まれるタグの要素数が,256 を超えることはない。

 与えられるタグ付き文字列に,構文の誤りはない。

(3) タグ構造が,別のタグ構造を含むこともある(図 1 参照)。


>図1 入れ子になったタグ構造の例

(4) 入れ子の深さは,最上位のタグ構造を 1 として,上位から下位に向かって,1,2,3,… とする。

(5) 図 2 のタグ付き文字列に対するプログラムの実行結果は,表 2 のとおりである。

<STUDENT>BILL<AGE>14</AGE><SCHOOL>Junior
<PLACE>Minato</PLACE></SCHOOL></STUDENT>
    注 文字列に改行は含まない

          図2 タグ付き文字列 mlstr の値

      表2 要素配列 elmtbl

タグ名 tag

入れ子の深さ depth

タグの値 value

“STUDENT”へのポインタ

1

“BILL”へのポインタ
“AGE”へのポインタ

2

“14”へのポインタ
“SCHOOL”へのポインタ

2

“Junior”へのポインタ
“PLACE”へのポインタ

3

“Minato”へのポインタ

〔プログラム〕
#define MAXELMNUM 256
typedef struct {

   char *tag;
  int depth;
  char *value;
} ELEMENT;
char *parse_ml_data(char *, int);
ELEMENT elmtbl[MAXELMNUM];
int elmnum = 0;
void parse_ml_string(char *mlstr)
{
  while (*mlstr != '\0') {
  mlstr = parse_ml_data(mlstr + 1, 1);
  }
}
char *parse_ml_data(char *mlstr, int level)

  /* 開始タグ処理 */
  elmtbl[elmnum].tag =;
  elmtbl[elmnum].depth = level;
  for (; *mlstr != '>'; mlstr++);
  *mlstr = '\0';
  /* タグの値処理 */
  elmtbl[elmnum].value = ;
  for (mlstr++; *mlstr != '<'; mlstr++);
  *mlstr = '\0';

   ;
  /* 下位のタグ構造処理 */
  while ( )
   mlstr = parse_ml_data(mlstr + 1, level + 1);
  /* 終了タグ処理 */
  for (mlstr += 2; *mlstr != '>'; mlstr++);
  return mlstr + 1;
  }

設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。 a,b に関する解答群

ア mlstr    イ ++mlstr    ウ mlstr + 1
エ *mlstr    オ *(++mlstr)    カ *mlstr++
キ *(mlstr + 1)

c に関する解答群

ア elmnum++    イ level++    ウ mlstr++
エ *elmnum++    オ *level++    カ *mlstr++

d に関する解答群

ア *(mlstr + 1) == '<'    イ *(mlstr + 1) != '<'
ウ *(mlstr + 1) == '/'    エ *(mlstr + 1) != '/'
オ *(mlstr + 1) == '>'    カ *(mlstr + 1) != '>'
解答欄a
ア  
イ 
ウ 
エ 
    
解答欄b
ア  
イ 
ウ 
エ 
    
解答欄c
ア  
イ 
ウ 
エ 
    
解答欄d
ア  
イ 
ウ 
エ 
  
問7

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

〔プログラムの説明〕

A 社では,社員の必須研修コースの修了条件を出席率 80% 以上と定めている。年度末に年間受講履歴ファイルに登録されている出席状況から,修了したかどうかを判定する。

(1) 年間受講履歴ファイル(4 月〜翌年 3 月)のレコード様式は,次のとおりである。

受講番号

修了判定

授業回数

出席状況

研修コード

社員番号

第 1 回

第 15 回

6 けた

6 けた

1 けた

2 けた

1 けた

1 けた

 受講番号をキーとする索引ファイルである。
 授業回数には研修の授業の実施回数が記録されており,各研修の授業回数は 1 〜 15 である。
(2) 年間受講履歴ファイルに対する処理は,次のとおりである。
 年度始めに,出席状況(第 1 〜 15 回)をすべて 0 にする。
 社員の授業への出席状況(1:出席, 0:欠席)を回ごとに記録する。
 年度末に出席状況を確認して,授業回数の 80% 以上の出席があった場合は修了判定を“Y”にし,80% 未満の場合は“N”にする。

〔プログラム〕
DATA DIVISION.
FILE SECTION.
FD ATTENDANCE-F.
01 ATTENDANCE-R.
  03 A-ID.
    05 A-COURSE PIC X(6).
    05 A-EMPLOYEE PIC X(6).
  03 A-COMPLETION PIC X.
  03 A-SESSIONS PIC 9(2).
  03 A-STATUS.
    05 A-ATTENDANCE OCCURS 15 PIC X.
WORKING-STORAGE SECTION.
01 W-ATTENDANCE PIC 9(2).
01 END-SW PIC X VALUE SPACE..
01 W-COMPLETION PIC 9(3).
PROCEDURE DIVISION.
START-RTN.
   OPEN I-O ATTENDANCE-F.
   PERFORM UNTIL END-SW = "E"
     READ ATTENDANCE-F
       AT END MOVE "E" TO END-SW
       NOT AT END PERFORM CHECK-RTN
     END-READ END-PERFORM.
   CLOSE ATTENDANCE-F.
   STOP RUN.
CHECK-RTN.
   MOVE ZERO TO W-ATTENDANCE.
   INSPECT  
TALLYING W-ATTENDANCE FOR ALL "1".
   COMPUTE W-COMPLETION = A-SESSIONS * 8.
  IF  
  THEN
       MOVE "Y" TO A-COMPLETION
  ELSE
       MOVE "N" TO A-COMPLETION
  END-IF.
   REWRITE ATTENDANCE-R INVALID DISPLAY "REWRITE ERROR", A-ID.

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

a に関する解答群

ア A-ATTENDANCE    イ A-STATUS
ウ ATTENDANCE-F    エ ATTENDANCE-R

b に関する解答群

ア W-ATTENDANCE * 10 >= W-COMPLETION
イ W-ATTENDANCE >= W-COMPLETION * 0.8
ウ W-COMPLETION >= W-ATTENDANCE
エ W-COMPLETION >= W-ATTENDANCE * 0.8
解答欄a
ア  
イ 
ウ 
エ 
    
解答欄b
ア  
イ 
ウ 
エ 
 
設問2  次の記述中の に入れる正しい答えを,解答群の中から選べ。

このプログラムは,AT END 指定の READ 文を使用して,年間受講履歴ファイルの全レコードを書き換えている。環境部のファイル管理段落では,ファイル編成は索引,呼出し法を とし,レコードキーとして を指定している。

解答群

ア A-COURSE    イ A-EMPLOYEE    ウ A-ID
エ 順呼出し    オ 動的呼出し    カ 乱呼出し
解答欄c
ア  
イ 
ウ 
エ 
    
解答欄d
ア  
イ 
ウ 
エ 
 
問8

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

〔プログラムの説明〕

プログラムは,ある衣料品小売業 A 社の在庫管理システムで使用するクラスとそのテスト用クラスからなる。現在 A 社で取り扱う商品はスラックス(Slacks)とジーンズ(Jeans)であり,両方に共通な属性である品番(code), サイズ(size)及び色(color)は抽象クラス Pants で定義する。サイズ及び色については,それぞれの属性値が引数の値と等しいかどうかを判定するメソッドとして sizeIs 及び colorIs を定義する。

ジーンズ(Jeans)は,打ち合いがボタン留めであるかファスナー留めであるかを示す属性(buttonFront)をもつ。

テスト用クラスのメソッド main を実行すると,次の実行結果を得る。

S1, 31, Black
S2, 31, Black
J1, 32, Black, zipper
J2, 34, Blue, button
true
true
false
false

図 実行結果

〔プログラム〕

public class TestPants { // テスト用クラス
   public static void main(String[] args) {
      Pants[] pants = {
         new Slacks("S1", 31, "Black"),
         new Slacks("S2", 31, "Black"),
         new Jeans("J1", 32, "Black", false),
         new Jeans("J2", 34, "Blue", true),
      };
      String black = new String("Black");
      for (int i = 0; i < pants.length; i++) {
         System.out.println(pants[i]);
      }
      System.out.println(pants[0].sizeIs(31));
      System.out.println(pants[1].colorIs(black));
      System.out.println(pants[2].sizeIs(30));
      System.out.println(pants[3].colorIs(black));
   }
}
abstract class Pants {
  String code;
  int size;
  String color;
  Pants(String code,
  int size, String color) {
    this.code = code;
    this.size = size;
    this.color = color;
  }
  public boolean sizeIs(int size) {
   return  ;
  }
  public boolean colorIs(String color) {
    return  ;
  }
  public String toString() {
    return code + ", " + size + ", " + color;
  }
}
class Slacks extends Pants {
  Slacks(String code, int size, String color) {
   super(code, size, color);
  }
 }
class Jeans extends Pants {
  boolean buttonFront;
  Jeans(String code, int size, String color, boolean buttonFront) {
  ;
this.buttonFront = buttonFront;
public String toString() {
  return ;
  }
}

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

a,b に関する解答群

ア this.size = size       イ this.size == size
ウ this.size.equals(size)    エ this.color = color
オ this.color == color     カ this.color.equals(color)

c に関する解答群

ア super()
イ super(buttonFront)
ウ super(code, size, color)
エ super(code, size, color, buttonFront)

d に関する解答群

ア code + ", " + size + ", " + color
イ code + ", " + size + ", " + color + ", " + buttonFront
ウ super.toString() + ", " + buttonFront
エ super.toString() + ", " + (buttonFront ? "button" : "zipper")
解答欄a
ア  
イ 
ウ 
エ 
    
解答欄b
ア  
イ 
ウ 
エ 
    
解答欄c
ア  
イ 
ウ 
エ 
    
解答欄d
ア  
イ 
ウ 
エ 
 
問9

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

〔プログラムの説明〕 副プログラム MULT は,正の整数 m と n の積(m×n)を求める。

(1) GR1 と GR2 に,それぞれ次の値が格納されて,主プログラムから渡される。

GR1 : m
GR2 : n

(2) 計算結果を GR0 に格納して,主プログラムに返す。

(3) 計算結果は,あふれないものとする。

(4) GR0 を除いて,副プログラムで使用する汎用レジスタの内容は保存される。

〔プログラム〕

(行番号)
 1 MULT  START         ;
 2       PUSH  0,GR1    ; レジスタの退避
 3       PUSH  0,GR2    ;
 4      ;; 結果を初期化
 5 LOOP  SRL  GR2,1    ;
 6       JOV  ON       ;
 7       JZE  FIN       ;
 8       JUMP SHIFT    ;
 9 ON   
10 SHIFT  SLL  GR1,1    ;
11       JUMP  LOOP    ;
12 FIN    POP  GR2     ; レジスタの復元
13       POP  GR1     ;
14       RET           ;
15       END           ;

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

解答群

ア ADDA GR0,GR1    イ ADDA GR0,GR2
ウ ADDA GR1,GR2    エ ADDA GR2,GR1
オ SUBA GR0,GR0    カ SUBA GR0,GR1
キ SUBA GR0,GR2    ク SUBA GR1,GR2
解答欄a
ア  
イ 
ウ 
エ 
   
解答欄b
ア  
イ 
ウ 
エ 
 
設問2  GR1 に 3,GR2 に 38 を格納して,主プログラムから呼び出したとき,行番号 11 の JUMP 命令が実行される回数として正しい答えを,解答群の中から選べ。
解答欄
ア  
イ 
ウ 
エ 
 
設問3  設問 2 において,行番号 11 の JUMP 命令が 2 回目に実行されるときの GR0 の内容として正しい答えを,解答群の中から選べ。
解答欄
0000 0000 0000 0000
0000 0000 0000 0011
0000 0000 0000 0110
0000 0000 0000 1001
0000 0000 0001 0010
 
問10〜問13までは、選択問題です。1問のみを選択してください。

問10

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

〔プログラムの説明〕

迷路を解くプログラムである。

(1) 図 1 に示したような縦 8 行横 8 列の目上に表現された迷路図のデータが 2 次元配列 M に格納されている。灰色に塗りつぶされている升が迷路の壁を示しており,白色の升が道を示している。

(2) 入口の升には始点を示すコード(0xf0)が,出口の升には終点を示すコード(0xf1)が,道の升には道を示すコード(0x00)が,壁の升には壁を示すコード(0xff )が
格納されている。

図1 迷路の例

(3) 迷路の外周となる升(M の横座標又は縦座標が 0 又は 7 である升)は,始点と終点を除いてすべて壁である。

(4) このプログラムで使用している大域変数の用途は,次のとおりである。

変数名

用途

M

迷路図データの格納域(2 次元配列)

x

迷路探索中の升の横座標

y

迷路探索中の升の縦座標

dir

迷路探索時の進行方向

これらの大域変数に初期値を設定し,関数 maze を呼び出すことによって迷路を探索し,入口から出口までの道筋を求める。

〔プログラム〕

(行番号)


 1 #define   UP        0
 2 #define   RIGHT     1
 3 #define   DOWN      2
 4 #define   LEFT      3
 5 #define   ROAD      0x00             /* 道のコード */
 6 #define   WALL      0xff             /* 壁のコード */
 7 #define   SMAX      8
 8 #define   ENTRANCE  0xf0             /* 始点のコード */
 9 #define   EXIT      0xf1             /* 終点のコード */
10
11 int rcheck(void);
12 int fcheck(void);
13 void go(void);
14 void maze(void);
15
16 int M[SMAX][SMAX], x, y, dir;
17
18 void maze()
19 {
20     while ( M[y][x] != EXIT ) {
21         if ( ( rcheck() == ROAD ) ||
22              ( rcheck() == EXIT ) ) {
23             dir = ( dir+1 ) % 4;
24             go();
25         }
26         else if ( ( fcheck() == ROAD ) ||
27                   ( fcheck() == EXIT ) ) go();
28         else dir = ( dir+3 ) % 4;
29     }
30     return;
31 }
32 
33 int rcheck()
34 {
35     if      ( dir == UP )     return M[y][x+1];
36     else if ( dir == RIGHT )  return M[y+1][x];
37     else if ( dir == DOWN )   return M[y][x-1];
38     else                      return M[y-1][x];
39 }
40
41 int fcheck()
42 {
43     if      ( dir == UP )     return M[y-1][x];
44     else if ( dir == RIGHT )  return M[y][x+1];
45     else if ( dir == DOWN )   return M[y+1][x];
46     else                      return M[y][x-1];
47 }
48 
49 void go()
50 {
51     if      ( dir == UP )    y--;
52     else if ( dir == RIGHT ) x++;
53     else if ( dir == DOWN )  y++;
54     else                     x--;
55 }
設問1  図 2 に示す迷路を,このプログラムによって解いた道筋として正しい答えを,解答群の中から選べ。図中の は,升の位置を示している。ここで,関数 maze を呼び出すときの大域変数 x,y,dir の値は次のとおりとする。
x = 1
y = 0
dir = DOWN

図2 迷路の升の位置

解答欄
ア   始点 → → 終点
 
イ  始点 → → 終点
 
ウ  始点 → → 終点
 
エ  始点 → → 終点
設問2  図 3 に示す迷路の場合,探索の道筋に関する記述として正しい答えを,解答群の中から選べ。ここで,関数 maze を呼び出すときの大域変数 x,y,dir の値は次のとおりとする。
    x = 1
    y = 0
    dir = DOWN

図3 閉じた迷路

解答欄
ア   始点 → → … を無限に繰り返す。
 
イ  始点 → → … を無限に繰り返す。
ウ  始点 → → … を無限に繰り返す。
エ  始点 → → 始点(プログラム終了)
始点 → → … を無限に繰り返す。
 
設問3  始点及び終点を含めて,通過した升の位置と進行方向を記録するために,プログラム中に次の文を追加することにした。文を追加する適切な位置を解答群の中から選べ。
 なお,プログラムの先頭に #include <stdio.h> があるものとする。

printf("dir=%d y=%d x=%d\n", dir, y, x);
解答欄
ア   行番号 20 の直後と行番号 29 の直後
イ  行番号 23 の直後と行番号 29 の直後
ウ  行番号 28 の直後と行番号 29 の直後
設問4  迷路の解法として,関数 rcheck の代わりに,次の関数 lcheck を使用することにした。行番号 11,21 及び 22 での関数 rcheck を lcheck に置き換える。

 その場合,プログラム中で更に変更すべき箇所として正しい答えを,解答群の中から選べ。

int lcheck()
{
    if      ( dir == UP )     return M[y][x-1];
    else if ( dir == RIGHT )  return M[y-1][x];
    else if ( dir == DOWN )   return M[y][x+1];
    else                      return M[y+1][x];
}
解答欄
行番号 21 の == ROAD を == WALL に変更する。
行番号 23 の +1 を +3 に,行番号 28 の +3 を +1 に変更する。
行番号 35 及び行番号 43 の UP を RIGHT に,行番号 36 及び行番号 44 の RIGHTを DOWN に,行番号 37 及び行番号 45 の DOWN を LEFT に変更する。
行番号 51 から行番号 54 までの間にある -- を ++ に,++ を -- に変更する。
問11

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

〔プログラムの説明〕

商品の名称,価格などを登録した商品マスタファイル( M ファイルと呼ぶ)がある。 M ファイルの更新情報が登録してあるトランザクションファイル( T ファイルと呼ぶ)を用いて M ファイルの追加,変更及び削除を行うプログラムである。

(1) M ファイル及び T ファイルのレコード様式は,次のとおりである。

商品コード

13 けた

分類コード

6 けた

価格

6 けた

名称

40 けた

(2) M ファイルは,商品コードをキーとする索引ファイルである。

(3) M ファイルへの更新処理は,T ファイルの商品コード,分類コード,価格及び名称の内容によって,次の処理を行うとともに,結果を印字する。ただし,T ファイルの商品コードは,空白ではない。

 M ファイルへの追加

T ファイルの商品コードが M ファイルに未登録で,T ファイルの商品コード,分類コード,価格及び名称がすべて記述されているときは,そのレコードを M ファイルに追加する。

 M ファイルの変更

T ファイルの商品コードが M ファイルに登録済みで,T ファイルの分類コード,価格及び名称の少なくとも一つが記述されているとき,その項目の内容で M ファイルの対応する項目を置き換える。

 M ファイルからの削除

T ファイルの商品コードが M ファイルに登録済みで,T ファイルの分類コード,価格及び名称がすべて空白のときは,M ファイルからその商品コードのレコードを削除する。

 T ファイルのエラー

T ファイルの商品コードが M ファイルに未登録で,T ファイルの分類コード,価格及び名称に一つでも空白の項目がある場合は,T ファイルのレコードエラーとして印字する。

(4) 処理結果の印字例は,次のとおりである。

Action 
GoodsCode
Class
Price
Name
INS 
XXXXXXXXXXXXX
XXXXXX
XXXXXX
XXXXXXXXXXX
XXXXXXXXXXXXX
UPD OLD 
XXXXXXXXXXXXX
XXXXXX
XXXXXX
XXXXXXXXXXX
XXXXXXXXXXXXX
  NEW 
XXXXXXXXXXXXX
XXXXXX
XXXXXX
XXXXXXXXXXX
XXXXXXXXXXXXX
DEL 
XXXXXXXXXXXXX
XXXXXX
XXXXXX
XXXXXXXXXXX
XXXXXXXXXXXXX
ERR 
XXXXXXXXXXXXX
XXXXXX
XXXXXX
XXXXXXXXXXX
XXXXXXXXXXXXX

 印字例中の項目 Action の意味は,次のとおりである。 INS :M ファイルへの追加 UPD:M ファイルの変更であり,OLD が変更前,NEW が変更後の内容 DEL:M ファイルからの削除 ERR:T ファイルのレコードエラー

 それ以外の項目には,Action が ERR であるときは T ファイルの内容を,ERR 以外のときは M ファイルの内容を印字する。

 見出しの印字は,最初に 1 度だけ行う。

〔プログラム〕
DATA DIVISION.
FILE SECTION.
FD MASTER-FILE.
01 MASTER-REC.
  02 GOODS-MAS     PIC X(13).
  02 DATA-MAS.
    03 CLASS-MAS   PIC X(06).
    03 PRICE-MAS   PIC X(06).
    03 NAME-MAS    PIC X(40).
FD TRANS-FILE.
01 TRANS-REC.
  02 GOODS-TRA     PIC X(13).
  02 DATA-TRA.
    03 CLASS-TRA   PIC X(06).
    03 PRICE-TRA   PIC X(06).
    03 NAME-TRA    PIC X(40).
FD PRINT-FILE.
01 PRINT-REC       PIC X(77).
WORKING-STORAGE SECTION.
01 TRANS-EOF       PIC 9(01) VALUE 0.
01 PRINT1         PIC X(41) VALUE
  "Action  GoodsCode   Class Price Name".
01 PRINT2 VALUE SPACE.
  03 ACTION-PRI     PIC X(07).
  03           PIC X(02).
  03 GOODS-PRI     PIC X(13).
  03           PIC X.
  03 CLASS-PRI     PIC X(06).
  03           PIC X.
  03 PRICE-PRI     PIC X(06).
  03           PIC X.
  03 NAME-PRI      PIC X(40).
PROCEDURE DIVISION.
TRANS-READ-RTN.
  OPEN I-O MASTER-FILE INPUT TRANS-FILE OUTPUT PRINT-FILE.
  WRITE PRINT-REC FROM PRINT1 AFTER PAGE.
  PERFORM UNTIL TRANS-EOF = 1
    READ TRANS-FILE
     AT END
       MOVE 1 TO TRANS-EOF
     NOT AT END
       PERFORM UPDATE-RTN
    END-READ
  END-PERFORM.
  CLOSE MASTER-FILE TRANS-FILE PRINT-FILE.
  STOP RUN.
UPDATE-RTN.
  MOVE  TO
  READ MASTER-FILE
    INVALID KEY
     IF  
     THEN
       PERFORM MOVE-TRA-RTN
       MOVE "INS" TO ACTION-PRI
       WRITE PRINT-REC FROM PRINT2 AFTER 1
       WRITE MASTER-REC FROM TRANS-REC
     ELSE
       PERFORM MOVE-TRA-RTN
       MOVE "ERR" TO ACTION-PRI
       WRITE PRINT-REC FROM PRINT2 AFTER 1
     END-IF
    NOT INVALID KEY
     IF = SPACE THEN
       PERFORM MOVE-MAS-RTN
       DELETE MASTER-FILE
        INVALID KEY
          DISPLAY "DELETE ERROR"
        NOT INVALID KEY
          MOVE "DEL" TO ACTION-PRI
          WRITE PRINT-REC FROM PRINT2 AFTER 1
       END-DELETE
     ELSE  
       MOVE "UPD OLD” TO ACTION-PRI
       IF CLASS-TRA NOT = SPACE THEN
        MOVE CLASS-TRA TO CLASS-MAS
       END-IF
       IF PRICE-TRA NOT = SPACE THEN
        MOVE PRICE-TRA TO PRICE-MAS
       END-IF
       IF NAME-TRA NOT = SPACE THEN
        MOVE NAME-TRA TO NAME-MAS
       END-IF
       WRITE PRINT-REC FROM PRINT2 AFTER 1
       PERFORM MOVE-MAS-RTN
       REWRITE MASTER-REC
        INVALID KEY
          DISPLAY "REWRITE ERROR"
        NOT INVALID KEY
          MOVE "NEW" TO ACTION-PRI
          WRITE PRINT-REC FROM PRINT2 AFTER 1
       END-REWRITE
     END-IF
  END-READ.
MOVE-TRA-RTN.
  MOVE GOODS-TRA TO GOODS-PRI.
  MOVE CLASS-TRA TO CLASS-PRI.
  MOVE PRICE-TRA TO PRICE-PRI.
  MOVE NAME-TRA TO NAME-PRI.
MOVE-MAS-RTN.
  MOVE GOODS-MAS TO GOODS-PRI.
  MOVE CLASS-MAS TO CLASS-PRI.
  MOVE PRICE-MAS TO PRICE-PRI.
  MOVE NAME-MAS TO NAME-PRI.


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

a,b,d に関する解答群

ア CLASS-MAS    イ CLASS-TRA    ウ DATA-MAS
エ DATA-TRA    オ GOODS-MAS    カ GOODS-TRA
キ NAME-MAS    ク NAME-TRA    ケ PRICE-MAS
コ PRICE-TRA

c に関する解答群

ア CLASS-MAS = SPACE AND    PRICE-MAS = SPACE AND NAME-MAS = SPACE
イ CLASS-MAS NOT = SPACE AND    PRICE-MAS NOT = SPACE AND NAME-MAS NOT = SPACE
ウ CLASS-TRA = SPACE AND    PRICE-TRA = SPACE AND NAME-TRA = SPACE
エ CLASS-TRA NOT = SPACE AND    PRICE-TRA NOT = SPACE AND NAME-TRA NOT = SPACE
オ DATA-MAS = SPACE
カ DATA-MAS NOT = SPACE
キ DATA-TRA = SPACE
ク DATA-TRA NOT = SPACE

e に関する解答群

ア MOVE MASTER-REC TO PRINT-REC
イ MOVE MASTER-REC TO TRANS-REC
ウ MOVE TRANS-REC TO MASTER-REC
エ MOVE TRANS-REC TO PRINT-REC
オ PERFORM MOVE-MAS-RTN
カ PERFORM MOVE-TRA-RTN
解答欄a
ア  
イ 
ウ 
エ 
    
解答群b
ア  
イ 
ウ 
エ 
    
解答群c
ア  
イ 
ウ 
エ 
    
解答群d
ア  
イ 
ウ 
エ 
   
解答群e
ア  
イ 
ウ 
エ 
 
設問2  M ファイル及び T ファイルに次のレコードがあるとき,正しい印字結果を,解答群の中から選べ。
M ファイル  49-0001-00011A0101A000300NAME-1  49-0021-00901A0301B001000NAME-2  49-0031-00002B0102C000050NAME-3
T ファイル  49-0001-00011  49-0001-00012 000500NAME-4  49-0021-00901 001200  49-0022-00003A0102C000100NAME-5

解答群
  
解答群
ア  
イ 
ウ 
エ 
 
問12

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

〔プログラムの説明〕

ある会社の情報管理部門で導入するコンピュータの候補としてワークステーションとパーソナルコンピュータが提案されている。これらのコンピュータの値引き後の価格の計算を行い,コンピュータの仕様を価格の降順に整列して出力するプログラムである。コンピュータの仕様は,次の四つからなる。

機種名,動作周波数,メモリ容量,価格
このプログラムは,次の四つのクラスと一つのインタフェースで構成される。

Computer

コンピュータに関するクラスであり,価格を返すメソッド getPrice,価格を格納するメソッド setPrice,仕様を文字列で返すメソッド toString,値引き率を返すメソッド getDiscountRate,及び整列する際に用いるデータの大小を比較するメソッド compareWith を定義している。

Workstation

クラス Computer のサブクラスとして定義されたワークステーションに関するクラスであり,ワークステーションの値引き率を返すメソッド getDiscountRate を再定義している。

PersonalComputer

クラス Computer のサブクラスとして定義されたパーソナルコンピュータに関するクラスであり,パーソナルコンピュータの値引き率を返すメソッド
getDiscountRate を再定義している。

PriceUtility

値引き後の価格の計算と整列をするためのクラスであり,価格の計算を行うメソッド computeDiscountPrice,及び整列を行うメソッド sort を定義している。

IComp

大小比較の対象を表すインタフェースであり,比較を行うメソッド compareWith を宣言している。
プログラム 1 のメソッド main とプログラム 2 〜 6 の実行結果を図に示す。このとき,メソッド main の処理は,次のとおりである。
(1) 四つのコンピュータの仕様を生成し,配列 computers に格納する。
(2) 各コンピュータの仕様を出力する。
(3) 値引き後の価格の計算を行う。
(4) 整列を行う。
(5) 整列結果を出力する。
Ws1, frequency:800, memory:256, price:300000
Pc1, frequency:450, memory:128, price:180000
Ws2, frequency:800, memory:512, price:500000
Pc2, frequency:450, memory:256, price:200000

<sorted by price>
Ws2, frequency:800, memory:512, price:450000
Ws1, frequency:800, memory:256, price:270000
Pc2, frequency:450, memory:256, price:160000
Pc1, frequency:450, memory:128, price:144000

図 実行結果

〔プログラム 1 〕

(行番号)


 1  public class PriceSort {
 2     public static void main(String[] args) {
 3        Computer[] computers = {
 4           new Workstation("Ws1", 800, 256, 300000),
 5           new PersonalComputer("Pc1", 450, 128, 180000), 
 6           new Workstation("Ws2", 800, 512, 500000), 
 7           new PersonalComputer("Pc2", 450, 256, 200000),
 8        };
 9        for (int i = 0; i < computers.length; i++) {
10           System.out.println(computers[i]);
11        }
12        System.out.println("\n<sorted by price>");
13        PriceUtility.computeDiscountPrice(computers);
14        PriceUtility.sort(computers);
15        for (int i = 0; i < computers.length; i++) {
16           System.out.println(computers[i]);
17        }
18     }
19  }
〔プログラム 2 〕 (行番号)

 1   public interface IComp {
 2      int compareWith(IComp a);
 3   }
〔プログラム 3 〕 (行番号)
1  public class Computer implements {
2   String name;
3   int frequency;
4   int memory;
5   int price;
6   public Computer(String name, int frequency,
7           int memory, int price) {
8     this.name = name;
9     this.frequency = frequency;
10     this.memory = memory;
11     this.price = price;
12   }
13   public int getPrice() {
14     return price;
15   }
16   public void setPrice(int price) {
17     this.price = price;
18   }  
19   public String toString() {
20     return name + ", frequency:" + frequency
21       + ", memory:" + memory + ", price:" + price;
22   }
23   public double getDiscountRate() {
24     return 0.0;
25   }
26   public int compareWith(IComp a) {
27     Computer computer = ()a;
28     return computer.price - this.price;
29   }
30  }

〔プログラム 4 〕 (行番号)

 1   public class Workstation extends Computer {
 2      public Workstation(String name, int frequency, 
 3                         int memory, int price) {
 4         super(name, frequency, memory, price);
 5      }
 6      public double getDiscountRate() {
 7         return 0.1;
 8      }
 9   }
〔プログラム 5 〕 (行番号)

 1   public class PersonalComputer extends Computer {
 2      public PersonalComputer(String name, int frequency,
 3                              int memory, int price) {
 4         super(name, frequency, memory, price);
 5      }
 6      public double getDiscountRate() {
 7         return 0.2;
 8      }
 9   }
〔プログラム 6 〕 (行番号)

1  public class PriceUtility {
2   public static void computeDiscountPrice(Computer[] a) {
3     int newPrice;
4     for (int i = 0; i < a.length; i++) {
5      newPrice = (int)(a[i].()
6               * (1 - a[i].getDiscountRate()));
7      a[i].setPrice(newPrice);
8     }
9   }
10   public static void sort(IComp[] a) {
11     // 単純挿入法による整列
12     int j;
13     for (int i = 1; i < a.length; i++) {
14      IComp temp = a[i];
15      for (j = i - 1;
16         j >= 0 && temp.(a[j]) < 0;
17         j--) {
18        a[j + 1] = a[j];
19      }
20      a[j + 1] = temp;
21     }
22   }
23  }
 
設問1  プログラム 3,6 中の に入れる正しい答えを,解答群の中から選べ。

解答群

ア  compareWith     イ  computeDiscountPrice
ウ  Computer     エ  getDiscountRate
オ  getPrice     カ  IComp
キ  PriceUtility    ク  sort
解答欄a
ア  
イ 
ウ 
エ 
    
解答群b
ア  
イ 
ウ 
エ 
    
解答群c
ア  
イ 
ウ 
エ 
    
解答群d
ア  
イ 
ウ 
エ 
 
設問2  プログラム 3 の行番号 28 を

return computer.frequency - this.frequency;

に変更したときのプログラム 1 の行番号 16 の出力として正しい答えを,解答群の中から選べ。

解答群

ア  Pc1, frequency:450, memory:128, price:144000
   Pc2, frequency:450, memory:256, price:160000
   Ws1, frequency:800, memory:256, price:270000
   Ws2, frequency:800, memory:512, price:450000
 
イ  Pc2, frequency:450, memory:256, price:160000
   Pc1, frequency:450, memory:128, price:144000
   Ws2, frequency:800, memory:512, price:450000
   Ws1, frequency:800, memory:256, price:270000
 
ウ  Ws1, frequency:800, memory:256, price:270000
   Ws2, frequency:800, memory:512, price:450000
   Pc1, frequency:450, memory:128, price:144000
   Pc2, frequency:450, memory:256, price:160000
 
エ  Ws2, frequency:800, memory:512, price:450000
   Ws1, frequency:800, memory:256, price:270000
   Pc2, frequency:450, memory:256, price:160000
   Pc1, frequency:450, memory:128, price:144000
 
設問3  プログラム 5 の行番号 7 を

return 0.4;

に変更したとき,各コンピュータの値引き後の価格として正しい答えを,解答群の中から選べ。

解答群
 

Ws1

Pc1

Ws2

Pc2

180000

108000

300000

120000

180000

144000

300000

160000

270000

108000

450000

120000

270000

144000

450000

160000

問13

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

〔プログラムの説明〕

指定された範囲のメモリの内容を,16 進数として出力する副プログラムである。

(1) 主プログラムは範囲の先頭アドレスを GR1 に,範囲の終端アドレスを GR2 に設定し,副プログラム HEXDUMP を呼ぶ。

(2) 副プログラム HEXDUMP によって出力されるレコードは,次の形式である。

(3) 副プログラム HEXDUMP は,別の副プログラム HEXCNV を使用する。 HEXCNV は,GR5 に格納された 1 語の内容を 4 けたの 16 進数字列に変換し, GR4 が指す出力領域に格納する。

〔プログラム〕
  HEXDUMP START
      RPUSH
 
  LP1   LAD  GR4,OUTBUF   ; 出力ポインタの初期化
      LAD  GR3,16     ; 行内語数カウンタの初期化
      LD   GR5,GR1
      CALL  HEXCNV     ; アドレスの 16 進変換
  LP2   LD   GR5,=' '
      ST   GR5,0,GR4
      LAD  GR4,1,GR4
      LD   GR5,0,GR1
      CALL  HEXCNV     ; 1 語分の 16 進変換
      LAD  GR1,1,GR1
      CPL  GR1,GR2
      
      SUBA  GR3,=1
      JNZ  LP2      ; 1 行分(16 語)終了?
      OUT  OUTBUF,OUTLEN
      JUMP  LP1
  FIN   LAD  GR5,OUTBUF
      
      ST   GR4,LENG
      OUT  OUTBUF,LENG
      RPOP
      RET
  OUTBUF DS   84
  OUTLEN DC   84
  LENG  DS   1
      END
  HEXCNV START
      LAD  GR6,0     ; シフト量を 0 に初期設定
  LP   LD   GR7,GR5
      SLL  GR7,0,GR6   ; 変換対象を上位 4 ビットに設定
       
  
      LD   GR7,CTABLE,GR7 
      ST   GR7,0,GR4
      LAD  GR4,1,GR4
      LAD  GR6,4,GR6
      CPA  GR6,=16    ; 1 語分の 16 進変換完了?
      JMI  LP
      RET
  CTABLE DC   '0123456789ABCDEF'
      END
 
設問1  プログラム中の に入れる正しい答えを,解答群の中から選べ。

a に関する解答群

ア JMI FIN    イ JMI LP1    ウ JPL FIN
エ JPL LP1    オ JZE FIN    カ JZE LP1

b に関する解答群

ア ADDL GR4,GR5    イ LAD GR4,84,GR5    ウ LD GR4,84,GR5
エ SUBL GR4,GR5

c に関する解答群

ア AND GR7,=#000F    イ AND GR7,=#F000    ウ OR GR7,=#000F
エ OR GR7,=#F000    オ SRL GR7,12    カ SRL GR7,13
解答欄a
ア  
イ 
ウ 
エ 
    
解答群b
ア  
イ 
ウ 
エ 
    
解答群c
ア  
イ 
ウ 
エ 
 
設問2  パラメタ領域に範囲の先頭アドレスと終端アドレスを格納し,パラメタ領域の先頭アドレスを GR1 に設定して呼び出すように HEXDUMP を変更することにした。プログラム中の α の位置に挿入すべき命令列として正しい答えを,解答群の中から選べ。
解答群
ア  
LD GR1,0,GR1    
LD GR2,1,GR1   
イ 
LD GR1,1,GR1    
LD GR2,2,GR1
ウ 
LD GR2,1,GR1
LD GR1,0,GR1
エ 
LD GR2,2,GR1 
LD GR1,1,GR1 
設問3  プログラム中の β を次の命令列で置き換えることにした。変更前と同じ結果を得るために命令列中の に入れる正しい答えを,解答群の中から選べ。

      CPA GR7,=9
      JPL AF
      LAD GR7,#0030,GR7 ; 数字 0 の文字コードを加算
      JUMP CONT
  AF
   
      CONT ST GR7,0,GR4
解答欄
ア   LAD GR7,#0031,GR7 
イ  LAD GR7,#0037,GR7
ウ  LAD GR7,#0038,GR7 
エ  LAD GR7,#0039,GR7
LAD GR7,#0041,GR7
        戻る