`
java-mans
  • 浏览: 11390915 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
/* (程序头部注释开始)
* 程序的版权和版本声明部分
* 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.自我感觉还是直接用字符串从头到尾比较好一点,虽然效率有点低。


分享到:
评论

相关推荐

    大、小断层矿井小波SVM融合智能故障预测matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    垂直SeekBar(拖动条).zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    libADLMIDI1-1.5.0-bp153.1.1.x86-64.rpm

    libADLMIDI1-1.5.0-bp153.1.1.x86_64.rpm 是用于在 x86_64 架构的设备上安装的 RPM 包,具体功能如下: 名称:libADLMIDI1 版本:1.5.0 摘要:带有 OPL3 (YMF262) 模拟器的软件 MIDI 合成器库 许可证:GPL-3.0-only 和 LGPL-3.0-only 该库提供了一个基于 ADLMIDI 的软件 MIDI 合成器,它模拟了 OPL3 音源芯片(FM 合成)。它可以通过使用 ADLMIDI 库来实现多平台的 MIDI 播放和 OPL3 模拟。 该 RPM 包适用于 x86_64 架构,用于在相关设备上安装 libADLMIDI1 库文件。库文件包括: /usr/lib64/libADLMIDI.so.1 和 /usr/lib64/libADLMIDI.so.1.5.0:库文件 /usr/share/doc/packages/libADLMIDI1/AUTHORS、/usr/share/doc/packages/libADLMIDI1/README.md 等文档文件:文档文件

    基于qt+C++实现u盘插拔检测.+源码(毕业设计&课程设计&项目开发)

    基于qt+C++实现u盘插拔检测.+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于qt+C++实现u盘插拔检测.+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于qt+C++实现u盘插拔检测.+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于qt+C++实现u盘插拔检测.+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~

    Quectel_Product_Brochure_CN_V7.9.pdf

    Quectel_Product_Brochure_CN_V7.9.pdf

    更换软件主题(apk方式).zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    chepai-reg-main (2).zip

    phpstudy

    Python 入门详细教程-1天学会 Python.docx

    python入门

    二维码扫描的实现.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    移动机器人机械臂的设计开题报告.doc

    移动机器人机械臂的设计开题报告.doc

    基于QT+C++开发的智能平台访客系统+源码

    用法链接:https://menghui666.blog.csdn.net/article/details/137977678?spm=1001.2014.3001.5502 基于QT+C++开发的智能平台访客系统+源码,包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 基于QT+C++开发的智能平台访客系统+源码,包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 基于QT+C++开发的智能平台访客系统+源码,包含主界面、系统设置、警情查询、调试帮助、用户退出功能。

    三菱机械臂校点说明.pptx

    三菱机械臂校点说明.pptx

    按字母索引滑动.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    激光推送客户端demo.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    c语言入门,小白进军C语言.zip

    C语言诞生于美国的贝尔实验室,由丹尼斯·里奇(Dennis MacAlistair Ritchie)以肯尼斯·蓝·汤普森(Kenneth Lane Thompson)设计的B语言为基础发展而来,在它的主体设计完成后,汤普森和里奇用它完全重写了UNIX,且随着UNIX的发展,c语言也得到了不断的完善。为了利于C语言的全面推广,许多专家学者和硬件厂商联合组成了C语言标准委员会,并在之后的1989年,诞生了第一个完备的C标准,简称“C89”,也就是“ANSI C”,截至2020年,最新的C语言标准为2018年6月发布的“C18”。 [5] C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。

    Python入门到精通.zip

    python入门 单元测试和测试用例 Python标准库中的模块unittest提供了代码测试工具。 单元测试用于核实函数的某个防霾呢没有问题; 测试用例是一组单元测试,这些单元测试仪器一起核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种收入,包含所有针对这些情形的测试。 全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。 对于大型项目,要实现全覆盖可能很难。通常,最初只要对针对代码的重要行为编写测试即可,等项目给广泛使用时再考虑全覆盖。 可通过的测试 创建测试用例的语法需要一段时间才能习惯,但测试用例创建后,再添加针对函数的单元测试就很简单了。要为函数编写测试用例,可先导入模块unittest以及要测试的函数,在创建一个继承unittest.TestCase的类,并编写一系列方法对函数行为的不同方面进行测试。 下面test_name_function.py一个只包含一个方法的测试用例,它检查函数get_formatted_name()在给定名和姓时能否正确的工作。

    基于matlabbenders分解算法.zip

    基于matlabbenders分解算法.zip

    dsp工程设计讲座.ppt

    dsp工程设计讲座.ppt

    Adams空间复杂机械臂动力学仿真研究.doc

    Adams空间复杂机械臂动力学仿真研究.doc

    基于Android+OpenCV的车牌识别系统源码+使用文档+全部资料(优秀项目).zip

    【资源说明】 基于Android+OpenCV的车牌识别系统源码+使用文档+全部资料(优秀项目).zip基于Android+OpenCV的车牌识别系统源码+使用文档+全部资料(优秀项目).zip基于Android+OpenCV的车牌识别系统源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

Global site tag (gtag.js) - Google Analytics