Компилятор думает, что я ссылаюсь на несуществующий параграф или раздел

Я получаю ошибки относительно моего процедурного разделения в одном из моих назначений для класса. Это программа COBOL, которая, как предполагается, должна содержать промежуточные суммы среднего роста и веса заявителей, количества претендентов с карими глазами, числа кандидатов-мужчин и количества кандидатов-женщин. Также программа должна печатать информацию о кандидатах, которые отвечают определенному набору требований, но я получаю ошибки почти во всех моих выступлениях.

COBCH0034 Операнд должен быть числовым. В этом контексте требуется числовое значение, а вы указали нечисловое значение.

COBCH0014 Неверный операнд Указанный вами операнд в некотором роде неверен и не может быть обработан вашей системой COBOL. Например, вы могли указать отрицательное целое число, где разрешены только положительные целые числа

       identification division.
   program-id. ELECTRA-MODELING-AGENCY.
  ******************************************************************
  *THIS PROGRAM PRODUCES THE REPORT ACCORDING TO THE GIVEN PRINTER 
  *SPACING CHART                                                   *
  ******************************************************************
   environment division.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT INPUT-FILE ASSIGN TO "INFILE.txt"
          Organization is line sequential.
   SELECT OUTPUT-FILE ASSIGN TO "CHOSEN-APLICANTS.TXT"
          Organization is line sequential.
   data division.
   FILE SECTION.
   FD INPUT-FILE.
   01 INPUT-REC.
       05 APPLICANTS-NAME              PIC X(20).
       05 APPLICANTS-WEIGHT            PIC 9(3).
       05 APPLICANTS-HEIGHT            PIC 9(2).
       05 APPLICANTS-EYE-CODE          PIC X.
       05 APPLICANTS-HAIR-CODE         PIC X.
       05 APPLICANTS-GENDER            PIC X.
   FD OUTPUT-FILE.
   01 OUTPUT-REC PIC X(78).
   WORKING-STORAGE SECTION.
   01 EOF PIC X VALUE "N".
   01 HEADING-1.
       05 FILLER                       PIC X(41) VALUE "M"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "O"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "D" 
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "E"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "L"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(3) VALUE "R"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "E"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "P"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "O"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "R"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(2) VALUE "T"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(16) VALUE SPACES.
   01 HEADING-2.
       05 FILLER                       PIC X(23) VALUE "NAME"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(13) VALUE "SEX"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(10) VALUE "WEIGHT"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(8) VALUE "HEIGHT"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(5) VALUE "EYE"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(6) VALUE "COLOR"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(6) VALUE "HAIR"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(6) VALUE "COLOR"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X VALUE SPACES.
   01 DETAIL-LINE.
       05 FILLER                       PIC X(10) VALUE SPACES.
       05 NAME-OUT                     PIC X(20).
       05 FILLER                       PIC X(4) VALUE SPACES.
       05 GENDER-OUT                   PIC X.
       05 FILLER                       PIC X(6) VALUE SPACES.
       05 WEIGHT-OUT                   PIC X(3).
       05 FILLER                       PIC X(6) VALUE SPACES.
       05 HEIGHT-OUT                   PIC XX.
       05 FILLER                       PIC X(6) VALUE SPACES.
       05 EYE-COLOR-OUT                PIC X(5). 
       05 FILLER                       PIC X(6) VALUE SPACES.
       05 HAIR-COLOR-OUT               PIC X(6).
   01 SUMMARY-LINE-01
       05 FILLER                       PIC X(17) VALUE "AVERAGE"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(7) VALUE "HEIGHT"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(3) VALUE "OF"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(4) VALUE "ALL"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(12) VALUE "APPLICANTS:"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X.
       05 AVERAGE-HEIGHT               PIC ZZZ9.
       05 FILLER                       PIC X(12) VALUE SPACES.
   01 SUMMARY-LINE-02
       05 FILLER                       PIC X(17) VALUE "AVERAGE"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(7) VALUE "WEIGHT"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(3) VALUE "OF"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(4) VALUE "ALL"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(12) VALUE "APPLICANTS:"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X.
       05 AVERAGE-WEIGHT               PIC ZZZ9.
       05 FILLER                       PIC X(12) VALUE SPACES.
   01 SUMMARY-LINE-03
       05 FILLER                       PIC X(16) VALUE "NUMBER"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(3) VALUE "OF"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(11) VALUE "BROWN-EYED"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(12) VALUE "APPLICANTS:"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC XX.
       05 BROWN-EYED-APPLICANTS        PIC ZZZ9.
       05 FILLER                       PIC X(12) VALUE SPACES.
   01 SUMMARY-LINE-04
       05 FILLER                       PIC X(16) VALUE "NUMBER"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(3) VALUE "OF"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(5) VALUE "MALE"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(12) VALUE "APPLICANTS:"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(8) VALUE SPACES.
       05 MALE-APPLICANTS              PIC ZZZ9.
       05 FILLER                       PIC X(12) VALUE SPACES.
   01 SUMMARY-LINE-05
       05 FILLER                       PIC X(16) VALUE "NUMBER"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(3) VALUE "OF"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(7) VALUE "FEMALE"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(11) VALUE "APPLICANTS:"
       JUSTIFIED RIGHT.
       05 FILLER                       PIC X(6) VALUE SPACES.
       05 FEMALE-APPLICANTS            PIC ZZZ9.
       05 FILLER                       PIC X(12) VALUE SPACES.
   procedure division.
   100-main.
       OPEN INPUT INPUT-FILE
            OUTPUT OUTPUT-FILE
       PERFORM UNTIL EOF = 'Y'
           READ INPUT-FILE
           AT END MOVE 'Y' TO EOF
           NOT AT END
      PERFORM 200-HEADING.
      PERFORM 200-AVG-HEIGHT.
      PERFORM 200-AVG-WEIGHT.
      PERFORM 200-BROWN-EYED-APPS.
      PERFORM 200-MALE-APPS.
      PERFORM 200-FEMALE-APPS.
      PERFORM 200-MALE-DETAIL-LINE.
      PERFORM 200-FEMALE-DETAIL-LINE.
   CLOSE INPUT-FILE, OUTPUT-FILE.
   STOP RUN.
   200-HEADING.
        WRITE OUTPUT-REC FROM HEADING-1.
           MOVE SPACES TO OUTPUT-REC.
           WRITE OUTPUT-REC.
           WRITE OUTPUT-REC FROM HEADING-2.
           MOVE SPACES TO OUTPUT-REC.
           WRITE OUTPUT-REC.
   200-AVG-HEIGHT.
          IF NOT AT END
          ADD APPLICANTS-HEIGHT TO AVERAGE-HEIGHT
          ELSE AT END
          DIVIDE AVERAGE-HEIGHT BY 21.
          WRITE OUTPUT-REC FROM SUMMARY-LINE-01.
   200-AVG-WEIGHT.
          IF NOT AT END
          ADD APPLICANTS-WEIGHT TO AVERAGE-WEIGHT
          ELSE AT END
          DIVIDE AVERAGE-HEIGHT BY 21.
          WRITE OUTPUT-REC FROM SUMMARY-LINE-02.
   200-BROWN-EYED-APPS.
          IF  APPLICANTS-EYE-CODE = 2
          ADD 1 TO BROWN-EYED-APPLICANTS
          ELSE CONTINUE.
          WRITE OUTPUT-REC FROM SUMMARY-LINE-03.
   200-MALE-APPS.
           IF APPLICANTS-GENDER = M
           ADD 1 TO MALE-APPLICANTS
           ELSE CONTINUE.
           WRITE OUTPUT-REC FROM SUMMARY-LINE-04.
   200-FEMALE-APPS.
           IF APPLICANTS-GENDER = F
           ADD 1 TO FEMALE-APPLICANTS
           ELSE CONTINUE.
           WRITE OUTPUT-REC FROM SUMMARY-LINE-05.
   200-MALE-DETAIL-LINE.
           IF APPLICANTS-HAIR-CODE = 1
           IF APPLICANTS-EYE-CODE = 1
           IF APPLICANTS-GENDER = M
           IF APPLICANTS-HEIGHT >= 72
           IF 185 <= APPLICANTS-WEIGHT <= 200
           ELSE CONTINUE.
           WRITE OUTPUT-REC FROM 01 DETAIL-LINE.
   200-FEMALE-DETAIL-LINE.
           IF APPLICANTS-HAIR-CODE = 2
           IF APPLICANTS-EYE-CODE = 2
           IF APPLICANTS-GENDER = F
           IF 62 <= APPLICANTS-HEIGHT <= 64
           IF 110 <= APPLICANTS-WEIGHT <= 125
           ELSE CONTINUE.
           WRITE OUTPUT-REC FROM 01 DETAIL-LINE.

   end program ELECTRA-MODELING-AGENCY.

