2013-10-16 2 views
0

수정 됨. 고맙습니다.부울에 따라 do/while 루프를 종료하는 데 문제가 있습니다. - C++

아래의 코드에서는 컴파일 및 실행되지만 do/while 루프가 작동하지 않습니다. 반환 값은 작동하지만 while 루프는이를 인식하지 않아야하며 무기한으로 이동합니다. 나는 진실하고 틀린 반환을받을 수있다. 둘 다 루프를 멈추지 않습니다. 정말로 여기에서 길을 잃었고 대답을 찾을 수 없습니다. 고맙습니다.

//helper function for inputGuess 
//checks if the user's guess is in the lowercase alphabet and that 
// it has not been guessed before 
bool Hangman::validGuess() { 
    //checks if the character guess is in the lowercase alphabet 
    if (guess >= 97 && guess <= 122) { 
    //checks if the user's guess has been guessed previously 
    if (guessed.size() > 0) { 
     for (int i = 0; i < guessed.size(); i++) { 
     cout << "enter for\n"; 
     cout << "guess[i]: " << guessed[i] << endl; 
     if (guess != guessed[i]) { 
      cout << "1st true: guess has not been guessed\n"; 
      return true; 
     } 
     else { 
      cout << "1st false: same letter\n"; 
      return false; 
     } 
     } 
    } 
    else { 
     cout << "2nd true: guessed size is 0\n"; 
     return true; 
    } 
    } 
    else { 
    cout << "2nd false: not alphabet\n"; 
    return false; 
    } 
} 

//gets input for guess, checks if guess is valid, adds guess to guessed 
void Hangman::inputGuess() { 
    bool valid = false; 
    do { 
    cout << "Please enter your guess: "; 
    cin >> guess; 
    cout << endl; 
    valid = validGuess(); 
    cout << "valid: " << valid << endl; 
    } while (valid == false); 
    guessed.push_back(guess); 
} 
+0

실행중인 시스템이 ASCII를 사용한다고 가정 할 수는 없습니다. 그렇게해도 "97"보다 훨씬 명확합니다. "islower"기능도 있습니다. – chris

+0

당신이 보여준 코드는 그 자체로 문제가 아니지만 또한 완벽하지는 않습니다. 나는 다른 외부 루프가 있다고 생각할 것이고이 외부 루프에 갇혀있다. 나머지 코드를 추가하십시오 (지나치게 많지 않은 경우). –

+0

코드가 컴파일되지 않아야합니다 ('추측은'validGuess()'에 선언되지 않습니다), 어떻게하면 그 코드를 실행시킬 수 있었습니까 ??? – Walter

답변

0

guessed이 비어있을 때 정의되지 않은 반품 케이스가 있습니다. 기본값은 반환되지 않으므로 값이 비어 있습니다.

관계없이이 코드는 지나치게 복잡해 보입니다. 이 같은 것이 더 좋을 수도 있습니다.

bool HangMan::validGuess() { 
    //checks if the character guess is in the lowercase alphabet 
    if (isalpha(guess)) { 
     //checks if the user's guess has been guessed previously 
     if (find(guessed.begin(), guessed.end(), guess) != guessed.end()) { 
      cout << "1st false: same letter\n"; 
      return false; 
     } 
     else { 
      cout << "1st true: guess has not been guessed\n"; 
      return true; 
     } 
    } else { 
     cout << "2nd false: not alphabet\n"; 
     return false; 
    } 
} 
1

당신은 당신의 문제인 validGuess()에 대한 매개 변수로 추측을 전달해야합니다. 추가하려고 시도하는 대신

this->guess 

을 입력하십시오.

+0

그것은'inputGuess()'에도 정의되어 있지 않기 때문에 전역 변수처럼 보입니다. –

+0

@Daniel : 나는 반원을 추측 하겠지만 그렇다고 나는 그 범위가 어느 한 기능보다 크다는 것에 동의한다.이 "대답"은 문체가 개선 될 수는 있지만 문제를 해결하지는 못할 것이다. –

+0

예, 알겠습니다. 아직도. 그는 그것을 "해야"합니다. 우리는 클래스의 나머지 부분을 볼 필요가 있습니다. 인스턴스의 문제 일 수도 있습니다. 함수가 정적 인 경우 등입니다. 클래스 var 인 경우 범위 해상도를 추가하십시오. – AwokeKnowing

관련 문제