《C语言程序设计实习报告简单的行编辑器.doc》由会员分享,可在线阅读,更多相关《C语言程序设计实习报告简单的行编辑器.doc(47页珍藏版)》请在三一办公上搜索。
1、C程序设计实习报告题目:简单的行编辑器(修改版) 学 院: 专 业: 姓 名:班级学号:指导教师: 2009年 7 月 3 日前言由于我们班选题是题号和学号一一对应,所以我抽到了16题,简单的行编辑器。刚开始时不知道什么叫行编辑器,以为这个题目有多么的神秘,第二次实习时老师说选这个题目最好换个题,与老师交流,老师建议在原有的题目上加些功能。只是还是不知道什么叫行编辑器,上网,问同学,没有一点思路。再一次问老师,老师说不用管它什么是行编辑器,编辑的目的是为了后面对文件进行处理,于是这一次总算有了新的思路。等到这个题快要做完时,也明白了为什么老师说它太简单了,做完后自己感觉都有串改题目之嫌疑,原题
2、的要求实在太简单了,自己加的功能占了程序的大部分。8天下来感觉自己对C语言以及程序编辑的认识加深了许多。以前觉得很难的结构体,数组,文件全部用到了,虽然并不能完全掌握,那也有一些成就感。在这里要感谢老师以及我的同学,在整个编程中给了我很大的帮助。目录前言II目录III1题目要求- 1 -2需求分析- 1 -3概要设计- 1 -3.1设计思想- 1 -3.2软件运行与开发平台- 2 -3.3数据结构- 2 -3.4系统结构图- 2 -4详细设计- 3 -4.1主函数- 3 -4.2各功能模块设计- 4 -(1)输入模块- 4 -(2)浏览模块- 5 -(3)添加模块- 6 -(4)查找模块- 8
3、 -(5)修改模块- 13 -(6)排序模块- 16 -(7)保存模块- 19 -4.3公共函数- 19 -(1)加载函数- 19 -(2) 学号输入函数- 20 -(3)输入三个科目分数函数- 20 -(4)求平均值函数- 21 -(5)输入整个记录函数- 21 -(6)修改整条记录函数- 21 -(7)显示数据结构项目- 22 -(8)显示一个记录的函数- 22 -5测试、结果进行分析- 23 -5.1进入页面- 23 -5.2数据录入- 24 -5.3数据录入成功,直接返回菜单- 24 -5.4不进行数据录入,直接进入菜单。- 25 -5.5浏览数据- 25 -5.6添加数据- 26 -
4、5.7浏览添加后的数据- 26 -5.8查找按姓名查找- 27 -5.9查找按学号查找- 27 -5.10修改对分数2进行修改- 28 -5.11排序按平均分进行排序- 28 -6总结- 30 -7参考文献- 30 -8附录- 31 -主要程序模块清单- 31 -1题目要求原题:简单的行编辑器【要求】(1) 设置一个简单的行编辑器,每行以回车结束。(2) 数据以文件形式储存。(3) 编辑器具有查找、替换、修改数据的功能。修改后:修改思路是将由行编辑器生成的文件换成有关结构体的内容,建立一个结构体输入关信息,生成文件,再实现查找、替换、修改数据等的功能。这里具体是参考书上学生成绩管理系统,实现成
5、绩的录入,显示,查找,添加,保存等功能模块。2需求分析根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入、输出等操作;在程序中需要浏览学生的信息,应提供显示、查找、排序等操作;另外还应提供键盘式选择菜单实现功能选择。3概要设计3.1设计思想由于原题的特点,对题目进行了一定的拓展。本着提高自己编程能力,加深对C语言重点、难点内容的理解,添加了关于结构体、数组以及文件的运用。将程序模块化,使程序条理清楚,制作简单,容易读懂,并能体会到程序开发的思想与方法,加深对C语言编程的认识。3.2软件运行与开发平台C语言,Windows平台,VC6.0,3.3数据结构此处选用了结构体的形式来存放每
6、一个学生的信息,对与若干个学生采用了结构体数组。3.4系统结构图学生成绩管理系统数据输入数据显示数据添加数据查找数据修改排序数据保存按姓名查找按学号查找按分数1排序按分数2排序按分数3排序按平均分排序4详细设计4.1主函数主函数比较简单,只提供了输入和菜单函数的调用。各个功能的模块用菜单方式选择。图4.11NY开始显示一系列功能选项输入n,判断m是否是12根据n的值调用各功能模块函数结束【程序】void main()int q,w1;printf(tt*行编辑器(修改拓展版)*nn);printf(ttttt072092t周磊t20091002238nn);doprintf(tt重新录入数据请
7、按1tt进入菜单请按2: bb);scanf(%d,&q);if(q!=1&q!=2) /*对选择数字作出判断*/w1=1;getchar();else w1=0;while(w1=1);if(q=1) /*if语句选择要进行的操作*/enter();elsemenu();4.2各功能模块设计(1)输入模块考虑到自己在C学习时遇到的问题,以及在考计算机二级时薄弱的地方,以及联系这个题目的要求,此处选用了结构体的形式来存放每一个学生的信息,对与若干个学生采用了结构体数组。具体到各个数据的信息,学号和姓名采用了字符型数组,分数为整型,而平均分采用了实型。/*定义结构体变量*/struct stud
8、entchar num20;/*学号*/char name100;/*姓名*/int score3;/*分数*/float ave;/*平均分*/stuN; /*stuN中每个元素对应一个学生*/N采用了宏定义的方式,可以随时在源程序中修改。【程序】/*输入模块*/void enter()YN图4.21开始输入用户要输入学生记录的个数n从0n-1调用输入函数input(i)i!=0吗?调用保存函数save()返回主菜单结束int i,n;printf(请输入学生数量(0-%d)?:,N-1);scanf(%d,&n);printf(n请输入数据nn);for(i=0;in;i+)printf(
9、n 输入第%d个学生记录n,i+1);input(i); /*调用输入函数*/if(i!=0) save(); /*调用保存函数*/(2)浏览模块该模块的功能是显示所有学生的记录信息,流程如图。显示学生记录(10人一屏)按任意键显示下一屏按任意键返回主菜单图4.22【程序】/*浏览函数*/void browse()/*浏览模块,前面多次用到*/int i,n;n=load();printf_face();for(i=0;in;i+)if(i!=0)&(i%10=0) /*目的是分屏显示*/printf(任意键继续n);getch();puts(nn);printf_one(i); printf
10、(nt共有%d条记录.n,n);printf(n任意键返回nn);getch();menu();(3)添加模块该模块的功能是用户需要增加新的学生记录,注意新添加的内容不能覆盖原来的记录。追加模块流程图:图4.23开始调用加载函数,并计算可以记录的个数K=m+ni从n到k调用输入函数input(i)保存追加的记录结束输入用户要追加学生记录个数【程序】/*添加模块*/void add()int i,n,m,k;FILE *fp;n=load();printf(请输入添加的学生个数(0-%d)?:,N-1-n); scanf(%d,&m); /*m为添加学生的个数*/k=m+n-1;for(i=n;
11、i=k;i+)printf(n 输入第%d个学生记录n,i-n+1);input(i); /*调用输入函数*/if(fp=fopen(zhoulei.txt,ab)=NULL)printf(n文件无法打开n);for(i=n;i=k;i+)if(fwrite(&stui,sizeof(struct student),1,fp)=0)printf(文件写入错误n);fclose(fp);save();(4)查找模块该模块在参考程序上做的一定逻辑上的修改,可以按姓名和按学号进行查找,找到以后,可进行修改和删除信息的操作。由于改动方便,这里的按姓名和按学号查找分了两个函数,使函数比较烦缀,故函数还可
12、以进行优化。图4.24其他21开始显示查找方式让用户选择调用按姓名查找函数search_name()调用按学号查找函数search_no()结束【程序】a)查找模块 /*查找函数*/void search()int z,w1;doprintf(请输入查找方式:1).按姓名查找 2).按学号查找 bb);scanf(%d,&z);if(z!=1&z!=2) /*对选择数字作出判断*/w1=1;getchar();else w1=0;while(w1=1);if(z=1)search_name(); /*调用按姓名查找程序*/elsesearch_no(); /*调用按学号查找程序*/b) 按姓名
13、查找模块这个是根据姓名查找到对应的学生记录,但在此处程序有一定的缺陷,就是如果有相同的姓名,只能查到最上面的一个,而其他的则不能找到。后来尝试修改时发现,还需要改动其他相应的函数,故没有进行下去。NYYN开始输入学生姓名是否找到此学生记录显示找到的记录提示没有找到询问用户是否继续查找让用户做出选择结束图4.25【程序】/*按姓名查找*/void search_name()int i,n,k,w1=1,w2,w3,w4;struct student s;n=load();dodok=-1;printf(nn请输入要查找的姓名! 姓名:);scanf(%s,s.name); /*输入要修改的数据的
14、姓名*/printf_face(); /*调用显示数据结构项目的函数*/for(i=0;in;i+)if(strcmp(s.name,stui.name)=0) /*匹配姓名*/k=i; /*找到要修改的记录*/ printf_one(k);break; /*调用显示一个记录的函数*/if(k=-1) printf(nn记录不存在!); printf(nn是否继续?nt1).是 2).否 返回 bb); scanf(%d,&w1); if(w1=1) search(); else menu();while(k=-1&w1=1);w4=0;w3=0;if(k!=-1)printf(nn请选择下一
15、步:nt1).查找其他 2).修改 3).删除 4).返回菜单 bb);scanf(%d,&w2);switch(w2) case 2:w3=modify_data(k,n);break; case 3: printf(n确定删除?nt1).确定 2).返回 bb); scanf(%d,&w4); if(w4=1) stuk.ave=0; break;if(w3=1|w4=1)save();printf(nn操作成功_);printf(nn请选择下一步:nt1).查找其他 2).返回 bb);scanf(%d,&w2);while(w2=1);menu();c) 按学号查找模块这个函数是在按姓
16、名查找模块的基础上做了相应的改动,由于学号具有唯一性,故不存在查不到相同学号的情况。NYYN开始输入学生学号是否找到此学生记录显示找到的记录提示没有找到询问用户是否继续查找让用户做出选择结束图4.26【程序】/*按学号查找程序*/void search_no()int i,n,k,w1=1,w2,w3,w4;struct student s;n=load();dodok=-1;printf(/n/n请输入要查找的学号! 学号:);scanf(%s,s.num);printf_face();for(i=0;in;i+)if(strcmp(s.num,stui.num)=0)k=i; printf
17、_one(k);break;if(k=-1) printf(nn记录不存在!); printf(nn是否继续?nt1).是 2).否 返回 bb); scanf(%d,&w1); if(w1=1) search(); else menu();while(k=-1&w1=1);w4=0;w3=0;if(k!=-1)printf(nn请选择下一步:nt1).查找下一个 2).修改 3).删除 4).返回菜单 bb);scanf(%d,&w2);switch(w2) case 2:w3=modify_data(k,n);break; case 3: printf(n确定删除?nt1).确定 2).返
18、回 bb); scanf(%d,&w4); if(w4=1) stuk.ave=0; break;if(w3=1|w4=1)save();printf(nn操作成功_);printf(nn请选择下一步:nt1).查找其他 2).返回 bb);scanf(%d,&w2);while(w2=1);menu();/*浏览函数*/void browse()/*浏览模块,前面多次用到*/int i,n;n=load();printf_face();for(i=0;in;i+)if(i!=0)&(i%10=0) /*目的是分屏显示*/printf(任意键继续n);getch();puts(nn);prin
19、tf_one(i); printf(nt共有%d条记录.n,n);printf(n任意键返回nn);getch();menu();(5)修改模块该模块首先要显示所有学生的信息,并采用分屏显示。显示完所有记录后,用户输入要修改的学生的学号,根据学号查找学生记录,并提示用户修改该记录的哪部分信息。NYYN开始显示所有记录,让用户看哪条信息需要修改输入要修改的学号i!=0吗?显示找到的记录,调用修改函数提示没有找到询问用户是否继续修改返回主菜单结束图4.27【程序】/*修改函数*/void modify()struct student s;int i,n,k,w0=1,w1,w2=0;n=load(
20、);dok=-1;printf_face(); /*调用显示数据结构项目函数*/for(i=0;in;i+)if(i!=0)&(i%10=0) /*目的是分屏显示*/ printf(nn记住你要修改的学号.任意键继续 .); getch(); puts(nn);printf_one(i); /*调用显示一个记录的函数*/doprintf(nn请输入你想要修改的学号:);scanf(%s,s.num); /*输入要修改的数据的学号*/for(i=0;in;i+)if(strcmp(s.num,stui.num)=0)k=i; /*找到要修改的记录*/s=stui; /*备份当次要修改的学生记录s
21、tui*/if(k=-1) printf(nn记录不存在!); /*当k=-1表示没有找到*/while(k=-1);printf_face();printf_one(k);w1=modify_data(k,n); /*修改学生记录并返回保存控制值*/if(w1=1)printf(n操作成功_.nn是否继续修改?nnt1).是2).返回并保存t bb);scanf(%d,&w0);w2=1; /*用来控制保存,使w2=1是标记已有过的修改*/elsew0=0;if(w2=1)stuk=s;if(w0!=1&w2=1)save();/*w2不等于1表示在此次之前没有修改过,这是就保存用户已确认的
22、修改并返回*/while(w0=1);printf(nn你所修改的内容不存在);menu();(6)排序模块该模块在原有的排序模块上做了一定的修改,可以按照分数1,、分数2、分数3以及平均数进行由大到小的排序。这里选择了冒泡法排序。由于改动方便,这里的4种排序方法在程序上其实是大同小异,因此程序还需进行一定的优化。还有一个问题就是排序结束后不能直接浏览,需要手动调用浏览模块。其原因是在排序后调用了保存函数,而保存函数保存完毕要直接返回主菜单。如果先进行浏览的话,所显示内容不是排序后的。非1414开始显示要进行的排序方式用户做出选择调用相应的函数结束图4.28【程序】a) 排序模块 /*排序模块
23、*/void order() int m;printf(请选择排序方式:1).按分数1排序 2).按分数2排序 3).按分数3排序 4).按平均分排序nn);scanf(%d,&m);switch(m) case 1:order_score1();break;/*分数1*/ case 2:order_score2();break;/*分数2*/case 3:order_score3();break;/*分数3*/case 4:order_ave();break; /*平均分*/b) 按四种方式排序图4.29开始用冒泡法排序保存返回主菜单结束/*按平均分排序*/void order_ave()
24、int i,j,n; struct student s;n=load();for(i=0;in-1;i+) /*冒泡法排序*/for(j=i+1;jn;j+)if (stui.avestuj.ave )s=stui;stui =stuj;stuj =s;save();puts(nn);menu();/*按分数1排序*/void order_score1() int i,j,n; struct student s;n=load();for(i=0;in-1;i+) /*冒泡法排序*/for(j=i+1;jn;j+)if (stui.score0stuj.score0 )s=stui;stui =
25、stuj;stuj =s;save();puts(nn);menu();/*按分数2排序*/void order_score2() int i,j,n; struct student s;n=load();for(i=0;in-1;i+) /*冒泡法排序*/for(j=i+1;jn;j+)if (stui.score1stuj.score1 )s=stui;stui =stuj;stuj =s;save();puts(nn);menu();/*按分数3排序*/void order_score3() int i,j,n; struct student s;n=load();for(i=0;in-
26、1;i+) /*冒泡法排序*/for(j=i+1;jn;j+)if (stui.score2stuj.score2 )s=stui;stui =stuj;stuj =s;save();puts(nn);menu();(7)保存模块这个模块单独放在菜单里其实有点缀余,因为每个对文件进行写入或修改的操作都单独进行了保存。这里文件的读写全用的是二进制,所以保存的文件直接以文本打开后会出现乱码。【程序】/*保存函数*/void save()/*存储函数*/ int i;FILE *fp;if(fp=fopen(zhoulei.txt,w)=NULL) /*按只写方式打开文件*/printf(文件无法打
27、开n);/*防止文件为空,并报错*/for(i=0;iN;i+)if(stui.ave!=0)/*stui.ave!=0表示此记录已删除*/if(fwrite(&stui,sizeof(struct student),1,fp)!=1) /*这里用二进制进行文件的读写,是文件不能通过电脑直接打开*/printf(文件写入错误n);fclose(fp);printf(nn保存成功!nn按任意键继续nn);getch();menu(); /*一般的保存模块,用于各种变动之后,文件的保存*/4.3公共函数这里都是些在每个模块都可能用到的公共函数(1)加载函数/*加载函数*/int load()FIL
28、E *fp;int i;if(fp=fopen(zhoulei.txt,rb)=NULL) /*以只读方式打开一个二进制文件*/printf(n无法打开文件n);return NULL;for(i=0;!feof(fp);i+)fread(&stui,sizeof(struct student),1,fp);fclose(fp);return(i-1); /*返回记录个数*/(2) 学号输入函数/*学号输入函数*/void no_input(int i,int n) /*i表示第i个学生的信息,n表示比较到第n个学生*/int j,k,w1;dow1=0;printf(学号:);scanf(%
29、s,stui.num);for(j=0;stui.numj!=0;j+) /*学号输入函数,作了严格的规定*/if(stui.numj9) /*判断学号是否为数字*/puts(输入错误!仅可输入(0-9),请重新输入!n);w1=1;break;if(w1!=1)for(k=0;kn;k+) /*比较到第n个学生*/*排除第i个学生记录*/if(k!=i&strcmp(stuk.num,stui.num)=0)/*判断学号是否有雷同*/puts(此记录已存在,请重新输入!n);w1=1;break;while(w1=1);(3)输入三个科目分数函数/*i表示第i个学生记录*/void scor
30、e_input(int i)int j;for(j=0;j3;j+)printf(分数 %d:,j+1);scanf(%d,&stui.scorej);/*循环语句依次输入三个分数*/(4)求平均值函数/*求平均值函数*/void average(int i)int j,sum;for(sum=0,j=0;j8|c1) puts(n选择错误,请重新输入!); getchar(); /*当输入是字符时可以防止是死循环*/ while(!(c=1);doswitch(c) /*选择要修改的项目*/case 1:no_input(i,n);break;case 2:printf(姓名:);scanf
31、(%s,stui.name);break;case 3:printf(分数1:);scanf(%d,&stui.score0);break;case 4:printf(分数2:);scanf(%d,&stui.score1);break;case 5:printf(分数3:);scanf(%d,&stui.score2);break;case 6:score_input(i);break;case 7:input(i);break;if(c2&c7)average(i);puts(n新数据:n);printf_face(); /*显示数据结构项目*/printf_one(i); /*修改后的数
32、据让用户确认*/printf(n是否确定?nnt1).是 2).否,重新修改 3).直接返回 bb);scanf(%d,&w1);while(w1=2);return(w1); /*返回控制值*/(7)显示数据结构项目/*显示数据结构项目函数*/void printf_face() /*显示数据结构项目函数*/printf(nt学号t姓名 分数1 分数2 分数3 平均n);(8)显示一个记录的函数/*显示一个记录的函数*/void printf_one(int i)int j;printf(%11st%-17s,stui.num,stui.name );for(j=0;j3;j+)printf
33、(%9d,stui.scorej);printf(t%9.2fn,stui.ave); /*保留两位小数*/5测试、结果进行分析5.1进入页面选择1是重新录入数据,不管原文件是否有内容,都会进行覆盖。选择2直接进入主菜单,可对原有文件进行数据处理。图515.2数据录入图525.3数据录入成功,直接返回菜单图535.4不进行数据录入,直接进入菜单。图545.5浏览数据图555.6添加数据图565.7浏览添加后的数据图575.8查找按姓名查找图585.9查找按学号查找图595.10修改对分数2进行修改图5105.11排序按平均分进行排序这里的一个问题是排序完了程序没有自动进行浏览,需要手动调用浏览函数图5115.12退出图5126总结8天的实习是短暂的,头两天主要是对C语言的快速复习以及对题目的分析,第三天才开始进行程序的编写。而最后一天主要是进行了界面的优化。从刚开始为了完成这项任务而实习,变成了为了锻炼自己,提高C语言编程能力而实习。8天下来感觉自己对C语言以及程序编辑的认识加深了许多。以前觉得很难的结构体,数组,文件全部用到了,虽然并不能完全掌握,那也有一些成就感。先说中间遇到的小问题,几乎每一个模块的录入,都会因为忘了加分号,忘了加括号,忘了加引号而出错,虽然好解决,但浪费了很大的时