[高等教育]学籍管理系统C语言实训报告二次终结版.doc

上传人:音乐台 文档编号:1994261 上传时间:2019-01-29 格式:DOC 页数:58 大小:1.24MB
返回 下载 相关 举报
[高等教育]学籍管理系统C语言实训报告二次终结版.doc_第1页
第1页 / 共58页
[高等教育]学籍管理系统C语言实训报告二次终结版.doc_第2页
第2页 / 共58页
[高等教育]学籍管理系统C语言实训报告二次终结版.doc_第3页
第3页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[高等教育]学籍管理系统C语言实训报告二次终结版.doc》由会员分享,可在线阅读,更多相关《[高等教育]学籍管理系统C语言实训报告二次终结版.doc(58页珍藏版)》请在三一文库上搜索。

1、北京联合大学实训报告课程名称: C语言程序设计课 项目名称: 学籍管理系统 学 院:自动化学院专 业:自动化(信息处理与智能技术)姓 名: 贾智超 李晶 朱伦伦 学 号:2010100302416 2010100302406 2010100301132指导教师: 李论 成 绩: 2011年6月20日2目录第一部分 实训题目与要求- 2 -1 问题提出- 2 -2 功能要求- 2 -3 任务分工- 3 -第二部分 设计实训题目功能- 4 -1 总体设计- 4 -2 算法设计- 5 -3 数据结构- 14 -4 程序代码设计- 14 -5 测试与调试- 29 -第三部分 实训总结- 33 -1 个

2、人总结- 33 -2 结束语- 35 -附录A 程序清单- 36 -附录B 用户使用说明书- 56 -参考文献- 56 - 第一部分 实训题目与要求1 问题提出学籍管理系统可广泛应用于全日制大、中小学及其他各类学校,对学生的成绩、升级、学籍变动进行综合管理和快速查询。可以节省在学籍管理花费的人力和物力,避免纸质文档易损坏,不易查找等缺点。同时可以随时随地的掌握学生信息,更简捷直白的对学生信息进行统计与管理。有助于提高学校的整体教育管理水平。2 功能要求1) 能够输入学生学籍信息并记录到文件中2) 能够随时调出学生学籍信息并进行浏览3) 能够将学生的学习成绩按照学号排序4) 能够计算学生五门成绩

3、的平均分并从高到低进行排序5) 能够统计学生成绩的分数段,并记录每个分数段的人数6) 能够生成并打印需要补考的学生名单7) 能够生成并打印需要退学的学生名单8) 删除退学学生的学籍并生成新名册9) 对学生的学籍可以随时输入、输出、查找、修改3 任务分工贾智超:编写主流程图、“生成并打印补考通知单”“生成并打印退学通知单”“生成并打印新名册”模块的代码编写及主流程图绘制实训报告的编写李 晶:编写主模块图“分数段排序”、“按照学号排序”,“求平均分并排序”模块的代码编写及相关流程图绘制。朱伦伦:编写主程序,“成绩录入”模块与“显示数据”模块的代码编写及相关流程图绘制第二部分 设计实训题目功能1 总

4、体设计模块设计:定义各函数的主要功能:1 scoreprint()录入数据 2 mainprint()显示主菜单3 scoreStat()统计成绩4 studentStatus()处理学籍 5 display()创新功能 6 sortAnhao()按学号排序7 jisuanPingjun()计算平均分并排序 8 tongjiFenshu()统计分数段9 buka()生成并打印补考通知单 10 tuixue()生成并打印退学通知单 11 xinmingdan()生成并打印新名册以上为学籍管理系统的模块图,可以实现录入成绩,统计成绩,显示数据,处理学籍四个大功能,其中统计成绩功能中可以实现按照学号

5、排序,计算平均分并排序,统计分数段得功能;处理学籍功能中可实现生成并打印补考和退学通知单以及新名册的功能。2 算法设计分析主模块算法如下:调用主函数:选择14模块并回车,执行相应功能:第一模块执行成绩录入功能;第二模块执行处理数据功能,并有三个子菜单,分别进行按学号排序、按平均成绩排序、统计分数的功能;第三模块执行学籍处理功能,并有三个子菜单,分别执行打印补考通知单、打印退学通知单、打印新名单的功能。若输入非法选项则会提示“非法选项”并提示是否继续。2建立录入成绩模块的流程图如下图所示:分析该录入成绩模块算法如下:创建一个文件yuan.txt,并把从键盘输入的数据(学号、姓名、成绩)存放在该文

