如何找到最接近的元音
How to find closest vowel?
我写了一个程序,让用户输入一个字符。如果字符是元音,则不执行任何操作;如果字符是辅音,请找到字母表中最接近的元音。有什么简单的方法可以做到这一点吗?
这是我现在所拥有的:
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'; }
有没有更简单的方法可以做到这一点?
你也可以使用数组:
const char nearestVowels[26] = "aaaeeeeiiiiioooooouuuuuyyy";
// abcdefghijklmnopqrstuvwxyz
然后你可以简单地这样做:
output = nearestVowels[input - 'a'];
看起来你想要这样的东西:
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'; }
}
住在科里鲁
也可以这样做:
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
确保除 a~z 之外没有输入输入到输出中。
有很多方法可以做到这一点,也许最简洁(尽管丑陋)是:
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
比上面更冗长一些,但可能会提供最快的性能(但如果您关心,请进行测量)。
switch
会更简单:
switch (input)
{
case 'b':
case 'c':
output = 'a';
break;
case 'd':
case 'f':
case 'g':
output = 'e';
break;
...
etc.
}
这感觉更通用:
- 获取输入的 ASCII 值
- 减去每个元音的 ASCII 值作为其距离,并在列表中存储(元音、距离)
- 对列表进行排序
- 获取其第一对的键(元音)
#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;
}
}
这是我
用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;
}
相关文章:
- 查找最接近的大于当前数字的数字的索引
- 必须首先打印向量 v1 中最接近整数 x 的数字<int>
- 查找索引的最接近的真实值
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- C++ lower_bound() 搜索最接近目标值的元素
- C++有效地找到向量中第一个最接近的匹配值?
- 在结构向量中查找最接近的值
- 在排序数组中搜索最接近的 int 值 <= 从右起给定值
- 最接近"std::atomic<std::vector>"是什么?
- C++中最接近 Lua 表操作的东西是什么?
- 在std::集中获取与给定元素最接近的元素
- 查找整数数组中最接近的数字
- Systemc - 将sc_time四舍五入到最接近的第 10 SC_NS
- 我是 c++ 的新手,有没有一种算法可以找到 3d 数组中最接近的 0 的距离?
- 我的程序不断四舍五入到最接近的整数
- 3 与错误最接近的总和:字符串常量之前的预期非限定 id
- 最接近Direct2D/DirectWrite的跨平台替代方案?
- 什么是从最接近线的一组点找到点的最快算法
- 从一组数字中找出最接近的三个数字值
- 比较两个值,找出最接近用户输入的值