COBOL语法帮助

3

我正在为我的COBOL课程编写一个计算学生学费的程序。但是,我一直在遇到语法错误:

   jdoodle.cobc: in Paragraph '100-MAIN-Module':
   jdoodle.cobc:33: error: syntax error, unexpected END
   jdoodle.cobc:36: error: syntax error, unexpected END
   jdoodle.cobc:40: error: syntax error, unexpected END-PERFORM

我尝试了删除、移动位置,检查拼写,但似乎无法摆脱这些错误。

   IDENTIFICATION DIVISION.
   PROGRAM-ID. Tuition.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT IN-STUDENT-FILE 
           ASSIGN TO 'name.dat'
           ORGANIZATION IS LINE SEQUENTIAL.    
       SELECT OUT-STUDENT-FILE 
           ASSIGN TO 'tuition.dat'
           ORGANIZATION IS LINE SEQUENTIAL.
   DATA DIVISION.
   FILE SECTION.
   FD IN-STUDENT-FILE.
   01 IN-STUDENT-REC.
       05 STUDENTNAME-IN  PICTURE X(20).
       05 NUMCRED-IN      PICTURE 99.
       05                 PICTURE X(58).
   FD OUT-STUDENT-FILE.
   01 OUT-STUDENT-REC.
       05 STUDENTNAME-OUT PICTURE X(20).
       05                 PICTURE X(20).
       05 NUMCRED-OUT     PICTURE 99.
       05                 PICTURE X(20).
       05 TUITION-OUT     PICTURE X(4).
   WORKING-STORAGE SECTION.
   01 TUITION             PICTURE 9(4).
   01 EOF                 PICTURE X.
   PROCEDURE DIVISION.
   100-MAIN-MODULE.
       OPEN INPUT IN-STUDENT-FILE
            OUTPUT OUT-STUDENT-FILE
        PERFORM UNTIL END OF FILE = 'YES'
           READ IN-STUDENT-FILE
               AT END
                   MOVE 'YES' TO END OF FILE
               NOT AT END
                   PERFORM 200-PROCESS-RTN
           END-READ.
        END-PERFORM.
         CLOSE IN-STUDENT-FILE
               OUT-STUDENT-FILE
         STOP RUN.
   200-PROCESS-RTN.
       MOVE STUDENTNAME-IN TO STUDENTNAME-OUT
       MOVE NUMCRED-IN TO NUMCRED-OUT
       IF NUMCRED-IN < 12 THEN
           MULTIPLY NUMCRED-IN BY 525 GIVING TUITION
       ELSE
           SET TUITION TO 6300
       END-IF
       MOVE TUITION TO TUITION-OUT
       DISPLAY OUT-STUDENT-REC
       WRITE OUT-STUDENT-REC.

我已经上了三个星期的课,在老师给我们的一个样例程序之外,这是我第一次尝试编写代码。


3
我非常着迷地发现仍有一门COBOL课程可以学习! - Bill K
1
从您的错误消息中,我推测您使用的是旧版本的OpenCOBOL/GnuCOBOL;如果可能的话,我建议您升级到3.x版本(在这种情况下也会提供稍微更好的错误消息)。 - Simon Sobisch
3
此外,将END-READ后的句号删除。这是与IT有关的内容。 - donPablo
感谢所有在END-READ处的时间和我有一些变量“未定义”的事实,这就是答案。 - Benjamin Poindexter
3个回答

4
你使用了一个名为END OF FILE的“变量”。对于COBOL来说,这是一个无效的名称,因为它包含保留字END,请改用END-OF-FILE,然后你会得到另一条错误消息,告诉你END-OF-FILE未定义;将其定义后,你就可以进一步操作。

4

两件事。首先,正如之前所提到的,字段名称中不能有空格。其次:句点结束语句而不是动词。除非必须使用它们,否则不要使用它们,只有在段落末尾才需要使用;作用域终止符本身就足够了,除非它是段落中最后一条语句。

  PERFORM UNTIL END-OF-FILE = 'YES'
     READ IN-STUDENT-FILE
        AT END
           MOVE 'YES' TO END-OF-FILE
        NOT AT END
           PERFORM 200-PROCESS-RTN
     END-READ. <- This period ends the statement not just the read
  END-PERFORM.  <- leaving this hanging

0

这段代码有很多方面可以改进。首先,没有特定的大写要求。小写也可以使用,个人认为这样更容易阅读。

你也不需要使用“picture”,可以缩写为“pic”,节省开发时间。

使用名为“END OF FILE”的变量并不必要,最好是使用一个标志并将其初始化为false,然后在需要时进行操作,level 88变量非常适合此用途。

同样,这完全取决于个人喜好,但我不喜欢使用段落,而是坚持使用章节,我觉得这样更容易管理程序的结构。

在你的代码中,你在read的末尾使用了句号,单独的句号会被视为“end-read”,因此由于已经有一个句号,编译器会将第一个句号视为“end-perform”,并报错。我使用句号的方式是在每个章节的末尾都加上一个句号,这样清晰可见,我知道它在哪里。

我已经按照我的方式重构了你的代码,请查看并告诉我你的想法。

identification division.
program-id. Tuition.
environment division.
input-output section.
file-control.
   select in-student-file
       assign to 'name.dat'
       organization is line sequential.    
   select out-student-file 
       assign to 'tuition.dat'
       organization is line sequential.

data division.    
file section.    
   fd in-student-file.    
      01 in-student-rec.
         05 studentname-in  pic x(20).
         05 numcred-in      pic 99.
         05                 pic X(58).    

   fd out-section-file.    
      01 out-student-rec.
         05 studentname-out pic X(20).
         05                 pic X(20).
         05 numcred-out     pic 99.
         05                 pic X(20).
         05 tuition-out     pic X(4).    
working-storage section.    
   01  tuition              pic 9(4).   
   01  ws-file-at-end       pic x.
       88 fl-eof            value "Y" false "N". 

procedure division.

*************************************************
*********Structure of programme******************
*************************************************    
main section.
   perform startup
   perform main-process until fl-eof-true
   perform closedown
   go-back
   .

*************************************************
***********Open necessary files******************
*************************************************
startup section.
   open input in-student-file
   open output out-student-file
   set fl-eof to false
   .

*************************************************
********Reads until flag end of file*************
*************************************************
main-process section.
   read in-student-file
      at end 
        set fl-eof to true
      not at end
        perform process-and-return
   end-read
   .

*************************************************
******Process the student tuition****************
*************************************************
process-and-return section.
   move studentname-in to studentname-out
   move numcred-in to numcred-out

   if numcred-in < 12 then
      multiply numcred-in by 525 giving tuition
   else
      set tuition to 6300
   end-if

   move tuition to tuition-out
   display out-student-rec
   write out-student-rec
   .

*************************************************
******Close all necessary files******************
*************************************************
closedown section.
   close in-student-file
   close out-student-file
   .          

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接