6、件中;然后进入循环当中,每写入一组记录,文件记录数增1。若输入的学号为空。则返回继续输入学号。3建立按学号排序的流程图如下图所示:分析按学号排序的算法如下:首先定义循环变量i,j,k,n,以及学号和成绩变量,然后从yuan.txt文件中读取数据,进入循环,引用结构体中学号变量比较大小之后交换变量顺序,然后输入所需结果。4 计算平均分并排序的流程图如下:分析计算平均分并排序的算法如下:首先从yuan,txt文件中读取之前在成绩录入模块中输入的数据,然后进入循环结构中:1首先将每位同学的五门成绩求和,然后求出平均值;2 比较平均成绩的大小并交换排序;3将排好序的数据内容写入sort.txt文件中。

7、5 统计分数段的流程图如下:分析统计分数段的算法如下:首先从yuan.txt文件中读取之前在成绩录入模块中的数据,然后进入循环结构中,利用结构体将每位同学的每科成绩分别进行判断,一共分为90以上,80以上,70以上,60以上及不及格五个分数段,并输出所要结果。6 生成并打印补考通知单的流程图如下:分析生成并打印补考通知单的算法如下:以不及格科目在1至3之间者为需要补考,超过3科退学处理。先读取写好的文件中每个同学的成绩,定义结构体变量tempN,以tempn算出总共学生记录数n,以tempi.gradej 外层i循环读取不同学生,内层j循环读取不同科目成绩,并以si表示每个同学不及格科目数,若

8、1=si3 则输出为退学。8 生成并打印新名册的流程图如下:分析生成新名单的算法如下:在前两个模块的基础上,删除掉退学学生后产生新名单。在for循环中if判断 是否tempi.gradek60 统计出不及格科目si,若第i个学生不及格,在for(c=i;c=n;c+)中tempc=tempc+1删除不及格大于三个的学生将新名单保存在d:next.txt中9 分析创新功能中的显示数据的算法分析显示数据模块的算法如下:首先从yuan.txt的文件中读取数据,然后将读取的学生学籍信息按照“学号、姓名、分数”的格式输出。3 数据结构 struct student char numN; /*学生学号*/

