• 仿照手机上的拼音输入法


    手机的汉字拼音输入法很'聪明',只要用数字键组合,就能够自动找到能组成拼音的字母组合。
    从2代表abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz

    写一个程序,对输入的数字组合,找到匹配的字母组合成拼音输出。
    如果有多个匹配则按照字母顺序排列后输出。

    pinyin2.txt文件,在这里下载

    #pragma warning(disable:4786)

    #include 
    <cstdio>
    #include 
    <cassert>
    #include 
    <vector>
    #include 
    <algorithm>
    #include 
    <string>

    using namespace std;

    class NameList
    {
    public:
        
    void init()
        
    {
            
    string a;
            
    for (int j = 0; ym[j]; j++)
            
    {
                a 
    = ym[j];
                mStrs.push_back(a);
                
    for (int i = 0; sm[i]; i++)
                
    {
                    a 
    = sm[i];
                    a 
    += ym[j] ;
                    mStrs.push_back(a);
                }

            }

        }

        
    void load(const char *file)
        
    {
            
    char buf[128];
            
    char buf2[1024];
            
    string a;
            mStrs.clear();
            mStrGBs.clear();
            FILE 
    *fp = fopen(file,"rt");
            
    while(fscanf(fp, "%s %s", buf, buf2) == 2)
            
    {
                a 
    = buf;
                mStrs.push_back(a);
                a 
    = buf2;
                mStrGBs.push_back(a);
            }

            fclose(fp);
        }

        
    void show()
        
    {
            
    for (vector< string >::iterator s = mStrs.begin(); s != mStrs.end(); ++s)
            
    {
                printf(
    "%s ", s->c_str());
            }

        }

        vector
    < string > mStrs;
        vector
    < string > mStrGBs;
    private:
        
    static const char *sm[];
        
    static const char *ym[];
    }
    ;

    const char *NameList::sm[]=
    {
        
    "b","p","m","f","d""t","n","l","g","k",
        
    "h","j","q","x","z""c","s","zh","ch","sh",
        
    "r","y","w",
        NULL,
    }
    ;
    const char *NameList::ym[]=
    {
        
    "a","ai","ao","an","ang",
        
    "o","ou","ong",
        
    "e","ei","er","en","eng",
        
    "i","iang","ian","iao","in","ing","iu","ia","ie","iong",
        
    "u","uo","uang","un","uai","uan",
        
    "ui","ue","ua",
        NULL,
    }
    ;
    class Digit2PinyinConverter
    {
    public:
        
    struct StrCmpFunctor
        
    {
            
    operator () (const char *s1, const char *s2)
            
    {
                
    int len1 = strlen(s1);
                
    int len2 = strlen(s2);
                
    if (len1 != len2)
                    
    return len1 < len2;
                
    return strcmp(s1, s2) < 0;
            }

        }
    ;
        
    void init()
        
    {
            validStrings.clear();
            vector
    < string >::iterator name = namelist.mStrs.begin();
            
    while(name != namelist.mStrs.end())
            
    {
                validStrings.push_back(name
    ->c_str());
                
    ++name;
            }

            digits 
    = "";
            sort(validStrings.begin(), validStrings.end(), StrCmpFunctor());
        }

        
    /// @param char digit '2'..'9'
        void push(char digit)
        
    {
            
    if (digit < '2' || digit > '9')
                
    return;
            digits 
    += digit;
            vector
    < const char * > next;
            vector
    < const char * >::iterator name = validStrings.begin();
            
    while(name != validStrings.end())
            
    {
                
    if (match(*name, digits.size() - 1, digit))
                
    {
                    next.push_back(
    *name);
                }

                
    ++name;
            }

            validStrings 
    = next;
            sort(validStrings.begin(), validStrings.end(), StrCmpFunctor());
        }


        
    void show()
        
    {
            printf(
    "+-------+-------+-------+\n");
            printf(
    "|       |2 abc  |3 def  |\n");
            printf(
    "+-------+-------+-------+\n");
            printf(
    "|4 ghi  |5 jkl  |6 mno  |\n");
            printf(
    "+-------+-------+-------+\n");
            printf(
    "|7 pqrs |8 tuv  |9 wxyz |\n");
            printf(
    "+-------+-------+-------+\n");
            printf(
    "|-|0|+|\n");
            printf(
    "+-------+-------+-------+\n");
        }

        
    string digits;
        vector
    < const char * > validStrings;
        
    static NameList namelist;
    private:  
        
    bool match(const char *name, int pos, char digit)
        
    {
            assert(digit 
    >= '0' && digit <= '9');
            
    int len = strlen(name);
            
    if (len <= pos)
                
    return false;
            
    char d = name[pos];
            
    const char *maplist = map[digit - '0'];
            
    for (; *maplist; maplist++)
            
    {
                
    if (d == *maplist)
                    
    return true;
            }

            
    return false;
        }

        
    static const char *map[10];
    }
    ;
    const char *Digit2PinyinConverter::map[10]=
    {
        
    """","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
    }
    ;
    NameList Digit2PinyinConverter::namelist;

    int main()
    {
        
    char c = '0';
        
    int page = 0;
        
    int i;

        Digit2PinyinConverter converter;
        Digit2PinyinConverter::namelist.load(
    "pinyin2.txt");
        converter.init();
        
    do
        
    {
            
    if (c == '\n')
                
    continue;
            
    if (c == '0')
                converter.init();
            
    if (c == '+')
            
    {
                page
    ++;
                
    int maxpage = (converter.validStrings.size() + 9)/10;
                
    if (page > maxpage)
                    page 
    = maxpage;
            }

            
    if (c == '-' && page > 0)
                page
    --;
            
    if (c >= '2' && c <= '9')
            
    {
                page 
    = 0;
                converter.push(c);
            }

            
            system(
    "cls");
            converter.show();
            
    for (i = 0; i < (int)converter.digits.size(); i++)
                printf(
    "%c", converter.digits[i]);
            printf(
    "\n");
            
    for (i=0;i<10 && i + page * 10 < (int)converter.validStrings.size();i++)
            
    {
                
    if (strlen(converter.validStrings[i + page * 10]) > strlen(converter.digits.c_str()))
                    
    break;
                printf(
    "%d:%s ", i, converter.validStrings[i + page * 10]);
            }

            printf(
    "\nPage %d, Total %d\n", page, converter.validStrings.size());
        }
     while(scanf("%c"&c) == 1);

        
    return 0;
    }

  • 相关阅读:
    【JZOJ3852】【NOIP2014八校联考第2场第2试9.28】单词接龙(words)
    【JZOJ3853】【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
    【JZOJ3854】【NOIP2014八校联考第2场第2试9.28】分组(group)
    【JZOJ4934】【NOIP2017GDKOI模拟1.12】a
    【JZOJ4935】【NOIP2017GDKOI模拟1.12】b
    【JZOJ4925】【GDOI2017模拟12.18】稻草人
    【JZOJ4930】【NOIP2017提高组模拟12.18】C
    【JZOJ4929】【NOIP2017提高组模拟12.18】B
    如何重新加载Spring Boot上的更改,而无需重新启动服务器?
    什么是JavaConfig及其优点?
  • 原文地址:https://www.cnblogs.com/kaikai/p/219569.html
Copyright © 2020-2023  润新知