首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输出是错误的

输出是错误的
EN

Stack Overflow用户
提问于 2015-02-09 04:57:43
回答 2查看 228关注 0票数 0

编写我的程序,但我无法得到正确的输出,因为以下是我的代码和我的输入与输出。

此外,我的程序程序是否有意义,或者我是否应该修改它,这似乎是有意义的,但在看了不同的书后,我不再确定。

代码语言:javascript
复制
FD INPUT-FILE.
   01 INPUT-RECORD.
       05 EXCUSE-NUMBER                     PIC 9(02).
          88 VALID-EXCUSE                   VALUE 1 THRU 10.
       05 FILLER                            PIC X(03).
       05 NUMBER-TIMES-USED                 PIC 9(02).
       05 FILLER                            PIC X(73).

   FD REPORT-FILE.
   01 REPORT-RECORD                         PIC X(80).

   FD ERROR-FILE.
   01 ERROR-RECORD                          PIC X(80).

   WORKING-STORAGE SECTION.
  ******************************************************************
  *  DEFINES PROCESSINGVARIABLES AND OUTPUT LINES                  *
  ******************************************************************
   01 WS-AREA.
       05 WS-IF-STATUS                      PIC X(02).
       05 WS-OF-STATUS                      PIC X(02).
       05 WS-EF-STATUS                      PIC X(02).
       05 WS-END-OF-FILE                    PIC X(01) VALUE "N".
           88 AT-WS-END-OF-FILE                       VALUE "Y".
       05 WS-INVALID-RECORD                 PIC X(01) VALUE "N".
       05 WS-LINE-NUMBER                    PIC 9(03) VALUE 0.
       05 WS-MOST-USED-EXCUSE               PIC 9(02) VALUE 0.
       05 WS-EXCUSE                         PIC 9(02) VALUE 0.
       05 WS-EXCUSE-TOTAL                   PIC 9(04).

   01 BLANK-LINE.
       05                                   PIC X(80).

  ******************************************************************
  * (THIS IS WHERE THE HEADING ON THE PRINT OUT SHEET GOES)        *
  ******************************************************************

   01 HEADING-LINE-1.
       05 FILLER                            PIC X(14) VALUE SPACES.
       05 FILLER                            PIC X(37)
                VALUE "TEN MOST OUTRAGEOUS HOME-WORK EXCUSES".

   01 HEADING-LINE-2.
       05 FILLER                           PIC X(11).
       05 FILLER                           PIC X(06) VALUE "RECORD".
       05 FILLER                           PIC X(08).
       05 FILLER                           PIC X(05) VALUE "IMAGE".

  ******************************************************************
  * DETAIL-LINE COMMENTS.                                          *
  * on the detail line we are writing out the Data information     *
  * in particular, when we write out the line-number, error        *
  * excuse number, excuses used, and how many times used           *
  * Detail summary will be reported out                            *
  * Stars will be Display underneath bad data.                     *
  *****************************************************************
   01 DETAIL-LINE.
       05 FILLER                           PIC X(03).
       05 DL-EXCUSE-NUMBER                 PIC 9(02).
       05 FILLER                           PIC X(03).
       05 DL-EXCUSE-USED                   PIC X(51).
       05 FILLER                           PIC X(03).
       05 DL-AMOUNT-USED                   PIC ZZ9.

   01 DETAIL-LINE-ERROR-1.
       05 FILLER                           PIC X(08) VALUE SPACES.
       05 DLE-LINE-NUMBER                  PIC ZZ9.
       05 FILLER                           PIC X(09) VALUE SPACES.
       05 DLE-ERROR                        PIC X(16).

   01 DETAIL-LINE-ERROR-2.
       05 FILLER                           PIC X(20) VALUE SPACES.
       05 DLE-EXCUSE-NUMBER                PIC X(02) VALUE SPACES.
       05 FILLER                           PIC X(03) VALUE SPACES.
       05 DLE-EXCUSE                       PIC X(02) VALUE SPACES.

   01 DETAIL-TOTAL.
       05 FILLER                           PIC X(41) VALUE SPACES.
       05 FILLER                           PIC X(20)
                VALUE "TOTAL EXCUSES USED =".
       05 DT-TOTAL                         PIC ZZZ9 VALUE ZERO.

   01 DETAIL-TOTAL-MOST-USED.
       05 FILLER                           PIC X(34) VALUE SPACES.
       05 FILLER                           PIC X(27)
                VALUE "EXCUSE USE THE MOST TIMES =".
       05 DTMU-HIGH                        PIC ZZZ9.

  ******************************************************************
  * This is where we hard code the excuses used with the table     *
  * from the input file.                                           *
  ******************************************************************
   01 TABLE-EXCUSES-1.
       05 PIC X(51)
       VALUE "JOHN CONVINCE ME TO CONVERT TO LINUX".
       05 PIC X(51)
       VALUE "BEACUSE OF SECURITY REASON I CAN'T CONFIRM NOR DENY".
       05 PIC X(51)
       VALUE "BECAUSE THE HOSPITAL DOESN'T HAVE WIFI'".
       05 PIC X(51)
       VALUE "AFTER INSTALLING LINUX MY SYSTEM CRASHED".
       05 PIC X(51)
       VALUE "WHAT WAS THE QUESTION AGAIN".
       05 PIC X(51)
       VALUE "ARE YOU SURE, I REMEBER TURNING IT IN".
       05 PIC X(51)
       VALUE "I'M INVOKING MY 5TH AMENDMENT RIGHT".
       05 PIC X(51)
       VALUE "LINUX MADE ME CRAZY I THREW MY COMPUTER".
       05 PIC X(51)
       VALUE "SOMEONE STOLED MY BACKPACK".
       05 PIC X(51)
       VALUE "BEACUSE OF SECURITY REASON I CAN'T CONFIRM NOR DENY".

   01 TABLE-EXCUSES-2 REDEFINES TABLE-EXCUSES-1.
       05 TEN-EXCUSES OCCURS 10 TIMES      PIC X(51).

   01 TABLE-EXCUSES-COUNTER.
       05 TABLE-EXCUSES-COUNT OCCURS 10 TIMES PIC 9(03).


   PROCEDURE DIVISION.
  ******************************************************************
  * Finally - where the real work gets done                        *
  * it is divided into paragraphs (or modules) generally called    *
  * from the main controlling module (here 1000-MAIN-CONTROL).     *
  * 1000-Main be the control module,                               *
  * 2000-Initialize                                                *
  * 3000-Process                                                   *
  * 4000-Finish                                                    *
  ******************************************************************
   1000-MAIN.
       OPEN INPUT INPUT-FILE
            OUTPUT REPORT-FILE, ERROR-FILE

       PERFORM 2000-INITIALIZE

       PERFORM UNTIL AT-WS-END-OF-FILE

            READ INPUT-FILE
                AT END MOVE "Y" TO WS-END-OF-FILE
                NOT AT END PERFORM 3000-PROCESS
           END-READ
       END-PERFORM


       PERFORM 4000-FINISH
           VARYING WS-EXCUSE
           FROM 1 BY 1
           UNTIL WS-EXCUSE > 10

       MOVE WS-MOST-USED-EXCUSE TO DTMU-HIGH
       MOVE WS-EXCUSE-TOTAL TO DT-TOTAL
       WRITE REPORT-RECORD FROM BLANK-LINE
       WRITE REPORT-RECORD FROM DETAIL-TOTAL
       WRITE REPORT-RECORD FROM BLANK-LINE
       WRITE REPORT-RECORD FROM DETAIL-TOTAL-MOST-USED.

       CLOSE INPUT-FILE REPORT-FILE ERROR-FILE
       STOP RUN.

   2000-INITIALIZE.
       INITIALIZE WS-EXCUSE
       INITIALIZE TABLE-EXCUSES-COUNTER
       WRITE ERROR-RECORD FROM HEADING-LINE-2
       WRITE ERROR-RECORD FROM BLANK-LINE
       WRITE REPORT-RECORD FROM HEADING-LINE-1
       WRITE REPORT-RECORD FROM BLANK-LINE.

   3000-PROCESS.
       MOVE "N" TO WS-INVALID-RECORD
       ADD 1 TO WS-LINE-NUMBER

       IF NOT VALID-EXCUSE
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE "Y" TO WS-INVALID-RECORD
       MOVE ALL "*" TO DLE-EXCUSE-NUMBER

       END-IF.

       IF WS-INVALID-RECORD = "N"
       INSPECT EXCUSE-NUMBER REPLACING LEADING SPACES BY ZERO
       IF EXCUSE-NUMBER IS NUMERIC
          ADD EXCUSE-NUMBER TO TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)
       IF TABLE-EXCUSES-COUNT(EXCUSE-NUMBER) >
          WS-MOST-USED-EXCUSE
       MOVE TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)
                                             TO WS-MOST-USED-EXCUSE
       END-IF

          ADD NUMBER-TIMES-USED TO WS-EXCUSE-TOTAL

       ELSE

       MOVE "Y" TO WS-INVALID-RECORD
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE ALL "*" TO DLE-EXCUSE

            END-IF

       END-IF.

       IF WS-INVALID-RECORD = "Y"
       WRITE ERROR-RECORD FROM DETAIL-LINE-ERROR-1
       WRITE ERROR-RECORD FROM DETAIL-LINE-ERROR-2
       MOVE SPACES TO DETAIL-LINE-ERROR-1
       MOVE SPACES TO DETAIL-LINE-ERROR-2

       END-IF.

   4000-FINISH.
       MOVE WS-EXCUSE TO DL-EXCUSE-NUMBER
       MOVE TEN-EXCUSES(WS-EXCUSE) TO DL-EXCUSE-USED
       MOVE TABLE-EXCUSES-COUNT(WS-EXCUSE) TO DL-AMOUNT-USED
       WRITE REPORT-RECORD FROM DETAIL-LINE
       WRITE REPORT-RECORD FROM BLANK-LINE
       MOVE SPACES TO DETAIL-LINE.

