2012-07-14 3 views
0

나는 Monty Hall Problem을 시뮬레이트하는 명령 행 C 프로그램을 작성하고 있지만, 프로그램이 단순히 열 수있는 숫자 문을 입력하라는 메시지를 표시하는 코드의 특정 부분에 문제가있다. 입력을 얻는다. 그것은 유효 확실하게 :이 C 프로그램이 while 루프 후에 작동하지 않는 이유는 무엇입니까?

printf("Please enter the door you would like to choose! (Door 1, 2 or 3)\n\nDoor "); 

char init_input[255]; 

int selection; 
int valid_input = 0; 
while(valid_input == 0) 
{ 
    gets(init_input); 
    int len = strlen(init_input); 
    while(len != 1) 
    { 
     printf("Please choose either door 1, 2 or 3\n\n"); 
     printf("Door "); 
     gets(init_input); 
     len = strlen(init_input); 
    } 
    int valid_input = 0; 
    char input = init_input[0]; 
    switch(input) 
    { 
     case('1'): 
     { 
      selection = 1; 
      valid_input = 1; 
      printf("Door 1\n"); 
      break; 
     } 
     case('2'): 
     { 
      selection = 2; 
      valid_input = 1; 
      printf("Door 2\n"); 
      break; 

     } 
     case('3'): 
     { 
      selection = 3; 
      valid_input = 1; 
      printf("Door 3\n"); 
      break; 


     } 
     default: 
     { 
      printf("\nPlease choose either door 1, 2 or 3\n\nDoor "); 
      break; 
     } 
    } 
} 

printf("\nYou chose Door %d, now I will reveal one of the doors that has a goat behind it:\n\n", selection); 

프로그램은 사용자가 입력 유효한 문 숫자의 때까지 잘 작동 : 1, 2, 3, 그것은 충돌하지 않습니다하지만 잠시 후 원하는 출력을 인쇄하지 않습니다 반복하고 프로그램을 계속 진행하십시오. 그러나 유효한 문구를 입력 할 때 선택된 문의 이름이 인쇄됩니다.이 문구는 switch 문과 관련이 없음을 나타냅니다.

+0

정수를 직접 입력 한 다음 유효성 검사를 수행하는 것이 왜 1,2 또는 3이 아닌지 사용자가 다시 입력하게하지 마십시오. – Rndm

+0

사용자가 정수가 아닌 다른 값을 입력하면 충돌을 일으키지 않도록 프로그램을 바보로 만들려고합니다. – Harry

답변

3

valid_input에서 while 루프 범위 :

int valid_input = 0; 
while (valid_input == 0) { 
    // ... 
    int valid_input = 0;  // remove this 
} 

valid_input 루프에서는 루프 밖에서가 아니라 루프에서 선언 된 루프에서 읽는 중입니다. 따라서 valid_input 루프 검사는 실제로 변경되지 않습니다.

+0

고마워 ... 내가 그걸 놓친 걸 믿을 수 없어! 이제 나는 마침내 프로그램으로 나아갈 수 있습니다 ... – Harry

1

프로그램을 작성하려면 디버거 사용법을 적극적으로 배우는 것이 좋습니다. 대부분의 컴파일러는 요즘 상당히 합리적입니다. 코드를 단계별로 실행하십시오. 어디서 잘못되었는지 판단 할 수 있어야합니다. 그리고 코드에 대한 몇 가지 예기치 않은 것들을 배울 수도 있습니다.

루프가 유효한 문 번호의 주어진 입력을 종료하지 않는 이유를 즉시 알 수 없습니다. 그러나 다시 한 번, 나는 정확히 어디를 가는지 확신 할 수 없습니다.

(BTW, 나는 "Monty Hall problem"테스트 프로그램을 만들었습니다. 사실이고 여기에 이유가 있습니다 : 하나의 문을 밝히면 선택하지 않은 문에 대한 추가 정보가 제공됩니다. 그들은 원래 선택한 문을 밝히지 않을 것이고 그 문에 대해 아무 것도 배우지 않을 것입니다. 전환하면 승산 확률은 1/3 대신 1/2이됩니다.)

+0

필자는 현재 명령 행에서 GCC와 함께 텍스트 편집기를 사용하고 있으며 디버깅 방법을 알고있다. IDE (Visual C++, Netbeans, Codeblocks)를 사용할 때마다 현재 메서드로 컴파일 할 때 존재하지 않는 오류가 발생했습니다. 그래서 IDE를 사용하지 않도록 당분간은 사용하지 않았습니다. 더 큰 프로젝트로 이동하십시오. – Harry

관련 문제