Синтаксическая справка для Cobol - PullRequest
3 голосов
/ 22 февраля 2020

В настоящее время я пишу программу для своего класса в Коболе, чтобы рассчитать стоимость обучения студентов. Тем не менее, я получаю синтаксические ошибки:

   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 ]

4 голосов
/ 22 февраля 2020

Две вещи. Во-первых, как упоминалось ранее, в именах полей не должно быть пробелов. Второе: точка заканчивается утверждением, а не глаголом. Не используйте их, если это не нужно, что только в конце абзаца; терминаторы области сами по себе хороши, если только они не указаны в последнем утверждении в абзаце.

  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
4 голосов
/ 22 февраля 2020

Вы используете «переменную» с именем END OF FILE.
. Для COBOL это недопустимое имя, поскольку оно включает зарезервированное слово END, вместо этого используйте END-OF-FILE, и вы получите другую ошибку с лучшим сообщением, сообщающим Вы, что END-OF-FILE не определен; сделайте это, и вы сможете продвинуться дальше.

0 голосов
/ 24 февраля 2020

Существует множество различных аспектов этого кода, которые вы можете изменить. Во-первых, нет особого c требования к капитализации. Можно использовать строчные буквы, и лично я считаю, что это будет намного проще для глаз.

Вам также не нужно использовать 'picture', и это может быть сокращено до 'pi c', что экономит время на разработку.

использование переменной с именем 'END OF FILE' необязательно, намного проще просто сделать флаг и инициализировать его как false для начала, прежде чем можно будет манипулировать этим при необходимости, переменные уровня 88 хороши за это.

Опять же, это полностью зависит от личных предпочтений, но я не люблю использовать абзацы и придерживаться разделов, я чувствую, что это облегчает управление структурой вашей программы.

В вашем коде вы использовали точки остановки в конце чтения, точка останова сама по себе будет выглядеть как «конец чтения», поэтому, так как у вас уже есть одна, компилятор читает первую точку остановки как 'end-execute' и выбрасывает ошибку для этого. То, как я использую точки полного останова, заключается в том, чтобы иметь один в конце каждого раздела, ясно видимый, чтобы я знал его там.

Я реорганизовал ваш код так, как я бы его написал. Пожалуйста, посмотрите на это и посмотрите, что вы думаете.

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