Еще один вопрос COBOL снова. Мне нужно создать программу COBOL, которая будет считывать три поля записи, а именно: номер учащегося, имя учащегося и ключ пола из входного файла. Затем я должен разделить студентов мужского и женского пола на два отдельных файла. Я создал функцию ввода, а затем сохранил ее в файле DAT, и этот файл DAT будет прочитан и вернет другой файл DAT, содержащий студентов мужского и женского пола. Я не проверял, будет ли программа действительно работать, потому что я столкнулся с этой ошибкой:
exercise1.cob:69: error: group item 'STUD-NAME-OUT' cannot have PICTURE clause
Строка 69 в этой задаче 02 STUD-NAME-OUT PIC X(25).
в этом элементе группы:
01 OUT-PRINT-REC.
02 FILLER PIC X(19) VALUE SPACES.
02 STUD-NO-OUT PIC X(10).
02 FILLER PIC X(23) VALUE SPACES.
02 STUD-NAME-OUT PIC X(25).
Я проверил другое переполнение стека, которое является этим, и проверил проблему пользователя в этом вопросе и в этом вопросе, по-видимому, я думаю, что сделал это правильно, но я не был уверен, почему этот конкретный элемент группы OUT-PRINT-REC
не работает .
И вот основной код:
IDENTIFICATION DIVISION.
PROGRAM-ID. exercise-one.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT-IN ASSIGN TO "BSIT21.DAT".
SELECT STUDENT-DATA ASSIGN TO "BSIT21.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT BSITMALE ASSIGN TO "BSITMALE.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
* SELECT BSITFEM ASSIGN TO "BSITFEM.DAT"
* ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD STUDENT-IN.
01 PRINT-REC PIC X(80).
FD STUDENT-DATA.
01 STUD-REC.
02 OUT-STUD-NO PIC X(10).
02 OUT-STUD-NAME PIC X(25).
02 OUT-STUD-GEND-IN-KEY PIC 9.
FD BSITMALE.
01 PRINT-MALE-REC PIC X(80).
* FD BSITFEM.
* 01 PRINT-FEMALE-REC PIC X(80).
WORKING-STORAGE SECTION.
* -----------------------------
01 PRINT-LINE.
02 STUD-NO-IN PIC X(10).
02 STUD-NAME-IN PIC X(25).
02 STUD-GEND-IN PIC 9.
01 ANS PIC X VALUE 'Y'.
88 NO-MORE-DATA VALUE 'N'.
88 MORE-DATA VALUE 'Y'.
01 L PIC 9.
01 STUD-NO PIC X(10).
01 STUD-NAME PIC X(25).
01 STUD-GEND-KEY PIC 9.
* -----------------------------
01 HDG-1.
02 FILLER PIC X(20) VALUE SPACES.
02 FILLER PIC X(22) VALUE "xxxxxxxxxxx University".
02 FILLER PIC X(19) VALUE " of the xxxxxxxxxxx".
01 HDG-2.
02 FILLER PIC X(32) VALUE SPACES.
02 FILLER PIC X(18) VALUE "xxxxxx xxxx xxxxx".
01 HDG-MALE.
02 FILLER PIC X(23) VALUE SPACES.
02 FILLER PIC X(21) VALUE "List of Male Students".
02 FILLER PIC X(14) VALUE " from xxx 4-1".
01 HDG-FEMALE.
02 FILLER PIC X(23) VALUE SPACES.
02 FILLER PIC X(23) VALUE "List of Female Students".
02 FILLER PIC X(14) VALUE " from xxxx 2-1".
01 HDG-4.
02 FILLER PIC X(19) VALUE SPACES.
02 FILLER PIC X(14) VALUE "STUDENT NUMBER".
02 FILLER PIC X(18) VALUE SPACES.
02 FILLER PIC X(12) VALUE "STUDENT NAME".
01 OUT-PRINT-REC.
02 FILLER PIC X(19) VALUE SPACES.
02 STUD-NO-OUT PIC X(10).
02 FILLER PIC X(23) VALUE SPACES.
02 STUD-NAME-OUT PIC X(25).
05 E-O-F PIC XXX VALUE "NO".
SCREEN SECTION.
01 BSCRN.
02 BLANK SCREEN.
* --------------------------------------
PROCEDURE DIVISION.
OPEN OUTPUT STUDENT-IN.
PERFORM INPUT-RTN UNTIL MORE-DATA.
PERFORM PRINT-MALE-RTN.
PERFORM CLOSE-RTN.
* --------------------------------------------
INPUT-RTN.
DISPLAY BSCRN.
MOVE 5 TO L.
DISPLAY "ENTER STUDENT NUMBER: " LINE L COLUMN 5.
ACCEPT STUD-NO LINE L COLUMN 35.
ADD 1 TO L.
DISPLAY "ENTER STUDENT NAME: " LINE L COLUMN 5.
ACCEPT STUD-NAME LINE L COLUMN 35.
ADD 1 TO L.
DISPLAY "MALE = 1 / FEMALE = 2" LINE L COLUMN 5.
ADD 1 TO L.
DISPLAY "ENTER STUDENT GENDER KEY: " LINE L COLUMN 5.
ACCEPT STUD-GEND-KEY LINE L COLUMN 35.
ADD 2 TO L.
MOVE STUD-NO TO STUD-NO-IN.
MOVE STUD-NAME TO STUD-NAME-IN.
MOVE STUD-GEND-KEY TO STUD-GEND-IN.
WRITE PRINT-REC FROM PRINT-LINE BEFORE 1 LINE.
DISPLAY "ENTER ANOTHER RECORD(Y/N)" LINE L COLUMN 30.
ACCEPT ANS.
* --------------------------------------------
PRINT-MALE-RTN.
WRITE PRINT-MALE-REC FROM HDG-1 BEFORE 1 LINE.
WRITE PRINT-MALE-REC FROM HDG-2 AFTER 1 LINE.
WRITE PRINT-MALE-REC FROM HDG-MALE AFTER 2 LINES.
WRITE PRINT-MALE-REC FROM HDG-4 AFTER 2 LINES.
MOVE SPACES TO PRINT-MALE-REC.
WRITE PRINT-MALE-REC AFTER 1 LINE.
PERFORM MALE-READ-RTN UNTIL E-O-F = "YES".
MALE-READ-RTN.
READ STUDENT-DATA AT END MOVE "YES" TO E-O-F.
IF OUT-STUD-GEND-IN-KEY = 1
MOVE OUT-STUD-NO TO STUD-NO-OUT.
MOVE OUT-STUD-NAME TO STUD-NAME-OUT.
WRITE PRINT-MALE-REC FROM OUT-PRINT-REC AFTER 1 LINE.
* --------------------------------------------
CLOSE-RTN.
CLOSE STUDENT-IN.
STOP RUN.
Ожидаемый результат:
xxxxxxxxxxx UNIVERSITY OF THE xxxxxxxxxxx
xxxxxx xxxx xxxxxx
List of Male Students from xxxx 4-1
STUDENT NUMBER STUDENT NAME
00-123345 Leon Paulus
00-123456 John Walker
Я также не писал код, так как хочу проверить, будет ли он выдавать правильный ответ при вводе данных, но я думаю, что эта ошибка не дает мне сделать следующий шаг.
Кроме того, то, как я назвал все свои переменные, кажется немного запутанным, но я разберусь с этим позже, и извините за это.
Следующий пункт
05 E-O-F
.05
заставляет компилятор рассматриватьSTUD-NAME-OUT
как групповой элемент. Замените05
на01
.