2017-02-17 41 views
0

Я пишу простую программу COBOL для чтения данных и расчета стоимости обучения в зависимости от количества часов кредитования. Моя программа завершена, за исключением одной ошибки, которую я не понимаю. В последней строке подпрограммы CALC я пытаюсь написать переменную TUITION, и я получаю ошибку: «Не имя записи». Я все еще изучаю базовую структуру и настройку программы COBOL, поэтому я знаю, что это небольшой туман, о котором я забыл.Ошибка COBOL Не указано имя

Код:

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. 
+0

Попробуйте 'Написать PRINT-REC' можно писать только полные записи не части записей –

+0

Не особенно связанных с COBOL, но процедуры, которые вы выполняете/вызываете, должны иметь одну задачу, и это имя должно отражать это. Ваш «200-CALC-RTN» подразумевает, что он вычисляет, но он делает больше, чем это: он также пишет! Я бы переместил WRITE сразу после инструкции PERFORM. –

+0

Это также хорошая идея поставить период, который закрывает абзац на своей собственной линии, чтобы люди точно знали, что это такое. В более старой версии COBOL не было терминатора ограничений (например, END-IF), поэтому для всех прерываний использовался период. Ввод его в ту же строку, что и WRITE TUITION, может быть немного запутанным, но не конец света – SaggingRufus

ответ

3

Попробуйте

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. 

 Смежные вопросы

  • Нет связанных вопросов^_^