0

我必须为我的算法类编写一个红黑树,然后编写一个菜单用于插入、删除、搜索等……元素。所以我认为 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();
}
4

2 回答 2

4

break在 case 之间缺少语句,这意味着如果 case1被执行,那么 case 2, 3, 4, 5and6也被执行。

循环内的break语句只跳出循环,最里面的循环也没有任何其他循环。如果你想跳出外循环,你必须有一些由外循环检查的状态变量。喜欢

bool go_on = true;
while (go_on)
{
    // Some code...

    switch (some_condition)
    {
    case 1:
        while (true)
        {
            if (some_other_condition)
            {
                go_on = false;  // Tell outer loop to stop
                break;  // Break out of inner loop
            }
        }
        break;  // End the "case"

    // More cases...
    }
}

此外,您在多个地方使用了许多通用代码,这不是一个好的设计模式。想想当你想改变它时会发生什么,但忘记在一个地方改变它。

于 2013-11-12T13:15:49.060 回答
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() 会执行

于 2013-11-12T13:34:47.730 回答