Бесконечный цикл do-while в c ++ - PullRequest
1 голос
/ 30 октября 2019

Эта функция displayMenu() вызывается в Main при условии while(menuChoice != Q), но сама функция имеет внутренний бесконечный цикл.

Любая подсказка о том, почему цикл в функции меню дисплея бесконечен,быть великолепным ... Я думаю, что это может быть связано со структурой do-while или оператором реляции !=, работающим некорректно.

FUNCTION DISPLAYMENU:
char displayMenu()
{
// can be useful info during development
cout << "Entered function displayMenu..." << endl;

char whatToDo = '?';


do {
    //Display Menu Options
    cout <<"Upload a regional sales data file \tU" <<endl;
    cout <<"display details (All loaded data) \tA" <<endl;
    cout <<"list details for specific Order number \tO" <<endl;
    cout <<"display summary by Region \tR" <<endl;
    cout <<"display summary by print method \tM" <<endl;
    cout <<"Clear all data \tC" <<endl;
    cout <<"Quit \tQ" <<endl;
    cout <<"\nPlease Enter Your Menu Choice: " <<endl;
    cin >> whatToDo;
} while (whatToDo != 'U' ||
         whatToDo != 'A' ||
         whatToDo != 'O' ||
         whatToDo != 'R' ||
         whatToDo != 'M' ||
         whatToDo != 'C' ||
         whatToDo != 'Q');

// can be useful info during development
cout << "Returning " << whatToDo << " from displayMenu..." << endl;

return whatToDo;

} // END function displayMenu()


FUNCTION MAIN 
while (menuChoice != 'Q'){
    menuChoice = displayMenu();
}

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Это условие никогда не может привести к значению «ложь», что, конечно, приводит к бесконечному циклу while. И это только часть вашего состояния ORed.

whatToDo != 'U' || whatToDo != 'A'

Требуется, чтобы whatToDo был в то же время идентичным «U» и «A».

Что вывероятно, требуется

whatToDo != 'U' && whatToDo != 'A'

"до тех пор, пока whatToDo не является ни A, ни U ..." в соответствии с эквивалентностью

!A && !B 

и

!(A || B)

последнее является более очевидным выражением для «NOR».

1 голос
/ 30 октября 2019
while (whatToDo != 'U' ||
         whatToDo != 'A' ||
         whatToDo != 'O' ||
         whatToDo != 'R' ||
         whatToDo != 'M' ||
         whatToDo != 'C' ||
         whatToDo != 'Q');

Независимо от того, что whatToDo, по крайней мере 6 из этих условий true, поэтому вы получаете бесконечный цикл.

То, что вы хотите, это продолжать цикл до тех пор, пока одно из условий не будетfalse.

Вы должны использовать что-то вроде этого:

while (whatToDo != 'U' &&
       whatToDo != 'A' &&
       whatToDo != 'O' &&
       whatToDo != 'R' &&
       whatToDo != 'M' &&
       whatToDo != 'C' &&
       whatToDo != 'Q');
...