最近在学习文件操作,在网上也找了许多相关的资料,其中对我帮助最大的是贺利坚老师的博客,我也一直通过看贺利坚老师的博客学习C++,对于C++初学者,我向大家推荐贺利坚老师的博客,里面有视频教程和一些非常经典的习题
贺利坚老师的博客地址http://blog.csdn.net/sxhelijian/article/details/7910565
我的这个英汉字典也是博客中一道习题 习题 http://blog.csdn.net/sxhelijian/article/details/9094735
在写代码前首先需要一个dictionary.txt文件,dictionary.txt文件中包含了按照字母的顺序排列的单词,还有单词的解释和词性 dictionary.txt文件下载地址 http://download.csdn.net/detail/u010105970/7861937
在查找单词时会用到二分法,二分法介绍 http://blog.csdn.net/u010105970/article/details/25413401
首先定义一个Word类(单词类)
class Word//单词类
{
public:
void set(string e, string c, string wc);//初始化单词类
int compare(string str);//英语部分与给定字符串比较,等于返回,大于返回1,小于返回-1
void display();//显示单词
private:
string english;//英语词汇
string chinese;//中文意思
string word_class;//词性
};
完成成员函数的功能
//初始化单词类
void Word::set(string e, string c, string wc)
{
english = e;
chinese = c;
word_class = wc;
}
//比较单词
int Word::compare(string str)
{
if(str > english)
{
return 1;
}
else if(str == english)
{
return 0;
}
else
{
return -1;
}
}
//显示单词
void Word::display()
{
cout<<english<<"\t"<<word_class<<"\t"<<chinese<<endl<<endl;
}
定义一个函数用于查找单词
//使用二分法查找单词
int SearchWord(int low, int high, Word *w, string k)
{
int midle = (low + high) / 2;//计算中间值
//退出循环的条件是low>high或者找到了
while(low <= high)
{
if(w[midle].compare(k) > 0)//当查找的单词在数组的右端
{
low = midle + 1;//将最小值得下标移到中间值的下标的后一位
}
else if(w[midle].compare(k) < 0)//当查找的单词在数组的左端
{
high = midle - 1;//将最大值的下标移到中间值的下标的前一位
}
else
{
return midle;//返回对象数组中单词的下标
}
midle = (low + high) / 2;//计算中间值
}
return -1;
}
程序的全部代码
#include <fstream>
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
class Word//单词类
{
public:
void set(string e, string c, string wc);//初始化单词类
int compare(string str);//英语部分与给定字符串比较,等于返回,大于返回1,小于返回-1
void display();//显示单词
private:
string english;//英语词汇
string chinese;//中文意思
string word_class;//词性
};
//初始化单词类
void Word::set(string e, string c, string wc)
{
english = e;
chinese = c;
word_class = wc;
}
//比较单词
int Word::compare(string str)
{
if(str > english)
{
return 1;
}
else if(str == english)
{
return 0;
}
else
{
return -1;
}
}
//显示单词
void Word::display()
{
cout<<english<<"\t"<<word_class<<"\t"<<chinese<<endl<<endl;
}
//使用二分法查找单词
int SearchWord(int low, int high, Word *w, string k)
{
int midle = (low + high) / 2;//计算中间值
//退出循环的条件是low>high或者找到了
while(low <= high)
{
if(w[midle].compare(k) > 0)//当查找的单词在数组的右端
{
low = midle + 1;//将最小值得下标移到中间值的下标的后一位
}
else if(w[midle].compare(k) < 0)//当查找的单词在数组的左端
{
high = midle - 1;//将最大值的下标移到中间值的下标的前一位
}
else
{
return midle;//返回对象数组中单词的下标
}
midle = (low + high) / 2;//计算中间值
}
return -1;
}
void main()
{
Word W[8000];//定义一个存放8000个单词的对象数组
int sizeWord = 0;//用于记录文件中单词的个数
string e;//英语词汇
string c;//中文意思
string wc;//词性
int i = 0;//用于循环
string key;//需要查找的英语单词
//将文件中的数据读入到程序中
ifstream infile("dictionary.txt", ios::in);
if(!infile)
{
cout<<"文件打开失败,程序终止!\n";
exit(0);
}
while(!infile.eof())
{
//将文件中的数据输到变量中
infile>>e>>c>>wc;
//将数据输到对象数组中
W[i].set(e, c, wc);
i++;
}
sizeWord = i;//得到文件中单词的个数
while(1)
{
cout<<"请输入待查询的关键词(英文),输入0结束:";
cin>>key;
if("0" != key)
{
//使用二分法查找单词
int flag = SearchWord(0, sizeWord-1, W, key);
if(-1 == flag)
{
cout<<"没有找到你的单词"<<endl<<endl;
}
else
{
W[flag].display();
}
}
else
{
cout<<"谢谢你使用本字典"<<endl<<endl;
break;//退出循环
}
}
system("pause");
}
测试程序
程序的执行结果
查找acid的意思
查找不存在的单词 aa
退出程序