如何找到最接近的元音

How to find closest vowel?

本文关键字:最接近 何找      更新时间:2023-10-16

我写了一个程序,让用户输入一个字符。如果字符是元音,则不执行任何操作;如果字符是辅音,请找到字母表中最接近的元音。有什么简单的方法可以做到这一点吗?

这是我现在所拥有的:

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.
}

这感觉更通用:

  1. 获取输入的 ASCII 值
  2. 减去每个元音的 ASCII 值作为其距离,并在列表中存储(元音、距离)
  3. 对列表进行排序
  4. 获取其第一对的键(元音)

#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;
}