当用户输入10个字母时,程序应告知其中有多少个元音。我写了这段代码:

while (count<10)
    {
        cin >> n;
        count++;
        if (n == 'A' || n == 'a' && n == 'E' || n == 'e' && n == 'I' || n == 'i' && n == 'O' || n == 'o' && n == 'U' || n == 'u')
            {
                total++;
            }
    }

cout <<  total << endl;

即使用户输入了元音,这也会产生输出0。有问题?

最佳答案

让我们从减少条件开始,只看ae

if (n == 'A' || n == 'a' && n == 'E' || n == 'e')

然后仅考虑小写字母以简化操作(但保留了问题)
if (n == 'a' && n == 'e')

如果您大声朗读,它会显示“如果n'a'n是'e'”。 “AND”(来自&&运算符)表示两个条件都必须为真。您在这里创建了一个不可能的条件,如果n'a',那么它不是'e',因此您得到if (true && false)-这是错误的。如果n'e',则它不是'a',因此您得到if (false && true)

如果至少有一个相等比较为真,则只需将所有&&(和)运算符替换为||(或)运算符即可使条件为true。
if (n == 'A' || n == 'a' || n == 'E' || n == 'e'
    || n == 'I' || n == 'i' || n == 'O' || n == 'o'
    || n == 'U' || n == 'u')

有一些方法可以简化条件。

一种是添加#include <cctype>并使用 std::tolower n转换为小写,然后只需要与小写字符进行比较。
n = std::tolower(n);
if (n == 'a' || n == 'e' || n == 'i' || n == 'o' || n == 'u')

另一种较少重复的方法是创建一个带有所有元音的std::string,然后在顶部添加see if it contains n #include <string>
std::string vowels = "aeiouAEIOU";
while (/*...*/) {
   // ...
   if (vowels.find(n) != std::string::npos) {
     ++total;
   }
}

正如n314159所指出的,如果您使用的是C++ 17或更高版本,则可以使用std::string_view来代替,它更便宜。 #include <string_view>
static constexpr std::string_view vowels = "aeiouAEIOU";
while (/*...*/) {
   // ...
   if (vowels.find(n) != std::string_view::npos) {
     ++total;
   }
}

关于c++ - 计算元音C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59093230/

10-13 08:09