1、北*学课程设计报告课程名称: C语言程序设计课设 项目名称: 学籍管理系统 学院: 专业: 姓名: 学号: 指导教师: 成 绩: 2010年6月4日目 录第1部分 课程设计题目与要求11.问题描述12.功能要求13.任务分工3第2部分 学籍管理系统的设计与功能实现41.总体设计42.数据结构53.算法设计54.程序代码设计115.测试与调试11第3部分 课程设计总结121.个人总结122.结束语12附录 程序清单13附录 用户使用说明书13参考文献13C程序课设学籍管理系统第1部分 课程设计题目与要求1.问题描述为了分析教学效果并进行相应的学籍处理,各学校每到学期末都对综合成绩进行分类统计、上
2、报成绩汇总结果等,这给每位老师和学籍管理人员带来很大的工作量。使用学籍管理系统可以减少工作者的工作负担。为了方便管理人员查找学生信息,在创新功能中,增加查询成绩功能,增加按学科成绩排名的功能,由于学籍管理系统涉及学生成绩及信息的安全,所以有必要给系统增加密码保护的功能,以保护系统信息的安全。2.功能要求循环显示如图-1所示的主菜单。其中,原始数据的排列是无序的。系统应能够保留原始成绩单。图-1在主菜单选择1:可以进行成绩的录入。在主菜单选择2:进入如图-2的子菜单,并统计成绩。在此可以计算平均、统计各分数段、按学号排序、按平均分排序。在子菜单选择1时,将该班学生的成绩按学号升序排序后的顺序存入
3、std.dat文件中,以方便打印。在子菜单选择2时,求出每位学生的平均分,并按平均分从高到低的顺序进行排序后,写入文件sort.dat中。在子菜单选择3时,统计出各门课、各分数段学生的人数,并如下表的形式输出。在子菜单选择4,返回主菜单;选择0,退出整个系统。 图-2在主菜单选择3:进入如图-3所示的子菜单,处理学籍。在子菜单中选择1,为不及格的学生打印重考通知单时,应在通知单上写明重考的课程、时间和地点(由键盘输入)。为了参加多门课重考的学生完成补考,应避免时间重复。在子菜单中选择2,为3门以上不及格的学生打印退学通知单。通知单上应写明学生的学号、姓名、退学原因(几门课不及格,成绩是多少)。
4、在子菜单中选择3时,删除已退学 的学生信息,将该班中升入高年级的学生信息写入文件next.dat中。在子菜单 选择4,返回主菜单;选择0,退出整个系统。 图-3在主菜单中选择4:进入如图-4所示的子菜单,在子菜单中选择1时,可以用学生的学号或姓名查询学生的成绩。在子菜单中选择2时,可以选择5门课查看五门单科成绩排名,在子菜单中选择3,可以对系统程序进行密码设置,以保护系统程序中的信息安全。 图-4在主菜单中选择5:可以显示我们组成员信息。如图-5所示。 图-5在主菜单中选择0:显示结束信息。按任意键后,退出系统。主菜单和子菜单 能够循环出现,每一项菜单执行之后,询问用户是否继续进行。从子菜单
5、可以返回到主菜单。3.任务分工我们小组成员有C,B和A。此程序是由我们共同完成的。由C负责录入成绩模块(void mycreate voidmyprintf1() void myprintf2() void myprintf3() void myrintf4()函数),B负责统计成绩模块(void mychongji函数,其中包括void mypiauxu1() 、void mypianxu2() 、void mypianxu3()函数),A负责主模块,学籍处理模块和创新功能模块(包括void chulixueji() void chuanxin函数,其中包括void bukao(),void
6、 tuixue(), void shengxue(),void chaxun(),void xueke(),void shezhimima()函数)。60第2部分 学籍管理系统的设计与功能实现1.总体设计根据题目要求,本系统分为一个主模块和五个子模块,其中,子模块包括录入成绩模块、统计成绩模块、处理学籍模块、创新功能模块和关于我们等五个模块。系统功能结构图如下图所示:本系统包括以下12个函数:(1)void myprintf1();函数功能:输出主菜单。(2)void myprintf2();函数功能:输出成绩统计子菜单。(3)void myprintf3();函数功能:输出学籍处理子菜单。(
7、4)void myprintf4();函数功能:输出创新功能子菜单。(5)void myprintf5();函数功能:输出关于我们模块内容。(6)void mycreate();函数功能:定义录入成绩函数,通过键盘输入学生学号,姓名和各科成绩并存放到文件中。(7)void pianxu1(struct student stu,int n);函数功能:定义按学号排序函数,将所有学生的信息通过学号进行排序(被void mytongji函数调用)。(8)void pianxu2(struct student stu,int n);函数功能:定义按平均分排序函数,将所有学生的信息通过其平均分进行排序(
8、被void mytongji函数调用)。(9)void pianxu3(struct student stu,int n);函数功能:定义统计各科分数段函数,将所有学生的各科成绩进行统计,按分数段进行输出(被void mytongji函数调用)。(10)void mytongji();函数功能:定义成绩统计函数。(11)void bukao(struct student stu,int n);函数功能:定义生成并打印补考通知单(被void chulixueji函数调用)。(12)void tuixue(struct student stu,int n);函数功能:定义生成并打印退学通知单(被c
9、hulixueji函数调用)。(13)void shengxue(struct student stu,int n);函数功能:定义生成并打印新名册(被chulixueji函数调用)。(14)void chulixueji();函数功能:定义处理学籍函数。(15)void chaxun(struct student stu,int n);函数功能:定义查询成绩函数(被函数void chuanxin()调用)。(16)void xueke(struct student stu,int n);函数功能:定义学科成绩排名函数(被函数void chuanxin()调用)。(17)void shezhi
10、mima();函数功能:定义密码保护函数(被函数void chuanxin()调用)。(18)void chuanxin();函数功能:定义创新功能函数。2.数据结构学生信息项用结构体student表示,其中包括7个属性,学号num,姓名name,5门成绩chengji5。struct student char num10,name15;int chengji5;学生补考信息项用结构体bukaoxinxi表示,其中包括6个属性,补考时间time1,补考地点size1,补考时间time2,补考地点size2,补考时间time3,补考地点size3。struct bukaoxinxichar ti
11、me110,time210,time310,size110,size210,size310;3.算法设计系统主函数mian()设计录入成绩模块函数void mycreate设计成绩统计模块函数void tongji设计处理学籍模块函数void chulixueji设计 创新功能模块函数void chuanxin设计关于我们模块函数void myprintf5设计4.程序代码设计(1)主模块函数部分代码domyprintf1();printf( );choose=getch();printf(n);switch(choose)case 1:/*录入成绩*/mycreate();break;cas
12、e 2:/*统计成绩*/mytongji();break;case 3:/*处理学籍*/chulixueji();break;case 4:/*创新功能*/chuanxin();break;case 5:/*关于我们*/myprintf5();break;case 0:/*退出系统*/system(cls);printf(nnnnnnn =n 感谢使用本软件,已正常退出,按任意键结束!n =nnnn );exit(0);default :printf( %c为非法选项,请重新输入!按任意键继续!n ,choose);getch();while(choose!=0);此为主模块的主要代码。用do
13、-while循环,显示主菜单,再用getch来输入要选择的项choose,用switch来判断所选的,然后执行相应的函数,如选择1,就执行mycreate函数等。如果输入 的不是0-5,就会一直的循环,直到输入的是0-5选项。(2) 录入成绩模块函数部分代码fp=fopen(chengji.dat,a);dofflush(stdin);/清除缓存printf( 请输入学生的成绩:n);printf( 学号(按#结束输入):);dogets(temp.num);while(strcmp(temp.num,)=0);printf( 姓名(按#结束输入):);dogets(temp.name);wh
14、ile(strcmp(temp.name,)=0);printf( 请依次输入高数、英语、物理、编程、马哲成绩:);scanf(%d%d%d%d%d,&temp.chengji0,&temp.chengji1,&temp.chengji2,&temp.chengji3,&temp.chengji4);if(temp.num0!=#&temp.name0!=#)fprintf(fp,%s %s %d %d %d %d %d n,temp.num,temp.name,temp.chengji0,temp.chengji1,temp.chengji2,temp.chengji3,temp.cheng
15、ji4);while(temp.num0!=#&temp.name0!=#);fclose(fp);程序开始先以“a”方式打开文件chengji.dat,显示提示输入内容,用do-while循环将输入成绩包裹在内,当输入的不是“#”号,就继续执行循环,继续输入 成绩。循环内又镶有do-while循环,要判断输入的是不是为空,若为空,则重新输入。然后将输入的内容写入文件chengji.dat中,当输入的为“#”号时,跳出循环,结束输入。(3)统计成绩模块函数部分代码for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;t=stuk;stuk=stui;stui=t;这是用选择
16、排序法对学生的信息按学号进行排序。for(i=0;in;i+)avei=(stui.chengji0+stui.chengji1+stui.chengji2+stui.chengji3+stui.chengji4)/5.0;for(i=0;in-1;i+)k=i;for(j=i+1;javej)k=j;t2=stuk;stuk=stui;stui=t2;t1=avek;avek=avei;avei=t1;用for循环计算每一位学生的平均分ave,再用选择排序法对每一位学生按平均分进行排序。for(i=0;in;i+)/统计高数各分数段的人数if(stui.chengji0/106)gaoshu
17、4+;elseif(stui.chengji0/10=10)gaoshu0+;elsegaoshu9-(stui.chengji0/10)+;这是统计高数各分数段的人数。用for循环对每一位学生的高数成绩进行判断,stui.chengji0/106是指学生的成绩小于60分,并在高数60分以下的人数增一。stui.chengji0/10=10是指学生的成绩等于100分,并在高数90分以上的人数增一。gaoshu9-(stui.chengji0/10)+;是指对学生的每一分数段的人数进行统计,并在相应的人数段增一。domyprintf2();printf( );choose=getch();pri
18、ntf(n);switch(choose)case 1:pianxu1(stu,i);break;case 2:pianxu2(stu,i);break;case 3:pianxu3(stu,i);break;case 4:return;case 0:system(cls);printf(nnnnnnn =n 感谢使用本软件,已正常退出,按任意键结束!n =nnnn );exit(0);default :printf( %c为非法选项,请重新输入!按任意键继续!,choose);getch();while(choose!=0);此为成绩统计功能模块的主要代码。用do-while循环,显示成绩统
19、计模块子菜单,再用getch来输入要选择的项choose,用switch来判断所选的,然后执行相应的函数。如果输入的不是0-4,就会一直的循环,直到输入的是0-4选项。(4)学籍处理模块函数部分代码for(i=0;i0&counti=3)k=0;for(j=0;j5;j+)if(stui.chengjij60)k+;if(k=1)switch(j) case 0:printf(%15s学生高数不及格,请输入他的补考时间和地点:,stui.name);scanf(%s%s,&bukaoreni.time1,&bukaoreni.size1);break; case 1:printf(%15s学生
20、英语不及格,请输入他的补考时间和地点:,stui.name);scanf(%s%s,&bukaoreni.time1,&bukaoreni.size1);break; case 2:printf(%15s学生物理不及格,请输入他的补考时间和地点:,stui.name);scanf(%s%s,&bukaoreni.time1,&bukaoreni.size1);break; case 3:printf(%15s学生编程不及格,请输入他的补考时间和地点:,stui.name);scanf(%s%s,&bukaoreni.time1,&bukaoreni.size1);break; default
21、:printf(%15s学生马哲不及格,请输入他的补考时间和地点:,stui.name);scanf(%s%s,&bukaoreni.time1,&bukaoreni.size1);break;if(k=2)dol=0;switch(j) case 0:printf( 高数不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time2,&bukaoreni.size2);break; case 1:printf( 英语不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time2,&bukaoreni.size2);break; ca
22、se 2:printf( 物理不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time2,&bukaoreni.size2);break; case 3:printf( 编程不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time2,&bukaoreni.size2);break; default :printf( 马哲不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time2,&bukaoreni.size2);break;if(strcmp(bukaoreni.time2,bukaoren
23、i.time1)=0)l=1;printf( 您输入的时间冲突!请重新输入!n);while(l=1);if(k=3)dol=0;switch(j) case 0:printf( 高数不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time3,&bukaoreni.size3);break; case 1:printf( 英语不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time3,&bukaoreni.size3);break; case 2:printf( 物理不及格,请输入他的补考时间和地点:);scanf(%s%s,
24、&bukaoreni.time3,&bukaoreni.size3);break; case 3:printf( 编程不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time3,&bukaoreni.size3);break; default :printf( 马哲不及格,请输入他的补考时间和地点:);scanf(%s%s,&bukaoreni.time3,&bukaoreni.size3);break;if(strcmp(bukaoreni.time3,bukaoreni.time1)=0)l=1;printf( 您输入的时间冲突!请重新输入!n);if(s
25、trcmp(bukaoreni.time3,bukaoreni.time2)=0)l=1;printf( 您输入的时间冲突!请重新输入!n);while(l=1);这是对成绩不及格科目少于等于3科的学生生成并打印补考通知单的代码,先对学生成绩不及格科目进行统计,若学生不及格科目数count大于0而小于等3时,该学生就要进行补考,利用for循环,对每一个学生每一门科进行判断,若该门科不及格,就要求为他输入补考的时间和地点,用switch要判断学生是哪门科不及格,再用if来判断学生的补考时间是否有冲突。最后,再用for循环逐一将需要补考的学生显示出来。for(i=0;in;i+)for(j=0;j
26、5;j+)if(stui.chengjij3)printf( %-15s %-15s,stui.num,stui.name);for(j=0;j5;j+) if(stui.chengjij60)switch(j) case 0:printf(高数 %-4d,stui.chengji0);break; case 1:printf(英语 %-4d,stui.chengji1);break; case 2:printf(物理 %-4d,stui.chengji2);break; case 3:printf(编程 %-4d,stui.chengji3);break; default :printf(马
27、哲 %-4d,stui.chengji4);break;printf(n);这是学生退学名单的代码,用for循环对不及格科目大于3科的学生进行统计,再用switch将其每一门不及格的科目 显示出来。for(i=0;in;i+)for(j=0;j5;j+)if(stui.chengjij60)counti+;if(counti=3)printf( %-15s %-15s %-7d%-7d%-7d%-7d%-7dn,stui.num,stui.name,stui.chengji0,stui.chengji1,stui.chengji2,stui.chengji3,stui.chengji4);fp
28、rintf(fp,%s %s %d %d %d %d %dn,stui.num,stui.name,stui.chengji0,stui.chengji1,stui.chengji2,stui.chengji3,stui.chengji4);用for循环对每一位学生的每一不及格门科进行统计,再用if判断每一个学生的不及格科目是否不大于3,当不及格科目count 不大于3时,将其输出并写入文件next.dat中。(5)创新功能模块函数部分代码printf( 请输入要查询的学号:); gets(a); for(i=0;itime1,bukaoreni-size1);错误error C2232: -
29、time1 : left operand has struct type, use .,经查是运算符的优先级的问题,按照系统指示,将“-”改成“.”问题就解决了。4、整个程序调试如下 (1)运行主程序,出现主界面按任意键后,出现主菜单界面如下(2)调试1功能,出现提示信息因为原有记录,因此输入y,并输入学生“带头大哥”的成绩,如图然后输入# 号结束输入,跳回主菜单。功能1运行正常。(3)调试功能2,出现成绩统计子菜单,如图输入1后,程序显示如图成绩单正常。按y 后返回成绩统计子菜单。输入2后,程序显示成绩统计正常。这时,验证“要继续选择吗(Y/N)?”,按N后,程序运行显示按任意键后,程序自动
30、关闭。重启程序,并回到成绩统计子菜单,选择3后,程序运行显示程序运行结果正常。输入Y,再输入0后,运行结果如下 程序运行结果正常。(4)重启程序,选择3,调试功能3,程序显示处理学籍子菜单选择1,并为补学生输入补考时间和地点,程序运行显示程序运行正常。返回子菜单,选择2,程序运行显示程序运行结果正常。返回子菜单,选择3,程序运行显示程序运行结果正常。程序能正常返回主菜单。(5)调试功能4,程序运行显示创新功能子菜单选择1,输入x,按学号查询,程序显示回车后程序运行结果正确。按姓名查询如下程序运行正常。当输入一个错误的查询学号,如109302100程序运行结果正确。返回,选择2,程序运行显示输入1程序运行结果正常。返回选择3,进入密码设置,因先前并无设置密码,因此程序运行显示输入密码后回车为了验证密码是否已设置,再进入密码设置返回,结果程序运行,重启,验证是否密码生效程序运行显示此时,在程序启动后,要求输入密码,若密码输入错,则程序显示输入正常密码后,程序顺利进入主菜单。功能4正常。(6)调试功能5,即关于我们模块,主菜单下,选择5,程序运行显示按任意键后,程序返回到主菜单 。关于我们模块正常。(7)主菜单 下,选择0,程序自动关闭。(8)主菜单 下,输入除0-5外的字符,程序显示 经过调试,程序功能正常,运行结果正确。第3部分 课程设计总结1.个人总结2009110302104C