基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成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

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

基本情報技術者試験


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

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]