第十六周实验--任务3--做一个词汇量近8000 个的电子词典--使用二分查找法提高效率

来源:互联网 发布:sql数据挖掘教程 编辑:程序博客网 时间:2024/06/05 15:37
/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生 
* All rights reserved.
* 文件名称:电子词典          
* 作    者:雷恒鑫                              
* 完成日期:2012   年   06   月   02     日
* 版 本 号: V1.0         
* 对任务及求解方法的描述部分
* 输入描述:。将文件中的内容读到对象数组中,由用户输入英文词。
* 问题描述: 做一个简单的电子词典。在文件dictionary.txt 中,保存的是英汉对照的一个词典,词汇量近8000 个,
英文、中文释义与词性间用’\t’隔开。建一个表示词条的类Word,Word 类的一个对象可以描述一个词,
类对象数组可以存储词库。
* 程序输出:显示中文释义。 
* 程序头部的注释结束

*/

#include<iostream>    #include<fstream> #include<string>#include<iomanip>using namespace std; int min(int a,int b);class Word  {  public:  Word();Word(string word,string word_meaning,string word_type);void set_word(string word);void set_word_meaning(string word_meaning);void set_word_type(string word_type);string get_word();string get_word_meaning();string get_word_type();    //friend ostream& operator << (ostream&,Word&); //重载流插入运算符“<<”  ;*/private:             string word;string word_meaning;string word_type;};void input_word(Word  s[]);Word search(string word,Word w1[]);int main()  {  Word w1[8000],w2;bool key=1;string word;input_word(w1);while(key==1){cout<<"请输入您要查找的单词:";cin>>word;w2=search(word,w1);cout<<"您要查找单词的意思为:"<<w2.get_word_meaning()<<'\t'<<w2.get_word_type()<<endl;cout<<"若想继续查词请按1,结束查词请按0!";cin>>key;}system("PAUSE");      return 0;  }int min(int a,int b){if(a>b)a=b;return a;}Word::Word(){word="unknow";word_meaning="unknow";word_type="unknow";}Word::Word(string word,string word_meaning,string word_type){this->word=word;this->word_meaning=word_meaning;this->word_type=word_type;}void input_word(Word s[])  {      int i=0; string word;string word_meaning;string word_type;ifstream infile("dictionary.txt",ios::in);if (!infile){cerr<<"open error!"<<endl;exit(1);}for (i=0;i<8000;i++){infile>>word;s[i].set_word(word);infile>>word_meaning;s[i].set_word_meaning(word_meaning);infile>>word_type;s[i].set_word_type(word_type);}infile.close();//cout<<endl;}void Word::set_word(string word){this->word=word;}void Word::set_word_meaning(string word_meaning){this->word_meaning=word_meaning;} void Word::set_word_type(string word_type){this->word_type=word_type;}string Word::get_word(){return word;}string Word::get_word_meaning(){return word_meaning;}string Word::get_word_type(){return word_type;}Word search(string word,Word w1[]){Word w2,w3[8000];for(int h=0;h<8000;++h)w3[h]=w1[h];int i=0;int a=0,b=0,c;w2.set_word(word);string s1,s2,s3,s4;int low=0,high=7962,mid;s1=w1[low].get_word();s2=w1[high].get_word();s4=w2.get_word();mid=(low+high)/2;s3=w1[mid].get_word();while(low<=high){a=word.size();b=s3.size(); c=min(a,b);if(s3==word)return w1[mid];else if(a==b){for (i = 0;i<a; ++i)  {  if(s3[i]!=s4[i]){if(s3[i]<s4[i]){low=mid+1;break;}else{high=mid-1;break;}}}if(s3==s4){return w1[mid];}}else if(a!=b){for (i = 0;i<c; ++i)  {  if(s3[i]!=s4[i]){if(s3[i]<s4[i]){low=mid+1;break;}else{high=mid-1;break;}}if(i==(c-1)){if(s3[i-1]==s4[i-1]){high=mid-1;}}}}mid=(low+high)/2;s1=w3[low].get_word();s2=w3[high].get_word();s3=w3[mid].get_word();}cerr<<"很遗憾,查无此词!";exit(1);return w2;}

运行结果:




经验积累:

1.自我感觉还是直接用字符串从头到尾比较好一点,虽然效率有点低。


原创粉丝点击