学籍管理系统C语言程序课设报告.docx
- 文档编号:24958463
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:85
- 大小:684.90KB
学籍管理系统C语言程序课设报告.docx
《学籍管理系统C语言程序课设报告.docx》由会员分享,可在线阅读,更多相关《学籍管理系统C语言程序课设报告.docx(85页珍藏版)》请在冰豆网上搜索。
学籍管理系统C语言程序课设报告
北****学
课程设计报告
课程名称:
C语言程序设计课设
项目名称:
学籍管理系统
学院:
专业:
姓名:
学号:
指导教师:
成绩:
2010年6月4日
第1部分课程设计题目与要求1
1.问题描述1
2.功能要求1
3.任务分工3
第2部分《学籍管理系统》的设计与功能实现4
1.总体设计4
2.数据结构5
3.算法设计5
4.程序代码设计11
5.测试与调试19
第3部分课程设计总结28
1.个人总结28
2.结束语29
附录Ⅰ程序清单30
附录Ⅱ用户使用说明书57
参考文献60
第1部分课程设计题目与要求
1.问题描述
为了分析教学效果并进行相应的学籍处理,各学校每到学期末都对综合成绩进行分类统计、上报成绩汇总结果等,这给每位老师和学籍管理人员带来很大的工作量。
使用学籍管理系统可以减少工作者的工作负担。
为了方便管理人员查找学生信息,在创新功能中,增加查询成绩功能,增加按学科成绩排名的功能,由于学籍管理系统涉及学生成绩及信息的安全,所以有必要给系统增加密码保护的功能,以保护系统信息的安全。
2.功能要求
循环显示如图-1所示的主菜单。
其中,原始数据的排列是无序的。
系统应能够保留原始成绩单。
图-1
在主菜单选择1:
可以进行成绩的录入。
在主菜单选择2:
进入如图-2的子菜单,并统计成绩。
在此可以计算平均、统计各分数段、按学号排序、按平均分排序。
在子菜单选择1时,将该班学生的成绩按学号升序排序后的顺序存入std.dat文件中,以方便打印。
在子菜单选择2时,求出每位学生的平均分,并按平均分从高到低的顺序进行排序后,写入文件sort.dat中。
在子菜单选择3时,统计出各门课、各分数段学生的人数,并如下表的形式输出。
在子菜单选择4,返回主菜单;选择0,退出整个系统。
图-2
在主菜单选择3:
进入如图-3所示的子菜单,处理学籍。
在子菜单中选择1,为不及格的学生打印重考通知单时,应在通知单上写明重考的课程、时间和地点(由键盘输入)。
为了参加多门课重考的学生完成补考,应避免时间重复。
在子菜单中选择2,为3门以上不及格的学生打印退学通知单。
通知单上应写明学生的学号、姓名、退学原因(几门课不及格,成绩是多少)。
在子菜单中选择3时,删除已退学的学生信息,将该班中升入高年级的学生信息写入文件next.dat中。
在子菜单选择4,返回主菜单;选择0,退出整个系统。
图-3
在主菜单中选择4:
进入如图-4所示的子菜单,在子菜单中选择1时,可以用学生的学号或姓名查询学生的成绩。
在子菜单中选择2时,可以选择5门课查看五门单科成绩排名,在子菜单中选择3,可以对系统程序进行密码设置,以保护系统程序中的信息安全。
图-4
在主菜单中选择5:
可以显示我们组成员信息。
如图-5所示。
图-5
在主菜单中选择0:
显示结束信息。
按任意键后,退出系统。
主菜单和子菜单能够循环出现,每一项菜单执行之后,询问用户是否继续进行。
从子菜单可以返回到主菜单。
3.任务分工
我们小组成员有C,B和A。
此程序是由我们共同完成的。
由C负责录入成绩模块(voidmycreatevoidmyprintf1()voidmyprintf2()voidmyprintf3()voidmyrintf4()函数),B负责统计成绩模块(voidmychongji函数,其中包括voidmypiauxu1()、voidmypianxu2()、voidmypianxu3()函数),A负责主模块,学籍处理模块和创新功能模块(包括voidchulixueji()voidchuanxin函数,其中包括voidbukao(),voidtuixue(),voidshengxue(),voidchaxun(),voidxueke(),voidshezhimima()函数)。
第2部分《学籍管理系统》的设计与功能实现
1.总体设计
根据题目要求,本系统分为一个主模块和五个子模块,其中,子模块包括录入成绩模块、统计成绩模块、处理学籍模块、创新功能模块和关于我们等五个模块。
系统功能结构图如下图所示:
本系统包括以下12个函数:
(1)voidmyprintf1();
函数功能:
输出主菜单。
(2)voidmyprintf2();
函数功能:
输出成绩统计子菜单。
(3)voidmyprintf3();
函数功能:
输出学籍处理子菜单。
(4)voidmyprintf4();
函数功能:
输出创新功能子菜单。
(5)voidmyprintf5();
函数功能:
输出关于我们模块内容。
(6)voidmycreate();
函数功能:
定义录入成绩函数,通过键盘输入学生学号,姓名和各科成绩并存放到文件中。
(7)voidpianxu1(structstudentstu[],intn);
函数功能:
定义按学号排序函数,将所有学生的信息通过学号进行排序(被voidmytongji函数调用)。
(8)voidpianxu2(structstudentstu[],intn);
函数功能:
定义按平均分排序函数,将所有学生的信息通过其平均分进行排序(被voidmytongji函数调用)。
(9)voidpianxu3(structstudentstu[],intn);
函数功能:
定义统计各科分数段函数,将所有学生的各科成绩进行统计,按分数段进行输出(被voidmytongji函数调用)。
(10)voidmytongji();
函数功能:
定义成绩统计函数。
(11)voidbukao(structstudentstu[],intn);
函数功能:
定义生成并打印补考通知单(被voidchulixueji函数调用)。
(12)voidtuixue(structstudentstu[],intn);
函数功能:
定义生成并打印退学通知单(被chulixueji函数调用)。
(13)voidshengxue(structstudentstu[],intn);
函数功能:
定义生成并打印新名册(被chulixueji函数调用)。
(14)voidchulixueji();
函数功能:
定义处理学籍函数。
(15)voidchaxun(structstudentstu[],intn);
函数功能:
定义查询成绩函数(被函数voidchuanxin()调用)。
(16)voidxueke(structstudentstu[],intn);
函数功能:
定义学科成绩排名函数(被函数voidchuanxin()调用)。
(17)voidshezhimima();
函数功能:
定义密码保护函数(被函数voidchuanxin()调用)。
(18)voidchuanxin();
函数功能:
定义创新功能函数。
2.数据结构
学生信息项用结构体student表示,其中包括7个属性,学号num,姓名name,5门成绩chengji[5]。
structstudent
{
charnum[10],name[15];
intchengji[5];
};
学生补考信息项用结构体bukaoxinxi表示,其中包括6个属性,补考时间time1,补考地点size1,补考时间time2,补考地点size2,补考时间time3,补考地点size3。
structbukaoxinxi
{
chartime1[10],time2[10],time3[10],size1[10],size2[10],size3[10];
};
3.算法设计
系统主函数mian()设计
录入成绩模块函数voidmycreate设计
成绩统计模块函数voidtongji设计
处理学籍模块函数voidchulixueji设计
创新功能模块函数voidchuanxin设计
关于我们模块函数voidmyprintf5设计
4.程序代码设计
(1)主模块函数部分代码
do
{
myprintf1();
printf("");
choose=getch();
printf("\n");
switch(choose)
{
case'1':
/*录入成绩*/mycreate();break;
case'2':
/*统计成绩*/mytongji();break;
case'3':
/*处理学籍*/chulixueji();break;
case'4':
/*创新功能*/chuanxin();break;
case'5':
/*关于我们*/myprintf5();break;
case'0':
/*退出系统*/{system("cls");printf("\n\n\n\n\n\n\n=======================================================\n感谢使用本软件,已正常退出,按任意键结束!
\n=======================================================\n\n\n\n");};exit(0);
default:
{printf("%c为非法选项,请重新输入!
按任意键继续!
\n",choose);getch();};
}
}while(choose!
='0');
此为主模块的主要代码。
用do-while循环,显示主菜单,再用getch来输入要选择的项choose,用switch来判断所选的,然后执行相应的函数,如选择1,就执行mycreate函数等。
如果输入的不是0-5,就会一直的循环,直到输入的是0-5选项。
(2)录入成绩模块函数部分代码
fp=fopen("chengji.dat","a");
do
{
fflush(stdin);//清除缓存
printf("请输入学生的成绩:
\n");
printf("学号(按#结束输入):
");
do
{
gets(temp.num);
}while(strcmp(temp.num,"")==0);
printf("姓名(按#结束输入):
");
do
{
gets(temp.name);
}while(strcmp(temp.name,"")==0);
printf("请依次输入高数、英语、物理、编程、马哲成绩:
");
scanf("%d%d%d%d%d",&temp.chengji[0],&temp.chengji[1],&temp.chengji[2],&temp.chengji[3],&temp.chengji[4]);
if(temp.num[0]!
='#'&&temp.name[0]!
='#')
fprintf(fp,"%s%s%d%d%d%d%d\n",temp.num,temp.name,temp.chengji[0],temp.chengji[1],temp.chengji[2],temp.chengji[3],temp.chengji[4]);
}while(temp.num[0]!
='#'&&temp.name[0]!
='#');
fclose(fp);
程序开始先以“a”方式打开文件chengji.dat,显示提示输入内容,用do-while循环将输入成绩包裹在内,当输入的不是“#”号,就继续执行循环,继续输入成绩。
循环内又镶有do-while循环,要判断输入的是不是为空,若为空,则重新输入。
然后将输入的内容写入文件chengji.dat中,当输入的为“#”号时,跳出循环,结束输入。
(3)统计成绩模块函数部分代码
for(i=0;i { k=i; for(j=i+1;j if(strcmp(stu[k].num,stu[j].num)>0) k=j; t=stu[k];stu[k]=stu[i];stu[i]=t; } 这是用选择排序法对学生的信息按学号进行排序。 for(i=0;i ave[i]=(stu[i].chengji[0]+stu[i].chengji[1]+stu[i].chengji[2]+stu[i].chengji[3]+stu[i].chengji[4])/5.0; for(i=0;i { k=i; for(j=i+1;j if(ave[k]>ave[j]) k=j; t2=stu[k];stu[k]=stu[i];stu[i]=t2; t1=ave[k];ave[k]=ave[i];ave[i]=t1; } 用for循环计算每一位学生的平均分ave,再用选择排序法对每一位学生按平均分进行排序。 for(i=0;i { if(stu[i].chengji[0]/10<6) gaoshu[4]++; else { if(stu[i].chengji[0]/10==10) gaoshu[0]++; else gaoshu[9-(stu[i].chengji[0]/10)]++; } } 这是统计高数各分数段的人数。 用for循环对每一位学生的高数成绩进行判断,stu[i].chengji[0]/10<6是指学生的成绩小于60分,并在高数60分以下的人数增一。 stu[i].chengji[0]/10==10是指学生的成绩等于100分,并在高数90分以上的人数增一。 gaoshu[9-(stu[i].chengji[0]/10)]++;是指对学生的每一分数段的人数进行统计,并在相应的人数段增一。 do { myprintf2(); printf(""); choose=getch(); printf("\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("\n\n\n\n\n\n\n=======================================================\n感谢使用本软件,已正常退出,按任意键结束! \n=======================================================\n\n\n\n");};exit(0); default: {printf("%c为非法选项,请重新输入! 按任意键继续! ",choose);getch();}; } }while(choose! ='0'); 此为成绩统计功能模块的主要代码。 用do-while循环,显示成绩统计模块子菜单,再用getch来输入要选择的项choose,用switch来判断所选的,然后执行相应的函数。 如果输入的不是0-4,就会一直的循环,直到输入的是0-4选项。 (4)学籍处理模块函数部分代码 for(i=0;i { if(count[i]>0&&count[i]<=3) { k=0; for(j=0;j<5;j++) { if(stu[i].chengji[j]<60) { k++; if(k==1) { switch(j) { case0: {printf("%15s学生高数不及格,请输入他的补考时间和地点: ",stu[i].name);scanf("%s%s",&bukaoren[i].time1,&bukaoren[i].size1);};break; case1: {printf("%15s学生英语不及格,请输入他的补考时间和地点: ",stu[i].name);scanf("%s%s",&bukaoren[i].time1,&bukaoren[i].size1);};break; case2: {printf("%15s学生物理不及格,请输入他的补考时间和地点: ",stu[i].name);scanf("%s%s",&bukaoren[i].time1,&bukaoren[i].size1);};break; case3: {printf("%15s学生编程不及格,请输入他的补考时间和地点: ",stu[i].name);scanf("%s%s",&bukaoren[i].time1,&bukaoren[i].size1);};break; default: {printf("%15s学生马哲不及格,请输入他的补考时间和地点: ",stu[i].name);scanf("%s%s",&bukaoren[i].time1,&bukaoren[i].size1);};break; } } if(k==2) { do { l=0; switch(j) { case0: {printf("高数不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time2,&bukaoren[i].size2);};break; case1: {printf("英语不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time2,&bukaoren[i].size2);};break; case2: {printf("物理不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time2,&bukaoren[i].size2);};break; case3: {printf("编程不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time2,&bukaoren[i].size2);};break; default: {printf("马哲不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time2,&bukaoren[i].size2);};break; } if(strcmp(bukaoren[i].time2,bukaoren[i].time1)==0) { l=1; printf("您输入的时间冲突! 请重新输入! \n"); } }while(l==1); } if(k==3) { do { l=0; switch(j) { case0: {printf("高数不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time3,&bukaoren[i].size3);};break; case1: {printf("英语不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time3,&bukaoren[i].size3);};break; case2: {printf("物理不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time3,&bukaoren[i].size3);};break; case3: {printf("编程不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time3,&bukaoren[i].size3);};break; default: {printf("马哲不及格,请输入他的补考时间和地点: ");scanf("%s%s",&bukaoren[i].time3,&bukaoren[i].size3);};break; } if(strcmp(bukaoren[i].time3,bukaoren[i].time1)==0) { l=1; printf("您输入的时间冲突! 请重新输入! \n"); } if(strcmp(bukaoren[i].time3,bukaoren[i].time2)==0) { l=1; printf("您输入的时间冲突! 请重新输入! \n"); } }while(l==1); } } } } } } 这是对成绩不及格科目少于等于3科的学生生成并打印补考通知单的代码,先对学生成绩不及格科目进行统计,若学生不及格科目数count大于0而小于等3时,该学生就要进行补考,利用for循环,对每一个学生每一门科进行判断,若该门科不及格,就要求为他输入补考的时间和地点,用switch要判断学生是哪门科不及格,再用if来判断学生的补考时间是否有冲突。 最后,再用for循环逐一将需要补考的学生显示出来。 for(i=0;i { for(j=0;j<5;j++) if(stu[i].chengji[j]<60) count[i]++; if(count[i]>3) { printf("%-15s%-15s",stu[i].num,stu[i].name); for(j=0;j<5;j++) { if(stu[i].chengji[j]<60) { switch(j) { case0: printf("高数%-4d",stu[i].chengji[0]);break; case1: printf("英语%-4d",stu[i].chengji[1]);break; case2: printf("物理%-4d",stu[i].chengji[2]);break; case3: printf("编程%-4d",stu[i].chengji[3]);break; default: printf("马哲%-4d",stu[i].che
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学籍 管理 系统 语言 程序 报告