我在CSC 101中有一个任务,我必须编写一个程序,其中用户必须想到一个介于1和19之间的数字(包括1和19),并且计算机必须在5次尝试内猜到它。现在,程序会提示我两次输入high或low。
我已经得到了一个使用if语句构建的模板,但我相信switch会工作得更好。我想不出另一种方法来给程序条件来检查我给它的是高还是低。如果用户忘记按空格键或其他什么,我不希望它默认使用错误语句。这就是为什么我又有提示符的原因。
cout << "is this your guess? Answer yes or no:" << guess << endl;
cin >> yesno;
if (yesno != "yes" || "no") {
cout << "Please answer only yes or no" << endl;
cin >> yesno;
}
if (yesno == "no")
{
cout << "Too high or too low? Answer too high or too low" << endl;
cin >> highlow;
if (highlow == "too high")
guess = guess - 5;
if (highlow == "too low")
guess = guess + 5;
if (highlow != "too high" || "too low")
{
cout << "Please anwer only too high or too low" << endl;
cin >> highlow;
}它似乎总是在yes==no块中输入最后一条if语句,并提示我两次输入过高或过低。在我的顶层代码块中,它不会这样做。我希望它只会再问我,如果我没有提前输入“太高”或“太低”,谢谢伙计们,任何帮助都是非常感谢的。
发布于 2019-11-13 02:39:51
cout << "is this your guess? Answer yes or no:" << guess << endl;
cin >> yesno;
if (yesno != "yes" || "no") { // ***Problem here
cout << "Please answer only yes or no" << endl;
cin >> yesno;
}
if (yesno == "no")
{
cout << "Too high or too low? Answer too high or too low" << endl;
cin >> highlow;
if (highlow == "too high")
guess = guess - 5;
if (highlow == "too low")
guess = guess + 5;
if (highlow != "too high" || "too low") // ***Same problem
{
cout << "Please anwer only too high or too low" << endl;
cin >> highlow;
}为了回答你的问题,问题主要存在于这些布尔表达式中。有两个主要问题。在这一行中:
highlow != "too high" || "too low"
你要问的是表达式highlow != "too high为真,OR是表达式"too low"为真。问题来自于第二个问题。逻辑OR的两边都必须是完整的表达式。否则,由于"too low"为非零/非null,因此只会将其计算为true。因此布尔表达式将始终计算为true。
最快的解决方法是更改这些行(注意:在这一点上仍然是无效的):
yesno != "yes" || yesno != "no" // Using || on this line is wrong
highlow != "too high" || highlow != "too low" // || is wrong here第二个问题是您对||的使用。回想一下,对于逻辑OR,只需要一个参数为真,整个事情就为真。因此,请考虑:
yesno != "yes" || yesno != "no"
如果我输入no,那么yesno不等于"yes“是真的。即使我输入了有效的内容,也会得到提示。因此,您当前将有效和无效输入标记为无效。有几种方法可以解决这个问题。最快的方法是将||更改为&&。
yesno != "yes" && yesno != "no"
现在如果我输入no,第一种情况仍然是真的,但是第二种情况是假的。因为逻辑And在任何参数为false时都为false,所以它返回false。这是正确的,因为no是一个有效的输入。另一种方法是避免过于消极的逻辑。
!(yesno == "yes" || yesno == "no")
这只是德摩根定律在上述表达式中的应用(如果您当前的课程没有涵盖逻辑表达式,我假设另一门课程会)。布尔表达式更容易理解,“yesno是我的有效值之一吗?”然后它被否定,因为你要检查输入是否无效。
最后一个问题是当你问“太低”或“太高”的时候。std::cin只读到空格为止。你会想要使用std::getline(std::cin, std::string)来读取它。为了避免mixing std::cin and std::getline带来的麻烦,只需在此任务中始终使用std::getline。
这应该回答了你所问的问题。在你的逻辑中还有其他问题,比如盲目地加或减5。有一种更聪明的方法,可以保证计算机总是在最多5次尝试中猜到你的号码。它涉及到跟踪你的有效范围,并在每次都做出聪明的(呃)猜测。
https://stackoverflow.com/questions/58822877
复制相似问题