词语输入法
#include"stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include<vector>
#include<set>
#include <windows.h>
using namespace std;
struct PYNode
{
string pinyin;
//合法输入对应的第一个拼音
int first;
//合法输入对应的最后一个拼音
int last;
};
//拼音库
class CSpelling
{
public:
//所有合法输入
PYNode* PYlist;
//构造函数
CSpelling()
{
int i;
//所有拼音的合法输入构成的一个数组
PYlist=new PYNode[487];
ifstream PYfin("list.txt");
//读入外部词库并赋值
for(i=0;i<487;i++)
{
PYfin>>PYlist[i].pinyin;
PYfin>>PYlist[i].first;
PYfin>>PYlist[i].last;
}
PYfin.close();
}
//析构函数
~CSpelling()
{
//删除拼音数组
delete []PYlist;
}
};
//词库
struct VListNode
{
string CiPinYin;
set<string> CiYu;
};
class CVocabulary
{
public:
//词库
vector<VListNode> VocabularyBase;
//构造词库
CVocabulary()
{
VListNode temp;
//从外部词库中读入
ifstream fin("2.txt");
//循环读入
string s2;
while(fin>> temp.CiPinYin)
{
string s1;
fin>>s1;
while(s1!="#")
{
temp.CiYu.insert(s1);
fin>>s1;
}
VocabularyBase.push_back(temp);
temp.CiYu.clear();
}
}
//多级索引,寻找与输入匹配的词语
bool Cifind(string temp,int& front,int& back)
{
int first=0;
int last=VocabularyBase.size()-1;
int i;
//找到拼音第一个字母的开始
while(temp[0]!=(VocabularyBase[first].CiPinYin)[0])
first++;
//找到拼音第一个字母的结束
while(temp[0]!=(VocabularyBase[last].CiPinYin)[0])
last--;
//寻找第一个匹配
for(i=first;i<last;i++)
{
if((VocabularyBase[i].CiPinYin).find(temp)==0)
break;
}
front=i;
//寻找最后一个匹配
for(i=last;i>first;i--)
{
if((VocabularyBase[i].CiPinYin).find(temp)==0)
break;
}
back=i;
//找到
if(front<=back)
return 1;
//没找到
return 0;
}
};
void gotoxy(int x, int y)
{
COORD coord = {x - 1, y - 1};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"------------------------------------------------------------------------"<<endl;
cout<<" 输入示例"<<endl;
cout<<"中间要加分隔上单引号"<<endl;
cout<<"输入样式"<<endl;
cout<<"su'zhou"<<endl<<"su'z"<<endl<<"s'z"<<endl;
cout<<"请输入: "<<endl;
int front=0 ,back=0;
CVocabulary c;
string str;
while(cin>>str){
c.Cifind(str,front,back);
if(front<=back){
vector<VListNode> v;
for(int i=front;i<=back;i++)
{
v.push_back(c.VocabularyBase[i]);
}
vector<VListNode>::iterator it;
set<string>::iterator it2;
int count=0;
for(it=v.begin();it!=v.end();it++)
{
for(it2=(*it).CiYu.begin();it2!=(*it).CiYu.end();it2++)
cout<<*it2<<" ";
}
cout<<endl;
}
else
{
/*char z=str[0];
const char *t=str[0];*/
string s1;
s1.assign (1,str[0]);
c.Cifind(s1,front,back);
s1="";
s1.assign (1,str[str.find("'")+1]);
int i=0;
for(i=front;i<back;i++)
{
if((c.VocabularyBase[i].CiPinYin).find(s1)!= s1.npos)
break;
}
front=i;
//寻找最后一个匹配
for(i=back;i>front;i--)
{
if((c.VocabularyBase[i].CiPinYin).find(s1)!= s1.npos)
break;
}
back=i;
vector<VListNode> v;
for(int i=front;i<=back;i++)
{
v.push_back(c.VocabularyBase[i]);
}
vector<VListNode>::iterator it;
set<string>::iterator it2;
int count=0;
for(it=v.begin();it!=v.end();it++)
{
for(it2=(*it).CiYu.begin();it2!=(*it).CiYu.end();it2++)
/* if(*it2=="苏州")
*/
// gotoxy(20, 10);
cout<<*it2<<" ";
}
cout<<endl;
}
}
getch();
return 0;
}