十六周任务三---字典

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生 
* All rights reserved.
* 文件名称:电子词典          
* 作    者:   张艳明                      
* 完成日期:2012   年   06   月   06 日
* 版 本 号: 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;  
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值