当用户输入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。有问题?
让我们通过减少的情况下来了一点,只查找开始a和e
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)