【问题标题】:COBOL Only Reading From One Line of Input FileCOBOL 只读取一行输入文件
【发布时间】:2020-10-14 20:07:24
【问题描述】:

Cobol 批处理程序存在问题,它仅从输入文件中读取一行,并且正在读取的行也不是第一行。输入文件的记录是固定长度的。 代码是:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. AverageGPA. 
       ENVIRONMENT DIVISION. 
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
          SELECT STUDENT-DATA
             ASSIGN TO "C:\COBOL\CH0708.DAT"
             ORGANIZATION IS LINE SEQUENTIAL.        
          SELECT OUTPUT-FILE
             ASSIGN TO "C:\COBOL\STUDENT_GPA.DAT"
             ORGANIZATION IS LINE SEQUENTIAL. 
       DATA DIVISION. 
       FILE SECTION.
       FD  STUDENT-DATA.
       01  EMPLOYEE-RECORD.
           05  SSN-IN                PICTURE X(9).
           05  NAME-IN               PICTURE X(21). 
           05  CLASS-IN              PICTURE 9.    
           05  SCHOOL-IN             PICTURE 9.
           05  GPA-IN                PICTURE 9V99.
           05  CREDITS-IN            PICTURE 999.
       FD  OUTPUT-FILE. 
       01  OUTPUT-DATA. 
           05  SSN-OUT               PICTURE X(9).  
           05                        PICTURE X(5).
           05  NAME-OUT              PICTURE X(21).
           05  CLASS-OUT             PICTURE X(9).
           05                        PICTURE X(5).
           05  SCHOOL-OUT            PICTURE X(15).
           05                        PICTURE X(5).
           05  GPA-OUT               PICTURE 9.99.
           05                        PICTURE X(5).
           05  CREDITS-OUT           PICTURE Z99.
       WORKING-STORAGE SECTION.
       01  OUTPUT-HEADING.
           05 SSN-HEADING            PICTURE X(9) 
                                        VALUE 'SSN'.
           05                        PICTURE X(5).
           05 NAME-HEADING           PICTURE X(21) 
                                        VALUE 'STUDENT NAME'.
           05 CLASS-HEADING          PICTURE X(9) VALUE 'CLASS'.
           05                        PICTURE X(5).
           05 SCHOOL-HEADING         PICTURE X(15) VALUE 'SCHOOL'.
           05                        PICTURE X(5).
           05 GPA-HEADING            PICTURE X(3) VALUE 'GPA'.
           05                        PICTURE X(5).
           05 CREDITS-HEADING        PICTURE X(7) VALUE 'CREDITS'.
       01  GPA-COUNT                 PICTURE 9 VALUE 0.
       01  GPA-SUM                   PICTURE 9V99 VALUE 0.
       01  AVERAGE-GPA               PICTURE 9.99.
       01  AVERAGE-GPA-LINE          PICTURE X(16)
                                VALUE 'AVERAGE GPA IS '.
       01  ARE-THERE-MORE-RECORDS    PICTURE XXX VALUE 'YES'.
       PROCEDURE DIVISION.
       100-MAIN-MODULE.
           OPEN INPUT STUDENT-DATA
                OUTPUT OUTPUT-FILE
           WRITE OUTPUT-DATA FROM OUTPUT-HEADING
           PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
              READ STUDENT-DATA
                  AT END
                      MOVE 'NO' TO ARE-THERE-MORE-RECORDS
                  NOT AT END
                      PERFORM 200-WRITE-GPA
                      
                 END-READ
           END-PERFORM
           DIVIDE GPA-SUM BY GPA-COUNT GIVING AVERAGE-GPA
           WRITE OUTPUT-DATA FROM AVERAGE-GPA-LINE
           WRITE OUTPUT-DATA FROM AVERAGE-GPA
           CLOSE STUDENT-DATA
                 OUTPUT-FILE
           STOP RUN.
       200-WRITE-GPA.
           MOVE SPACES TO OUTPUT-DATA.
           MOVE SSN-IN TO SSN-OUT
           MOVE NAME-IN TO NAME-OUT
           IF CLASS-IN = 1
              MOVE 'FRESHMAN' TO CLASS-OUT
           ELSE IF CLASS-IN = 2
              MOVE 'SOPHOMORE' TO CLASS-OUT
           ELSE IF CLASS-IN = 3
              MOVE 'JUNIOR' TO CLASS-OUT
           ELSE IF CLASS-IN = 4 
              MOVE 'SENIOR' TO CLASS-OUT
           ELSE
              MOVE CLASS-IN TO CLASS-OUT
           END-IF
           IF SCHOOL-IN = 1
              MOVE 'BUSINESS' TO SCHOOL-OUT
           ELSE IF SCHOOL-IN = 2
              MOVE 'LIBERAL ARTS' TO SCHOOL-OUT
           ELSE IF SCHOOL-IN = 3
              MOVE 'ENGINEERING' TO SCHOOL-OUT
           ELSE
              MOVE 'INVALID' TO SCHOOL-OUT
           END-IF
           MOVE GPA-IN TO GPA-OUT
           ADD  GPA-IN TO GPA-SUM
           MOVE CREDITS-IN TO CREDITS-OUT
           ADD 1 TO GPA-COUNT
           WRITE OUTPUT-DATA.
           STOP RUN.

