1、C语言程序设计实习报告 行编辑器 学生管理系统C程序设计实习报告题目:简单的行编辑器(修改版) 学 院: 专 业: 姓 名:班级学号:指导教师: 2009年 7 月 3 日前言由于我们班选题是题号和学号一一对应,所以我抽到了16题,简单的行编辑器。刚开始时不知道什么叫行编辑器,以为这个题目有多么的神秘,第二次实习时老师说选这个题目最好换个题,与老师交流,老师建议在原有的题目上加些功能。只是还是不知道什么叫行编辑器,上网,问同学,没有一点思路。再一次问老师,老师说不用管它什么是行编辑器,编辑的目的是为了后面对文件进行处理,于是这一次总算有了新的思路。等到这个题快要做完时,也明白了为什么老师说它太
2、简单了,做完后自己感觉都有串改题目之嫌疑,原题的要求实在太简单了,自己加的功能占了程序的大部分。8天下来感觉自己对C语言以及程序编辑的认识加深了许多。以前觉得很难的结构体,数组,文件全部用到了,虽然并不能完全掌握,那也有一些成就感。在这里要感谢老师以及我的同学,在整个编程中给了我很大的帮助。1题目要求原题:简单的行编辑器【要求】(1) 设置一个简单的行编辑器,每行以回车结束。(2) 数据以文件形式储存。(3) 编辑器具有查找、替换、修改数据的功能。修改后:修改思路是将由行编辑器生成的文件换成有关结构体的内容,建立一个结构体输入关信息,生成文件,再实现查找、替换、修改数据等的功能。这里具体是参考
3、书上学生成绩管理系统,实现成绩的录入,显示,查找,添加,保存等功能模块。2需求分析根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入、输出等操作;在程序中需要浏览学生的信息,应提供显示、查找、排序等操作;另外还应提供键盘式选择菜单实现功能选择。3概要设计3.1设计思想由于原题的特点,对题目进行了一定的拓展。本着提高自己编程能力,加深对C语言重点、难点内容的理解,添加了关于结构体、数组以及文件的运用。将程序模块化,使程序条理清楚,制作简单,容易读懂,并能体会到程序开发的思想与方法,加深对C语言编程的认识。3.2软件运行与开发平台C语言,Windows平台,VC6.0,3.3数据结构此
4、处选用了结构体的形式来存放每一个学生的信息,对与若干个学生采用了结构体数组。3.4系统结构图4详细设计4.1主函数主函数比较简单,只提供了输入和菜单函数的调用。各个功能的模块用菜单方式选择。【程序】void main()int q,w1; printf(tt*行编辑器(修改拓展版)*nn); printf(ttttt072092t周磊t20091002238nn); do printf(tt重新录入数据请按1tt进入菜单请按2: bb); scanf(%d,&q); if(q!=1&q!=2) /*对选择数字作出判断*/ w1=1; getchar(); else w1=0;while(w1=
5、1); if(q=1) /*if语句选择要进行的操作*/ enter(); else menu();4.2各功能模块设计(1)输入模块考虑到自己在C学习时遇到的问题,以及在考计算机二级时薄弱的地方,以及联系这个题目的要求,此处选用了结构体的形式来存放每一个学生的信息,对与若干个学生采用了结构体数组。具体到各个数据的信息,学号和姓名采用了字符型数组,分数为整型,而平均分采用了实型。/*定义结构体变量*/struct student char num20;/*学号*/ char name100;/*姓名*/ int score3;/*分数*/ float ave;/*平均分*/stuN; /*st
6、uN中每个元素对应一个学生*/N采用了宏定义的方式,可以随时在源程序中修改。【程序】/*输入模块*/void enter() int i,n; printf(请输入学生数量(0-%d)?:,N-1); scanf(%d,&n); printf(n请输入数据nn); for(i=0;in;i+) printf(n 输入第%d个学生记录n,i+1); input(i); /*调用输入函数*/ if(i!=0) save(); /*调用保存函数*/(2)浏览模块该模块的功能是显示所有学生的记录信息,流程如图。图4.22【程序】/*浏览函数*/void browse()/*浏览模块,前面多次用到*/
7、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(nt共有%d条记录.n,n); printf(n任意键返回nn); getch(); menu();(3)添加模块该模块的功能是用户需要增加新的学生记录,注意新添加的内容不能覆盖原来的记录。追加模块流程图:【程序】/*添加模块*/void add() int i,n,m,k; FILE *fp; n=load(); print
8、f(请输入添加的学生个数(0-%d)?:,N-1-n); scanf(%d,&m); /*m为添加学生的个数*/ k=m+n-1; for(i=n;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)查找模块该模块在参考程序上
9、做的一定逻辑上的修改,可以按姓名和按学号进行查找,找到以后,可进行修改和删除信息的操作。由于改动方便,这里的按姓名和按学号查找分了两个函数,使函数比较烦缀,故函数还可以进行优化。【程序】a)查找模块 /*查找函数*/void search() int z,w1; do printf(请输入查找方式: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(); /*调用按姓名查找程序*/ else sea
10、rch_no(); /*调用按学号查找程序*/b) 按姓名查找模块这个是根据姓名查找到对应的学生记录,但在此处程序有一定的缺陷,就是如果有相同的姓名,只能查到最上面的一个,而其他的则不能找到。后来尝试修改时发现,还需要改动其他相应的函数,故没有进行下去。【程序】/*按姓名查找*/void search_name() int i,n,k,w1=1,w2,w3,w4; struct student s; n=load(); do do k=-1; printf(nn请输入要查找的姓名! 姓名:); scanf(%s,s.name); /*输入要修改的数据的姓名*/ printf_face(); /
11、*调用显示数据结构项目的函数*/ 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请选择下一步:nt1).查找其他
12、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) 按学号查找模块这个函数是在按姓名查找模
13、块的基础上做了相应的改动,由于学号具有唯一性,故不存在查不到相同学号的情况。【程序】/*按学号查找程序*/void search_no() int i,n,k,w1=1,w2,w3,w4; struct student s; n=load(); do do k=-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_one(k);break; if(k=-1) printf(nn记录不存在!); printf(n
14、n是否继续?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).返回 bb); scanf(%d,&w4); if(w4=1) stuk.ave=0;
15、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); printf_one(i); printf(nt共有%d条记录.
16、n,n); printf(n任意键返回nn); getch(); menu();(5)修改模块该模块首先要显示所有学生的信息,并采用分屏显示。显示完所有记录后,用户输入要修改的学生的学号,根据学号查找学生记录,并提示用户修改该记录的哪部分信息。【程序】/*修改函数*/void modify() struct student s; int i,n,k,w0=1,w1,w2=0; n=load(); do k=-1; printf_face(); /*调用显示数据结构项目函数*/ for(i=0;in;i+) if(i!=0)&(i%10=0) /*目的是分屏显示*/ printf(nn记住你要修
17、改的学号.任意键继续 .); getch(); puts(nn); printf_one(i); /*调用显示一个记录的函数*/ do printf(nn请输入你想要修改的学号:); scanf(%s,s.num); /*输入要修改的数据的学号*/ for(i=0;in;i+) if(strcmp(s.num,stui.num)=0) k=i; /*找到要修改的记录*/ s=stui; /*备份当次要修改的学生记录stui*/ if(k=-1) printf(nn记录不存在!); /*当k=-1表示没有找到*/ while(k=-1); printf_face(); printf_one(k)
18、; w1=modify_data(k,n); /*修改学生记录并返回保存控制值*/ if(w1=1) printf(n操作成功_.nn是否继续修改?nnt1).是2).返回并保存t bb); scanf(%d,&w0); w2=1; /*用来控制保存,使w2=1是标记已有过的修改*/ else w0=0; if(w2=1) stuk=s; if(w0!=1&w2=1) save();/*w2不等于1表示在此次之前没有修改过,这是就保存用户已确认的修改并返回*/ while(w0=1); printf(nn你所修改的内容不存在); menu();(6)排序模块该模块在原有的排序模块上做了一定的修
19、改,可以按照分数1,、分数2、分数3以及平均数进行由大到小的排序。这里选择了冒泡法排序。由于改动方便,这里的4种排序方法在程序上其实是大同小异,因此程序还需进行一定的优化。还有一个问题就是排序结束后不能直接浏览,需要手动调用浏览模块。其原因是在排序后调用了保存函数,而保存函数保存完毕要直接返回主菜单。如果先进行浏览的话,所显示内容不是排序后的。【程序】a) 排序模块 /*排序模块*/void order() int m; printf(请选择排序方式:1).按分数1排序 2).按分数2排序 3).按分数3排序 4).按平均分排序nn); scanf(%d,&m); switch(m) case
20、 1:order_score1();break;/*分数1*/ case 2:order_score2();break;/*分数2*/ case 3:order_score3();break;/*分数3*/ case 4:order_ave();break; /*平均分*/ b) 按四种方式排序/*按平均分排序*/void order_ave() 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;
21、 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 =stuj; stuj =s; save(); puts(nn); menu();/*按分数2排序*/void order_score2() int i,j,n; struct student s; n=load();
22、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-1;i+) /*冒泡法排序*/ for(j=i+1;jn;j+) if (stui.score2stuj.score2 ) s=stui; stui =stuj; stuj =s; sa
23、ve(); puts(nn); menu();(7)保存模块这个模块单独放在菜单里其实有点缀余,因为每个对文件进行写入或修改的操作都单独进行了保存。这里文件的读写全用的是二进制,所以保存的文件直接以文本打开后会出现乱码。【程序】/*保存函数*/void save()/*存储函数*/ int i; FILE *fp; if(fp=fopen(zhoulei.txt,w)=NULL) /*按只写方式打开文件*/ printf(文件无法打开n);/*防止文件为空,并报错*/ for(i=0;iN;i+) if(stui.ave!=0)/*stui.ave!=0表示此记录已删除*/ if(fwrite
24、(&stui,sizeof(struct student),1,fp)!=1) /*这里用二进制进行文件的读写,是文件不能通过电脑直接打开*/ printf(文件写入错误n); fclose(fp); printf(nn保存成功!nn按任意键继续nn); getch(); menu(); /*一般的保存模块,用于各种变动之后,文件的保存*/4.3公共函数这里都是些在每个模块都可能用到的公共函数(1)加载函数/*加载函数*/int load() FILE *fp; int i; if(fp=fopen(zhoulei.txt,rb)=NULL) /*以只读方式打开一个二进制文件*/ printf
25、(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; do w1=0; printf(学号:); scanf(%s,stui.num); for(j=0;stui.numj!=0;j+) /*学号输入函数,作了严格的规定*/ if(stui.numj9) /*判断学号是否为数字*/ put
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1