【问题标题】:While loop creating infinite loopWhile循环创建无限循环
【发布时间】:2021-02-20 08:03:21
【问题描述】:

所以我正在为 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;
    }

【问题讨论】:

  • 仔细查看while(pkgweight &gt; 0 || pkgweight &lt; 1800) 的条件,并询问pkgweight 是否有任何可能的值可以使false 成为可能。然后,在你修复它之后,问问自己如果你从未在 while 循环的主体期间为 pkgweight 分配新值,它会如何从 true更改false
  • 为什么这些while 循环而不是if 条件? “程序终止”后面应该跟 std::terminate() 之类的东西。
  • 谢谢你们!我自己也打算寻找终止代码,感谢您尝试向我解释它:)

标签: c++ while-loop infinite-loop


【解决方案1】:

如果该循环内没有任何变化,则退出条件将永远不会被触发。

也许你的意思是:

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++ reference book,如果你对某事感到困惑,请经常参考它。这对于正确学习是必不可少的,而不仅仅是在这里和那里捡起零碎的东西并试图凭直觉找出差距。 C++ 的许多部分没有意义,它们是几十年前设计决策的产物,以及您从未听说过的其他编程语言的影响。你需要一个合适的基础。

【讨论】:

  • 感谢您的意见!从我的教授提供的屏幕截图来看,他似乎不想在错误消息之后添加额外的输入,所以我没有添加它。我没有意识到由于 while 循环的性质,它会在没有输入校正的情况下产生无限循环。我肯定也会看看参考书:)
【解决方案2】:

如果您希望用户能够修复错误输入的内容,您会希望:

 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 循环将执行“while”它检查的条件是true。在您当前的程序中,一旦设置了pkgweight,它就会保持相同的值。这意味着如果进入循环是因为它检查的条件是true,那么该条件将永远不会改变(允许循环退出),并且您的错误消息将被无限期地打印出来。

【讨论】:

  • 我的教授不希望输入更正,这就是我遇到问题的原因。感谢您的帮助!
【解决方案3】:

查看您的代码,如果输入错误,您似乎想终止程序。您可以考虑终止该功能。这一切都在main() 中吗?如果它不在外部函数中,只需执行return -1。我知道这可能是不好的编程习惯,但是,嘿,它专门为此工作!
顺便说一句,您的条件是 &gt; 0&lt; 1800,这意味着程序将终止 如果变量 distance 和 pkgweight 在指定范围内。
这是我的工作 sn-p 没有这些错误,在 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 &gt; 0 || pkgweight &lt; 1800 等价于 truewhile(false) 实际上并不比 while(true) 这里好。
猜你喜欢
  • 2015-06-25
  • 2014-03-29
  • 2012-12-24
  • 2013-02-22
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多