输入文件是:

125997600R. HENDERSON         11379011
234789543P. MARTINSON         11250011
276888003M. JACKSON           22394020
332557267B. BRUHANSKY         21314020
235654654K. THOMPSON          23279021
336221180F. SMITH             21304019
332557845D. MIKA              33217024
377000854A. ABRAMS            31379027
399000002L. NAIRN             33375029
211311411P. BUTTRAM           41397035
122886567F. DARK              41297034
224257889S. SMITH             41397038
125654334C. HAYES             41400040
345345669J. FISHER            42200036
432234543S. JONES             43291033
488345612M. PILLION           41255034

给出的输出是

SSN           STUDENT NAME         CLASS         SCHOOL              GPA     CRED
432234543     S. JONES             SENIOR        ENGINEERING         2.91      33
AVERAGE GPA IS
2.91

另外,还有两个问题。 为什么学分标题没有显示所有字母?我将如何为平均 GPA 做好准备?现在它在两条线上,但我希望它在一条线上。

【问题讨论】:

  • 您在 200-WRITE-GPA 中有一个 STOP RUN,因此它将在第一次执行该段落时停止执行。此外,您的输出中的名称 (S> JONES) 不会出现在您列出的输入中。您确定向我们展示了正确的文件吗?
  • 这是正确的文件,它是倒数第二行。至于 STOP RUN,如果最后一行不存在,我会收到一条错误消息,提示文件意外结束。
  • 刚刚在 WRITE OUTPUT-DATA 之后添加了另一行,现在它可以工作了。
  • 而且仍然以某种方式只显示 S. Jones 线。
  • 在最后一行出错并不是在第一行执行 STOP RUN 的理由。

标签: cobol


【解决方案1】:
  • 为什么信用标题没有显示所有字母 - 输出记录不够长 要保留完整的标题,请参阅扩展部分
  • 我将如何为平均 GPA 做一行 - 读取整个文件,将 GPA 相加并除以记录数。

学分标题问题

输出记录定义为


       01  OUTPUT-DATA. 
           05  SSN-OUT               PICTURE X(9).  
           05                        PICTURE X(5).
           05  NAME-OUT              PICTURE X(21).
           05  CLASS-OUT             PICTURE X(9).
           05                        PICTURE X(5).
           05  SCHOOL-OUT            PICTURE X(15).
           05                        PICTURE X(5).
           05  GPA-OUT               PICTURE 9.99.
           05                        PICTURE X(5).
           05  CREDITS-OUT           PICTURE Z99.

您所要做的就是在末尾添加一个填充符。

       01  OUTPUT-DATA. 
           05  SSN-OUT               PICTURE X(9).  
           05                        PICTURE X(5).
           05  NAME-OUT              PICTURE X(21).
           05  CLASS-OUT             PICTURE X(9).
           05                        PICTURE X(5).
           05  SCHOOL-OUT            PICTURE X(15).
           05                        PICTURE X(5).
           05  GPA-OUT               PICTURE 9.99.
           05                        PICTURE X(5).
           05  CREDITS-OUT           PICTURE Z99.
           05                        picture X(2).

