我的代码有什么问题...当条件满足时循环不关闭

What is Wrong With My Code That do...while Loop is Not Closing When Condition is Fulfilled

我正在学习 Ivor Horton 的 Beginning Visual C++ 2012,我正在做第三章中的练习二:决策和循环。这是我的代码:

#include <iostream>

using namespace std;

int main()
{
    char letter;
    int vowels = 0;

    do
    {
        cout << "Enter a letter, and enter q or Q to end" << endl;
        cin >> letter; // Enter a letter
        switch (letter)
        {
            case 'a' || 'A' || 'e' || 'E' || 'i' || 'I' || 'o' || 'O' || 'u' || 'U': // If letter is a vowel, add to vowels variable
                vowels++;
                break;
            default: // If letter is not a vowel, break loop
                break;
        }
    } while (letter != 'Q' || letter != 'q');

    cout << "You entered " << vowels << " vowels.";
    return 0;
}

该程序的预期目的是允许用户输入一个字母,直到他们输入 q 或 Q,此时 do...while 循环结束,程序向用户显示他们输入的元音数量已进入。

当我运行这个的时候,我输入Q或者q的时候程序没有退出。为什么?我该如何解决这个问题?

letter != 'Q' || letter != 'q'

永远如此。你是说&&.

注意 case :它不能按原样工作,你可以写 case 'a': case 'A' ... : => 所有元音大小写都属于 vowels++;

letter != 'Q' || letter != 'q'

意味着...

字母不是Q or不是q...所以它总是正确的...好像是Q,它不会是q,如果它是 q,则它不会是 Q ... 如果字母同时是 Qq,那只会是错误的。

只需使用:

letter != 'Q' && letter != 'q'

德摩根定律。

!( letter == 'Q' || letter == 'q' ) <=> ( letter != 'Q' && letter != 'q' )

德摩根定律指出,

Not (A or B) 等同于 Not A and Not B.

试试这个

#include <iostream>

using namespace std;

int main()
{
    char letter;
    int vowels = 0;
    int flag = 0;

    do
    {
        cout << "Enter a letter, and enter q or Q to end" << endl;
        cin >> letter; // Enter a letter
        switch (letter)
        {
            case 'a' || 'A' || 'e' || 'E' || 'i' || 'I' || 'o' || 'O' || 'u' || 'U': // If letter is a vowel, add to vowels variable
                vowels++;
                break;
            case 'q' || 'Q' :  flag = 1;    
            break;
            default: // If letter is not a vowel, break loop
                break;
        }
    } while (flag !== 1);

    cout << "You entered " << vowels << " vowels.";
    return 0;
}