如何找到最接近的元音?

时间:2015-03-16 01:15:55

标签: c++

我写了一个程序,让用户输入一个字符。如果角色是元音,什么都不做;如果角色是辅音,请找到字母表中最接近的元音。有没有简单的方法呢?

这就是我现在所拥有的:

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

有更简单的方法吗?

7 个答案:

答案 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'; }
}

Live On Coliru

答案 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感觉更通用:

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

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