2015-01-20 3 views
1

이전 COBOL을 처음 사용합니다. 온라인 컴파일러에 대한 예제를 찾고 있습니다. 하지만, 내가 사용하고있는 코드는 무한 루프에 들어간다. 코드는 다음과 같습니다cobol 프로그램의 무한 루프

나는 (대략적인 아이디어를) 이해 무엇
IDENTIFICATION DIVISION. 
PROGRAM-ID. Conditions. 

DATA DIVISION. 
WORKING-STORAGE SECTION. 
01 Char    PIC X. 
    88 Vowel   VALUE "a", "e", "i", "o", "u". 
    88 Consonant  VALUE "b", "c", "d", "f", "g", "h" 
          "j" THRU "n", "p" THRU "t", "v" THRU "z". 
    88 Digit   VALUE "0" THRU "9". 
    88 ValidCharacter VALUE "a" THRU "z", "0" THRU "9". 

PROCEDURE DIVISION. 
Begin. 
    DISPLAY "Enter lower case character or digit. No data ends.". 
    ACCEPT Char. 
    PERFORM UNTIL NOT ValidCharacter 
     EVALUATE TRUE 
      WHEN Vowel DISPLAY "The letter " Char " is a vowel." 
      WHEN Consonant DISPLAY "The letter " Char " is a consonant." 
      WHEN Digit DISPLAY Char " is a digit." 
      WHEN OTHER DISPLAY "problems found" 
     END-EVALUATE 
    END-PERFORM. 
    STOP RUN. 

처럼 동안, 가 EVALUATE 때까지 수행한다는 것입니다 스위치같은CASE처럼 될 때 C. 따라서 유효한 문자를 입력 할 때 루프가 깨지지 않아야합니까?

+0

루프 휴식. – bmargulies

답변

6

루프 내에서 아무 것도 변경하지 마십시오. 루프 내에서 유일한 코드는 EVALUATE (데이터 변경 없음)과 DISPLAY 문 (데이터 변경 없음)입니다.

아무 것도 변경하지 않고 루핑하는 것은 무한 루프입니다.

END-EVALUATE 뒤에 두 번째 ACCEPT 문을 포함시켜야합니다.

C에서 동등한 코드를 코딩했다면 무한 루프도있을 것입니다.

+0

즉, COBOL과 달리 while 문에서 getchar() 호출을 코딩 할 수 있고 COBOL에서 ACCEPT는 자체 문이어야합니다. –

+0

@DavidGorsline 예. 그것은 시도되고있는 것일 수 있습니다, 좋은 기회. –

1

빌 우거 (Bill Woodger)가 말했듯이, 당신은 char 값을 변경하지 않았기 때문에 영원히 반복 할 것입니다. 당신이 그 문제를 해결하는 경우

있는 moreso, 프로그램이 여전히 제대로 작동하지 않습니다 : 당신이 그것에 어떤 이상한 논리를 가지고 :

  • 그것은 것입니다 PERFORM 숯불 그것에 유효한 문자를 가지고있다.
  • 그러나 문자가 모음, 자음 또는 숫자가 아닌 경우 EVALUATE을 이스케이프 처리합니다.

    IDENTIFICATION DIVISION. 
    PROGRAM-ID. Conditions. 
    
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 Char    PIC X. 
        88 Vowel   VALUE "a", "e", "i", "o", "u". 
        88 Consonant  VALUE "b", "c", "d", "f", "g", "h" 
              "j" THRU "n", "p" THRU "t", "v" THRU "z". 
        88 Digit   VALUE "0" THRU "9". 
        88 ValidCharacter VALUE "a" THRU "z", "0" THRU "9". 
    
    PROCEDURE DIVISION. 
    Begin. 
        DISPLAY "Enter lower case character or digit. No data ends.". 
        MOVE "a" to Char 
        PERFORM UNTIL NOT ValidCharacter 
         ACCEPT Char 
         EVALUATE TRUE 
          WHEN Vowel DISPLAY "The letter " Char " is a vowel." 
          WHEN Consonant DISPLAY "The letter " Char " is a consonant." 
          WHEN Digit DISPLAY Char " is a digit." 
         END-EVALUATE 
        END-PERFORM. 
        DISPLAY "Non-valid character!" 
        STOP RUN. 
    

    변경 :

    • 내가 PERFORM 내부의 ACCEPT을 넣어

    내 추측이 당신이 그것을 작동을 시도하는 방법입니다.

  • Char와 Char가 잘못된 문자 (공백)로 선언 되었기 때문에. 그래서 나는 MOVE "a" to Char으로 수행 기준을 검증하기 위해 유효한 문자 ("a")를 옮깁니다.
  • 실제로는 OTHER 인 경우 모음, 자손 또는 숫자가 아니기 때문에 WHEN OTHER 행을 없앴습니다. 정확히 PERFORM이 수행하는 작업입니다. Char에 유효하지 않은 문자가있을 때까지 대기합니다.

내 출력 : NOT ValidCharacter에

Enter lower case character or digit. No data ends. 
d 
The letter d is a consonant. 
e 
The letter e is a vowel. 
q 
The letter q is a consonant. 
a 
The letter a is a vowel. 
1 
1 is a digit. 
@ 
Non valid character! 

COBOL STOP RUN at line 218 in program TEST.CBL 
+0

당신이 무슨 말을하는지 잘 모르겠습니다. 루프의 맨 아래에있는 두 번째 ACCEPT를 사용하여 루프 외부에 "초벌 인수 (priming ACCEPT)"를 제안합니다. 루프가 입력 될지 여부를 결정할 때마다 ACCEPT에서 코드가 작동 할 수있는 새 값과 현재 값이 있습니다. –

+0

ACCEPT를 루프의 "맨 위에"놓으면 OTHER 만 문제가됩니다. –

+0

'시험 후 성능'은 어떻습니까? 그러면 Char를 "프라이밍"할 필요가 없습니다. –