英汉字典

最近在学习文件操作,在网上也找了许多相关的资料,其中对我帮助最大的是贺利坚老师的博客,我也一直通过看贺利坚老师的博客学习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


退出程序



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值