9、char nameN; /*学生姓名*/int grade5; /*学生分数*/float pingjun; /*学生平均分*/;4 程序代码设计简介函数:(1)scoreInput()以下为成绩录入模块的代码设计: 首先定义变量类型。本模块涉及的变量有统计实际记录数的变量n,循环变量I;存放学号,姓名,成绩的3个数组,num,name,grade;另外还需要定义存放临时学号姓名的一维字符数组,临时成绩的一维整形数组。int i=1,j=0;struct student temp=0;FILE*fp=NULL;fp=fopen(d:yuan.txt,w);if(fp=NULL)printf(n

10、 打开文件失败!n);return;system(cls);printf(n注意:输入学号时请按照“0x”格式输入,例如“01”,真诚感谢您的使用!n);printf(n请输入第一个记录:n);printf( 学号(用#结束输入):);dogets(temp.num);while(strcmp(temp.num,)=0);printf( 姓名(用#结束输入):);gets(temp.name);printf( 请输入 高数 英语 物理 编程 马哲 成绩(用#结束输入): );for(j=0;j5;j+)scanf(%d,&temp.gradej);以下部分使用while循环控制输入,而没有使用

11、do-while循环,而且在程序中使用一个临时数组先接受用户输入的内容,其目的是确保用户属于的结束标志不被存放在数组中。为了保证用户输入的学号不为空,使用strcmp(tempnum,”)=0将输入的学号与空字符串进行比较。while(temp.num0!=#&temp.name0!=#&temp.grade0!=#)fprintf(fp,%23s%15s,temp.num,temp.name); for(j=0;j=4;j+)fprintf(fp,%5d,temp.gradej);fprintf(fp,n);i+;printf(n请输入第%d个记录:n,i);printf( 学号(用#结束输

12、入):);dogets(temp.num);while(strcmp(temp.num,)=0);printf( 姓名(用#结束输入):);gets(temp.name);printf( 请输入 高数 英语 物理 编程 马哲 成绩(用#结束输入): );for(j=0;j5;j+)scanf(%8d,&temp.gradej);fclose(fp);(2)sortAnhao()以下为按学号排序模块的代码设计:本模块实现的是按学号将之前录入的成绩记录从小到大进行排序。首先定义循环变量i,j,k以及控制变量n. 存放学号,姓名,成绩的3个数组,num,name,grade;另外还需要定义存放临时学

13、号姓名的一维字符数组,临时成绩的一维整形数组;int i=0,j=0,k=0,n=0,grade=0,num=0,m=0,ww;struct student tempN=0;struct student a;FILE *fp=NULL;FILE *fq=NULL;以下是从之前录入学生记录的yuan.txt文件中读取记录,并准备开始进入循环,实现按照学号排序的功能;fp=fopen(d:yuan.txt,r);if(fp=NULL)printf(n 打开文件失败!n);return;system(cls);while(feof(fp)=0)ww=fscanf(fp,%23s%15s,tempn.

14、num,tempn.name);if(ww=-1) break;for(j=0;j5;j+)fscanf(fp,%d,&tempn.gradej);n+;printf(共有%d个同学,n);fclose(fp); printf(n);以下开始进入循环当中,调用比较函数strcmp将前后两个学号的大小进行比较,如果前面的学号大于后面的学号,则将两条记录交换,否则不换位置; for(i=0; in; i+) k=i; for(j=k+1; j0) k=j; a=tempi; tempi=tempk; tempk=a;以下进入循环中,利用控制变量n来控制准备将按照学号排好序的学号,姓名和成绩记录按照

15、如下格式输出,并写入文件std.txt中; for(k=0;kn;k+)printf(%10s号 %10s同学,tempk.num,tempk.name);for(m=0;m5;m+)printf(%5d分,tempk.gradem);printf(n);if(n=0)printf(n 文件中无记录!n);else printf(n 文件中有%d个记录,n);fq=fopen(d:std.txt,w);if(fq=NULL)printf(打开文件失败!n);exit(0);for(i=0;in;i+)fprintf(fq,%23s%15s,tempi.num,tempi.name);for(j

16、=0;j5;j+)fprintf(fq,%2d,tempi.gradej);fprintf(fq,n);fclose(fq);printf(计算已完成 保存在d:std.txt文件当中,请查验);(3)jisuanPingjun()以下为按照平均分进行排序模块的程序代码设计:本模块实现的是首先将每位同学的五门成绩平均分计算出来然后按照平均分从高到低进行排序,并输出所需的结果。首先定义循环变量i,j,和控制变量n,还需要定义存放临时学号姓名的一维字符数组,临时成绩的一维整形数组;struct student tempN=0,aN=0;int i=0,j=0,n=0,ww=0;FILE*fp=NU

17、LL;FILE*fq=NULL;以下是从之前录入学生记录的yuan.txt文件中读取记录,并准备开始进入循环,实现按照平均分高低排序的功能;fp=fopen(d:yuan.txt,r);if(fp=NULL)printf(打开文件失败!n);exit(0);system(cls);while(feof(fp)=0)ww=fscanf(fp,%23s%15s,tempn.num,tempn.name);if(ww=-1) break;for(j=0;j5;j+)fscanf(fp,%d,&tempn.gradej);n+;以下开始进入循环中,首先利用控制变量n控制外层循环,即控制进入循环当中的记

18、录的个数必须小于n,然后利用内层循环计算出每条学生记录的平均成绩;for(i=0;in;i+)for(j=0;j5;j+)tempi.pingjun=tempi.pingjun+tempi.gradej;tempi.pingjun=tempi.pingjun/5;以下开始进入排序循环中,如果前一位同学的平均分低于后一位同学,则交换两个同学的位置;for(i=0;in;i+)for(j=0;jtempj.pingjun)ai=tempi;tempi=tempj;tempj=ai;以下为输出排好序的记录的代码,利用结构体循环将学号姓名平均分的完整记录输出,并写入文件sort.txt中;for(i=

19、0;in;i+)printf(学号是%10s 姓名是%15s 平均分是%10.2f ,tempi.num,tempi.name,tempi.pingjun);printf(n);fq=fopen(d:sort.txt,w);if(fq=NULL)printf(打开文件失败!n);exit(0);for(i=0;in;i+) fprintf(fq,%23s%15s%10.2f,tempi.num,tempi.name,tempi.pingjun );for(j=0;j5;j+)fprintf(fq,%2d,tempi.gradej);fprintf(fq,n);fclose(fq);printf

20、(计算已完成 保存在d:sort.txt文件当中,请查验);(4)tongjiFenshu()以下为统计分数段模块的程序代码设计:本模块实现的是将每位同学的每门课成绩进行分数段的统计,一共分为“90以上”,“80以上”,“70分以上”,“60分以上”,“不及格”五个分数段,并将每个分数段的人数统计出来输出所需的结果;首先定义循环变量i,j,和控制变量n,还需要定义存放临时学号姓名的一维字符数组,临时成绩的一维整形数组;int i=0,j=0,n=0,ww;int bN=0,cN=0,dN=0,eN=0,fN=0;struct student tempN=0;FILE*fp=NULL;以下是从之

21、前录入学生记录的yuan.txt文件中读取记录,并准备开始进入循环,实现按照分数段统计人数的功能;fp=fopen(d:yuan.txt,r);if(fp=NULL)printf(打开文件失败!n);return;system(cls);while(feof(fp)=0)ww=fscanf(fp,%23s%15s,tempn.num,tempn.name);if(ww=-1) break;for(j=0;j5;j+)fscanf(fp,%d,&tempn.gradej);n+;以下开始进入循环中,首先利用控制变量n控制外层循环,即控制进入循环当中的记录的个数必须小于n,然后利用内层循环以及if

22、 分支结构将学生的成绩与设定好的分数段进行比较,然后输出所需要的结果;for(i=0;in;i+)for(j=0;j=90)bj=bj+1;else if(tempi.gradej=80)cj=cj+1;else if(tempi.gradej=70)dj=dj+1;else if(tempi.gradej=60)ej=ej+1;else fj=fj+1;printf(各门课、各分数段学生的人数n);printf(_n);printf( |90分以上 | 8089分 | 7079分 | 6069分 | 60分以下 n);printf(-n);printf( 高数%10d%10d%10d%10d

23、%10dn,b0,c0,d0,e0,f0);printf(-n);printf( 英语%10d%10d%10d%10d%10dn,b1,c1,d1,e1,f1);printf(-n);printf( 物理%10d%10d%10d%10d%10dn,b2,c2,d2,e2,f2);printf(-n);printf(C语言%10d%10d%10d%10d%10dn,b3,c3,d3,e3,f3);printf(-n);printf( 马哲%10d%10d%10d%10d%10dn,b4,c4,d4,e4,f4);printf(_n);fclose(fp);(5)bukao()以下是生成并打印补考

24、通知单模块的程序代码设计:本函数为功能为生成并打印补考通知单,根据输入的学生成绩数据进行分析,以不及格科目在1至3之间者为需要补考,超过3科退学处理。先读取写好的文件中每个同学的成绩,定义结构体变量tempN,以tempn算出总共学生记录数n,以tempi.gradej 外层i循环读取不同学生,内层j循环读取不同科目成绩,并以si表示每个同学不及格科目数,若1=si=3 则输出为补考定义整型变量 i,e,j,n,ww,数组s5,结构体变量student tempN读文件d:yuan.txtint i=0,e=0,j=0,n=0,s5=0,ww;struct student tempN=0;FI

25、LE*fp=NULL;fp=fopen(d:yuan.txt,r);if(fp=NULL)printf(打开文件失败!n);return;文件读取完整,表示出学生数据数量nwhile(feof(fp)=0)ww=fscanf(fp,%23s%15s,tempn.num,tempn.name);if(ww=-1) break;for(j=0;j5;j+)fscanf(fp,%d,&tempn.gradej);n+;双重循环 ,外层循环学生,内层各科成绩循环,判断若成绩小于六十,统计不及格科目数sifor (i=0;in;i+)for(j=0;j5;j+)if(tempi.gradej=1 & s

26、i=3)printf(n);printf(学号%10s 姓名%10s n,tempi.num,tempi.name);if(tempi.grade060)printf(%10s您的高数成绩为%6d,需要补考,请于2011年9月15日上午9点在教学楼2014教室进行补考考试n,tempi.name,tempi.grade0);if(tempi.grade160)printf(%10s您的英语成绩为%6d,需要补考,请于2011年9月15日上午9点在教学楼2014教室进行补考考试n,tempi.name,tempi.grade1);if(tempi.grade260) printf(%10s您的物

27、理成绩为%6d,需要补考,请于2011年9月16日上午9点在教学楼2013教室进行补考考试n,tempi.name,tempi.grade2);if(tempi.grade360) printf(%10s您的编程成绩为%6d,需要补考,请于2011年9月16日下午3点在教学楼2013教室进行补考考试n,tempi.name,tempi.grade3);if(tempi.grade460) printf(%10s您的马哲成绩为%6d,需要补考,请于2011年9月17日下午3点在教学楼2013教室进行补考考试n,tempi.name,tempi.grade4);提示 若没人学要补考 空白 若有人不

28、考 输出 “以上学生需要补考”for(e=0;e0&se3 则输出为退学。定义整型变量 i,k,ww,数组s5,结构体变量student tempN读文件d:yuan.txtint i=0,k=0,s5=0,n=0,j=0,ww;struct student tempN=0;FILE*fp=NULL;fp=fopen(d:yuan.txt,r);if(fp=NULL)printf(打开文件失败!n);return;文件读取完整,表示出学生数据数量nwhile(feof(fp)=0)ww=fscanf(fp,%23s%15s,tempn.num,tempn.name);for(j=0;j5;j+

29、)ww=fscanf(fp,%d,&tempn.gradej);if(ww=-1) break;n+;双重循环 ,外层循环学生,内层各科成绩循环,判断若成绩小于六十,统计不及格科目数sifor(i=0;in-1;i+) for(k=0;k5;k+) if (tempi.gradek3)printf(n);printf(学号%10s 姓名%10s 由于您不及格的科目为%d门(多于3门),因此退学。n,tempi.num,tempi.name,si);if (tempi.grade060) printf(%15s您的高数成绩为%6d,为不及格。n,tempi.name,tempi.grade0);

30、if (tempi.grade160)printf(%15s您的英语成绩为%6d,为不及格。n,tempi.name,tempi.grade1);if (tempi.grade260)printf(%15s您的物理成绩为%6d,为不及格。n,tempi.name,tempi.grade2);if (tempi.grade360)printf(%15s您的编程成绩为%6d,为不及格。n,tempi.name,tempi.grade3);if (tempi.grade460)printf(%15s您的马哲成绩为%6d,为不及格。n,tempi.name,tempi.grade4); (7)xinm

31、ingdan在前两个模块的基础上,删除掉退学学生后产生新名单。在for循环中if判断 是否tempi.gradek60 统计出不及格科目si,若第i个学生不及格,在for(c=i;c=n;c+)中tempc=tempc+1删除不及格大于三个的学生将新名单保存在d:next.txt中,首先定义整型变量 i,k,v,n,m,j,p,c,ww,数组s5,z5,结构体变量student tempN读文件d:yuan.txtint i=0,k=0,s5=0,z5=0,v=0,n=0,m=0,j=0,p=0,c=0,ww;struct student tempN=0;FILE*fp=NULL;FILE*f

32、q=NULL;fp=fopen(d:yuan.txt,r);if(fp=NULL)printf(打开文件失败!n);return;文件读取完整,表示出学生数据数量nwhile(feof(fp)=0)ww=fscanf(fp,%23s%15s,tempn.num,tempn.name);if(ww=-1) break;for(j=0;j5;j+) fscanf(fp,%d,&tempn.gradej);n+;while(i=n)for循环中判断成绩是否不及格,并统计不及格科目数sifor(k=0;k5;k+)if (tempi.gradek60)si=si+1;for(v=0;v5;v+)if(

33、tempi.gradev=0)zi+;if(zi=5)break;统计剩余学生数量iif(si3)for(c=i;c=n;c+)tempc=tempc+1;si=0;显示新名单,并写入文件d:next.txtprintf(n);printf(删除已退学的学生后,学生名册为:);printf(n);for(i=0;in;i+)printf(n);printf(学号%10s姓名%10s,tempi.num,tempi.name);for(m=0;m5;m+)printf(成绩%4d,tempi.gradem);printf(n);fq=fopen(d:next.txt,w);if(fq=NULL)

34、printf(打开文件失败!n);exit(0);for(i=0;in;i+)fprintf(fq,%23s%15s,tempi.num,tempi.name);for(j=0;j5;j+)fprintf(fq,%2d,tempi.gradej);fprintf(fq,n);fclose(fq);printf(计算已完成 保存在d:next.txt文件当中,请查验);注:完整程序请参见附录A。- 55 -5 测试与调试测试数据类型测试数据预期结果实测结果合法数据在主菜单中输入1进入录入同学学籍菜单进入录入同学学籍菜单在创建同学学籍输入信息在yuan.dat文件存入同学信息yuan.dat文件有同学信息非法数据在主菜单中输入“a”输出“a为非法选项”输出“a为非法选项”在每次完成一项是弹出“是否继续(Y/N)?”输入1没有反应没有反应测试数据类型测试数据预期结果实测结果合法数据在主菜单下输入2进入scorestat()进入成绩统计界面在成绩统计界面输入1按照学号从小到大排序按照学号从小到大排序在成绩统计界面输入2按照平均分从高到低进行排序按照平均分从高到低进行排序在成绩统计界面输入3统计分数段统计分数段非法数据在主菜单输入a输出“a为非法选项”非法字符在编辑菜单输入b输出“b为非法选项”非法字符

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1