Compiler errors COBOL错误不是记录名

Compiler errors COBOL错误不是记录名,compiler-errors,record,cobol,Compiler Errors,Record,Cobol,我正在写一个简单的COBOL程序来读取数据,并根据学分数计算学费。我的程序是完整的,除了一个我不明白的错误。在CALC例程的最后一行,我试图写入tumore变量,结果得到错误:“不是记录名”。我还在学习COBOL程序的基本结构和设置,所以我知道这是我忘记的一些小错误 代码: 识别部门。 程序ID.prg1 lankford。 作者兰克福德。 环境司。 输入输出部分。 文件控制。 选择磁盘文件分配给“prg1.dat” 组织是按行顺序的。 选择打印文件分配到“prg1 lankford.rpt”

我正在写一个简单的COBOL程序来读取数据,并根据学分数计算学费。我的程序是完整的,除了一个我不明白的错误。在CALC例程的最后一行,我试图写入tumore变量,结果得到错误:“不是记录名”。我还在学习COBOL程序的基本结构和设置,所以我知道这是我忘记的一些小错误

代码:

识别部门。
程序ID.prg1 lankford。
作者兰克福德。
环境司。
输入输出部分。
文件控制。
选择磁盘文件分配给“prg1.dat”
组织是按行顺序的。
选择打印文件分配到“prg1 lankford.rpt”
组织是按行顺序的。
数据司。
文件部分。
磁盘文件
记录包含80个字符。
01磁盘记录。
05学生姓名输入图X(20)。
05数字-学分-输入图9(2)。
05图X(58)。
FD打印文件
该记录包含66个字符。
01打印记录。
05学生姓名输出图片X(20)。
05图X(20)。
05 NUM-CREDITS-输出图9(2)。
05图X(20)。
05图9(4)。
工作和储存科。
01更多记录PIC X值“Y”。
01全日制PIC 9(4)值6300。
01每学分PIC 9(3)值525。
程序司。
100-主模块。
打开输入磁盘文件
输出打印文件
执行直到更多记录='N'
读取磁盘文件
最后
将“N”移动到更多记录
不在最后
执行200-CALC-RTN
端读
末端执行
关闭磁盘文件
打印文件
停,跑。
200-钙-RTN。
将STUDENT-NAME-INPUT移动到STUDENT-NAME-OUTPUT
将NUM-CREDITS-INPUT移动到NUM-CREDITS-OUTPUT
如果NUM-CREDITS-INPUT<12,则
将NUM-CREDITS-INPUT乘以PER-CREDIT
交学费
其他的
将全日制学费改为学费
写学费。
试试看

您只能写入完整记录,不能写入部分记录

此外,如果在写入之前有一个结尾,那么您将丢失,请尝试:

200-CALC-RTN。
将STUDENT-NAME-INPUT移动到STUDENT-NAME-OUTPUT
将NUM-CREDITS-INPUT移动到NUM-CREDITS-OUTPUT
如果NUM-CREDITS-INPUT<12,则
将NUM-CREDITS-INPUT乘以PER-CREDIT
交学费
其他的
将全日制学费改为学费
如果结束
写打印记录。
试试看

您只能写入完整记录,不能写入部分记录

此外,如果在写入之前
有一个结尾,那么您将丢失,请尝试:

200-CALC-RTN。
将STUDENT-NAME-INPUT移动到STUDENT-NAME-OUTPUT
将NUM-CREDITS-INPUT移动到NUM-CREDITS-OUTPUT
如果NUM-CREDITS-INPUT<12,则
将NUM-CREDITS-INPUT乘以PER-CREDIT
交学费
其他的
将全日制学费改为学费
如果结束
写打印记录。

Try
Write PRINT-REC
您只能写入完整记录,而不是与COBOL无关的部分记录,但是您执行/调用的例程应该有一个任务,并且名称应该反映这一点。你的“200-CALC-RTN”意味着它会计算,但它做的不止这些:它还会写!我会把WRITE移到PERFORM语句之后。我还建议将段落结尾的句点放在它自己的行中,这样人们就可以确切地知道它是什么。在旧版本的COBOL中,并没有作用域终止符(比如END-IF),所以所有终止都使用句点。将其与写入教程放在同一行可能会有点混淆,但不是世界末日尝试
WRITE PRINT-REC
您只能写入完整记录,而不是与COBOL无关的部分记录,但是您执行/调用的例程应该有一个任务,并且名称应该反映这一点。你的“200-CALC-RTN”意味着它会计算,但它做的不止这些:它还会写!我会把WRITE移到PERFORM语句之后。我还建议将段落结尾的句点放在它自己的行中,这样人们就可以确切地知道它是什么。在旧版本的COBOL中,并没有作用域终止符(比如END-IF),所以所有终止都使用句点。把它和写作教学放在同一行可能有点混乱,但这不是世界末日
IDENTIFICATION DIVISION.
PROGRAM-ID. prg1-lankford.
AUTHOR. Lankford.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT DISK-FILE ASSIGN TO 'prg1.dat'
        ORGANIZATION IS LINE SEQUENTIAL.
    SELECT PRINT-FILE ASSIGN TO 'prg1-lankford.rpt'
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD  DISK-FILE
    RECORD CONTAINS 80 CHARACTERS.
01  DISK-REC.
    05  STUDENT-NAME-INPUT  PIC X(20).
    05  NUM-CREDITS-INPUT   PIC 9(2).
    05                  PIC X(58).
FD  PRINT-FILE
    RECORD CONTAINS 66 CHARACTERS.
01  PRINT-REC.
    05  STUDENT-NAME-OUTPUT PIC X(20).
    05                  PIC X(20).
    05  NUM-CREDITS-OUTPUT  PIC 9(2).
    05                  PIC X(20).
    05  TUITION             PIC 9(4).

WORKING-STORAGE SECTION.
01  MORE-RECORDS            PIC X VALUE 'Y'.
01  FULL-TIME-TUITION       PIC 9(4) VALUE 6300.
01  PER-CREDIT          PIC 9(3) VALUE 525.

PROCEDURE DIVISION.
100-MAIN-MODULE.
    OPEN INPUT DISK-FILE
        OUTPUT PRINT-FILE
    PERFORM UNTIL MORE-RECORDS = 'N'
        READ DISK-FILE
            AT END
                MOVE 'N' TO MORE-RECORDS
            NOT AT END
                PERFORM 200-CALC-RTN
        END-READ
    END-PERFORM
    CLOSE DISK-FILE
        PRINT-FILE
    STOP RUN.
200-CALC-RTN.
    MOVE STUDENT-NAME-INPUT TO STUDENT-NAME-OUTPUT
    MOVE NUM-CREDITS-INPUT TO NUM-CREDITS-OUTPUT
    IF NUM-CREDITS-INPUT < 12 THEN
        MULTIPLY NUM-CREDITS-INPUT BY PER-CREDIT
            GIVING TUITION
    ELSE 
        MOVE FULL-TIME-TUITION TO TUITION
    WRITE TUITION.
    Write PRINT-REC
200-CALC-RTN.
    MOVE STUDENT-NAME-INPUT TO STUDENT-NAME-OUTPUT
    MOVE NUM-CREDITS-INPUT TO NUM-CREDITS-OUTPUT
    IF NUM-CREDITS-INPUT < 12 THEN
        MULTIPLY NUM-CREDITS-INPUT BY PER-CREDIT
        GIVING TUITION
    ELSE 
        MOVE FULL-TIME-TUITION TO TUITION
    end-if

    WRITE PRINT-REC.