Программа COBOL не закончится

В настоящее время я пишу программу на языке COBOL с экраном, который проверяет и отображает запись из файла. Тем не менее, программа застревает, когда я пытаюсь ввести команду, отличную от "F" или "Q". Хотя предполагается отображение нового экрана с сообщением об ошибке. Сообщение об ошибке, которое я пытаюсь вызвать, это "<>"

Identification Division.
   Program-ID.      Lab10b.

   Environment Division.
   Input-Output Section.
   File-Control.
       Select InFile Assign to "Lab10b-master.dat"
       Organization is Indexed
       Access Mode is Random
       Record Key is Movie-Key
       Status is FileStatus.

   Data Division.
   File Section.
   FD  InFile.
   01  Movie.
       05  Movie-Key       Pic 9(5).
       05  Movie-Title     Pic X(50).
       05  Movie-Genre     Pic X(20).

   Working-Storage Section.
   01  black   constant as 0.
   01  blue    constant as 1.
   01  green   constant as 2.
   01  cyan    constant as 3.
   01  red     constant as 4.
   01  magenta constant as 5.
   01  brown   constant as 6.
   01  white   constant as 7.
   01  Today-Date.
       05 YYYY                Pic 9(4).
       05 MM                  Pic 9(2).
       05 DD                  Pic 9(2).
   01  FileStatus             Pic 99.
   01  Error-Message          Pic X(50).
   01  Res1.
       05 a                   Pic X.
       05 b                   Pic X.
       05 c                   Pic X.
       05 d                   Pic X.
       05 e                   Pic X.
   01  Res2                   Pic X.
       88 Quit       Value "Q" "q".
       88 Find       Value "F" "f".

   Screen Section.
   01  data-screen.
       05 screen-header.
          10 PH-Month Blank Screen Line 01 Col 01 Pic Z9/ From MM.
          10 PH-Day Line 01 Col 04 Pic 99/ From DD.
          10 PH-Year Line 01 Col 07 Pic 9999 From YYYY.
          10 Value "Stomper & Wombat's Movie Warehouse"
             Line 01 Col 40.
       05 screen-data.
          10 Value "Movie #:      " Line 05 Col 9.
          10 Movie-Number-Out Line 05 Col 24
             Pic 9(5) from Movie-Key Blank When Zero.
          10 Value "Title:         " Line 06 Col 9.
          10 Movie-Title-Out Line 06 Col 24
             Pic X(50) From Movie-Title.
          10 Value "Genre:         " Line 07 Col 9.
          10 Movie-Genre-Out Line 07 Col 24
             Pic X(50) From Movie-Genre.
       05 Error-Message-Out Line 11 Col 15 Pic X(50)
          From Error-Message foreground-color red.
       05 screen-response.
          10 Value "Key:           [" Line 13 Col 9.
          10 Key-Response Line 13 Col 25 Pic X(5) to Res1.
          10 Value "]" Line 13 Col 30.
       05 screen-response2.
          10 Value "Command:       [" Line 14 Col 9.
          10 Command-response Line 14 Col 25 Pic X to Res2.
          10 Value "]" Line 14 Col 26.


   Procedure Division.
   000-Main.
       Accept Today-Date From Date YYYYMMDD
       Move YYYY To PH-Year
       Move MM To PH-Month
       Move DD To PH-Day

       Open Input InFile
       Move " " to Error-Message
       Display data-screen
       Accept screen-response2
       If Res2 = "F" Or "f"
          Accept screen-response
       End-If

       Perform Until res2 = "q" or "Q"
          Move " " to Error-Message
          If res2 <> "Q" And "q" and "f" and "F" *> If Command Response is not valid, Write this error message.
             Move "<<Command Invalid>>" to Error-Message
          Else if res2 = "f" Or "F" *> If command = find
             If a = " " And b = " " And c = " " And d = " "
             And e = " " *> Check if key is empty
                Move "<<Key Must Be Provided>>" to Error-Message
                Move " " to Movie
             Else If (a = " " Or b = " " Or c = " " Or d = " "
             Or e = " ") Or res1 is not numeric *> Check if key is numeric and complete?
                Move "<<Invalid Key>>" to Error-Message
                Move " " to Movie
             Else
                Move res1 to Movie-Key
                Read InFile
                Evaluate FileStatus
                   When 00
                      Continue
                   When 23
                      Move " " to Movie
                      Move "<<Key Not Found>>" to Error-Message
                   When Other
                      Move "<<Unknown Read Error>>" to Error-Message
                End-Evaluate
             End-If
          Else
             Continue
          End-If

          Display data-screen
          Accept screen-response2
          If Res2 = "F" Or "f"
             Accept screen-response
          End-If
       End-Perform

       Close InFile
       Stop Run.

1 ответ

Возможно, это может быть проще для чтения и отладки:

01   Perform Until res2 = "q" or "Q"
02      Move " " to Error-Message
03      If res2 <> "Q" And "q" and "f" and "F" 
04         Move "<<Command Invalid>>"                 to Error-Message
05      Else
06         if res2 = "f" Or "F" 
07            If a = " " And b = " " And c = " " And d = " " And
08               e = " " *> Check if key is empty
09               Move "<<Key Must Be Provided>>"      to Error-Message
10               Move " "                             to Movie
11            Else
12               If (a = " " Or b = " " Or c = " " Or d = " "
13                   Or e = " ") Or res1 is not numeric
14                  Move "<<Invalid Key>>"            to Error-Message
15                  Move " "                          to Movie
16               Else
17                  Move res1                         to Movie-Key
18                  Read InFile
19                  Evaluate FileStatus
20                    When 00
21                      Continue
22                    When 23
23                      Move " "                      to Movie
24                      Move "<<Key Not Found>>"      to Error-Message
25                    When Other
26                      Move "<<Unknown Read Error>>" to Error-Message
27                  End-Evaluate
28               End-If
29         Else
30            Continue
31         End-If
32
33      Display data-screen
34      Accept screen-response2
35      If Res2 = "F" Or "f"
36         Accept screen-response
37      End-If
38   End-Perform

(Я добавил номера строк для удобства.)

Вот что происходит: вам не хватает конца, если где-то там.

Скорее всего, вам не хватает одного после строки 28, но это не проблема. Потому что у вас уже был else (в строке 11) для if в строке 7 else прекратит if из строки 7 и примените к одному в строке 6.

Я верю, что ты скучаешь по другому end-if после строки 31. В настоящее время происходит следующее: если вы вводите что-то отличное от Q и F, move в строке 4, а затем пропускает все между else в строке 5 и когда if прекращено. Потому что вам не хватает end-if после строки 31 все пропускается до end-perform на линии 38.

Небольшое пояснение: причина, по которой он входит в бесконечный цикл, если вы вводите что-то отличное от Q или F, в том, что он пропускает accept на линии 34 и, таким образом, у вас нет возможности ввести что-либо еще. И потому что ваше выступление продолжается до res2 = "q" or "Q"что это явно не так, он будет продолжать цикл навсегда.

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

Кроме того, я заметил, что у вас есть 88 уровней, определенных для Quit и Find, но вы не используете их. Они сделают ваш код намного более читабельным. И тесты с a = " " и т.д. в строках 7 и 8 может быть упрощено с помощью if res1 = spaces (при условии, что OpenCOBOL работает так, как должен; я не использовал его.)

Надеюсь это поможет.

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