COBOL仅从输入文件的一行读取

COBOL仅从输入文件的一行读取,cobol,Cobol,当Cobol批处理程序只从输入文件中读取一行时出现问题,而正在读取的行也不是第一行。输入文件的记录是固定长度的。 代码是: IDENTIFICATION DIVISION. PROGRAM-ID. AverageGPA. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STUDENT-DATA A

当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?现在它在两条线上,但我希望它在一条线上。

  • 为什么credits标题没有显示所有字母-输出记录不够长 要保存完整的页眉,请参见展开部分
  • 如何计算平均GPA的a行-读取整个文件,求和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).
我个人会的

  • 将输出记录定义移动到工作存储器
  • 输出数据定义为单个图片
i、 e

其他问题 我会改变

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

单线输出 创建一个像这样的记录

      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 if
结束oneif i、 它实际上意味着

         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.
写入输出数据。
结束所有嵌套的if

使用
评估

         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 use evaluate。将更新Answer您在200-WRITE-GPA中有一个停止运行,因此它将在第一次执行该段落时停止执行。此外,输出(S>JONES)中的名称不会出现在您列出的输入中。你确定你给我们看的是正确的文件吗?这是正确的文件,是倒数第二行。至于停止运行,我得到一个错误,如果最后一行不存在,则在最后一行显示意外的文件结尾。只是在写入输出数据后添加了另一行,现在它工作了。并且仍然以某种方式仅显示S.Jones行。在最后一行获得eror并不是在第一行执行停止运行的理由。
         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.
         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.