基本情報技術者 2011年 秋期 午後 問10
次のCOBOLプログラムの説明及びプログラムを読んで、設問1,2に答えよ。
〔プログラムの説明〕
受験の申込みを登録した申込ファイルから、受験区分別に申込者の人数を集計し、集計表を印字するプログラムである。
(1) 申込ファイルは図1に示すレコード様式の順ファイルである。

① 受験の申込み1件に対して、1件のレコードが作成され、5桁の申込番号が付与される。
② 受験区分は、試験区分と開催地区分から構成される。
③ 試験区分は、試験内容に対応付けたA~Hのいずれか1文字である。
④ 開催地区分は、開催地に対応付けた01~20のいずれかの数字である。
⑤ 各受験区分の申込者数は、999人以下である。
⑥ 申込ファイルの内容には、誤りはないものとする。
(2) 集計表の印字例は、図2のとおりである。申込者がいない受験区分は、印字しない。


設問1:
問題文を見る プログラムのに入れる正しい答えを、解答群の中から選べ。
aに関する解答群
ア:MOVE 1 TO TEST-IDX
イ:MOVE 1 TO TEST-NO
ウ:MOVE TEST-IDX TO TEST-NO
エ:SET TEST-IDX TO 1
オ:SET TEST-IDX TO TEST-CATEG-S
カ:SET TEST-IDX TO TEST-NO
bに関する解答群
ア:SUM-WK
イ:TEST-IDX
ウ:TEST-NO
エ:TEST-W1
オ:TEST-W2
カ:TEST-W3
cに関する解答群
ア:SUM-WK(LOOP1 LOOP2)
イ:SUM-WK(LOOP2 LOOP1)
ウ:SUM-WK(TEST-CATEG-M TEST-NO)
エ:SUM-WK(TEST-NO TEST-PLACE-M)
オ:SUM-WK(TEST-PLACE-M TEST-NO)
カ:SUM-WK(TEST-PLACE-S TEST-NO)
模範解答
a:エ、b:カ、c:ア
解説
解答の導き方
このプログラムは、申込ファイルを1件ずつ読み、試験区分と開催地区分の組合せごとに人数を数えます。COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)の表(同じ種類の値を複数並べて扱う領域)やSEARCH文(表の中から条件に合う値を探す文)の使い方に注目します。
-
試験区分を表の何番目かに置き換えます試験区分は「A~Hのいずれか1文字」です。一方、集計用の表では、試験区分ごとに1から8までの位置を使います。プログラムでは、TEST-W2に「ABCDEFGH」が設定されています。その同じ記憶領域をTEST-W3としても扱い、TEST-W3(1)からTEST-W3(8)までの8個の要素に分けています。そのため、TEST-W3(1)はA、TEST-W3(2)はBという対応になります。TEST-IDXは、表の何番目を指しているかを表す索引名です。索引名は通常の数値変数とは扱いが異なるため、SEARCHの開始位置を1にするには、「SET TEST-IDX TO 1」とします。したがって、aにはエが入ります。
-
SEARCHで探す表を指定します「SEARCH b」では、試験区分を探す対象となる表を指定します。試験区分の文字が入っている表は、TEST-W3です。「WHEN TEST-CATEG-M = TEST-W3(TEST-IDX)」は、申込レコードの試験区分と、TEST-W3が索引で指している文字を比べる条件です。一致しなければ、SEARCHが索引を次の位置に進めて探します。A~Hのどれかが見つかると、TEST-IDXには見つかった位置が入ります。よって、bにはカが入ります。
-
見つかった試験区分と開催地区分の人数を増やします一致した位置は、直後の「SET TEST-NO TO TEST-IDX」でTEST-NOに設定されます。たとえば試験区分がCなら、TEST-W3の3番目で一致するため、TEST-NOは3になります。集計用の表SUM-WKは、宣言で「OCCURS 8」の内側に「OCCURS 20」があります。つまり、1つ目の添字(表の何番目かを示す番号)が試験区分の1~8、2つ目の添字が開催地区分の01~20を表します。そのため、「ADD 1 TO SUM-WK(TEST-NO TEST-PLACE-M)」によって、該当する試験区分と開催地区分の組合せの人数を1人増やします。
-
集計表の印字では、同じ順序で表を参照します印字処理では、LOOP1が1~8、LOOP2が1~20の範囲で動きます。SUM-WKの1つ目の添字は試験区分、2つ目の添字は開催地区分なので、確認する人数はSUM-WK(LOOP1 LOOP2)です。また、条件に合う人数が0でない場合だけ印字します。これは、申込者がいない受験区分を印字しないという説明と一致します。したがって、cにはアが入ります。
誤りやすいポイント
-
添字の順序を逆にしないこと
SUM-WKは「8個の試験区分それぞれに、20個の開催地区分がある」という構造です。したがって、1つ目が試験区分、2つ目が開催地区分です。cで2つの添字を逆にすると、表の構造に合いません。 -
試験区分の文字をそのまま添字にしないこと
試験区分のA~Hは文字です。集計用の表では、SEARCHで表の中の位置を見つけ、その位置をTEST-NOとして使っています。 -
TEST-IDXとTEST-NOを同じ種類のものだと思わないこと
TEST-IDXは表の要素を探すための索引名です。TEST-NOは見つかった位置を保持し、集計用の表の添字に使う数値項目です。そのため、検索開始位置の設定にはSETを使い、見つかった位置はTEST-NOに渡しています。
FAQ
Q: SEARCHは、TEST-W3のどこから探し始めますか?
A: aでTEST-IDXを1に設定しているので、TEST-W3の1番目から探し始めます。一致しない場合は、索引が次の位置に進みます。
A: aでTEST-IDXを1に設定しているので、TEST-W3の1番目から探し始めます。一致しない場合は、索引が次の位置に進みます。
Q: SUM-WKの人数が0の場合、なぜ印字しないのですか?
A: 印字処理が人数を確認し、0でない場合だけ印字するためです。申込者がいない受験区分を集計表に出さないという条件に対応しています。
A: 印字処理が人数を確認し、0でない場合だけ印字するためです。申込者がいない受験区分を集計表に出さないという条件に対応しています。
Q: TEST-W2とTEST-W3は、別々の文字列を持っていますか?
A: いいえ。「REDEFINES」は同じ記憶領域を別の形で扱う指定です。TEST-W2の「ABCDEFGH」を、TEST-W3では1文字ずつの8個の要素として扱っています。
A: いいえ。「REDEFINES」は同じ記憶領域を別の形で扱う指定です。TEST-W2の「ABCDEFGH」を、TEST-W3では1文字ずつの8個の要素として扱っています。
関連キーワード: COBOL、表(テーブル)、添字、SEARCH文、REDEFINES
設問2:
問題文を見る 集計表における受験区分の印字を申込者数の多い順になるようにプログラムを変更したい。表1に示すプログラムの変更内容のに入れる正しい答えを、解答群の中から選べ。ここで、cには設問1の正しい答えが入っているものとする。

