计算元音C ++

scy*_*ypx 2 c++

当用户输入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;
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*ing 6

让我们通过减少的情况下来了一点,只查找开始ae

if (n == 'A' || n == 'a' && n == 'E' || n == 'e')
Run Code Online (Sandbox Code Playgroud)

然后为了简单起见仅考虑小写字母(但保留了问题)

if (n == 'a' && n == 'e')
Run Code Online (Sandbox Code Playgroud)

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

如果您至少有一个相等比较为真,只需将所有&&(和)运算符替换为||(或)运算符即可使条件为真。

if (n == 'A' || n == 'a' || n == 'E' || n == 'e' 
    || n == 'I' || n == 'i' || n == 'O' || n == 'o' 
    || n == 'U' || n == 'u')
Run Code Online (Sandbox Code Playgroud)

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

一种是添加#include <cctype>并用于std::tolower转换n为小写字母,然后只需要与小写字符进行比较。

n = std::tolower(n);
if (n == 'a' || n == 'e' || n == 'i' || n == 'o' || n == 'u')
Run Code Online (Sandbox Code Playgroud)

另外,少重复的方法是创建一个std::string与它所有的元音,然后看它是否包含n#include <string>往上顶。

std::string vowels = "aeiouAEIOU";
while (/*...*/) {
   // ...
   if (vowels.find(n) != std::string::npos) {
     ++total;
   }
}
Run Code Online (Sandbox Code Playgroud)

正如n314159所指出的那样,如果您使用的是C ++ 17或更高版本,则可以改用std::string_view更便宜的a。#include <string_view>

static constexpr std::string_view vowels = "aeiouAEIOU";   
while (/*...*/) {
   // ...
   if (vowels.find(n) != std::string_view::npos) {
     ++total;
   }
}
Run Code Online (Sandbox Code Playgroud)