首页 > 解决方案 > 仅对 if 语句使用循环,然后打印 else 语句

问题描述

检查输入的字符是辅音还是元音?

我几乎得到了结果,但我只需要else声明脱离循环。是否可以使用else外循环?在这里我尝试添加{}但没有帮助我。我该怎么做?我已经以多种方式解决了这个程序,但我想清除我的if循环概念。

#include <iostream>
    
using namespace std;

int main(){
    char x ;
    char vowel[10] ={'a','e','i','o','u','A','E','I','O','U'};
    cout<<"Enter ";
    cin>>x ;
    for(int i = 0 ; i<10 ; i++)
    {
        {    
            if(x ==vowel[i])
            {
                cout<<"This is a vowel";
            }
        }   
        else
        {
            cout<<"This is a consonant";
        }   
    }
    return 0 ;
}

标签: c++loopsif-statement

解决方案


你也可以写:

#include <iostream>

int main() {

    std::cout << "\nEnter a character: ";

    if (char c{}; std::cin >> c)
        std::cout << c << " is a " << (((0x208222 >> (c & 0x1f)) & 1) ? "vowel" : "consonant") << '\n';
   return 0;
}

那更紧凑。


这显示了如何用 C++ 解决奇妙的问题。但是,它需要很多解释。首先,如何检查一个字符是否是元音。

如果我们使用 ASCII 码对字母进行编码,那么我们将看到以下内容:

字母的 Ascci 代码

我们看到大写和小写字母的 ASCII 码只是低 5 位不同。所以,如果我们用 0x1F 屏蔽 ASCII 码char c{'a'}; unsigned int x{c & 0x1F},我们将得到 1 到 26 之间的值。所以,我们可以计算每个字母的 5 位值。如果我们现在用 1 标记所有元音,我们可以构建一个由 32 位(无符号整数)组成的二进制数,并在元音为真的每个位置设置一个位。然后我们得到类似的东西

Bit position
3322 2222 2222 1111 1111 1100 0000 0000  
1098 7654 3210 9876 5432 1098 7654 3210  
Position with vowels:
0000 0000 0010 0000 1000 0010 0010 0010

这个数字可以转换为 0x208222。如果我们现在想知道,如果一个字母(不管是大写还是小写)是一个元音,那么我们从字符中屏蔽掉不必要的位( C & 1F )并将二进制数向右移动尽可能多位置,正如结果字母代码所具有的那样。如果然后该位设置在 LSB 位置,则我们有一个元音。这知道如何有几十年的历史。

啊哈。不是那么容易,但适用于 ASCII 编码的字母。

顺便说一句,它也适用于其他角色选择。

结果是:

auto isVowel = [](char c) { return (0x208222 >> (c & 0x1f)) & 1; };

凉爽的 。. .


推荐阅读