我想要一个大于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;
}
}
}
答案 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)
在这种情况下,您不应使用嵌套循环。一种方法是这样的:
更好的方法是使用一个验证号码并打印消息的功能。这样,您可以执行以下操作:
do
{
cin >> num;
} while (!ValidateNumber(num));