我在CSC 101中有一个作业,我必须编写一个程序,使用户必须想到一个介于1和19之间的数字,并且计算机必须在5次尝试中猜出它。现在,程序提示我两次输入高或低。
我已经获得了使用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语句,它提示我两次输入太高或太低。它不在我的最爱。我希望它只会再问我一次,如果我没有输入“太高”或“太低”,谢谢您。
最佳答案
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
为真,还是表达式"too low"
为真。问题来自第二个问题。逻辑或的两端必须是完整的表达式。否则,正在发生的事情是"too low"
仅被评估为true,因为它不是零/非空。因此,布尔表达式将始终为true。最快的解决方法是更改这些行(注意:这时仍然中断):
yesno != "yes" || yesno != "no" // Using || on this line is wrong
highlow != "too high" || highlow != "too low" // || is wrong here
第二个问题是您使用
||
。回想一下,对于逻辑或,只有一个参数需要为真,整个情况才为真。因此请考虑:yesno != "yes" || yesno != "no"
如果键入
no
,则yesno
不等于“是”是正确的。即使我这样做,也会提示我输入有效的内容。因此,您当前正在将有效和无效输入标记为无效。有两种方法可以解决此问题。最快的是将||
更改为&&
。yesno != "yes" && yesno != "no"
现在,如果键入
no
,则第一种情况仍然为true,但是第二种情况为false。并且由于如果任何参数为false,则逻辑AND为false,因此它返回false。这是正确的,因为no
是有效输入。另一种方法是避免过于消极的逻辑。!(yesno == "yes" || yesno == "no")
这只是DeMorgan法则对上述表达式的一种应用(如果您当前的课程没有涵盖逻辑表达式,那么我假设另一门课程可以)。布尔表达式更容易理解,“
yesno
是我的有效值之一吗?”然后取反,因为您要检查输入是否无效。最后一个问题是当您询问“太低”或“太高”时。
std::cin
只能读取,直到到达空白为止。您将要使用std::getline(std::cin, std::string)
进行阅读。为避免mixing std::cin
and std::getline
带来的麻烦,只需始终使用std::getline
进行此分配。那应该可以回答您所问的问题。您的逻辑中还有其他问题,例如盲目地加或减5。有一种更聪明的方法可以保证计算机在最多5次尝试中始终能猜出您的号码。它涉及跟踪您的有效范围并每次都做出更明智的猜测。
关于c++ - 高低猜猜游戏-计算机猜c++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58822877/