我的输出如下,然后跟着它应该是什么。

代码语言:javascript
复制
RECORD        IMAGE

      3         0r4000700     03
                     **
     12         125999999     12
                **
     21         125000899     21
                **
     23         A01001111     23
                **                   

应:

代码语言:javascript
复制
RECORD        IMAGE

      3         0r4000700     03
                **
      6         074000Q00     06
                     **
     12         125999999     12
                **
     21         125000899     21
                **
     23         A01001111     23
                **
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-09 13:15:11

您有两个问题,导致第三条记录没有以正确的错误出现,第六条记录根本不作为错误出现。

我已经缩进了您的代码,以便您更好地了解正在发生的事情。

像往常一样,编译器不关心,也不注意缩进,人类也是如此。那就去做吧。缩进。通常,只要这样做,您就会看到自己的一些错误。

代码语言:javascript
复制
   IF NOT VALID-EXCUSE
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE "Y" TO WS-INVALID-RECORD
       MOVE ALL "*" TO DLE-EXCUSE-NUMBER
   END-IF

   IF WS-INVALID-RECORD = "N"
       INSPECT EXCUSE-NUMBER REPLACING LEADING SPACES BY ZERO
       IF EXCUSE-NUMBER IS NUMERIC
           ADD EXCUSE-NUMBER TO TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)
           IF TABLE-EXCUSES-COUNT(EXCUSE-NUMBER) >
               WS-MOST-USED-EXCUSE
               MOVE TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)
                                         TO WS-MOST-USED-EXCUSE
           END-IF
           ADD NUMBER-TIMES-USED TO WS-EXCUSE-TOTAL
       ELSE
           MOVE "Y" TO WS-INVALID-RECORD
           MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
           MOVE INPUT-RECORD TO DLE-ERROR
           MOVE ALL "*" TO DLE-EXCUSE
       END-IF
   END-IF

