我写了一个程序,让用户输入一个字符。如果角色是元音,什么都不做;如果角色是辅音,请找到字母表中最接近的元音。有没有简单的方法呢?
这就是我现在所拥有的:
char input, output;
cin >> input;
if (input == 'b'){ output = 'a'; }
else if (input == 'c'){ output = 'a'; }
else if (input == 'd'){ output = 'e'; }
else if (input == 'f'){ output = 'e'; }
else if (input == 'g'){ output = 'e'; }
else if (input == 'h'){ output = 'i'; }
else if (input == 'j'){ output = 'i'; }
else if (input == 'k'){ output = 'i'; }
else if (input == 'l'){ output = 'i'; }
else if (input == 'm'){ output = 'o'; }
else if (input == 'n'){ output = 'o'; }
else if (input == 'p'){ output = 'o'; }
else if (input == 'q'){ output = 'o'; }
else if (input == 'r'){ output = 'o'; }
else if (input == 's'){ output = 'u'; }
else if (input == 't'){ output = 'u'; }
else if (input == 'v'){ output = 'u'; }
else if (input == 'w'){ output = 'u'; }
else if (input == 'x'){ output = 'u'; }
else if (input == 'y'){ output = 'u'; }
else if (input == 'z'){ output = 'u'; }
有更简单的方法吗?
答案 0 :(得分:10)
您也可以使用数组:
const char nearestVowels[26] = "aaaeeeeiiiiioooooouuuuuyyy";
// abcdefghijklmnopqrstuvwxyz
然后你可以这样做:
output = nearestVowels[input - 'a'];
答案 1 :(得分:4)
看起来你想要这样的东西:
if (input != 'a' && input != 'e' && input != 'i' && input != 'o' && input != 'u')
{
if ('a' <= input && input <= 'c') { output = 'a'; }
else if (input <= 'g') { output = 'e'; }
else if (input <= 'l') { output = 'i'; }
else if (input <= 'r') { output = 'o'; }
else if (input <= 'z') { output = 'u'; }
}
答案 2 :(得分:3)
也可以这样做:
if(input>='a'&&input<='z'){
if(input<='c')output='a';
else if(input<='g')output='e';
else if(input<='l')output='i';
else if(input<='r')output='o';
else if(input<='z')output='u';
}
第一个if
确保没有输入除了〜z之外的输入。
答案 3 :(得分:2)
有很多方法可以做到这一点,也许最简洁(尽管很难看)是:
const char* p = strchr(input, "bacadefegehijikilimonopoqorosutuvuwuxuyuzu");
output = (p && *p) ? p[1] : input;
这可以通过在该字符串文字中查找char*
到input
,然后如果找到则返回以下字符。对于任何字符代码0-255,它都不会崩溃,但如果你输入一个元音,它会在字符串中找到它并返回以下辅音 - 如果这是一个问题,它可能更好使用以下...
有两个数组 - 一个辅音和另一个元音,如果你在前者中找到input
,则从后者的同一个索引中获取元音。
另一种方法是使用std::map
:
std::map<char, char> m { { 'b', 'a' }, {'c', 'a' } etc... };
if (auto i = m.find(input))
output = *i;
else
output = input;
switch
比上面的更冗长,但可能会提供最快的表现(但如果你愿意,可以衡量)。
答案 4 :(得分:1)
switch
会更简单:
switch (input)
{
case 'b':
case 'c':
output = 'a';
break;
case 'd':
case 'f':
case 'g':
output = 'e';
break;
...
etc.
}
答案 5 :(得分:1)
This感觉更通用:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
bool compare(const pair<char, int>& a, const pair<char, int>& b)
{
return a.second < b.second;
}
int main()
{
char vowels[] = { 'a', 'e', 'i', 'o', 'u' };
char input;
//std::cin >> input;
input = 'r';
vector<pair<char, int>> distances;
for (char& vowel : vowels)
{
distances.push_back(make_pair(vowel, abs(input - vowel)));
}
sort(distances.begin(), distances.end(), compare);
pair<char, int> nearest = distances.front();
if (nearest.second > 0)
{
cout << nearest.first;
}
}
答案 6 :(得分:1)
这是我用Java制作的,它没有静态分配,支持大小写字母。
public static char closestVowel(char character) {
int value = (int) character;
if(character == 'z' || character == 'Z')
return (char) (value - 25);
if(isVowel(character)) {
return character;
} else {
return closestVowel((char) (value - 1));
}
}
public static boolean isVowel(char character) {
return "aeiouAEIOU".indexOf(character) >= 0;
}