C语言课程设计一种简单的英文词典排版系统的实现.doc
目 录课程设计评语2目 录31课程论文题目42程序设计思路43功能模块图54数据结构设计55算法设计66程序代码137程序运行结果228编程中遇到的困难及解决方法259总结心得及良好建议2610致谢261课程论文题目 一种简单的英文词典排版系统的实现【要求】(1)能输入和现实打入的单词(2)能分辨出单词(3)对重复的单词和已经输入的单词能自动排除(4)能按AZ的顺序排版(5)能将运行结果以文本形式储存(6)具有添加新单词蹦重新排版的能力提示(1)需求分析:运行结果以文本形式储存,因而要提供文件的输入输出操作;通过查找操作检查重复单词;提供排序操作现实按AZ的顺序排版;提供插入操作添加新单词并重新排版。另外通过键盘式菜单实现功能选择。(2)总体设计:整个系统被设计为单词录入模块,文件存储模块和单词浏览模块。其中单词录入模块要完成输入单词,检查是否重复,排序操作。文件存储模块把存放单词的数组中的数据写入文件。单词浏览模块完成英文词典的输出,即文件的输出操作。(3)数据结构采用指针数组或二维数组。以【Enter】键或者空格键作为单词输入结束标志,对重复的单词自动排除可选用查找方法,数据结构可采用指针和数组。2程序设计思路整个系统被设计为单词录入模块,文件存储模块和单词浏览四个模块。其中单词录入模块要完成输入单词,检查是否重复,排序操作。文件存储模块把存放单词的词组中的数据写入文件。单词浏览模块完成英文词典的输出,即文件的输出操作。这四个模块是整体的设计思路,设计核心,整个程序的设计都将围绕这四个模块进行,各个模块都相互衔接,所以需要在设计好各个部分地同时,还要把握好各个部分的连接。3功能模块图(英文词典排版系统单词录入文件存储单词浏览 4数据结构设计数据结构采用指针数组或二维数组:char* dictionaryN; 或 char dictionaryN20。其中N是宏定义#define N 256 (表示单词个数)(1)单词录入模块 输入一个单词,存放在一个临时字符数组中,以空格或回车表示单词的结束(这也是默认操作),然后换行输出刚刚输入的单词。采用插入排序算法的思想把该单词插入单词数组中,不同的是如果两个单词相同则不插入。(2)文件存储模块 采用fwrite或fprintf把单词数组输入到文件中。(3)单词浏览模块采用fread或fscanf把单词从文件中读出,然后输出。 5算法设计1.主函数 【流程图】 显示一系列的功能选项输入n,判断n是否是19NY根据n的值调用各功能模块函数【程序】#include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #define ROWS 256 #define COLS 32 static FILE *fp; static char aROWSCOLS; char get_option(void); int b(int count); void c(char *pt, int count); int check(char arr, int count); void storage(char *pt, int count);int n; /*n全局变量*/ char wordN20;void menu()/*主界面*/int n,w;/*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*/doputs("tt*MENU*nn");puts("tttWelcome to dj's program!nn");puts("tttt 1.Add new word.");puts("tttt 2.Browse all the words.");puts("tttt 3.Search the word.");puts("tttt 4.Sort the words.");puts("tttt 5.Order by A-z.");puts("tttt 6.Exit!");puts("nntt*n");printf("Choice your number(1-6): bb");scanf("%d",&n);if(n<1|n>6)/*对选择的数字作判断*/w=1;getchar();else w=0;while(w=1);switch(n)case 1:add();break;/*追加模块*/case 2:browse();break;/*浏览模块*/case 3:search();break;/*查找模块*/case 4:sort();break;/*分类模块*/case 5:order();break;/*排序模块*/case 6:exit(0);/*退出*/void main() /*主函数*/ menu();2.公共函数【程序】int load()/*加载函数*/int i,count; int start; char *ptROWS; char ch, len; char input;if(fp=fopen("words.txt","a+")=NULL)/*以输出打开方式,在此前的记录被覆盖*/printf("nCannot open file!n");return NULL;for(i=0;!feof(fp);i+)fscanf(fp,"%s",&wordi);fclose(fp);return i+1;/*返回记录个数*/void save(int n)/*保存函数,保存n个记录*/FILE *fp;int i;if(fp=fopen("words.txt","a+")=NULL)/*以输出打开方式,在此前的记录被覆盖*/printf("nCannot open file!n");exit(0);for(i=0;i<n;i+)fprintf(fp,"%s",&wordi);fclose(fp);3.各功能模块设计1)分类模块【程序】void sort()int i,j,k;char c20;if(n=load()=0)printf("nCannot open file!n");exit(0);for(i=0;i<n;i+)for(j=0;j<n-i-1;j+);if(strcmp(wordj,wordj+1)>0)strcmp(c,wordj);strcmp(wordj,wordj+1);strcmp(wordj+1,c);save(n);printf("Successful!_.n");printf("nNow? 1.browse all 2.back");scanf("%d",&k);if(k=1)browse();else if(k=2)menu(); 用选择法排序2)排序模块【流程图】【程序】 保 存void order() /*排序模块*/int aN,i,j,t; 返回主菜单struct words;n=load();for(i=0;i<N;i+)for(i=0;i<N-1;i+)for(j=i+i;j<N;j+)if(ai>aj)t=ai;ai=aj;aj=t;for(j=0;j<N;j+)printf("%3d",ai);3)修改模块【流程图】显示所有记录,让用户看哪个要修改输入要修改的单词是否找到此单词记录YN显示找到的单词,调用修改函数提示没有找到询问用户是否继续修改Y返回主菜单Y【程序】void modify(int a) /*修改模块*/char c20;printf("Enter the new word:");scanf("%s",c);strcpy(worda,c);save(n);4)删除模块【流程图】显示所有记录,让用户看哪个需要删除输入需要删除的单词是否找到此单词记录YN提示没有找到显示找到的记录 调 用 删 除 函 数返回主菜单询问用户是否继续删除YN【程序】void del(int a) /*删除模块*/int x,i,y;printf("Are you sure to delete this word?nt1).sure 2).no and back menu bb");scanf("%d",&x); /*输入要修改的单词*/if(x=1)for(i=a;i<n-1;i+) /*查找要修改的单词*/strcpy(wordi,wordi+1);save(n-1);printf("Successful!_.nNow? 1).one more 2).back menu");scanf("%d",&y);if(y=1)search();else if(x=2)menu();else if(x=2)menu();5)追加模块询问用户是否继续追加单词保存追加的单词输入用户要追加的的单词调用加载函数n=load();并计算可以记录个数n【流程图】返回主菜单YN【程序】void add() /*追加模块*/int i,x,w1,w2,w;char c20;if(n=load()=0)exit(0);elseputs("Enter the new word!n");scanf("%s",c); /*输入要追加的单词*/for(i=0;i<n;i+)if(strcmp(wordi,c)=0)break;if(i<n)w=1;doprintf("The word has already exit!n");printf("nnWhat do you want to do?nt1).enter one more 2).back menu bb");scanf("%d",&x);if(x<1|x>2)w1=1;elsew1=0;while(w1=1);elsew2=1;strcpy(wordi,c);save(n+1);printf("Successful!_.Now choose what you will do next?nt1).add another 2).back menu bb");doscanf("%d",&x);if(x<1|x>2)w2=1;elsew2=0;while(w2=1);switch(x)case 1:add();break;case 2:menu();break;显示所有单词记录6)浏览(全部)模块【流程图】用户进行选项回到分类模块返回主菜单【程序】void browse() /*浏览(全部)模块*/int i,w;if(n=load()=0) /*加载记录*/printf("nCannot open file!n");exit(0);for(i=0;i<n-1;i+)printf("%s/n",wordi);puts("Successful!_.Now 1.back menu 2.sort");scanf("%d",&w);if(w=1)menu();else if(w=2)sort();7)查找模块是否找到该单词记录输入需要查找的单词【流程图】YN返回主菜单让用户选择1).查找另一个2).返回询问用户是否继续查找提示没有找到显示找到的记录YN【程序】void search() /*查找模块*/int i,x,y;char vs20;if(n=load()=0) /*加载记录*/printf("nCannot open file!n");exit(0);printf("Enter the word what you want to search!");scanf("%s",vs); /*输入要查找的单词*/for(i=0;i<n;i+) /*查找要修改的单词*/if(strcmp(wordi,vs)=0)printf("Successful!_.nThe word is:%sn",wordi);/*找到需要修改的单词*/printf("What would you like to do with the word?nt1).modify 2).delrte 3).nothing bb");scanf("%d",&y);if(y=1)modify(i);elsedel(i);if(i=n)printf("HOHO!Sorry.Not found");printf("Now.1).one more 2).back 3).exit");scanf("%d",&x);switch(x) case 1:search();break;case 2:menu();break;case 3:exit(0); 6程序代码#include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #define ROWS 256 #define COLS 32 static FILE *fp; static char aROWSCOLS; char get_option(void); int b(int count); void c(char *pt, int count); int check(char arr, int count); void storage(char *pt, int count); int main(void) int i,count; int start; char *ptROWS; char ch, len; char input; if(fp=fopen("words.txt","a+")=NULL) fputs("不能打开或建立文件!n",stderr); exit(1); fseek(fp,0L,SEEK_END); start=(int)ftell(fp)/32; count=start; rewind(fp); if(fread(a,32*sizeof(char),start,fp)=0) i=0; puts("开始创建词库");puts("请输入单词(每行一个)");puts("在新行输入END结束输入:"); while(i<ROWS&&scanf("%s", ai)=1) fflush(stdin); if(strncmp(ai,"END",3)=0) count+=i; break; if(check(ai, i) continue; i+; puts("tt*欢迎使用字典排版系统*nn");puts(" MENU ");puts("您要做些什么?"); puts("a. 显示已有的单词 b. 添加新单词"); puts("c. 对已有的单词进行排序 d. 退出"); puts("nntt*n");while(input=get_option()!='d') if(input='a') puts("已有的单词:"); for(i=0;i<count;i+) printf(" "); puts(ai); if(input='b') puts("开始创建词库");puts("请输入新的单词(每行一个)");puts("在新行输入END结束输入: "); count=b(count); if(input='c') puts("对单词进行排序:"); c(pt, count); for(i=0;i<count;i+) printf(" "); puts(pti); puts("还要做些什么?"); storage(pt,count); fclose(fp); puts("谢谢使用,再见!"); return 0; char get_option(void) char ch; while(ch=getchar()<'a'|ch>'d') while(ch=getchar()!='n') ; puts("请输入a,b,c或者d."); fflush(stdin); return ch; int b(int count) int i; i=count; while(i<ROWS&&scanf("%s", ai)=1) fflush(stdin); if(check(ai, i) continue; if(strncmp(ai,"END",3)=0) count=i; break; i+; return count; void c(char *pt, int count) int i,j; char *temp; for(i=0;i<ROWS;i+) pti=ai; for(i=0;i<count;i+) for(j=i+1;j<count;j+) if(strcmp(pti,ptj)>0) temp=pti; pti=ptj; ptj=temp; int check(char arr, int count) int i; int flag=0; for(i=0;i<strlen(arr);i+) if(isalpha(arri)=0) printf("%s不是一个单词.n",arr); flag=1; break; for(i=0;i<count;i+) if(strncmp(ai,acount,strlen(acount)+1)=0) puts("重复的单词!"); flag=1; return flag; void storage(char *pt, int count) int i,j; char ptrROWSCOLS; c(pt, count); for(i=0;i<count;i+) for(j=0;ptij!='0'j+) ptrij=ptij; fp=fopen("words.txt","w+"); rewind(fp); fwrite(ptr,32*sizeof(char),count,fp); 7程序运行结果8编程中遇到的困难及解决方法在学习C语言时,最初使用的是TurboC计算机编程软件,实习则用VC软件编程。两个软件各有自己的特点。VC作为后来开发的软件,功能上来讲比TurboC有优势,但是在很多方面VC并不能兼容TurboC。以前在TurboC的习惯用法,在VC中使用就会出错。一开始是很难适应的,。比如,子函数写在VC,前面必须要声明其类型,在TurboC中时不必的,这类的问题很多,在以后索性只要涉及到的我都会注明类型。在编程的过程中,很容易出现一个问题,就时少大括号“”的问题。这是,error只有一个,但是错误的地方很多,且都在括号处。按照计算机所指出的错误位置寻找是不容易找出错误的。直到整个程序看了一遍后才会发现是一个大括号的问题。通常少的是“”或着“”,错误位置会出现在缺少括号位置之后的其他大括号出现的地方。只要这种情况发生后,往前找是否有大括号缺失就可以将问题很快解决了。在帮同学修改程序的过程中,也遇到过一个问题。在头文件后定义了子函数,可是之后忘了编写子函数,在纠错时,有的是不会发现错误的,但是连接过程中就会报告出错。我觉得在以后的编程过程中,最好用什么函数写什么函数,后者在写完一个子函数后再在头文件底下声明。9总结心得及良好建议C语言实习基本上由老师引导,自己很多都靠自学,不明白的问老师,自学能力得到了很大的培养。在实习过程中,我感觉到一点,程序是不能一气呵成的。至少一气呵成的程序不会尽善尽美。程序编写要一步一步的完成。首先,对于要编的程序要有一个总体思路。要明确想要什么。只要把思路理清楚了,程序就好编写了。把程序分割成几个块,即多个函数,一块一块的编写。然后将分散的函数用另外的函数连接起来或者用main函数连接。到这一步,程序也就初步编成了,之后便是调试,检查错误。最后我觉得还可以对于已经编写好的程序进行一些修改添加,使它更加人性化。优化程序的阶段是很重要的。10致谢在C语言的实习过程中,让我巩固了C语言的基础知识,以前从来没有这样编过完整的程序,实习让我有这样的一个机会,自己独立编写程序。我觉得自己说学的东西不多,但是可以将它们运用出来。在实习过程中,首先我要感谢我的老师,一个是带我走进C语言大门的曹老师,因为她,我开始喜欢C语言,把所学知识掌握牢固。同时,在这次实习中,邵老师对我的帮助对我最难忘。题目本身是很简单的,在老师的教学风格影响下,我在编写完最初程序后,有自己添加了很多功能。邵老师也给过我其他发展的建议,在此,我要感谢他。最后,我还要感谢给我帮助的同学,在一些程序问题上,我和同学交流经验,学到了很多在书本上学不到的东西。总之,我真诚的感谢在这次实习中给过我帮助的人!