dに関する解答群
ア:ASCENDING KEY SORT-S
イ:ASCENDING KEY SORT-TEST-REC
ウ:DESCENDING KEY SORT-S
エ:DESCENDING KEY SORT-TEST-REC
e~gに関する解答群
ア:END-READ
イ:END-RETURN
ウ:READ TEST-SORT-FILE
エ:READ TEST-SUM-FILE
オ:RELEASE SORT-REC
カ:RELEASE SUM-REC
キ:RETURN TEST-SORT-FILE
ク:RETURN TEST-SUM-FILE
模範解答
d:ウ、e:オ、f:キ、g:イ
解説
解答の導き方
この変更では、集計結果をいったん別のファイルに保存し、その件数が多い順に並べ替えてから印字します。COBOL(Common Business-Oriented Language:事務処理向けのプログラミング言語)のSORT文は、並べ替えるレコードを受け取り、指定された項目を基準に並べ替えます。
-
並べ替える項目を決めます。追加されるSORT-RECには、受験区分を入れるSORT-TEST-RECと、申込者数を入れるSORT-Sがあります。受験者数の多い順にしたいので、並べ替えの基準にするのは申込者数のSORT-Sです。「多い順」は、大きい値から小さい値に並べる降順です。したがって、dにはSORT-Sを降順にする指定が入ります。解答群ではウの「DESCENDING KEY SORT-S」です。
-
集計結果を並べ替えに渡します。行番号48〜60の変更内容では、集計値が0でない場合に、受験区分と人数をSUM-RECに格納してTEST-SUM-FILEに書き込みます。その後、IN-PROCでTEST-SUM-FILEから1件ずつ読み込み、受験区分と人数をSORT-RECに移します。SORT文に並べ替えるレコードを渡すCOBOLの命令はRELEASEです。ここでSORT文が扱うレコードはSORT-RECなので、「RELEASE SORT-REC」となります。よって、eはオです。
-
並べ替え後のレコードを取り出します。並べ替えが終わったレコードは、OUT-PROCで1件ずつ取り出して印字します。SORT文から並べ替え後のレコードを取り出す命令はRETURNです。取り出す対象はSORT文で指定しているTEST-SORT-FILEなので、fは「RETURN TEST-SORT-FILE」となるキです。RETURNの後には、レコードを取り出せなかったときのAT ENDと、取り出せたときのNOT AT ENDが続きます。このRETURNの処理範囲を閉じる命令はEND-RETURNです。したがって、gはイです。
誤りやすいポイント
-
「多い順」を昇順と取り違えること
昇順は小さい値から大きい値への並びです。申込者数の多い順は、大きい値から小さい値への降順です。 -
受験区分を並べ替えの基準にしてしまうこと
SORT-TEST-RECは、並べ替えた後も受験区分を表示できるように持っておく項目です。申込者数の多い順にする基準はSORT-Sです。 -
RELEASEとRETURNを逆にすること
RELEASEは並べ替え前のレコードをSORT文に渡す命令です。RETURNは並べ替え後のレコードを取り出す命令です。 -
SUM-RECをRELEASEすること
SUM-RECはTEST-SUM-FILEのレコードです。並べ替え対象のレコードとして定義されているのはSORT-RECなので、SORT文に渡すのはSORT-RECです。
FAQ
Q: 申込者数が0の受験区分も並べ替えに含めますか?
A: 含めません。変更内容では、件数が0でない場合にだけSUM-RECへ書き込むため、0件の受験区分は並べ替えの対象にも印字対象にもなりません。
A: 含めません。変更内容では、件数が0でない場合にだけSUM-RECへ書き込むため、0件の受験区分は並べ替えの対象にも印字対象にもなりません。
Q: 申込者数が同じ受験区分は、どの順に印字されますか?
A: 指定されている並べ替えの基準はSORT-Sだけです。同じ申込者数の受験区分どうしの順序は、このプログラム変更内容では指定されていません。
A: 指定されている並べ替えの基準はSORT-Sだけです。同じ申込者数の受験区分どうしの順序は、このプログラム変更内容では指定されていません。
Q: RETURNの後にEND-RETURNが必要なのはなぜですか?
A: RETURNに続くAT ENDやNOT AT ENDの処理がどこまで続くかを示すためです。READの処理範囲をEND-READで閉じるのと同じように、RETURNの処理範囲はEND-RETURNで閉じます。
A: RETURNに続くAT ENDやNOT AT ENDの処理がどこまで続くかを示すためです。READの処理範囲をEND-READで閉じるのと同じように、RETURNの処理範囲はEND-RETURNで閉じます。
関連キーワード: COBOL、SORT文、ソートキー、昇順・降順、順ファイル



