这个嵌套的while循环有什么问题吗?

时间:2019-05-04 20:03:26

标签: c++

我想要一个大于7的奇数。但是当我输入66时,嵌套的while循环不会执行,也不会要求重新输入。逻辑有问题吗?

#include <iostream>
using namespace std;

void fuserinput(int);

int main()
{
    int num=0;
    fuserinput(num);
}

void fuserinput(int num)
{
    cout<<"Enter a odd number greater than 7 : ";
    cin>>num;

    while((num<7))
    {
        cout<<"enter number greator than 7 : ";
        cin>>num;
        while(num%2==0)
        {
          cout<<"You have entered even number please reenter : ";
          cin>>num;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您正在尝试保持循环,直到数字大于7并且是奇数,对吧?

如果您输入的数字大于7,则您的第一个循环将永远不会进入。您可以使用do ... while语句使该代码始终至少在循环中输入一个,这样您就可以肯定该代码总是至少一次进入内循环。

#include <iostream>
using namespace std;

void fuserinput(int);

int main()
{
    int num=0;
    fuserinput(num);
}

void fuserinput(int num)
{
    cout<<"Enter a odd number greater than 7 : ";
    cin>>num;

    do {
        cout<<"enter number greator than 7 : ";
        cin>>num;
        while(num%2==0)
        {
          cout<<"You have entered even number please reenter : ";
          cin>>num;
        }
    } while((num<7));
}

希望这会有所帮助

答案 1 :(得分:0)

实际上还有更多内容。您要连续循环,直到收到所需的输入。但是,每次读取时,您都必须测试每个错误状态(eof(), bad(), fail(),并验证输入是否在所需的有效范围内,并且为奇数。

这没有什么困难,但是您必须逐步进行操作,并记住清空未读取的输入缓冲区中保留的所有字符-可能会在下次尝试读取时咬住您。您可以这样做:

#include <limits>
...
void fuserinput (int& num)
{
    num = 0;

    for (;;) {  /* loop continually until valid input received */

        cout << "Enter a odd number greator than 7 : "; /* prompt */

        if (!(cin >> num)) {    /* handle all error states */
            if (cin.eof() || cin.bad()) {   /* eofbit or badbit */
                cerr << "(user canceled or unreconverable error)\n";
                return;
            }
            else if (cin.fail()) {      /* if failbit */
                cerr << "error: invalid input.\n";
                cin.clear();            /* clear failbit */
                /* extract any characters that remain unread */
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
            }
        }
        else {  /* on succesful read */
            /* extract any characters that remain unread */
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            /* validate that num is in range and odd */
            if (num > 7 && num % 2 == 1)
                break;  /* good input break read loop */
            else
                cerr << "error: num <= 7 or not odd.\n"
        }
    }
}

注意,我建议将返回值更改为有意义的类型,例如int,由于您希望使用> 7 plus odd,因此可以返回-1来指示失败。调用函数)

仔细研究一下,如果您有任何疑问,请告诉我。

答案 2 :(得分:0)

在这种情况下,您不应使用嵌套循环。一种方法是这样的:

  • 循环执行:
    • 阅读电话号码
    • 如果该数字小于7,则显示一条消息
    • 否则,如果该数字甚至显示第二条消息
    • 否则退出循环

更好的方法是使用一个验证号码并打印消息的功能。这样,您可以执行以下操作:

do
{
    cin >> num;
} while (!ValidateNumber(num));