平成20年 秋期 基本情報技術者 午後 問11
問11 COBOL
次の COBOL プログラムの説明及びプログラムを読んで,設問1,2に答えよ。
〔プログラムの説明〕
論理式評価プログラム EVAL-EXP の動作検証のため,論理式を構成するすべての
パターンの文字列を生成するプログラム GEN-EXP である。
(1) GEN-EXP は,1文字から7文字までの論理式文字列を自動生成して EVAL-EXP を
呼び出し,図1のような結果を印字する。検証はこの結果リストを使って目視で行う。
見出しは印刷済とする。
評価結果: 論理式
T: T
F: F
E: (
E: &
: :
F: T&T&F
: :
F: T&t&(F)
: :
|
図1 結果の例
(2) 論理式評価プログラムの呼出しは,次のように行う。
CALL "EVAL-EXP" USING パラメタ1 パラメタ2
ここで,パラメタ1は8けたで,空白で終了する1文字から7文字の論理式を指定する。
パラメタ2は評価結果であり,真のときは T,偽のときは F,
構文エラーがあるときは E が返る。パラメタ1は EVAL-EXP の実行によって変更されることはない。
(3) EVAL-EXP で扱う論理式は,次の仕様とする。
@ 論理式は,論理項目 T,F,二つの論理式を論理演算子 &,| でつないだもの,
及び論理式を括弧(,)でくくったもので構成される。ここで,T は真値,F は偽値,
& は論理積, | は論理和を表す。
A 論理式の評価の順序は,括弧でくくられた内側が先に評価され,
括弧でくくられていないか又は括弧が同じ順位の場合は & が | よりも優先順位が高い。
同じ優先順位が並ぶ場合は左から右に評価される。
(4) 論理式の自動生成は,数字1〜6からなる長さ1〜7の数字列を,
作業領域 NUM-TBL に生成し,数字1〜6に6種類の文字 T,F,(,&, |,) を
対応させて変換する(図2)。
図2 作業領域 NUM-TBL に生成された数字列と対応する論理式文字列
〔プログラム GEN-EXP 〕
(行番号)
1 DATA DIVISION.
2 FILE SECTION.
3 FD EXP-F.
4 01 EXP-REC PIC X(08).
5 FD PRINT-F.
6 01 P-REC PIC X(13).
7 WORKING-STORAGE SECTION.
8 01 CONSTANT-CHARS.
9 05 CONS-VALUE PIC X(06) VALUE "TF(&|)".
10 05 FILLER REDEFINES CONS-VALUE.
11 10 CONS-TBL PIC X OCCURS 6.
12 01 NUM-BUF.
13 05 NUM-TBL PIC 9 0CCURS 10.
14 01 EXIT-SW PIC 9.
15 01 EXP-L PIC 99.
16 01 RESULT-SW PIC X.
17 01 WK-I PIC 99.
18 01 WK-TEMP PIC 99.
19 PROCEDURE DIVISION.
20 MAIN-CTL.
21 OPEN OUTPUT EXP-F.
22 PERFORM GENERATE-EXP VARYING EXP-L FROM 1 BY 1
23 UNTIL EXP-L > 7.
24 CLOSE EXP-F.
25 *
26 OPEN INPUT EXP-F.
27 OPEN OUTPUT PRINT-F.
28 PERFORM EVAL-EXP-PRINT.
29 CLOSE EXP-F PRINT-F.
30 *
31 STOP RUN.
32 GENERATE-EXP.
33 MOVE SPACE TO EXP-REC.
34 * 作業領域初期化
35 MOVE ALL "T" TO EXP-REC(1:EXP-L).
36 PERFORM VARYING WK-I FROM 1 BY 1 UNTIL WK-I > EXP-L
37
38 END-PERFORM.
39 MOVE EXP-L TO WK-I.
40 * 数字列の生成と論理式への変換
41 PERFORM
42 WRITE EXP-REC
43 MOVE EXP-L TO WK-I
44 MOVE O TO EXIT-SW
45 PERFORM UNTIL WK-I < 1 OR EXIT-SW = 1
46
47 * けた上がりのチェック
48 IF NUM-TBL(WK-I) > 6 THEN
49 MOVE 1 TO NUM-TBL(WK-I)
50 MOVE CONS-TBL(1) TO EXP-REC(WK-I:1)
51 SUBTRACT 1 FROM WK-I
52 ELSE
53 MOVE NUM-TBL(WK-I) TO WK-TEMP
54 MOVE CONS-TBL(WK-TEMP) TO EXP-REC(WK-I:1)
55 MOVE 1 TO EXIT-SW
56 END-IF
57 END-PERFORM
58 END-PERFORM.
59 *
60 EVAL-EXP-PRINT.
61 MOVE 0 TO EXIT-SW.
62 PERFORM UNTIL EXIT-SW = 1
63 READ EXP-F AT END MOVE 1 TO EXIT-SW
64 NOT AT END
65 CALL "EVAL-EXP" USING EXP-REC RESULT-SW
66 STRING RESULT-SW ": " EXP-REC
67 DELIMITED BY SIZE INTO P-REC
68 WRITE P-REC AFTER 1
69 END-READ
70 END-PERFORM.
設問1 プログラム中の に入れる正しい答えを,
解答群の中から選べ。
解答群
ア ADD 1 TO NUM-TBL(WK-I) イ ADD 1 TO WK-I
ウ MOVE 1 TO NUM-TBL(WK-I) エ SUBTRACT 1 FROM WK-I
オ UNTIL EXIT-SW = 1 力 UNTIL WK-I < 1
キ UNTIL WK-I > EXP-L
イ
カ
ア
基本情報技術者試験
設問2 GEN-EXP では,論理式を構成するすべてのパターンの文字列を生成しているので,
評価結果のほとんどが構文エラーであった。そこで,EVAL-EXP での論理式評価が
効率よく実行できるよう,CEN-EXP で論理式生成後に論理式の構文チェックを行い,
構文エラーでないものだけを検査対象とするように変更することとなった。
論理式の構文チェックは次の@,Aに従う。
@ 論理式で許される文字 T,F,(,&, |,) の記述の順序の可否は表1のとおりとする。
表1 記述の順序
| 左側 右側 | T, F 又は( | & | または) |
| T, F 又は) | − | ○ |
| & | 又は( | ○ | − |
注 ○:許される,−:許されない
A 論理式の先頭文字には &, |, ) は許されず,論理式の末尾文字には
&, | , ( は許されない。また,左右の括弧は対になっていなければならない。
このためにプログラムを次のとおりに変更する。
表2中の に入れる正しい答えを,解答群の中から選べ。
表2 プログラムの変更内容
| 処置 | 変更内容 |
行番号 18 と 19 の間 に追加 |
01 CHECK-ERROR PIC 9.
01 NEST-LEVEL PIC S99.
01 WK-R PIC 99.
01 WK-L PIC 99.
| |
行番号 42 を変更 |
PERFORM CHECK-SYNTAX
IF CHECK-ERROR = O THEN
WRITE EXP-REC
END-IF
|
行番号 70 の次 に追加
|
CHECK-SYNTAX.
MOVE 0 TO CHECK-ERROR.
MOVE 0 TO NEST-LEVEL.
PERFORM VARYING WK-R FROM 1 BY 1
UNTIL WK-R > EXP-L OR CHECK-ERROR NOT = 0
* 先頭文字チェック
IF WK-R = 1 THEN
IF EXP-REC(WK-R:1) = "&" OR "|" OR ")" THEN
MOVE 1 TO CHECK-ERROR
END-IF
ELSE
COMPUTE WK-L = WK-R - 1
* 記述順序のチェック
IF EXP-REC(WK-L:1) = "(" OR "&" OR "|" THEN
IF EXP-REC(WK-R:1) = "&" OR "|" OR ")" THEN
MOVE 1 TO CHECK-ERROR
END-IF
ELSE
IF EXP-REC(WK-R:1) = THEN
MOVE 1 TO CHECK-ERROR
END-IF
END-IF
END-IF
EVALUATE EXP-REC(WK-R:1)
WHEN "("
WHEN ")" SUBTRACT 1 FROM NEST-LEVEL
IF NEST-LEVEL < 0 THEN
MOVE 1 TO CHECK-ERROR
END-IF
END-EVALUATE
END-PERFORM.
* 最右端のチェック
IF CHECK-ERROR = 0 AND (EXP-REC(EXP-L:1) = "&" OR
"|" OR "(") THEN
MOVE 1 TO CHECK-ERROR
END-IF.
* 括弧の対応チェック
IF CHECK-ERROR = 0 AND NEST-LEVEL NOT = 0 THEN
MOVE 1 TO CHECK-ERROR
END-IF.
|
解答群
ア "&" OR "|" OR ")" イ "T" OR "F" OR "("
ウ "T" OR "F" OR ")" エ ADD 1 TO NEST-LEVEL
オ SUBTRACT 1 FROM NEST-LEVEL
イ
エ
[←前の問題]
[次の問題→]
[問題一覧表]
[分野別]
[基本情報技術者試験TOP
]
©2004-2025 情報処理試験.jp
|
|
|