c++ - 仅对 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 ;
}
解决方案
你也可以写:
#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 码对字母进行编码,那么我们将看到以下内容:
我们看到大写和小写字母的 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; };
凉爽的 。. .
推荐阅读
- python - Django Form:重定向到发送帖子请求的页面
- android - Xamarin.Forms 中的 Recycleview 是否需要在 IOS 上单独实现?
- dailymotion-api - Dailymotion API 是否具有与 YouTube 的 onYouTubeIframeAPIReady 等效的功能?
- javascript - Javascript Intl.NumberFormat 问题
- ios - 如何使用 swift-4 Promises then、done、catch 等块
- python - Pygame 矩形不会出现,除非我退出并返回
- windows - `read_csv` 在 Windows 中看不到我的文件
- sql-server - 根据使用 T-SQL 的 xml 字段中的连接值更新表中的 xml 特定节点
- php - PHP不会将用户数据插入SQL?
- python - peewee 一对多作为集合