如果我们先拿第三张唱片。

您在88上的范围测试(好用88s,多做一点)是这样的,以十六进制表示:

代码语言:javascript
复制
X'3031' through X'3130'. 

如果该字段已知为数字,但否则,由于数字出现在ASCII中的字母之前,那么大量您不想要的内容就会被视为“有效”。12的值被拒绝,因为它们大于10 (X'3130')。任何字母,前面有一个零,将被视为有效,任何控制代码或任何剩余的值,恰巧适合于大范围的非数字值。

正如Bruce所指出的,在应用该测试之前,您需要知道该字段是数字字段。

代码语言:javascript
复制
   IF EXCUSE-NUMBER NUMERIC
   AND NOT VALID-EXCUSE
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE "Y" TO WS-INVALID-RECORD
       MOVE ALL "*" TO DLE-EXCUSE-NUMBER
   END-IF

这对人类来说有点难读(编译器并不介意)。Bruce的简化建议(正面检查和CONTINUEELSE一起捕捉坏数据)是一个很好的建议:

代码语言:javascript
复制
   IF  ( EXCUSE-NUMBER NUMERIC )
   AND ( VALID-EXCUSE ) 
       [all the good data goes here]
       CONTINUE
   ELSE
       [leaving all the bad data here, ie both not numeric and
        numeric but not in range]
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE "Y" TO WS-INVALID-RECORD
       MOVE ALL "*" TO DLE-EXCUSE-NUMBER
   END-IF