1 ответ

Таким образом, у вас есть несколько вещей, которые идут не так, как надо здесь. Позвольте мне подробно описать некоторые из них и дать несколько советов, как их исправить.

Вы используете периоды для завершения операторов, это ужасно и плохо, когда вы смешиваете их с некоторыми более новыми (и под более новыми, я имею в виду только 30-летними) стилями операторов, такими как встроенное выполнение и чтение / в конце / не в конце / конец чтения.

Вместо этого:

  PERFORM UNTIL EOF = 'Y'
      READ INPUT-FILE
      AT END MOVE 'Y' TO EOF
      NOT AT END
  PERFORM 200-HEADING.
  PERFORM 200-AVG-HEIGHT.
  PERFORM 200-AVG-WEIGHT.
  PERFORM 200-BROWN-EYED-APPS.
  PERFORM 200-MALE-APPS.
  PERFORM 200-FEMALE-APPS.
  PERFORM 200-MALE-DETAIL-LINE.
  PERFORM 200-FEMALE-DETAIL-LINE.
  CLOSE INPUT-FILE, OUTPUT-FILE.
  STOP RUN.

Вам нужно что-то вроде этого:

  PERFORM UNTIL EOF = 'Y'    <--- This is better as an 88 level
      READ INPUT-FILE
         AT END MOVE 'Y' TO EOF
         NOT AT END
           PERFORM SOMETHING <--- You need to accumulate you data here
      END-READ
  END-PERFORM

  PERFORM 200-HEADING
  PERFORM 200-AVG-HEIGHT
  PERFORM 200-AVG-WEIGHT
  PERFORM 200-BROWN-EYED-APPS
  PERFORM 200-MALE-APPS
  PERFORM 200-FEMALE-APPS
  PERFORM 200-MALE-DETAIL-LINE
  PERFORM 200-FEMALE-DETAIL-LINE
  CLOSE INPUT-FILE, OUTPUT-FILE
  STOP RUN.                   <--- This is the only period you need
                              <--- In your mainline

