第14周项目4-电子词典

/*   
* Copyright (c) 2014, 烟台大学计算机学院   
* All rights reserved.   
* 文件名称:test.cpp   
* 作    者:刘畅   
* 完成日期:2014 年 11  月  30  日   
* 版 本 号:v1.0   
*   
* 问题描述:做一个简单的电子词典。在文件dictionary.txt中,保存的是英汉对照的一个词典。编程序,将文件中的内容读到两个数组e[ ]和c[ ]中,分别代表英文和中文,由用户输入英文词,显示中文意思。运行程序后,支持用户连续地查词典,直到输入“0000”结束;
* 输入描述:输入英文单词;   
* 程序输出:输出中文意思。

(1)普通版:

#include <fstream>
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
const int num=8000;
int main()
{
    string e[num],c[num],key;
    int i=0;
    ifstream infile("dictionary.txt",ios::in);
    if (!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    while (infile>>e[i]>>c[i])
    {
        i++;
    }
    infile.close();
    cout<<"当输入后没有输出时,可能词典中查无此词。"<<endl;
    do
    {
        cout<<"请输入要查找的词(0000结束):";
        cin>>key;
        if (key=="0000")
            break;
        for (i=0; i<num; ++i)
        {

            if (e[i]==key)
                cout<<"“"<<e[i]<<"的中文意思是:"<<c[i]<<endl;
        }
        cout<<endl;
    }
    while (1);
    return 0;
}
运行结果:


(2)二分法版:

#include <fstream>
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
const int num=8000;
int i=0;
string e[num],c[num];
int BinarySearch(int max,int min,string key);
int main()
{
    string key;
    ifstream infile("dictionary.txt",ios::in);
    if (!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    while (infile>>e[i]>>c[i])
    {
        ++i;
    }
    infile.close();
    do
    {
        cout<<"请输入要查的词(0000结束):";
        cin>>key;
        if (key=="0000")
            break;
        else
        {
            int max=i-1,min=0;
            int result;
            result=BinarySearch(max,min,key);
            if (result==-1)
                cout<<"查无此词"<<endl;
            else
                cout<<"“"<<key<<"“的中文意思是:"<<c[result]<<endl;
        }
        cout<<endl;
    }
    while (1);
    return 0;
}

int BinarySearch(int max,int min,string key)
{
    int median;
    while (min<=max)
    {
        median=(max+min)/2;
        if (e[median]==key)
        {
            return median;
        }
        else if (e[median]>key)
                     max=median-1;
        else
            min=median+1;
    }
    return -1;
}

运行结果:

知识点总结:

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

学习心得:

这两天真的是有些荒废了,想要编程却没有感觉,突然听到室友说某某这周的任务都已经做完了,才感觉到压力开始付诸行动,处理文件上又出了点问题,同时如果查找不到的话显示查无此词的代码始终插不进程序去,只好取了个巧,在程序运行前面提示如果没有输出的话则为查无此词;写完原版后,才发现学案题目后面提示我们用二分查找法,又花费时间去百度了解什么是二分查找法,在借鉴老师的代码的帮助下,总算是搞定了。

   

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值