我必须为我的Algorithms类编写一个红黑树,然后编写一个菜单用于插入,删除,搜索等元素。所以我认为Switch语句是可行的方法,但是当它突然出现时,它总是直接进入return语句并结束程序,即使我没有输入“0”。
我已经连续工作了大约24个小时,并为最后16个编程,所以我道歉,如果它有些愚蠢,或者我没有很好地解释它。
while ( true )
{
int userinput = NULL;
PrintMenu();
cin >> userinput;
cin.clear();
cin.ignore( 10000 , '\n' );
switch ( userinput )
{
case 0:
{
return 0;
}
case 1:
{
while (true )
{
cout << "Enter an integer to be entered into the Red Black Tree or any letter to exit:\n";
if ( !(cin >> userinput) )
break;
cin.clear();
cin.ignore( 10000, '\n' );
data.Insert( userinput );
data.PrintInOrder();
}
}
case 2:
{
while (true )
{
cout << "WARNING : This mode allows entering of duplicate numbers.\n";
cout << "Enter an integer to be entered into the Red Black Tree or any letter to exit:\n";
if ( !(cin >> userinput) )
break;
cin.clear();
cin.ignore( 10000, '\n' );
data.Insert( userinput );
data.PrintInOrder();
}
}
case 3:
{
while (true )
{
cout << "Enter an integer to search the Red Black Tree for or any letter to exit:\n";
if ( !(cin >> userinput) )
break;
cin.clear();
cin.ignore( 10000, '\n' );
data.Search( userinput );
}
}
case 4:
{
while (true )
{
cout << "Enter an integer to be deleted from the Red Black Tree or any letter to exit:\n";
if ( !(cin >> userinput) )
break;
cin.clear();
cin.ignore( 10000, '\n' );
data.Delete( userinput );
data.PrintInOrder();
}
}
case 5:
{
while (true )
{
cout << "WARNING : This mode deletes all copies of an integer.\n";
cout << "Enter an integer to delete from the Red Black Tree or any letter to exit:\n";
if ( !(cin >> userinput) )
break;
cin.clear();
cin.ignore( 10000, '\n' );
data.DeleteAll( userinput );
data.PrintInOrder();
}
}
case 6:
data.PrintInOrder();
break;
case 7:
{
cout << "This Function tests if the tree passes all 5 Criteria of a Red Black Tree.\n";
data.IsRBT();
cout << "Test Finished, if you see no Violations then it passed. Press any letter to exit.\n";
if ( !(cin >> userinput) )
break;
}
}
system("CLS");
data.PrintInOrder();
}
答案 0 :(得分:4)
您在案例之间缺少break
语句,这意味着如果案例1
已执行,则案例2
,3
,4
,{{1} }和5
也被执行。
循环中的6
语句只会突破循环,而最内层的循环也不会突破任何其他循环。如果你想突破外环你必须要有一些由外循环检查的状态变量。像
break
此外,您在多个地方使用了许多常用代码,这不是一个好的设计模式。想想当你想要改变它时会发生什么,但忘记在一个地方改变它。
答案 1 :(得分:1)
switch(cond)
{
case 0:
f0();
case 1:
f1();
case 2:
f2()
}
让我们假设cond == 1.这意味着f1()和f2()将被执行,因为你的案件没有中断。
我认为你想要做的是:
switch(cond)
{
case 0:
f0();
break;
case 1:
f1();
break;
case 2:
f2();
break;
default: // you should always treat the default case in a switch statement
//some for of error handling or pint a message
break;
}
假设cond == 1(再次);这次只有f1()会执行