VC 6.0 下编译通过 disc 为辞典 expression 为输入的短语
// Code.cpp : Defines the entry point for the console application. //
#include "stdafx.h" #include "iostream.h" #include "string.h" #include "windows.h"
int CountWord(char* words); //计 算有多少个字符
struct dict { char syn[8],word[6]; int scode,wcode; } dic[19];
int main(int argc, char* argv[]) { strcpy(dic[0].syn,"祈使动词"); dic[0].scode=0; strcpy(dic[0].word,"请"); dic[0].wcode=0; strcpy(dic[1].syn,"祈使动词"); dic[1].scode=0; strcpy(dic[1].word,"把"); dic[1].wcode=1; strcpy(dic[2].syn,"代词"); dic[2].scode=1; strcpy(dic[2].word,"你"); dic[2].wcode=0; strcpy(dic[3].syn,"动词"); dic[3].scode=2; strcpy(dic[3].word,"走"); dic[3].wcode=0; strcpy(dic[4].syn,"动词"); dic[4].scode=2; strcpy(dic[4].word,"跑"); dic[4].wcode=1; strcpy(dic[5].syn,"动词"); dic[5].scode=2; strcpy(dic[5].word,"跳"); dic[5].wcode=2; strcpy(dic[6].syn,"动词"); dic[6].scode=2; strcpy(dic[6].word,"转"); dic[6].wcode=3; strcpy(dic[7].syn,"动词"); dic[7].scode=2; strcpy(dic[7].word,"抬"); dic[7].wcode=4; strcpy(dic[8].syn,"方向词"); dic[8].scode=3; strcpy(dic[8].word,"向左"); dic[8].wcode=0; strcpy(dic[9].syn,"方向词"); dic[9].scode=3; strcpy(dic[9].word,"向右"); dic[9].wcode=1; strcpy(dic[10].syn,"方位词"); dic[10].scode=4; strcpy(dic[10].word,"向前"); dic[10].wcode=0; strcpy(dic[11].syn,"方位词"); dic[11].scode=4; strcpy(dic[11].word,"侧"); dic[11].wcode=1; strcpy(dic[12].syn,"名词"); dic[12].scode=5; strcpy(dic[12].word,"左手"); dic[12].wcode=0; strcpy(dic[13].syn,"名词"); dic[13].scode=5; strcpy(dic[13].word,"右手"); dic[13].wcode=1; strcpy(dic[14].syn,"名词"); dic[14].scode=5; strcpy(dic[14].word,"左腿"); dic[14].wcode=2; strcpy(dic[15].syn,"名词"); dic[15].scode=5; strcpy(dic[15].word,"右腿"); dic[15].wcode=3; strcpy(dic[16].syn,"副词"); dic[16].scode=6; strcpy(dic[16].word,"快"); dic[16].wcode=0; strcpy(dic[17].syn,"副词"); dic[17].scode=6; strcpy(dic[17].word,"慢"); dic[17].wcode=1; strcpy(dic[18].syn,"其他词"); dic[18].scode=7; strcpy(dic[18].word,"起来"); dic[18].wcode=0; //--Init Data End ///
char expression[30],phrase[40]; //输 入句子的分词程序 char *p1,*p2; //* PWORD pw_exp1,pw_exp2,pw_old; //temp pw_old Can RollBack int n_WordNub = 0,n_InputNub = 0; //* strcpy(expression,"请你向前走快抬左手侧左腿"); for(int i=0; i<40; i++) phrase[i] = ' ' ; phrase[39] = '/0';
p2 = expression; p1 = phrase; pw_old = pw_exp1 = (PWORD)p2; //Init
//计 算输入的字数以确定查询的次数 n_InputNub = CountWord(p2); printf("分析结果: /n");
for(int nub=0; nub<n_InputNub; nub++) //按 照输入的字数来找 { for(int i=0; i<19; i++) // 查询词表 { pw_exp2 = (PWORD)dic[i].word; for(int j=0; j<CountWord(dic[i].word); j++) //比 较单词 { if (*pw_exp1 == *pw_exp2) { pw_exp1++; pw_exp2++; } else { pw_exp1 = pw_old; //RollBack } }
if ((char*)pw_exp1 != p2) //词 表找到单词 { for(int x=0; x<((char*)pw_exp1 - p2); x++) //存 储识别单词 { *p1 = *(p2+x); p1++; } *p1 = '/'; //填 入分隔符 p1++; p2 =(char*) pw_exp1; //查 询下一个 pw_old = pw_exp1; //Can RollBack }
if (*p2 == '/0') //查 完了! { break; }
} }
//查 询完辞典! if( ((char*)pw_exp1 == p2) && (*p2 != '/0') ) //词 表里没有找到 { cout<<"不可识别的短语!"; } else{ cout<<"识别完毕! :" ; cout<<phrase;} return 0; }
int CountWord(char* words) { int n = 0; while(*words != '/0') { words++; n++; } return int(n/2); }