注意:在验证数据时,您需要数字+范围.一旦良好的数据在您的系统中,范围检查将工作“如预期”,因为将没有中间的非数字数据破坏情节。

您还可以同时对“借口号”进行两种类型的错误操作,简化了下面的IF。

如果您可以在两个字段中都有一个前导空白,则需要在任何检查之前处理它。您不需要使用INSPECT

使用两个字节的字段,您可以重新定义整个字段为alpha-数值名称,而第一个字节为名称。把88s放在那些有空间价值的东西上。如果88为真,将其设置为零(整个字段或字节,两个测试):

代码语言:javascript
复制
IF 88-level
    MOVE ZERO TO name-you've-given 
END-IF

到目前为止,记录三被认为是有效的。现在它进入了您的nested-IF。它的借口-数字不是数字,所以点击ELSE,在那里您有第二个字段的编码,。因为你没有缩进,这是模糊的。

记录三被“偶然”拒绝。

在嵌套-IF中,您要检查NUMBER-TIMES-USED中的数字。

这就解释了为什么记录6不以错误的形式出现,因为它的唯一错误是数字次数--使用的不是数字,而您的程序目前没有注意到。

您还错误地添加了借口号,而不是使用的次数。

代码语言:javascript
复制
IF WS-INVALID-RECORD = "N"
    [stuff for leading space]
    IF NUMBER-TIMES-USED IS NUMERIC
        ADD NUMBER-TIMES-USED TO TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)
        IF TABLE-EXCUSES-COUNT(EXCUSE-NUMBER) >
            WS-MOST-USED-EXCUSE
            MOVE TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)
                                      TO WS-MOST-USED-EXCUSE
        END-IF
        ADD NUMBER-TIMES-USED TO WS-EXCUSE-TOTAL
    ELSE
        MOVE "Y" TO WS-INVALID-RECORD
        MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
        MOVE INPUT-RECORD TO DLE-ERROR
        MOVE ALL "*" TO DLE-EXCUSE
    END-IF
END-IF

