나는 단지 몇 가지 논리 진술에 갇혀 있습니다.
특히 함수에있는 char GetInteger()
것이므로 3 개의 값만 루프를 종료하도록 허용하는 방법은 무엇입니까?
char GetInteger( /* out */ char& usrinput)
{
do
{
cin >> usrinput;
cin.ignore(200,'\n');
if (usrinput != 0 || usrinput != 1 || usrinput != 2)
{
cout << "Invalid Input." << userinput << " Try Again\n";
}
} while(usrinput != 0 || usrinput != 1 || usrinput != 2);
return userInput;
}
이 코드의 두 가지 문제 :
먼저 userinput
문자 유형이 있습니다. 따라서 스트림에서 읽을 때 공백을 삭제 한 후 단일 문자를 읽습니다. 따라서 사용자 1<enter>
가 입력하면 변수에 '1'문자가 표시 userinput
됩니다. 문자 '1'
는 숫자와 동일하지 않습니다 1
.
따라서 테스트는 다음과 같아야합니다.
userinput != '1';
둘째, 부울 논리가 잘못되었습니다. 처음 학습 할 때 문제를 받아 들일 수있는 값 목록 (용납 할 수없는 값이 아님)으로 설명하는 것이 더 쉽습니다.
userInput에 허용 된 값 중 하나가 있으면 조건이 false가되기를 원합니다 (좋은 값은 테스트에 실패하므로 잘못된 코드를 호출하지 않습니다). 이에 대한 첫 번째 단계는 값이 유효한 경우 true를 얻는 것입니다.
// If any value is good then true.
userinput == '1' || userinput == '2' || userinput == '3'
이것을 반전하려면 not
표현식 에 a 를 추가하십시오 .
if (! (userinput == '1' || userinput == '2' || userinput == '3') )
참고 : 부울 논리
!(A || B) => (!A && !B)
따라서 위의 내용을 다음과 같이 다시 작성할 수 있습니다.
if (userinput != '1' && userinput != '2' && userinput != '3')
나는 이것이 당신이 변환 된 메인 실수 생각 ==
으로 !=
하지만 변환하지 않았다 ||
로를 &&
.
나는 또한 이것을 범위 기반 테스트로 변환하여 (더 유효한 결과를 얻을 수 있으므로) 이것을 단순화 할 수 있다고 제안합니다.
if (userinput < '1' || userinput > '3')
{
// Test Failed.
}
또한. 두 곳에서 시험이 있기 때문에. 당신은 그것을 자신의 기능으로 끌어 당겨야합니다. 그런 다음 함수를 호출하여 테스트를 수행 할 수 있습니다.
bool isUserInputValid(char userInput)
{
return userInput >= '1' && userInput <= '3';
}
이제 원래 함수를 다음과 같이 다시 작성할 수 있습니다.
char GetInteger( /* out */ char& usrinput)
{
do
{
cin >> usrinput;
cin.ignore(200,'\n');
if (!isUserInputValid(userinput))
{
cout << "Invalid Input." << userinput << " Try Again\n";
}
} while(!isUserInputValid(userinput));
return userInput;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다