我编写了一个简单的程序来管理名称列表(程序的一部分如下)。我期望函数“choice()”结束并返回main() - 从而结束程序 - 当用户对变量“option”的输入为4.但是,choice()往往会重复几次即使将4分配给“选项”,例如:
Would you like to: (1) - Add name(s) to the list (2) - Remove name(s) from the list (3) - View the list (4) - Exit the program (type 1, 2, 3, or 4): 4 Exiting Program... Would you like to: (1) - Add name(s) to the list (2) - Remove name(s) from the list (3) - View the list (4) - Exit the program (type 1, 2, 3, or 4): 4 Exiting Program... ryan$ _
如果没有整个程序,您认为可能导致问题的原因是什么?很抱歉,如果没有足够的信息来推荐。
你可以看到我在第四个if语句的结尾处注释了“exit(0)”,其中choice()应该到达它的结尾并返回到main()。我宁愿避免这种说法,但这是我目前唯一可以解决的问题。谢谢你的帮助。
-Ryan
int main()
{
cout << endl
<< "WELCOME TO THE NAME LIST PROGRAM" << endl
<< "--------------------------------" << endl;
choice();
return 0;
}
void choice()
{
string option = "0";
cout << "\nWould you like to:" << endl
<< "\t(1) - Add name(s) to the list" << endl
<< "\t(2) - Remove name(s) from the list" << endl
<< "\t(3) - View the list" << endl
<< "\t(4) - Exit the program" << endl
<< "(type 1, 2, 3, or 4): ";
getline(cin,option);
while( option != "1" && option != "2" &&
option != "3" && option != "4" )
{
cout << "\nInvalid input, reenter: ";
getline(cin,option);
}
if(option == "1")
{
appendNames();
choice();
}
else if(option == "2")
{
string flag = "menu";
removeNames(flag);
choice();
}
else if(option == "3")
{
viewNames();
choice();
}
else if(option == "4")
{
cout << "\n\nExiting Program...\n\n";
// exit(0);
}
}
答案 0 :(得分:1)
我认为问题来自对某个功能如何运作的误解。假设您有一个显示您姓名的功能:
void showName()
{
cout << "Ryan" << endl;
}
现在说你要重复10次。在您特定的编程方式中,您可能会执行以下操作:
void showName(int times)
{
cout << "Ryan" << endl;
if ( times > 0 ) {
showName( --times );
}
return;
}
int main()
{
showName( 10 );
}
这种编程方式称为递归,但我确信你已经偶然达到了这种方式。递归在某些情况下很方便,但它不是做简单事情的常用方法,比如重复一些事情。让我们看看实际程序调用该函数10次:
void showName()
{
cout << "Ryan" << endl;
}
int main()
{
for(int i = 0; i < 10; ++i) {
showName();
}
}
每次调用函数showName()
(被调用者)时,它都必须返回给调用者。如果您执行示例中显示的内容:
if( option == "1" )
{
appendNames();
choice();
}
然后,您实际上正在调用choice()
次,因为用户选择了除4(退出)之外的任何其他选项。这解释了为什么您必须致电exit( 0 )
才能立即生效。
总结一下,你的程序应该是:
int main()
{
cout << endl
<< "WELCOME TO THE NAME LIST PROGRAM" << endl
<< "--------------------------------" << endl;
while( !choice() );
return 0;
}
bool choice()
{
bool toret = false;
string option = "0";
cout << "\nWould you like to:" << endl
<< "\t(1) - Add name(s) to the list" << endl
<< "\t(2) - Remove name(s) from the list" << endl
<< "\t(3) - View the list" << endl
<< "\t(4) - Exit the program" << endl
<< "(type 1, 2, 3, or 4): ";
getline(cin,option);
while( option != "1" && option != "2" &&
option != "3" && option != "4" )
{
cout << "\nInvalid input, reenter: ";
getline(cin,option);
}
if(option == "1")
{
appendNames();
}
else if(option == "2")
{
removeNames();
}
else if(option == "3")
{
viewNames();
}
else if(option == "4")
{
cout << "\n\nExiting Program...\n\n";
toret = true;
}
return toret;
}
希望这有帮助。
答案 1 :(得分:0)
问题出在你的while循环中。用户必须继续输入输入,直到输入的输入无效。
while( option != "1" && option != "2" &&
option != "3" && option != "4" )
{
cout << "\nInvalid input, reenter: ";
getline(cin,option);
}
更改循环条件或移动循环内的所有内容应该可以解决问题。 希望有所帮助。 :)
P.S:如果您要在While循环中移动所有内容,请确保为退出选项添加break;
。