请注意,TABLE-EXCUSES-COUNT的大小大于WS-MOST-USED-EXCUSE的大小。如果你保持这样,当你有超过99个相同类型的借口时,你会得到意想不到的行为。

你的嵌套-如果有点曲折,你有一些重复。以下是一些简化:

代码语言:javascript
复制
    IF  ( EXCUSE-NUMBER NUMERIC )
    AND ( VALID-EXCUSE ) 
        PERFORM CHECK-NUMBER-TIMES-USED
    ELSE
        PERFORM SET-STANDARD-REJECTION
        MOVE ALL "*" TO DLE-EXCUSE-NUMBER
    END-IF

...

CHECK-NUMBER-TIMES-USED.
    IF 88-level-first-byte-space
        MOVE ZERO TO name-you've-given-the-first-byte
    END-IF
    IF 88-level-field-space
        MOVE ZERO TO field
    END-IF
    IF NUMBER-TIMES-USED IS NUMERIC
        ADD NUMBER-TIMES-USED TO TABLE-EXCUSES-COUNT ( EXCUSE-NUMBER )
                                 WS-EXCUSE-TOTAL
        PERFORM CHECK-HIGHEST-EXCUSE-COUNT
    ELSE
        PERFORM SET-STANDARD-REJECTION
        MOVE ALL "*" TO DLE-EXCUSE
    END-IF


SET-STANDARD-REJECTION.
    MOVE INPUT-RECORD TO DLE-ERROR
    MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
    MOVE "Y" TO WS-INVALID-RECORD
    .

CHECK-HIGHEST-EXCUSE-COUNT.
    IF TABLE-EXCUSES-COUNT ( EXCUSE-NUMBER ) 
        GREATER THAN WS-COUNT-OF-MOST-USED
        MOVE TABLE-EXCUSES-COUNT ( EXCUSE-NUMBER )
                                  TO WS-COUNT-OF-MOST-USED
        MOVE EXCUSE-NUMBER        TO WS-EXCUSE
    END-IF
    .

当你到达总数的时候,至少还有一个简化,但看看结果如何。

票数 2
EN

Stack Overflow用户

发布于 2015-02-09 07:14:43

有效-借口很有可能作为

代码语言:javascript
复制
     EXCUSE-NUMBER >= '01' and EXCUSE-NUMBER < '12'

所以在过程3000过程中,我会尝试替换

代码语言:javascript
复制
   IF  NOT VALID-EXCUSE
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE "Y" TO WS-INVALID-RECORD
       MOVE ALL "*" TO DLE-EXCUSE-NUMBER
   END-IF.

使用

代码语言:javascript
复制
   INSPECT EXCUSE-NUMBER REPLACING LEADING SPACES BY ZERO
   IF  EXCUSE-NUMBER is numeric
   and VALID-EXCUSE
       continue
   else
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE "Y" TO WS-INVALID-RECORD
       MOVE ALL "*" TO DLE-EXCUSE-NUMBER
   END-IF

   if not NUMBER-TIMES-USED is numeric
       MOVE "Y" TO WS-INVALID-RECORD
       MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
       MOVE INPUT-RECORD TO DLE-ERROR
       MOVE ALL "*" TO DLE-EXCUSE
   end-if

还删除以下内容:

代码语言:javascript
复制
       ELSE

           MOVE "Y" TO WS-INVALID-RECORD
           MOVE WS-LINE-NUMBER TO DLE-LINE-NUMBER
           MOVE INPUT-RECORD TO DLE-ERROR
           MOVE ALL "*" TO DLE-EXCUSE

这段代码位于完全错误的位置。

还有其他错误。

代码语言:javascript
复制
    ADD EXCUSE-NUMBER TO TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)

很可能是

代码语言:javascript
复制
    ADD 1             TO TABLE-EXCUSES-COUNT(EXCUSE-NUMBER)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28403057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档