While循环创建了无限循环

3

我正在为一门C++课程创建一个程序,我创建了一个while循环来防止无效输入。每次我尝试使用一个无效输入进行测试时,它都会陷入无限循环中。由于我是编程新手,所以我真的不知道该如何解决这个问题。

 cout << "Enter weight in ounces (Max: 1800)" << endl;
    cin >> pkgweight;

    while (pkgweight > 0 || pkgweight < 1800)
    {
        cout << "Weight out of range. Program terminating.\n" << endl;
    }

    cout << "Enter miles shipping (Max: 3500)" << endl;
    cin >> distance;

    while (distance > 0 || distance < 3500)
    {
        cout << "Shipping distance out of range." << endl;
        cout << "Program terminating.\n" << endl;
    }

6
仔细看一下条件语句 while(pkgweight > 0 || pkgweight < 1800), 然后询问是否有可能的 pkgweight 值会使它变为 false。然后,在你修复之后,问问自己如果在 while 循环体内从未给 pkgweight 赋新值,它如何从 true 变为 false - Nathan Pierson
1
为什么这些是while循环而不是if条件?“程序终止”应该跟随类似于std::terminate()的内容。 - John Zwinck
谢谢大家!我本来也要自己寻找终止代码,感谢你们试图向我解释 :) - Jessica Alvarado
3个回答

2
如果在循环内部没有任何变化,退出条件将永远不会触发。
也许你的意思是:
int pkgweight = 0;

cout << "Enter weight in ounces (Max: 1800)" << endl;
cin >> pkgweight;

if (pkgweight < 0 || pkgweight > 1800)
{
  cout << "Weight out of range. Program terminating.\n" << endl;
}

当你想要循环直到满足某个条件时,应该使用while。而if就像一个不需要循环的while

虽然你正在学习并且犯错误是可以理解的,但如果在这个基本问题上出错通常意味着你没有一个好的参考资料。获取一本可靠的C++参考书,如果你遇到了困难就经常查阅它。这对于学习是至关重要的,不只是零散地记忆一些片段并试图推测其中的空缺。许多C++的部分都很难理解,因为它们是几十年前设计决策和其他编程语言影响的产物,而这些语言你从未听说过。你需要一个扎实的基础。


感谢您的输入!从我的教授提供的截图来看,似乎他不想在错误消息后添加其他输入,所以我没有添加。我没有意识到由于while循环的性质,它会在没有输入更正的情况下产生无限循环。我一定会查阅参考书的 :) - Jessica Alvarado

1
如果您希望用户能够修正错误输入,您需要:
 cout << "Enter weight in ounces (Max: 1800)" << endl;
 cin >> pkgweight;

 while (pkgweight > 0 || pkgweight < 1800)
 {
     cout << "Weight out of range. Program terminating.\n" << endl;
     cout << "Enter weight in ounces (Max: 1800)" << endl;
     cin >> pkgweight;
 }

如果用户输入的数字超过有效范围,他们将被提示输入新数字。如果新值在范围内,循环将退出。
你当前程序的问题是while循环会在它检查的条件为true时执行。在你的当前程序中,一旦pkgweight被设置,它就保持相同的值。这意味着,如果循环因为它检查的条件为true而被进入,那么条件将永远不会改变(允许循环退出),并且你的错误消息将无限期地打印。

1
我的教授不想要输入纠正,所以我才遇到了问题。感谢您的帮助! - Jessica Alvarado

0
看了你的代码,似乎你想在输入错误时终止程序。你可以考虑终止函数。这是在main()中吗?如果不是在外部函数中,只需执行return -1。我知道这可能是不好的编程实践,但嘿,它特别适用于这个问题!
顺便说一下,你的条件语句中写的是> 0< 1800,这意味着如果变量distance和pkgweight在指定范围内,程序将会终止。
这是我的工作示例,没有这些错误,在onlineGDB上测试过。
 #include <iostream>
 using namespace std;
 int main ()
 {
    int pkgweight, distance;
    cout << "Enter weight in ounces (Max: 1800)" << endl;
    cin >> pkgweight;

    while (pkgweight < 0 || pkgweight > 1800)
    {
        cout << "Weight out of range. Program terminating.\n" << endl;
        return -1;
    }

    cout << "Enter miles shipping (Max: 3500)" << endl;
    cin >> distance;

    while (distance < 0 || distance > 3500)
    {
        cout << "Shipping distance out of range." << endl;
        cout << "Program terminating.\n" << endl;
        return -1;
    }
    return 0;
}

当然,你也可以将小于号和大于号交换位置,或者将条件语句放在not运算符中。


将条件语句用非运算符包装起来是不正确的。pkgweight > 0 || pkgweight < 1800 等同于 true。在这里,while(false) 实际上并不比 while(true) 更好。 - Nathan Pierson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接