Ты не сможешь это сделать:

  200-AVG-HEIGHT.
      IF NOT AT END            <--- NOT AT END and AT END only work
                               <--- in the context of a READ statement
      ADD APPLICANTS-HEIGHT TO AVERAGE-HEIGHT
      ELSE AT END
      DIVIDE AVERAGE-HEIGHT BY 21.
      WRITE OUTPUT-REC FROM SUMMARY-LINE-01.

Пока вы просматриваете файл в цикле, накапливайте общую высоту, добавляя каждого кандидата в APPLICANTS-HEIGHT и добавляя 1 к вашему APPLICANTS-COUNT. Когда вы будете готовы сделать итоговую строку для высоты, сделайте это:

  200-AVG-HEIGHT.
      DIVIDE APPLICANTS-HEIGHT BY APPLICANTS-COUNT
      WRITE OUTPUT-REC FROM SUMMARY-LINE-01
      .       <---- Again, you only need a single period to end a paragraph

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

Так должно происходить с каждой записью:

  200-MALE-DETAIL-LINE.
       IF APPLICANTS-HAIR-CODE = 1
       IF APPLICANTS-EYE-CODE = 1
       IF APPLICANTS-GENDER = M
       IF APPLICANTS-HEIGHT >= 72
       IF 185 <= APPLICANTS-WEIGHT <= 200
       ELSE CONTINUE.   <--- you are doing nothing here
       WRITE OUTPUT-REC FROM 01 DETAIL-LINE.

Лучше написано так:

  200-MALE-DETAIL-LINE.
       IF APPLICANTS-HAIR-CODE = 1
         AND APPLICANTS-EYE-CODE = 1
           AND APPLICANTS-GENDER = M
             AND APPLICANTS-HEIGHT >= 72
               AND (185 <= APPLICANTS-WEIGHT <= 200)
          WRITE OUTPUT-REC FROM 01-DETAIL-LINE
       END-IF

Это должно помочь вам. Вам нужно будет применить эти подсказки ко всем остальным абзацам. Короче говоря, ваша программа должна выглядеть так:

  Open Files
  Perform until EOF
    Read a-record
      not at end
        Perform Do-Detail-Lines
      at end
        Set EOF to true
    End-Read
  End-Perform

  Perform Do-Summary-Lines

  Close files
  Stop Run.

  Do-Detail-Lines.
     ...add up all the things you are averaging and counting...
     ...populate detail line...   
     write output-rec from detail-line
     .

  Do-Summary-Lines.
     ...calculate all averages...
     ...populate summary line...
     write output-red from summary-line
     ...repeat as needed for other summary-lines...
     .

Удачного кодирования:-)

Другие вопросы по тегам