我在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/

10-11 02:29