题目描述
做一个简单的电子词典。在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文与释义间用’\t’隔开。编程序,将文件中的内容读到两个数组English[]和Chinese[]中,分别代表英文和中文,由用户输入英文词,显示中文意思。运行程序后,支持用户连续地查词典,直到输入“0000”结束,如图:
提示:文件中的词汇已经排序,故在查找时,用二分查找法提高效率。
/*烟台大学计算机学院 2016
作者: 马春澎
完成日期:2017年1月4日 */
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
char English[8000][20],Chinese[8000][24];//用于从文件中读入的英文数组和中文数组
int num;//实际词汇总数
int binary_search(int first,int last,char *word);//二分查找
int main()
{
int count1=0,count2=0;
char word[20];//查找单词
FILE *fp;
fp=fopen("dictionary.txt","r");//以只读的方式打开文件
if(fp==NULL)//测试文件是否打开成功
{
printf("文件打开失败\n");
exit(-1);
}
while(fscanf(fp,"%s%s",English[num],Chinese[num])!=EOF)//读取成功,重复从文件中读
{
num++;//计算单词总数
}
fclose(fp);
printf("********************欢迎使用********************\n\n");
do
{
printf("请输入您要查找的单词(输入0000退出)\n");
scanf("%s",word);//输入单词进行查找
if(strcmp(word,"0000")==0)
break;
else
{
int index=-1,first=0,last=num-1;//查找的上下界
index=binary_search(first,last, word);
if (index == -1)
{
printf("查无此词!\n\n");
count1++;
printf("您已查找本词典内没有的词%d次(如果您输入五次词典中没有的词系统将自动退出)\n",count1);
printf("************************************************\n\n");
}
else
{
count2++;
printf("%s 的中文意思是:%s\n\n", word, Chinese[index]);
printf("您已成功查找%d次\n",count2);
printf("************************************************\n\n");
}
}
if(count1==5)
break;
}
while(1);
printf("***************** 感谢您的使用 ******************");
return 0;
}
/*************************************************************
功能描述:二分查找,查找文件中单词所在的位置
输入参数:first—查找的起始位置
last—查找的终止位置
word—需要查找的单词
返 回 值:mid—要查找的单词所在的位置
其他说明:无
*************************************************************/
int binary_search(int first,int last,char *word)//二分查找
{
int mid;
while(first<=last)//第一个位置大于等于最后一个位置时跳出循环
{
mid=(first+last)/2;//找中间位置
if(strcmp(English[mid],word)==0)//找到了
return mid;//查找成功并返回
if(strcmp(English[mid],word)>0)//将在前半段继续查找
last=mid-1;
else //在后半段查找
first=mid+1;
}
return -1;//表示查不到这个词
}
输入 about
输出 about的中文意思是:prep.关于,大约
输入 ade
输出 查无此词!
输入五次 ade 系统自动退出
运算结果
知识点总结
文件的打开的应用,二分查找的应用
学习心得
以前没有使用过打开文件,通过这个程序认识到文件的方便,以后要熟练的应用。