词语输入法

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

posted @ 2012-10-16 20:24  MFT  阅读(239)  评论(0编辑  收藏  举报