Есть ли бесконечная причина l oop в этом коде COBOL? - PullRequest
2 голосов
/ 10 апреля 2020

Я новичок в программировании на языке COBOL, поэтому я попытался создать образец калькулятора, но не смог заставить его работать. Cal c входит в бесконечное l oop, и я не нашел причину, я даже пытался скопировать подобный код и не работал. Итак, это проблема OpenCobolIDE или код?

Код:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. Loops.
   ENVIRONMENT DIVISION.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 WSS-FIRSTOP          PIC S9(05)V9(04).
   77 WSS-SECONDOP         PIC S9(05)V9(04).
   77 WSS-RESULT           PIC S9(10)V9(04).
   77 WSS-OPERATOR         PIC A(01).
   77 WSS-CHOICE           PIC X(01).

   PROCEDURE DIVISION.
   LOOP SECTION.
   PERFORM 0001-STARTCALC UNTIL WSS-CHOICE = 2.

   STOP RUN.
   STARTING SECTION.
   0001-STARTCALC.
       DISPLAY "1.- CALCULATOR, 2.- EXIT".
       DISPLAY "ENTER:", ACCEPT WSS-CHOICE.
       IF WSS-CHOICE = 1
           PERFORM 0002-DATAREQUEST
           PERFORM 0003-OPERATIONS
       ELSE IF WSS-CHOICE = 2
           STOP RUN
       ELSE
           DISPLAY "ERROR. INVALID OPTION.".

   0002-DATAREQUEST.
   CHOICE SECTION.
       DISPLAY "CALCULATOR 1.0".
       DISPLAY "ENTER 1ST OPERATOR:".
       ACCEPT WSS-FIRSTOP.
       DISPLAY "ENTER 2ND OPERATOR".
       ACCEPT WSS-SECONDOP.
       DISPLAY "CHOOSE OPERATION TO PERFORM:".
       DISPLAY "A: ADD, S: SUBTRACT, M: MULTIPLY, D: DIVISION".
       ACCEPT WSS-OPERATOR.

   0003-OPERATIONS.
   OPERATIONS SECTION.
       IF WSS-OPERATOR =                   "A"
           ADD WSS-FIRSTOP TO WSS-SECONDOP GIVING WSS-RESULT
           DISPLAY "ADDITION RESULT: ",    WSS-RESULT
       ELSE IF WSS-OPERATOR =              "S"
           SUBTRACT WSS-FIRSTOP FROM WSS-SECONDOP GIVING WSS-RESULT
           DISPLAY "SUBTRACTING RESULT: ", WSS-RESULT
       ELSE IF WSS-OPERATOR =              "M"
           MULTIPLY WSS-FIRSTOP BY WSS-SECONDOP GIVING WSS-RESULT
           DISPLAY "MULTIPLYING RESULT: ", WSS-RESULT
       ELSE IF WSS-OPERATOR =              "D"
           DIVIDE WSS-SECONDOP INTO WSS-FIRSTOP GIVING WSS-RESULT
           DISPLAY "DIVIDING RESULT: ",    WSS-RESULT
       ELSE
           DISPLAY "INVALID OPERATOR. CHECK".

1 Ответ

2 голосов
/ 10 апреля 2020

Cal c входит в бесконечное число l oop [...], это проблема OpenCobolIDE или это код?

Я думаю, что это оба. Основная причина бесконечного l oop, который может произойти без какого-либо дисплея, очень вероятно, что у OCIDE нет соответствующего терминала. Запуск того же самого на отдельном терминале должен привести, по крайней мере, к экрану + принять, прежде чем вы доберетесь до l oop. Если я правильно помню, в настройках OCIDE есть опции для настройки поведения терминала.

Причина, по которой код "выглядит" как бесконечный l oop, (как упоминал @ bruce-martin) неправильная использование абзацев и разделов. Если вы хотите сохранить оба, вам нужно поместить заголовки разделов перед абзацем, поскольку абзац заканчивается, если либо определен новый абзац, либо определен раздел.

Примечание : Использование разделов и абзацев часто определяется компанией / командой: если это не так (как на любом языке программирования), и вы редактируете существующую программу: используйте все, что делает старый код - для нового кода: делайте, как вам нравится , (Мое личное предпочтение состоит в том, чтобы использовать абзацы только тогда, когда я хочу GOTO их, и всегда использовать EXIT SECTION, чтобы оставить раздел вместо GOTO mysec-end)

Для решения возможных проблем: используйте литералы '1' или цифры c WSS-CHOICE PIC 9 [для терминального ввода-вывода, я бы всегда предпочел alphanumi c + literal]. Как вы уже упоминали, вы смотрите на COBOL в первый раз: обязательно посмотрите EVALUATE WSS-OPERATOR.

...