Automatic.dai : 之前在Ourdev论坛上看到有人用C51设计了拼音输入法,代码还没有看,但是对于其实现原理很感兴趣,所以自己简单尝试了一下。
主要原理:
建立一张汉字索引表,主键为拼音,如”bao”,内容为汉字码表,如”包宝饱报抱保苞胞褒雹堡豹鲍暴爆剥薄瀑”。根据用户输入的拼音去查找对应的汉字码表,之后再根据用户输入的数字输出对应的汉字。这种方式很像LUA的table数据结构,用LUA写这个程序会简单很多,之后我会尝试用LUA写一个版本。
程序优点:
索引为拼音字符串的指针,检索阶段不涉及具体汉字,速度快、原理简单。
程序缺点:
因为只是一个演示程序,这个程序还存在不少缺点。比如使用顺序方式查找,效率低,并且越在表后的数据,检索的速度就越慢。要解决这个问题,可以使用二次查找的方法加快速度,即首先查找‘b’,之后直接散转查找’b’开头的拼音 ”ba”, ”ban”, ”bang” 等。这还需要建立一张映射表,读者可自行尝试。
源代码:
/*-------------------------------------------------------------------------- * 项目名称 :简易拼音输入法 * 程序名称 :主程序 * 项目组织 :云飞工作室 * 程序编写 :戴晓天 * 邮 箱 :automatic.dai@gmail.com * 版 本 :V0.1.111124(beta) ---------------------------------------------------------------------------- * 程序说明 : 本程序利用建立索引的方法实现了简单的拼音输入法。 目前仅支持a、b开头的拼音码,可以自行扩展。 ---------------------------------------------------------------------------- * 修订说明 : 暂无修订。 --------------------------------------------------------------------------*/ #include "stdio.h" #include "string.h" #include "conio.h" typedef struct _PY_Index { char *_PyMa; // 存放拼音的拼音码 char *_PYTable; // 对应的中文汉字表 }PY_Index; PY_Index PY_Ma_Talbe[] = { {"a" ,"阿啊嗄呵锕吖腌錒"}, {"ai" ,"哎爱唉碍哀埃挨矮蔼皑癌艾隘暧"}, {"an" ,"按安案暗俺岸胺氨庵"}, {"ang" ,"昂盎肮醃醠枊肮岇骯卬"}, {"ao" ,"奥澳傲懊熬袄凹敖翱"}, {"b" ,"不把吧爸必"}, {"ba" ,"把吧爸巴拔八"}, {"bai" ,"白百佰柏摆败拜稗"}, {"ban" ,"办半搬板伴"}, {"bang" ,"棒帮榜镑蚌"}, {"bao" ,"包宝饱报抱保苞胞褒雹堡豹鲍暴爆剥薄瀑"}, {"bei" ,"被北倍杯备背卑悲碑贝狈钡惫焙辈"}, {"ben" ,"本奔苯笨夯"}, {"beng" ,"崩绷甭迸蹦泵"}, {"bi" ,"必毕闭鼻比彼笔币避鄙逼庇毖陛毙敝痹蓖弊碧蔽壁臂"}, {"bian" ,"边编鞭贬扁卞便变遍辨辩辫"}, {"biao" ,"彪标膘表"}, {"bie" ,"憋鳖别瘪"}, {"bin" ,"宾斌彬滨鬓濒摈"}, {"bing" ,"冰丙并病秉柄炳饼兵"}, {"bo" ,"拨波玻钵脖菠播伯驳帛泊勃铂舶博渤搏箔膊卜"}, {"bu" ,"不补哺捕布步怖部埠簿"}, {NULL ,NULL} }; /* ******************************************************************** *函数名称 : PY_Search() *入口参数 : char *pPyMa // 待查找的拼音码 *出口参数 : 无 *返回参数 : char *pTable // 查找到的汉字码 *程序编写 : 戴晓天 *版 本 : V1.0.111124 *说 明 : 在索引表中搜索待查找的拼音码,返回对应的汉字码起始地址。 ******************************************************************** */ char *PY_Search(char *pPyMa) { char *pTable; int i; for ( i = 0; PY_Ma_Talbe[i]._PyMa!= NULL ;i++ ) { if ( strcmp(pPyMa, PY_Ma_Talbe[i]._PyMa) == 0 ) { break; } } // 注意此时如果没有找到,._PYTable为NULL pTable = PY_Ma_Talbe[i]._PYTable; return pTable; } //////////////////////////////////////////////////////////////////////////////////////// // 主程序 int main(int argc, char* argv[]) { char chPYInput[10]; // 输入的拼音码 char chPYIndex; // 输入拼音码的索引 char chInChar; // 每次输入的字符 char *PYString; // 对应的汉字码表 char chPYMaResult[2+1]; // 最后确定选择的汉字,中文占两个字节 printf("请输入要查找的字符(只支持a、b开头):\n"); memset(chPYInput,0,10); chPYIndex = 0; while (1) { chInChar = getch(); // 如果是字母 if ( chInChar >='a' && chInChar <= 'z' ) { chPYInput[chPYIndex++] = chInChar; PYString = PY_Search(chPYInput); // 这里输入要查找的字符 if ( PYString != NULL) { printf(chPYInput); printf(PYString); printf("\n"); } else { printf("The PY code you input is not exist!\n"); getch(); return 0; } } // 如果是退格键 else if ( chInChar == '\b' ) { chPYInput[--chPYIndex] = 0; PYString = PY_Search(chPYInput); // 这里输入要查找的字符 if ( PYString != NULL) { printf(chPYInput); printf(PYString); printf("\n"); } else { printf("The PY code you input is not exist!\n"); getch(); return 0; } } // 如果是数字键,则表示选择了对应的汉字 else if ( chInChar >= '0' && chInChar <= '9') { unsigned int index; index = ( (chInChar-'0') * 2 ); // 汉字索引为偏差值*2,因为汉字一位是两个字节 // 如果还没有找到汉字表,或者索引超出了汉字表的最大索引,则什么都不做 if ( PYString == NULL || index > strlen(PYString)-1 ) { ; } // 否则说明找到了正确的汉字,将其拷贝到内存变量中 else { memcpy(chPYMaResult ,&PYString[index], 2); chPYMaResult[2] = '\0'; // 别忘了加上\0,否则打印时会出错 break; } } } printf("你输入的字符是:%s\n", chPYMaResult); getch(); return 0; }
Cpp文件下载:
>> 本文章版权归作者所有,如需转载请联系作者授权许可。
>> 原文来自: 云飞机器人实验室
>> 原文地址: C语言 | 简易拼音输入法
>> 关于我们: 关于云飞实验室
>> 支持我们: 帮助我们可持续发展
强大!
强啊!我顶一个!