1、 课程设计(论文)课 题: 电子英汉词典的编程 学 院:专 业:学生姓名:学 号: 指导老师 : 目录*内容摘要.3*关键词.31、电子英汉词典的编程设计.4( 1 )、编辑任务与要求4(2)、编程过程.4A、方案设计.4总流程图.4B、程序的编写,及功能实现.5B.1 全局变量的定义.5B.2 二维数组的定义.5B.3 词条文本库中数据个数的探测.5B.4 词条录入.5B.5 信息显示.9B.6 词条修改.10B.7 词条删除.13B.8 单词查询.17B.9 信息保存.19C、程序调试过程中出现的问题,以及解决方法.222、总结收获、体会.243、谢辞.244、参考文献.245、源代码25
2、*内容摘要随着日益进步的科学技,那种纸质的英汉词典应经成为过去。现代的电子英汉词典兼容了携带方便,使用便捷,词库及时更新,数据量庞大等优点。本次实验设计利用对二维数组中数据的添加,显示,查找,删除,修改,排序和保存实现了电子英汉词典中添加,显示,查找,删除,修改和保存单词的功能,让我们初步认识了电子英汉词典的工作原理以及设计要求。*关键词:词条录入,信息显示,词条修改,词条删除,单词查询,信息保存。(1)、编程任务与要求:电子英汉词典的设计要求是:实现简单的电子英汉词典的功能,具体管理操作包括:单词的添加,显示,查找,删除,修改和保存。(1) 使用结构体数组实现,每个数组的结构应包括:单词的英
3、文拼写,单词的中文释义。(2) 系统功能a 词条录入:即添加单词记录。b 信息显示:将所有的单词俺字母顺序显示。c词条修改:对已经输入的单词信息进行修改。d 词条删除:删除某个单词记录。e单词查询:输入单词英文拼写,输出该单词的中文释义。f 信息保存:将词条信息保存到文件。g 退出系统。(2)编程过程 A、 方案设计:总流程图:电子英汉词典scanf(%d,&j);j=1j=7j=6j=5j=4j=3j=2退出系统信息保存单词查询词条删除词条修改信息显示词条录入A、B、程序的编写B.1全局变量的定义:在编程中需要用到许多变量,为了不用反复定义变量,我们需要定义全局变量。全局变量的定义如下:in
4、t i=0,j,m,k,N,a,b,c; /定义全局变量char temp20,dsq20,tabl2020; char word1200,word2200;FILE *p; /定义指针变量B.2 二维数组的定义:根据要求,电子英汉词典中应该包含英语单词和中文解释。这应我们就需要定义一个二维数组来存储英文单词和中文释义。定义的二维数组如下:char table200200=apple,苹果,buy,购买,cat,猫,dog,狗,end,结束,fat,肥胖,good,好,hello,你好,job,事业;B.3 词条文本库中数据个数的探测:在文本储存中,如果不对已存在文件的个数进行探测,那么在进行
5、读写操作的时候就会浪费大量内存,以及给往后的各种操作增加难度与运行时间。故,对已存在的数据个数进行探测是很必要的。loop0:N=0;printf(请输入您所需要进行的操作代号:n);p=fopen(danciku.txt,r+);while(!feof(p)fread(&tablei,20,1,p);N+;N=N-1; /输出N为已存在的数据个数 if(N!=0) /如果N不等于0,进行菜单操作printf(/*当前单词库单词个数 N=%d*/n,N/2);scanf(%d,&j);else /如果N=0,则自动保存程序中table200200的数据goto loop6;B.4 词条录入根据
6、要求,我们需要对单词库进行新单词的录入,为了不出现重复录入,我们还需要将准备录入的单词与单词库中的单词进行对比。最后将录入的单词与单词库里的单词进行排序后,再存入文本词库中。流程图:词条录入打开文本,从文本词库中提取词条到tablei中后,关闭文本输入准备录入的词条词库中是否存在是否排序写入文本录入成功是否继续录入是否返回主菜单具体程序如下:loop1:p=fopen(danciku.txt,r+); /打开文本文档,进行读写操作for(i=0;iN;i+)fread (&tablei,20,1,p); /读取文本词库中的单词fclose(p);printf(请输入单词:n); /输入准备录入
7、的单词scanf(%s,tableN);for(i=0;iN;i+=2) if( strcmp(tableN,tablei)=0) /判断词库中是否已存在此单词printf(帅锅,此单词已存在喔!n);break;if(i=N-2 & strcmp(tableN,tablei)!=0) /printf(请输入意思:n);scanf(%s,&tableN+1); / 输入准备录入的中文释义for(i=0;i=N;i+=2) k=i; /排序for(j=i+2;j0) k=j;if(k!=i) strcpy(temp,tablei);memset(tablei,0,20); /清空tablei中的
8、数据strcpy(tablei,tablek);memset(tablek,0,20);strcpy(tablek,temp);memset(temp,0,20);strcpy(dsq,tablei+1);memset(tablei+1,0,20);strcpy(tablei+1,tablek+1);memset(tablek+1,0,20);strcpy(tablek+1,dsq);memset(dsq,0,20);p=fopen(danciku.txt,r+); /打开文本库,将排序好的单词写入文库for(i=0;i=N+1;i+)fwrite(&tablei,20,1,p);fclose
9、(p);printf(帅锅,词条录入成功啦!n); fclose(p); /关闭文本库printf(继续录入,请按 1,退出录入进行其他操作请按 0,退出程序请按 7 !n);scanf(%d,&a);if(a=1)goto loop1; /继续录入if(a=0)goto loop0; /返回主菜单程序调试:B.5信息显示按要求,我们需要对文本词库中的单词进行显示,利用前面的对文本词库的读写操作,就可以轻松的显示文本词库中的单词。信息显示流程图:打开文本,从文本词库中提取词条到tablei中后,关闭文本显示词条及其中文释义是否继续显示是返回主菜单否具体程序如下:else if(j=2)loop
10、2: p=fopen(danciku.txt,r+); /打开文本词库for(i=0;iN;i+)fread (&tablei,20,1,p); /读取文本词库中的单词及其中文释义for(i=0;iN;i+=2) /显示文本词库中的单词及其中文释义printf( %s 中文释义:%s n, tablei,tablei+1);fclose(p);printf(继续显示,请按 1,退出显示进行其他操作请按 0,退出程序请按 7 !n);scanf(%d,&a);if(a=1)goto loop2; /继续显示if(a=0)goto loop0; /返回主菜单程序调试: B.6 词条修改 按要求,我
11、们需要完成对词库中的单词进行修改,以完善词库。要想对文本词库中的单词进行修改,我们需要对词库中的数据进行读取,然后执行修改操作,修改完成后再将所有单词从新排序后写入文本词库。词条修改流程图:打开文本,从文本词库中提取词条到tablei中是否存在准备修改的单词否是修改该词条以及中文释义是否继续修改是返回主菜单否具体程序如下:else if(j=3)loop3: p=fopen(danciku.txt,r+); /打开文本词库for(i=0;iN;i+)fread (&tablei,20,1,p); /读取文本词库中的所有单词fclose(p);printf(请输入单词:); /输入需要修改的单词
12、scanf(%s,word1);for(i=0;iN;i+=2) /查找词库中是否存在次单词if(strcmp(tablei,word1)=0) /词库中存在次单词,进行下面修改操作c=i;printf(单词库中: %s 中文释义: %sn,tablei,tablei+1); /输出词库中需要修改的单词printf(确认修改请输入 1 ,退出修改请输入 0 !n);scanf(%d,&b);if(b=1) printf(请输入修改后的英语单词:); scanf(%s,word1); printf(请输入需要修改的单词释义:); scanf(%s,word2);memset(tablec,0,2
13、0); /清空tablec中的数据strcpy(tablec,word1);memset(tablec+1,0,20);strcpy(tablec+1,word2);for(i=0;i=N;i+=2) /对所有单词进行排序 k=i;for(j=i+2;j0) k=j;if(k!=i) strcpy(temp,tablei);memset(tablei,0,20);strcpy(tablei,tablek);memset(tablek,0,20);strcpy(tablek,temp);memset(temp,0,20);strcpy(dsq,tablei+1);memset(tablei+1,
14、0,20);strcpy(tablei+1,tablek+1);memset(tablek+1,0,20);strcpy(tablek+1,dsq);memset(dsq,0,20);p=fopen(danciku.txt,r+);for(i=0;iN;i+) fwrite(&tablei,20,1,p); /将排好序后的单词写入文本词库fclose(p);printf(靓女,词条修改成功了哦!n);break;if(b=0)goto loop0;if(i=N-2)printf(帅锅,字典中木有此单词啊!n);printf(继续修改,请按 1,退出修改进行其他操作请按 0,退出程序请按 7 !
15、n);scanf(%d,&a);if(a=1)goto loop3; /继续对文本词库中的单词进行修改if(a=0)goto loop0;程序调试:B.7词条删除 按要求,我们需要对文本词库中的单词进行删除操作,其删除原理为:先清空需要删除词条所在的数组1,然后将其后一个数组2中的数据复制给数组1,在清空数组2,将数组3的数据复制给数据2.循环操作,最后在执行保存即可。词条删除流程图:打开文本,从文本词库中提取词条到tablei中输入准备删除的单词词库中是否存在此单词否是是否删除此单词否是删除成功是否继续删除是否返回主菜单具体程序段如下:else if(j=4)loop4:printf(现已存
16、在的单词以及其中文解释:nn);p=fopen(danciku.txt,r+);for(i=0;iN;i+)fread(&tablei,20,1,p); /读取文本词库中的词条,付给tableiprintf(%st,tablei);fclose(p);printf(nn);printf(请输入单词:); scanf(%s,tabl0);for(i=0;iN;i+=2)if(strcmp(tablei,tabl0)=0 & i!=N-2) /文本词库中存在此单词且不为最后一个单词,是否执行删除操作printf(%s 中文释义: %sn,tablei,tablei+1);printf(确认删除请输
17、入 1 ,退出删除请输入 0 !n);scanf(%d,&b);if(b=1) /删除词条int c=i;for(c=i;cN-2;c+)memset(tablec,0,20);strcpy(tablec,tablec+2);memset(tablec+1,0,20);strcpy(tablec+1,tablec+3);p=fopen(danciku.txt,w); /清空文本fclose(p);p=fopen(danciku.txt,r+);for(c=0;cN-2;c+)fwrite(&tablec,20,1,p);/将删除后的词库存入文本printf(词条删除成功!n);fclose(p
18、);break;if(strcmp(tablei,tabl0)=0 & i=N-2) /文本词库中存在此单词,且为最后一个单词,是否进行删除操作 printf(%s 中文释义: %sn,tablei,tablei+1);printf(确认删除请输入 1 ,退出删除请输入 0 !n);scanf(%d,&b);if(b=1)p=fopen(danciku.txt,w); /清空文本fclose(p);p=fopen(danciku.txt,r+);for(i=0;iN-2;i+)fwrite(&tablei,20,1,p); /将删除后的词库写入文本fclose(p);printf(词条删除成功
19、!n);break;if(strcmp(tablei,tabl0)!=0 & i=N-2)printf(词库中没有此单词,无需删除!n);printf(继续删除,请按 1,退出删除进行其他操作请按 0,退出程序请按 7 !n);scanf(%d,&a);if(a=1)goto loop4; /继续删除if(a=0)goto loop0;程序调试:B.8单词查询 按要求,我们需要进行对词库中词条的查询,利用strcmp()函数,我们可以轻松的完成查询操作。流程图:单词查询打开文本,从文本词库中提取词条到tablei中输入查询的单词词库中是否存在此单词否是输出此单词及其中文释义是否继续查询是否返回
20、主菜单具体程序如下:else if(j=5)loop5:p=fopen(danciku.txt,r+);for(i=0;iN;i+)fread(&tablei,20,1,p);/词库读取fclose(p);printf(请输入单词:);scanf(%s,tabl0);for(i=0;i=N;i+=2)if(strcmp(tablei,tabl0)=0) /词条查询成功printf(%s ,tablei);printf(中文释义 : );printf(%s ,tablei+1);printf(n);break;if(i=N+2)printf(字典中木有此单词!n);printf(继续查询,请按
21、1,退出查询进行其他操作请按 0,退出程序请按 7 !n);scanf(%d,&a);if(a=1)goto loop5; /继续查询if(a=0)goto loop0;程序调试:B.9 信息保存 按要求,当文本词库中没有词条时,我们需要对程序中在的词条存入文本。利用fwrite()函数就可以轻松完成保存操作。流程图:信息保存词库中是否存在单词是否保存词库到文本返回主菜单具体程序如下:else if(j=6)loop6:if(N=0) /如果文本为空,自动执行保存操作p=fopen(danciku.txt,r+);for(i=0;i18;i+)fwrite(&tablei,20,1,p);fc
22、lose(p);printf(信息保存成功!n);goto loop0;Else /如果文本中存在词库,直接返回主菜单printf(数据已经保存,无需再保存!nn);goto loop0;程序调试:C、程序调试过程中出现的问题,以及解决方法。 C.1问题:在调用系统函数strcmp()对数组中数据的复制的时候会出现覆盖不完全而留下的残留项,如下:删除apple前:删除apple后:发现buy只有3个字节,apple有5个字节,buy无法全部覆盖apple而残留le项(buyle),使数据出现错误。解决方法:调用系统函数memset()就可以轻松的解决问题,其memset()的作用在于:清空数组
23、。C.2问题:在删除操作后再次将词条存储到文本时,会出现末尾单词无法覆盖的问题,如下:删除end前:删除end后:我们会发现在删除end后的文本末多了(job 事业 )项,其原因与上面问题C.1所说的情况类似:都是因为少数项无法全部覆盖多数想,而残留尾项。解决方法:我们可以运用一个很简单的打开、关闭文本操作来轻松的清空文件,再对文件进行写入操作即可,如下程序段:p=fopen(danciku.txt,w);fclose(p);只要在对文本进行写入操作的程序段前加入上述程序段,就可以很好地解决了此问题。得到以下正确的存储数据,如下:2、总结收获、体会 本次课设的课题是编程调试以实现简单电子英汉词
24、典的添加,显示,查找,删除,修改和保存单词的功能。经过认真地思考后,我采用的是对数组中数据的添加,显示,查找,删除,修改,排序和保存的操作来实现简单电子英汉词典的各项功能。在编程调试的过程中我遇到了不少的问题,例如上面C.1和C.2中提单的问题。我通过查阅C程序设计(第四版)和数据结构与算法分析C语言描述等书籍,网上搜寻了百度文库、百度知道等网络之源,以及在老师、同学们的帮助下,终于顺利的解决了问题,完成了简单电子英汉词典的各项功能的编程。不过遗憾的是我还未能完成输入中文查询英文的的功能。这次课程设计让我学会了如何自主学习,提高了我理论结合实践的能力。编程过程中让我对C程序设计(第四版)和数据
25、结构与算法分析C语言描述这两本书有了不同的认识,课外拓展了解了feof()函数和memset()函数的作用和用法。3、谢辞感谢此次课程设计过程中给予我们悉心指导的陈寿宏老师,同时也感谢其他同学,因为有老师和同学的帮助,我才能克服各种各样的难题成功完成了这次课程设计。同时更感谢学校给我们提供的这次课设机会,让我们学到了很多知识,提高我们的动手能力。4、参考文献:数据结构与算法分析C语言描述,C程序设计(第四版),百度文库5、源代码:#include stdio.h#include string.hint i=0,j,m,k,N,a,b,c;char temp20,dsq20,tabl2020;c
26、har word1200,word2200;FILE *p;void main()char table200200=apple,苹果,buy,购买,cat,猫,dog,狗,end,结束,fat,肥胖,good,好,hello,你好,job,事业;/定义二维数组printf(*n);printf(* 欢迎使用丁氏电子英汉词典 *n);printf(*n);printf( 词条录入请输入 : 1*n);printf( 信息显示请输入 : 2*n);printf( 词条修改请输入 : 3*n);printf( 词条删除请输入 : 4*n);printf( 单词查询请输入 : 5*n);printf(
27、 信息保存请输入 : 6*n);printf( 再次查询请输入 : 0*n);loop0:N=0;printf(请输入您所需要进行的操作代号:n);p=fopen(danciku.txt,r+);while(!feof(p)fread(&tablei,20,1,p); / 读取文本文件内容N+;N=N-1; /文本总词条个数if(N!=0)printf(/*当前单词库单词个数 N=%d*/n,N/2);scanf(%d,&j);elsegoto loop6;if(j=1) /单词录入loop1:p=fopen(danciku.txt,r+);for(i=0;iN;i+)fread (&tabl
28、ei,20,1,p);fclose(p);printf(请输入单词:n);scanf(%s,tableN);for(i=0;iN;i+=2) if( strcmp(tableN,tablei)=0) /查看词库中是否存在次单词printf(帅锅,此单词已存在喔!n);break;if(i=N-2 & strcmp(tableN,tablei)!=0)printf(请输入意思:n);scanf(%s,&tableN+1);for(i=0;i=N;i+=2) /排序 k=i;for(j=i+2;j0) k=j;if(k!=i) strcpy(temp,tablei);memset(tablei,0
29、,20);strcpy(tablei,tablek);memset(tablek,0,20);strcpy(tablek,temp);memset(temp,0,20);strcpy(dsq,tablei+1);memset(tablei+1,0,20);strcpy(tablei+1,tablek+1);memset(tablek+1,0,20);strcpy(tablek+1,dsq);memset(dsq,0,20);p=fopen(danciku.txt,r+);for(i=0;i=N+1;i+)fwrite(&tablei,20,1,p); /将排好序后的词条写入文本fclose(p
30、);printf(帅锅,词条录入成功啦!n); fclose(p);printf(继续录入,请按 1,退出录入进行其他操作请按 0,退出程序请按 7 !n);scanf(%d,&a);if(a=1)goto loop1; /继续录入if(a=0)goto loop0; /返回主菜单else if(j=2) /信息显示loop2: p=fopen(danciku.txt,r+);for(i=0;iN;i+)fread (&tablei,20,1,p); /从文件中读取词条for(i=0;iN;i+=2)printf( %s 中文释义:%s n, tablei,tablei+1); /输出词条以及
31、其中文释义fclose(p);printf(继续显示,请按 1,退出显示进行其他操作请按 0,退出程序请按 7 !n);scanf(%d,&a);if(a=1)goto loop2; /继续显示if(a=0)goto loop0; /返回主菜单else if(j=3) /词条修改loop3: p=fopen(danciku.txt,r+);for(i=0;iN;i+)fread (&tablei,20,1,p); /从文本读取词条fclose(p);printf(请输入单词:);scanf(%s,word1);for(i=0;iN;i+=2)if(strcmp(tablei,word1)=0) /词库中存在此单词c=i;printf(单词库中: %s 中文释义: %sn,tablei,tablei+1);printf(确认修改请输入 1 ,退出修改请输入 0 !n);s