0

Algorithms クラスの Red Black Tree を作成し、要素の挿入、削除、検索などに使用するメニューを作成する必要がありました。そこでSwitch文がいいのかと思ったのですが、ケースを抜けると「0」を入力していないのに必ずreturn文に直行してプログラムを終了してしまいます。

私は約 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。つまり、ケース1が実行されると、ケース、、、およびも2実行されます。3456

ループ内の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...
    }
}

また、多くの共通コードが複数の場所で使用されているため、これは適切な設計パターンではありません。変更したいときに何が起こるかを考えてください。ただし、1 か所で変更することを忘れてください。

于 2013-11-12T13:15:49.060 に答える