简单的英文词典排版系统实验报告_第1页
简单的英文词典排版系统实验报告_第2页
简单的英文词典排版系统实验报告_第3页
简单的英文词典排版系统实验报告_第4页
简单的英文词典排版系统实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计基础课程设计2/14实验目录需求分析————————————2整体设计————————————2详细设计————————————4调试与测试———————————6用户手册————————————6总结——————————————6附录——————————————9一需求分析1目的我们所做的程序课题是一个“简单的英文词典排版系统”。该课题目的在于锻炼我们的自主动手和创新、创造能力,同时通过自己看书学习文件的输入输出等功能的实现,提升我们的自学能力。并通过自己思考程序的算法和函数的组建过程来提升我们的逻辑思维能力,最后是利用自我程序测试和改进来增加我们对编程的进一步了解,和提升编程的能力。其大背景是要为同学提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼同学的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。2预期达到功能(1) 能输入和显示所打的单词。(2) 能分辨出单词。(3) 对重复的单词和已经输入的单词能自动排除。(4) 能按A-Z的顺序排版。(5) 能将运行结果以文本形式存储。(6) 具有添加新单词并重新排版的能力。(7)实现以上功能的选择操作3需解决问题主要解决单词输入到文件和从文件输出以及最后文件保存的问题,但是我们对C++的学习仍不完全,这就要求我们提前把课本上的“文件与流”这一章节的相关内容进行自学并应用于其中。其次我们要解决如何实现查找单词、分辨单词、添加单词以及对单词进行排序的系列问题,这要求我们能对已学习的内容充分掌握并熟练应用。词库文件建立并选择功能词库文件建立并选择功能添加单词单词排序搜索单词显示单词文本形式存储并退出1程序设计功能模块图2程序流程示意图1)字符排序交换dic[j]和dic[j+1]flag=1交换dic[j]和dic[j+1]flag=1j++结束Flag=0循环控制变量jture开始Flag=1循环控制变量iI<r-1&&flag=1>?falsefalsej<r-i-1?dic[j]>dic[j+1]?tureturefalse 2)检查模块输出输出”noword”输出”r=word”结束false输出dic[r]r++r=0?true开始r=0循环控制变量rdic[r]!=EOF?truefalse三详细设计1函数功能voidwrite(intr)将单词写入文件的函数intread()读取文件函数voidzhucaidan()主菜单函数intpaixu()排序函数voidjiancha()检查单词模块voidcharu(char*d)插入单词模块voidfind(char*s)查找单词模块voidxuanze()选择菜单模块2参数说明dic[N][20]N为100,即但单词库课输入100个单词,每个单词长度不得大于19*p为指向Data文件的指针flag,temp在不同的函数模块中用于不同情况下的结果判断与后续的程序执行s[20],d[20],f[20]char类型的数组s、d和f用于临时的单词输入放置t[20]char类型的数组t是用于临时放置从文件中读取的单词way是用于switch语句中功能选项的选择i,j,c等是普通的int变量函数调用voidxuanze()选择菜单调用的函数:jiancha()检查函数、find(d)查找函数、charu(d)插函数以及zhucaidan()主菜单函数voidfind(char*s)查找单词模块调用的函数:strcpy复制函数、strcmp比较大小函数、write(r)写入文件函数voidcharu(char*d)插入单词模块调用的函数:read()读取函数、strcmp比较函数、strcpy复制函数、write(r)写入文件函数、paixu()排序函数、voidjiancha()检查单词模块调用的函数:write(r)写入文件函数intpaixu()排序函数调用的函数:read()读取函数、strcmp比较大小函数、strcpy复制函数、write(r)写入文件函数intread()读取文件函数调用的函数:write(r)写入文件函数main()主函数调用的函数:jiancha()检查函数、paixu()排序函数、xuanze()菜单选择函数4算法实现插入模块voidcharu(char*d)单词存在情况:先输入单词放置于*d指向的d[20]临时数组中,再利用for循环和strcmp比较函数看输入的单词是否已经存在,存在flag=1,不存在将单词保存break跳出for循环从新输入单词,flag仍等于0;单词不存在情况:若flag=0,利用strcpy复制函数将新输入的单词复制到单词库已存在单词的后面,单词个数r增加1;继续输入:利用while语句,只要继续输入的字符不为0(即输入的为单词,用户不返回主菜单),就可以执行while语句继续重复上述的检查单词和保存单词的步骤;返回主菜单:若输入的字符为0(即用户要返回主菜单),while语句无法执行,经过从新排序后,利用return返回调用函数,即voidxuanze()菜单选择函数,可从新选择功能。查找单词模块voidfind(char*s)文件读取:利用while循环先将文件中以保存的单词读取到临时的数组t[20]中,再从t数组中复制到到dic[r]数组中,最开始r为0,后r++;查找单词:利用strcmp比较函数查找是否有与临时存放在s[20]数组中单词相同的以保存单词;若strcmp的值为0(即用户要查找的单词存在),则c=r,c即为用户要查找的单词的序号,此时flag=1,若flag不为1,输出查找单词不存在;继续查找:方法同继续插入单词是一样的,利用输入的字符不为则执行以上查找步骤,若输入的字符为0,则不执行查找步骤并return,返回到调用函数即voidxuanze()菜单选择函数中,从新选择功能。四调试与测试我们反复输入从a到z的26个单词,用很长的单词和很短的单词来测试文件的保存能力。曾遇到的问题:1单词的显示挤在一起,之后我们在输出printf中加入:“\t”来解决单词显示的美观问题;2输入的单词仍无法保存在文件中,我们在查找和输入等模块添加write()读取函数后,使得单词真正的保存在文件中;3开始并未建立文件,因此使程序无法运行,后询问老师问题得以解决;4一开始使用else语句来实现功能模块的选择无法运行,后改为使用switch语句问题得以解决;5在进行字符串的复制时开始并未使用字符串函数,而是自行设计了函数来进行字符串的复制及比较,发现无法成功,咨询其他同学后讨论可以利用现成的字符串函数来解决该问题;6在查找和插入单词的返回主菜单的算法上开始使用的是goto语句,但会跳错程序,因此讨论后改用return语句,直接返回主菜单的方法。以上问题每次调试均要删除文件中以保存的单词,从新输入a到z的26个单词,从新运行。五用户手册进入主菜单后,输入“1”后开始输入单词。输入完毕可按“0”返回主菜单。在主菜单页面输入“2”后可以查找单词,输入单词按回车开始查找,查找完毕按“0”返回主菜单。在主菜单页面输入“3”后可以结束操作,同时在文件中保存已输入的单词。4.在主菜单页面输入“4”后可以检查所有单词,按“0”返回主菜单。六总结开始无单词界面和主菜单:选择way1(输入单词)并输入单词apple:选择way2(查找单词)界面:选择way3(结束程序并保存):选择way4(先检查所有单词):选择0返回主菜单:重新打开程序:优点:程序所要求的功能基本存在且均可以正常执行。缺点:界面不够美观,某些算法效率仍不够高。参考文献:C++程序设计(第二版)C语言初级教程附录#include<stdio.h>#include<string.h>#defineN100chardic[N][20];FILE*p;/*file结构输入读取*//*写入文件*/voidwrite(intr){inti;p=fopen("Data.txt","w");//以写方式打开文件for(i=0;i<r;i++) {fprintf(p,"%s\n",dic[i]);//输入数组内容,输入到p指向的data文件里}fclose(p);//关闭文件}/*读取文件*/intread(){intr=0;p=fopen("Data.txt","r");//r打开读取文件while(fscanf(p,"%s",dic[r])!=EOF)//只要读取的dic内容不为结束,继续增加读取;读取出来{ r++;}fclose(p);//关闭datawrite(r);//再从新写入returnr;//输入了r个单词}/*主菜单*/voidzhucaidan(){printf("\n\n");printf("____________way=1:shuruwords______________________\n");printf("_____________way=2:chazhaowords_______________________\n");printf("________________way=3:end___________________________\n");printf("__________________way=4:jianchasuoyou_________________\n");printf("pleasexuanzaway=");}/*字符排序*/intpaixu(){inti,j,flag=1,r;chars[20];r=read(); /*类似于冒泡排序*/for(i=0;i<r-1&&flag==1;i++)//外层扫描一遍{flag=0;for(j=0;j<r-i-1;j++){if(strcmp(dic[j],dic[j+1])>0)//比较字符串的大小,即单词的长短排序;前面的若长于后面的则交换{flag=1;strcpy(s,dic[j]);strcpy(dic[j],dic[j+1]);strcpy(dic[j+1],s);//通过复制交换}}}write(r);//拍完序再从新写入return0;}/*检查模块————————————小块————模块函数*/voidjiancha(){ //检查模块在程序的开始,先对文件读取,然后printf输出显示已经保存的单词intr=0;p=fopen("Data.txt","r");while(fscanf(p,"%s",dic[r])!=EOF){printf("%s\t",dic[r]);r++;}fclose(p);//————————————————————————————————————write(r);//检查完再从新写入if(r==0)printf("thereisnowordinData.txt\n");//即文件中尚没有保存了单词else{printf("\n\nthereare%dwordsinData.txt!\n",r);//文件中保存了r个单词}}/*插入单词———————————————————模块函数case1———后面插入模块会先输入一个单词,同时将其与以保存单词作比较———*/voidcharu(char*d)//flag=0即为输入的单词未被保存到文件中。flag=1即输入的单词已经存在于文件里{inti;charf[20];intr=read();intflag=0;//先对已经保存的单词做检查,看刚插入的单词是否已经存在for(i=0;i<r;i++){if(strcmp(d,dic[i])==0)//通过字符串的比较,找到存在的情况{printf("theword%shasalreadycunzai\n",d);flag=1;//单词存在flag=1break;}}if(flag==0)//之前保存的0到r-1的单词里都没有刚输入的单词的情况{printf("theword%sischenggongbaocun\n",d);//则单词保存strcpy(dic[r],d);//将d指向的后输入的单词复制到dic[r]中r++;}printf("\n\njixuzengjiadanci,pleaseshuruaword;backtomainmenu,shuru0:\n");while(scanf("%s",f)&&!(f[0]=='0'&&f[1]==0))//输入一个内容到f当中,只要不是0就一直可以检查输入{flag=0;//先假设输入到f数组的单词不已经存在于文件中for(i=0;i<r;i++){if(strcmp(f,dic[i])==0)//从0到r-1单词已经存在,能够找到与其相同的{printf("theword%shasalreadycunzai\n",d);//存在的情况flag=1;break;}}if(flag==0)//单词不存在,并且保存{printf("theword%sissuccessfulbaocun\n",f);strcpy(dic[r],f);//将f复制到r上r++;}printf("\n\ncontinuezengjiadanci,pleaseshuruaword;backtomainmenu,shuru0:\n");}write(r);paixu();//从新排下序 write(r);return;//输入的f数组为0后跳出while循环,返回调用函数的xuanze函数}//————————————————————————————————————————/*查找已录入单词—————————————模块函数case2———————————*/voidfind(char*s){chart[20];intflag=0;charf[20];intr=0,c,i;inttemp;p=fopen("Data.txt","r");while(fscanf(p,"%s",t)!=EOF)//将已经排好顺序的单词一个个读取出来{strcpy(dic[r],t);//将t复制到dic;r一开始赋值为0,将t挨个付给dic的0到r-1r++;temp=strcmp(s,t);//比较s与t串的大小,然后返回0左右的值;后查找模块输入一个单词并由s指向他,将其与t中的单词作比较if(temp==0)//若两个单词相同{c=r;flag=1;}}write(r);//从新再将单词写入文件中if(flag)//flag=1{printf("%s'snumberis%d!\n",s,c);//s指向的要查找的某个单词是第c个;}else{printf("cannotfind%s!\n",s);//没有在存储的文件中找到单词}printf("\n\njixuezengjiadanci,pleaseshuruaword;backtomainmenu,shuru0:\n");while(scanf("%s",f)&&!(f[0]=='0'&&f[1]==0))//再次输入单词只要其不为0即可从新开始查找{flag=0;for(i=0;i<r;i++){if(strcmp(f,dic[i])==0){flag=1;c=i+1;break;}}if(flag){printf("%s'snumberis%d!\n",f,c);}else{printf("cannotfind%s!\n",f);}printf("\n\njixushurudanci,pleaseshuruaword;backtomainmenu,shuru0:\n");}return;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论