У меня проблемы с таблицами с использованием Cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. MP4-5.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SEAT-DESCRIPTION.
03 FILLER PIC X(50) VALUE "01 DRIVER".
03 FILLER PIC X(50) VALUE "02 DRIVER'S ASST".
03 FILLER PIC X(50) VALUE "03".
03 FILLER PIC X(50) VALUE "04".
03 FILLER PIC X(50) VALUE "05".
03 FILLER PIC X(50) VALUE "06".
03 FILLER PIC X(50) VALUE "07".
03 FILLER PIC X(50) VALUE "08".
03 FILLER PIC X(50) VALUE "09".
03 FILLER PIC X(50) VALUE "10".
03 FILLER PIC X(50) VALUE "11".
03 FILLER PIC X(50) VALUE "12".
03 FILLER PIC X(50) VALUE "13".
03 FILLER PIC X(50) VALUE "14".
03 FILLER PIC X(50) VALUE "15".
01 MAIN-MENU PIC X.
88 RESERVATION VALUE "R".
88 VIEW-RESERVATION VALUE "V".
88 CANCEL-RESERVATION VALUE "D".
88 EXIT-PROC VALUE "E".
01 DECISION PIC X.
88 YES VALUE "Y".
88 NAY VALUE "N".
01 SEAT-NUM PIC 9(2).
01 CUST-NAME PIC X(18).
01 CUST-CNTCT PIC 9(11).
01 CHOICE PIC X.
PROCEDURE DIVISION.
MAIN-ROUTINE.
DISPLAY " ABC TRANSPORT COMPANY".
DISPLAY "__________________________________________".
DISPLAY " [R] ADD RESERVATION/S ".
DISPLAY " [V] VIEW RESERVATION/S ".
DISPLAY " [D] CANCEL RESERVATION/S ".
DISPLAY " [E] EXIT".
DISPLAY " ENTER CHOICE: " WITH NO ADVANCING.
ACCEPT MAIN-MENU.
PERFORM I-CHAIN.
I-CHAIN.
IF RESERVATION
GO TO RESERVE-PROC
ELSE IF VIEW-RESERVATION
GO TO VRESERVE-PROC
ELSE IF CANCEL-RESERVATION
GO TO CRESERVE-PROC
ELSE IF EXIT-PROC
GO TO END-PGM
ELSE
DISPLAY "INVALID OPTION"
GO TO MAIN-ROUTINE.
RESERVE-PROC.
DISPLAY "RESERVE SEAT #: "WITH NO ADVANCING.
ACCEPT SEAT-NUM.
IF SEAT-NUM IS NUMERIC
IF SEAT-NUM >2 AND SEAT-NUM <16
GO TO CONT-RES
ELSE
DISPLAY "INVALID OPTION"
PERFORM RESERVE-PROC
ELSE
DISPLAY "ENTER A NUMERIC VALUE"
GO TO RESERVE-PROC.
CONT-RES.
DISPLAY "CUSTOMER NAME : "WITH NO ADVANCING.
ACCEPT CUST-NAME.
MOVE CUST-NAME TO SEAT-NUM.
DISPLAY "CUSTOMER CONTACT #: "WITH NO ADVANCING.
ACCEPT CUST-CNTCT.
MOVE CUST-CNTCT TO SEAT-NUM.
GO TO RESER-CONT.
RESER-CONT.
DISPLAY "RESERVE MORE? [Y/N]? "WITH NO ADVANCING.
ACCEPT DECISION.
IF YES
PERFORM RESERVE-PROC
ELSE IF NAY
PERFORM MAIN-ROUTINE
ELSE
DISPLAY "INVALID OPTION"
PERFORM RESER-CONT.
VRESERVE-PROC.
DISPLAY " ABC TRANSPORT COMPANY".
DISPLAY " RESERVATION LIST".
DISPLAY "__________________________________________".
DISPLAY " "SEAT-DESCRIPTION.
CRESERVE-PROC.
DISPLAY " ABC TRANSPORT COMPANY".
DISPLAY " CANCEL RESERVATION".
DISPLAY "__________________________________________".
END-PGM.
STOP RUN.
Я знаю, что код еще не завершен, но могу ли я получить некоторую помощь о том, как использовать таблицы, потому что мне трудно пытаться отобразить то, что я хочу добавить к моей переменной SEAT-NUM, и любые советы по удалению строки 1 с помощью 1 было бы полезно
2 ответа
Для начала вам нужно что-то вроде
01 SEAT-DESCRIPTION-REDEF REDEFINES SEAT-DESCRIPTION.
03 SEAT-NUMBER-DATA OCCURS 15.
05 SEAT-NUMBER-TEXT PIC X(02).
05 FILLER PIC X(04).
05 SEAT-FILLED-BY PIC X(44).
Теперь вы можете присвоить значение SEAT-FILLED-BY(SEAT-NUM)
назначить имя для места.
Непонятно чем вы занимаетесь CUST-CNTCT
но небольшая корректировка:
01 SEAT-DESCRIPTION-REDEF REDEFINES SEAT-DESCRIPTION.
03 SEAT-NUMBER-DATA OCCURS 15.
05 SEAT-NUMBER-TEXT PIC X(02).
05 FILLER PIC X(04).
05 SEAT-FILLED-BY PIC X(32).
05 FILLER PIC X(01).
05 SEAT-CONTACT PIC X(11).
и теперь вы можете MOVE CUST-CNTCT TO SEAT-CONTACT(SEAT-NUM).
что, вероятно, близко к тому, что вы хотите сделать.
А теперь немного рекламы о структуре.
ESCHEW GO TO.
НИКОГДА не нужно использовать GO TO. Всегда
PERFORM paragraphname [UNTIL condition].
Это непростая дисциплина, пока вы не привыкнете к ней - и вы привыкнете к ней, когда у вас будут кошмары со спагетти-кодом; Идите повсюду и выполняйте меня, используя рекурсивный код.
И если кто-то когда-либо упоминает " ВЫПОЛНЯТЬ ЧЕРЕЗ", просто улыбнитесь, кивните и игнорируйте все, что он должен сказать. Они являются воплощением зла, потому что они защищают код, зависящий от макета.
Мы используем THROUGH
в нашем магазине, но для одной цели. Мы помечаем каждый параграф именем и закрываем этот абзац этим именем с "-"EXIT"в конце.
Затем, когда мы вызываем этот абзац, мы называем его, используя синтаксис
"PERFORM L2-SUB-PARAGRAPH
THROUGH L2-SUB-PARAPGRAPH-EXIT.
Это дает коду более объектно-ориентированный вид и делает абзацы более модульными.
Или, если вы хотите перебрать абзац, вы можете написать его так:
`PERFORM -L2-LOOPING-PARA'
'THROUGH L2-LOOPING-PARA-EXIT'
'VARYING INDEX1 FROM 1 BY 1.... `