我个人会

  • 将输出记录定义移动到工作存储中
  • output-data定义为单张图片

       01  OUTPUT-DATA               pic x(73).
       
       Woring storage.
       
       01  report-record.       
           05  SSN-OUT               PICTURE X(9).  
           05                        PICTURE X(5).
           05  NAME-OUT              PICTURE X(21).
           05  CLASS-OUT             PICTURE X(9).
           05                        PICTURE X(5).
           05  SCHOOL-OUT            PICTURE X(15).
           05                        PICTURE X(5).
           05  GPA-OUT               PICTURE 9.99.
           05                        PICTURE X(5).
           05  CREDITS-OUT           PICTURE Z99.
           05                        picture X(2).

其他问题

我会改变

          ADD 1 TO GPA-COUNT
           WRITE OUTPUT-DATA.
           STOP RUN.

           ADD 1 TO GPA-COUNT
           WRITE OUTPUT-DATA.
       299-exit.
           exit.

单行输出

只需创建一个类似的记录

      01  Summary-line
          03               PICTURE X(16)
                                VALUE 'AVERAGE GPA IS '.
          03  everage-gpa  picture 9.99.

只写了一条记录

问题是你没有结束你的 if 语句

         IF SCHOOL-IN = 1
              MOVE 'BUSINESS' TO SCHOOL-OUT
           ELSE IF SCHOOL-IN = 2
              MOVE 'LIBERAL ARTS' TO SCHOOL-OUT
           ELSE IF SCHOOL-IN = 3
              MOVE 'ENGINEERING' TO SCHOOL-OUT
           ELSE
              MOVE 'INVALID' TO SCHOOL-OUT
           END-IF
           MOVE GPA-IN TO GPA-OUT
           ADD  GPA-IN TO GPA-SUM
           MOVE CREDITS-IN TO CREDITS-OUT
           ADD 1 TO GPA-COUNT
           WRITE OUTPUT-DATA.

end-ifone 结尾,如果 即它实际上意味着

         IF SCHOOL-IN = 1
              MOVE 'BUSINESS' TO SCHOOL-OUT
         ELSE
           IF SCHOOL-IN = 2
              MOVE 'LIBERAL ARTS' TO SCHOOL-OUT
           ELSE 
              IF SCHOOL-IN = 3
                 MOVE 'ENGINEERING' TO SCHOOL-OUT
              ELSE
                 MOVE 'INVALID' TO SCHOOL-OUT
              END-IF
              MOVE GPA-IN TO GPA-OUT
              ADD  GPA-IN TO GPA-SUM
              MOVE CREDITS-IN TO CREDITS-OUT
              ADD 1 TO GPA-COUNT
              WRITE OUTPUT-DATA.

WRITE OUTPUT-DATA. 结束所有嵌套的 if

使用Evaluate

         evaluate true
         when SCHOOL-IN = 1
              MOVE 'BUSINESS' TO SCHOOL-OUT
         when SCHOOL-IN = 2
              MOVE 'LIBERAL ARTS' TO SCHOOL-OUT
         when SCHOOL-IN = 3
              MOVE 'ENGINEERING' TO SCHOOL-OUT
         when other
              MOVE 'INVALID' TO SCHOOL-OUT
         END-evaluate
         MOVE GPA-IN TO GPA-OUT
         ADD  GPA-IN TO GPA-SUM
         MOVE CREDITS-IN TO CREDITS-OUT
         ADD 1 TO GPA-COUNT
         WRITE OUTPUT-DATA.

这同样适用于另一个 if end-if

【讨论】:

  • 谢谢,这让信用部分工作了。那是一件事解决了。至于如何存储输出,这是针对大学课程的,所以我认为我必须这样做,因为这是教授教的。
  • 对于平均 GPA,您必须遍历文件。我会更新答案
  • 这个问题的措辞很糟糕,我只是希望那部分放在一条线上。我现在的方式是两条线。
  • 添加了额外的部分
  • 问题是你使用 if - 每个 if 都需要一个 end-if 使用 evaluate 代替。将更新答案
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2010-12-26
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多