代碼:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int i,t,j;
FILE * p; //用於文件打開的指針
char a[8010][88]; //存放7989個英文和漢語,每個單詞及其它的註釋集中在一個串
char b[8010][88]; //僅存放英文單詞(提取於a字符串)
char c[88],d; //存放待查找的英文單詞
int first=1,last=7989,y; //用於二分查找的定位
if((p=fopen("dictionary.txt","r"))==NULL) //以僅讀的方式開記錄單詞及其註釋的文本文件
{
printf("not find the dictionary!\n");
exit;
}
printf("請輸入需要查找的單詞(0000結束):\n"); //輸入提示
for(i=1;i<=7989;i++) //從文件中錄入單詞及其註釋
fgets(a[i],80,p);
for(i=1;i<=7989;i++) //從a字符串中提取b字符串
{
j=0;
while(a[i][j]!=' ')
{
b[i][j]=a[i][j];
j++;
}
b[i][j]='\0';
}
while(1) //多次查找,通過循環內判斷,break結束程序
{
scanf("%s",c); //從鍵盤獲得待查找的單詞
if(strcmp(c,"0000")==0) //判斷輸入,是否結束程序
break;
first=1,last=7989; //二分法開始
y=(first+last)/2;
while(1)
{
if(strcmp(c,b[y])==0) //找到該單詞
{
printf("\""); //格式化輸出
for(i=0;a[y][i]!='\0';i++)
{
if(a[y][i-1]==' '&&a[y][i]==' ')
continue;
printf("%c",a[y][i]);
if(a[y][i-1]!=' '&&a[y][i]==' '&&a[y][i+1]==' ')
printf("\"的中文意思是:");
}
break; //輸出註釋後即可結束該單詞的查找
}
if(strcmp(c,b[y])>0) //如果待查找的單詞與中間單詞比較大,就查找後半部分
first=y+1;
else if(strcmp(c,b[y])<0) //如果待查找的單詞與中間單詞比較小,就查找後半部分
last=y-1;
y=(first+last)/2;
if(first>last) //如果尋找完成一遍且並沒有找到單詞,給出提示並結束高單詞的查找
{
printf("詞典中未找到這個單詞!\n");
break;
}
}
}
fclose(p); //關閉文件
return 0;
}
注:
文件操作:(同一根目錄下dictiona.txt,大約8000個單詞)
測試運行: