/*
* 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;
}
运行结果:
知识点总结:
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
学习心得:
这两天真的是有些荒废了,想要编程却没有感觉,突然听到室友说某某这周的任务都已经做完了,才感觉到压力开始付诸行动,处理文件上又出了点问题,同时如果查找不到的话显示查无此词的代码始终插不进程序去,只好取了个巧,在程序运行前面提示如果没有输出的话则为查无此词;写完原版后,才发现学案题目后面提示我们用二分查找法,又花费时间去百度了解什么是二分查找法,在借鉴老师的代码的帮助下,总算是搞定了。