/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2012, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:字典(二分查找)
* 作 者: 刘镇
* 完成日期: 2012 年 06 月 05日
* 版 本 号: 1.078
* 对任务及求解方法的描述部分
* 输入描述: ......
* 问题描述: ......
* 程序输出: ......
* 程序头部的注释结束
*/
#include<fstream>
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
class Dictionary
{
public:
void write_dictionary(ifstream & in);
string get_e();
string get_c();
string get_w();
private:
string e;
string c;
string w;
};
void Dictionary::write_dictionary(ifstream & in)
{
in >> this->e >> this->c >> this->w;
}
void writefile(Dictionary * d, int num)
{
ifstream infile( "dictionary.txt", ios::in );
if(!infile)
{
cerr << "open error" << endl;
exit(1);
}
for(int i = 0; i < num; ++i)
{
d[i].write_dictionary(infile);
}
infile.close();
}
string Dictionary::get_e()
{
return this->e;
}
string Dictionary::get_c()
{
return this->c;
}
string Dictionary::get_w()
{
return this->w;
}
void search(Dictionary * d, int num)
{
string find_word;
do
{
int low = 0;
int mid = 0;
int high = num - 1;
bool flag = false;
cout << "请输入您要查找的英文单词: " << endl;
cin >> find_word;
while(low <= high)
{
mid = (low + high) / 2;
if(d[mid].get_e() == find_word)
{
cout << d[mid].get_e() << '\t';
cout << d[mid].get_w() << '\t';
cout << d[mid].get_c() << endl;
flag = true;
break;
}
if(d[mid].get_e() < find_word)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
if(flag == false && find_word != "0000")
{
cout << "未找到该单词!" << endl;
}
}while(find_word != "0000");
}
int main()
{
Dictionary dic[8000];
string find_word;
writefile(dic, 8000);
search(dic, 8024);
system("pause");
return 0 ;
}
运行结果:与上篇博文无太大差别
缺点:不知道为啥要在search()中数字为8024
心得体会:
二分查找当初在做上学期题目的字典时觉得是挺麻烦的,但是经过下学期的提高,真的感觉到理解能力提高了,在百度上打上二分查找,读一段代码,即可解决问题。用书面语言讲就是折半法,将你所用的分段查找,精确定位,省去了要从头找到位的麻烦。但由于实现排序,才能实现分割,也带来了不便于插入的缺点。
提供我学习的一个代码(重在体会):http://wenku.baidu.com/view/4632e62acfc789eb172dc836.html
感言:
这个问题就只有几个难点:二分查找算一个(较简单),对类的处理数据成员(三个字符串数组)一个,文件读入一个(将其做成函数)