COBOL仅从输入文件的一行读取
当Cobol批处理程序只从输入文件中读取一行时出现问题,而正在读取的行也不是第一行。输入文件的记录是固定长度的。 代码是:COBOL仅从输入文件的一行读取,cobol,Cobol,当Cobol批处理程序只从输入文件中读取一行时出现问题,而正在读取的行也不是第一行。输入文件的记录是固定长度的。 代码是: IDENTIFICATION DIVISION. PROGRAM-ID. AverageGPA. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT STUDENT-DATA A
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).
我个人会的
- 将输出记录定义移动到工作存储器
- 将
输出数据定义为单个图片
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.