课程设计报告学生成绩管理系统_第1页
课程设计报告学生成绩管理系统_第2页
课程设计报告学生成绩管理系统_第3页
课程设计报告学生成绩管理系统_第4页
课程设计报告学生成绩管理系统_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高级语言程序设计课程设计报告课题名称: 学生成绩管理管理 姓 名: 田宇 班 级: 通信1412 学 号: 指导教师: 陶恂 电子信息学院2015年 07 月 10 日目 录1 课题分析11.1 问题描述1(1)录入每个学生的学号、姓名和各科考试成绩1(2)计算每门课程的总分和平均分1(3)计算每个学生的总分和平均分1(4)按每个学生的总分由高到低排出名次表1(5)按每个学生的总分由低到高排出名次表1(6)按学号由小到大排出成绩表1(7)按姓名的字典顺序排出成绩表1(8)按学号查询学生排名及其考试成绩1(9)按姓名查询学生排名及其考试成绩1(10)按优秀(90-100)、良好(89-89)、中

2、等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比1(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分1(12)将每个学生的记录信息写入文件1(13)从文件中读出每个学生的记录信息并显示11.2 功能需求分析12 系统设计32.1 数据结构设计32.2 函数设计与说明32.3 菜单设计32.4 文件清单与说明43 系统实现53.1 管理系统菜单53.2 学生成绩排名53.3 学生成绩统计94 测试数据与测试过程记录104.1 菜单测试104.2 系统功能测试13管理系统菜单13输入学生信息14录入每个学生的

3、学号、姓名和各科考试成绩14计算总分和平均分14计算每门课程的总分和平均分测试14计算每个学生的总分和平均分测试15学生成绩排名16按每个学生总分由高到低排名16按每个学生总分由低到高排名16按学号由大到小排名17按姓名的在字典顺序排名18查询学生成绩18按学号查询学生排名及其考试成绩测试18按姓名查询学生排名及其考试成绩测试19学生成绩统计20各等级学生的百分比20学生信息的输入输出20输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分测试20将每个学生的记录信息写入文件测试21从文件中读出每个学生的记录信息并显示测试225 课程设计遇到的问题及解决方法226 课程设计总结2

4、3参考文献23附录源代码231 课题分析1.1 问题描述某班有最多不超过30人(具体人数键盘输入)参加期末考试,考试科目为数学(MT)、英语(EN)和物理(PH)。学生成绩管理系统是一个非常实用的程序,如果能够把用户输入的数据存盘,下次运行时读出,就更有用了。编程实现如下菜单驱动的学生成绩管理系统(1)录入每个学生的学号、姓名和各科考试成绩(2)计算每门课程的总分和平均分(3)计算每个学生的总分和平均分(4)按每个学生的总分由高到低排出名次表(5)按每个学生的总分由低到高排出名次表(6)按学号由小到大排出成绩表(7)按姓名的字典顺序排出成绩表(8)按学号查询学生排名及其考试成绩(9)按姓名查询

5、学生排名及其考试成绩(10)按优秀(90-100)、良好(89-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分(12)将每个学生的记录信息写入文件(13)从文件中读出每个学生的记录信息并显示1.2 功能需求分析若要完成问题中的各项要求,首先需要运用结构体数据储存学生的成绩信息,再运用循环语句求得各学生成绩之和及平均分和各学科成绩之和及平均分,再运用文件存储数据便于以后查询,对于数据查询,则同样需要运用循环语句将要查询的姓名或学号与已储存的信息进

6、行对比,直至找到要查询的信息。系统功能模块如图所示输入输出统计查询排名计算从文件中读出每个学生的记录信息并显示将每个学生的记录信息写入文件输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分对每门课程分别统计每个类别的人数以及所占的百分比按姓名查询学生排名及其考试成绩按学号查询学生排名及其考试成绩按姓名的字典顺序排出成绩表按学号由小到大排出成绩表按每个学生的总分由低到高排出名次表按每个学生的总分由高到低排出名次表计算每个学生的总分和平均分计算每门课程的总分和平均分录入每个学生的学号、姓名和各科考试成绩学生成绩管理系统图1 系统功能模块图 表2 系统设计2.1 数据结构设计 系统处

7、理的数据主要是学生信息,由C语言数据体表示struct student char nameNUM_N; /学生姓名 int scoreSCORE_N; /学生成绩(物理 数学 英语) float averstudent; /平均成绩STUDENT; 2.2 函数设计与说明学生信息管理系统采用结构化程序设计思想,程序处理主函数以外,共设计了13个函数,函数的原型及功能说明如表所示序号函 数 原 型功 能 说 明1int Input()输入学生信息2void Print()输出学生信息3void Sum()计算学生总成绩4void Average() 计算学生平均成绩5void High()按每个

8、学生的总分由高到低排出名次表6void Down()按每个学生的总分由低到高排出名次表7void Score()将学生成绩由小到大排序8void SortString()按姓名的字典顺序排出成绩表9int Refernum()按学号查询学生排名及其考试成绩10int Refername()按姓名查询学生排名及其考试成绩11void Count()对每门课程分别统计每个类别的人数以及所占的百分比12void Writetofile()将每个学生的记录信息写入文件13void Readfromfile()从文件中读出每个学生的记录信息并显示表 函数列表2.3 菜单设计 采用二级菜单设计,为保证程序

9、有效性,先选择1项录入学生各项信息,再进入其他功能选择。开始是否录入学生信息 否 是输入学生信息选择进入二级菜单 是选择功能是否继续 否结束2.4 文件清单与说明表中的函数与主函数,以及函数声明、数据结构定义、数据存储二进制文件共两个,程序文件清单如表所示。序号程序文件名文件说明116.c主程序文件2Student.txt存储学生信息的文本文件 表3 系统实现3.1 管理系统菜单进入菜单选择界面,进行成绩单录入和各项功能的选择开始是否录入学生信息 否 是输入学生信息选择进入二级菜单 是选择功能是否继续 否结束3.2 学生成绩排名按每个学生的总分由高到低排出名次表进入菜单后选择该功能,用循环语句

10、计算出存储在不同结构体中每个学生各科的分数之和即为总分。再应用比较语句进行比较总分大小,按照从高到低进行输出显示开始是否有学生信息N输入成绩 Y应用do,for语句循环和if语句比较总分高低按总分由高到低输出结果结束按每个学生的总分由低到高排出名次表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。再应用比较语句进行比较总分大小,按照从低到高进行输出显示开始是否有学生信息N输入成绩 Y应用do,for语句循环和if语句比较总分高低按总分由低到高输出结果结束按学号由小到大排出名次表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和

11、即为总分。再应用比较语句进行比较学号大小,按照学号从小到大进行输出显示开始是否有学生信息N输入成绩 Y应用do,for语句循环和if语句比较学号大小按学号由小到大输出结果结束按姓名的在字典顺序排出成绩表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。再应用比较语句进行比较姓名在字典顺序,按照姓名在字典顺序进行输出显示开始是否有学生信息N输入成绩 Y应用for循环语句和if语句比较姓名按照姓名在字典顺序输出结果结束3.3 学生成绩统计进入菜单后选择该功能,用switch语句进行各项等级累加,在将各项累加的数量处于总人数算出百分比,输出显示开始是否有学生信息

12、N输入成绩 Y应用for循环语句和switch语句计算输出各项等级百分比结束4 测试数据与测试过程记录4.1 菜单测试进入菜单选择,可以有多项选择,选择录入学生信息后进行其他从菜单功能的选择进行该项功能。进行完此项功能后有选择是否继续的功能,可以进行选择继续返回主菜单在进行其他功能的选择。 图 图图 图 图4.2 系统功能测试管理系统菜单进入菜单选择界面,选择想要执行的功能 图输入学生信息录入每个学生的学号、姓名和各科考试成绩先选择1进入录入信息界面,再按要求输入总人数,然后根据弹出的格式依次输入学生信息,按回车结束输入后可选择是否继续进行其他功能。 图计算总分和平均分计算每门课程的总分和平均

13、分测试输入成绩后,在菜单界面选择计算成绩功能进入二级菜单,选择计算每门课程的总分和平均分,则功能完成,然后可选择是否继续实现其他功能。 图计算每个学生的总分和平均分测试输入成绩后,在菜单界面选择计算成绩功能进入二级菜单,选择计算每个学生的总分和平均分,则功能完成,然后可选择是否继续实现其他功能。 图4.2.4学生成绩排名按每个学生总分由高到低排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续 图.1按每个学生总分由低到高排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续 图.2按学号由大到小排名先输入学生信息,在一级菜单选择排名,在二级菜

14、单选择该功能,可以选择是否继续 图.3按姓名的在字典顺序排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续 图.44.2.5查询学生成绩按学号查询学生排名及其考试成绩测试输入成绩后,在菜单界面选择查询功能进入二级菜单,选择按学号查询学生排名及其考试成绩,输入要查询的学号,则功能完成,然后可选择是否继续实现其他功能。 图按姓名查询学生排名及其考试成绩测试输入成绩后,在菜单界面选择查询功能进入二级菜单,选择按姓名查询学生排名及其考试成绩,输入要查询的姓名,则功能完成,然后可选择是否继续实现其他功能。 图学生成绩统计各等级学生的百分比先输入学生信息,在一级菜单选择统计进入

15、该功能,可以选择是否继续 图学生信息的输入输出输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分测试 输入学生个人信息后,进入菜单选择界面,选择菜单代码1,则完成此功能。选择是否继续,进行其他操作。图4.2.6.将每个学生的记录信息写入文件测试输入学生个人信息后,进入菜单选择界面,选择菜单代码2,则完成此功能。选择是否继续,进行其他操作。 图从文件中读出每个学生的记录信息并显示测试输入学生个人信息后,进入菜单选择界面,选择菜单代码3,则完成此功能。选择是否继续,进行其他操作。图5 课程设计遇到的问题及解决方法(1)在建立二级菜单是定义错误问题内容:在switch选择语句中定义变

16、量,导致程序出错;问题分析:switch选择语句中不能定义变量;解决方法:重新定义变量在switch选择语句前,同时修改二级菜单选择的变量与一级菜单选择的变量不同。(2)输出统计成绩百分比时错误问题内容:将第一门成绩输出错误,而后面课程的成绩百分比变为前一门成绩的百分比问题分析:学生成绩与学号的混淆,系统错将学号为学生成绩;解决方法:修改学生成绩的输出方式,将循环输出是定义的j=0改为j=1,输出的j<3改为j<4。6 课程设计总结在结束了一个学年的C语言学习后,在下学期结束后我们迎来了为期一周的C语言程序设计的实训,尝试去编辑一个比以前复杂而且较长的程序。在和同学讨论、分工合作,

17、终于做出了这个让我们满意的成果。短短的一个星期的设计让我有了和以前的不一样的感受。以前做的程序短小而且内容少,就一两个知识点。而这次的程序整整结合一个学年所学到知识,要在其中选择最好最方便的方法。通过C语言实训,让我加深了对C语言的了解,而不只是单单的在课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。不过,通过几天的实训,逐渐积攒了一些经验,有些错误可以很快就看出来。对于这次的实训,我有很大的收获,对于C语言有了更深度的了解,平时在课堂上学习的理论知识可以转化为一些实

18、际的技能。但一个程序出错时,会去仔细的观察,思考,找出程序的错误点并修改;但程序成功运行时会有一种自豪感。通过短短的几天,我认识到了我以前学习的不足之处,处在的问题,在老师和同学的帮助下去改正。我相信这将是我学习C语言中的一个里程碑,它将促进我以后的学习。参考文献1. 吉顺如,陶恂,曾祥绪.C程序设计教程与实验.清华大学出版社.20112. 吉顺如,计春雷.C程序设计习题集与课程设计指导.电子工业出版社.20123. 程序设计语言. 百度百科.附录源代码#include<stdio.h> #include<stdlib.h> #include<string.h&g

19、t; #define NUM_N 30 #define N 100 #define SCORE_N 7 #define COURSE_N 6typedef struct student /*声明一个结构体模板STUDENT*/ char nameNUM_N; int scoreSCORE_N; float averstudent; STUDENT; int Input(STUDENT stu,int n); /*函数原型声明*/ int Refernum(STUDENT stu,int n); int Refername(STUDENT stu,int n); void Print(STUDE

20、NT stu,int n); void High(STUDENT stu,STUDENT b,int n); void Down(STUDENT stu,STUDENT b,int n); void Score(STUDENT stu,STUDENT b,int n); void SortString(STUDENT stu,STUDENT b,int n); void Sum(STUDENT stu,int n,int coursesum); void Count(STUDENT stu,int n); void Printf(STUDENT stu,int n,float avercour

21、se,int coursesum); void Average(STUDENT stu,int n,float avercourse,int coursesum); void Writetofile(STUDENT stu,FILE *fp,int n); void Readfromfile(FILE *fp,int n); void main() int coursesumCOURSE_N=0,countNUM_NCOURSE_N=0; float avercourseNUM_N; int i,j,p,n,op,r=0,m; char answer='Y' FILE *fp;

22、 STUDENT stuNUM_N; STUDENT bNUM_N; menu:; system("cls"); printf(" *欢迎使用学生成绩管理系统*n"); printf("n"); printf(" 欢迎使用如下菜单n"); printf("n"); printf(" 1.录入每个学生的学号、姓名、各科考试成绩n"); printf(" 2.计算成绩n"); printf(" 3.排名n"); printf("

23、4.查询n"); printf(" 5.统计n"); printf(" 6.输入输出n"); printf(" 0.退出n"); printf("n"); choose:; printf("请输入你的选择:n"); scanf("%d",&op); if(op!=1&&op!=13&&r=0) printf("请先输入学号、姓名、各科成绩!"); r+; goto choose; else r+; goto

24、 start; do answer='N' printf("请输入你的选择:n"); scanf("%d",&op); start:; switch(op) case 1: n=Input(stu,n);break; /*调用Input函数*/ case 2: printf("1.计算每门课程的总分和平均分n");printf("2.计算每个学生的总分和平均分n");printf("请输入你的选择:n"); scanf("%d",&m); sw

25、itch(m)case 1: printf("计算每门课程的总分和平均分n"); /*调用Sum和Average函数*/ Sum(stu,n,coursesum); for(i=0;i<3;i+) printf("课程%d总分=%dn",i,coursesumi); Average(stu,n,avercourse,coursesum); for(i=0;i<3;i+) printf("课程%d平均分=%fn",i,avercoursei); break; case 2: printf("计算每个学生的总分和平均

26、分n"); /*调用Sum和Average函数*/ Sum(stu,n,coursesum); for(i=0;i<n;i+) printf("学生%d总分=%dn",i+1,stui.score4); Average(stu,n,avercourse,coursesum); for(i=0;i<n;i+) printf("学生%d平均分=%fn",i+1,stui.averstudent); break;break; case 3: printf("1.按每个学生的总分由高到低排出名次表n"); printf(

27、"2.按每个学生的总分由低到高排出名次表n");printf("3.按学号由小到大排出成绩表n");printf("4.按姓名的字典顺序排出成绩表n");printf("请输入你的选择:n"); scanf("%d",&m);switch(m)case 1: printf("按每个学生的总分由高到低排出名次表n"); /*调用Sum、High函数*/ Sum(stu,n,coursesum); High(stu,b,n); Print(stu,n); break; c

28、ase 2: printf("按每个学生的总分由低到高排出名次表n"); /*调用Sum、Down函数*/ Sum(stu,n,coursesum); Down(stu,b,n); Print(stu,n); break; case 3:printf("按学号由小到大排出成绩表n"); /*调用Score函数*/ Score(stu,b,n); Print(stu,n); break; case 4: printf("按姓名的字典顺序排出成绩表n"); /*调用Sum、SortString函数*/ Sum(stu,n,coursesu

29、m); SortString(stu,b,n); printf("姓名 学号 物理 数学 英语 总分n"); for(i=0;i<n;i+) puts(); for(j=0;j<5;j+) printf("%6ld",stui.scorej); printf("n"); break;break; case 4: printf("1.按学号查询学生排名及其考试成绩n"); printf("2.按姓名查询学生排名及其考试成绩n"); printf("请输入你的

30、选择:n"); scanf("%d",&m); switch(m) case 1: Sum(stu,n,coursesum); /*调用Sum、High和Refernum函数*/ High(stu,b,n); printf("按学号查询学生排名及其考试成绩n"); i=Refernum(stu,n); if(i!=-1) printf("姓名 学号 物理 数学 英语 总分 名次n"); for(j=0;j<5;j+) printf("%6ld",stui.scorej); printf(&q

31、uot;%6ldn",i+1); else printf("查无此人n"); break; case 2: printf("按姓名查询学生排名及其考试成绩n"); /*调用Sum、High和Refername函数*/ Sum(stu,n,coursesum); High(stu,b,n); i=Refername(stu,n); if(i!=-1) printf("姓名 学号 物理 数学 英语 总分 名次n"); printf("%s",); for(j=0;j<5;j+) pri

32、ntf("%6ld",stui.scorej); printf("%6ldn",i+1); else printf("查无此人n"); break; break; case 5: printf("按优秀、良好、中等、及格、不及格对每门课程分别统计人数及其所占百分比n"); /*调用Count函数*/ Count(stu,n); break; case 6: printf("1.输出每个学生的学号、姓名、各科考试成绩,每门课程的总分和平均分n"); printf("2.将每个学生的记录信

33、息写入文件n"); printf("3.文件中读出每个学生的记录信息并显示n"); printf("请输入你的选择:n"); scanf("%d",&m); switch (m) case 1: printf("输出每个学生的学号、姓名、各科考试成绩,每门课程的总分和平均分n"); /*调用Sum、Average函数*/ Sum(stu,n,coursesum); Average(stu,n,avercourse,coursesum); Printf(stu,n,avercourse,course

34、sum); break; case 2: printf("将每个学生的记录信息写入文件n"); /*调用Sum、Average和Writeotfile函数*/ Sum(stu,n,coursesum); Average(stu,n,avercourse,coursesum); Writetofile(stu,fp,n); break; case 3: printf("文件中读出每个学生的记录信息并显示n"); /*调用Readfromeile函数*/ Readfromfile(fp,n); break; break; case 0: if(op=0) g

35、oto end; break; printf("您还需要继续吗?(回答Y或N)"); scanf("%c%c",&p,&answer); if(answer='N') goto end; else goto menu; while(op!=0); end:; printf("感谢您的使用,下次再见!n"); int Input(STUDENT stu,int n) /*输入函数*/ int i; printf("总人数:n"); scanf("%d",&n

36、); while (n>30) printf("人数应小于30n"); printf("总人数:n"); scanf("%d",&n); printf("姓名 学号 物理 数学 英语n"); for(i=0;i<n;i+) scanf("%s %d %d %d %d",&,&stui.score0,&stui.score1,&stui.score2,&stui.score3); return(n); void Prin

37、t(STUDENT stu,int n) /*输出函数*/ int i,j; printf("姓名 学号 物理 数学 英语 总分n"); for(i=0;i<n;i+) printf("%s",); for(j=0;j<5;j+) printf("%6ld",stui.scorej); printf("n"); void Sum(STUDENT stu,int n,int coursesum) /*计算成绩总和*/ int i,j; for(j=1;j<4;j+) /*计算每门课

38、程成绩总和*/ coursesumj-1=0; for(i=0;i<n;i+) coursesumj-1=coursesumj-1+stui.scorej; for(i=0;i<n;i+) /*计算每个学生成绩总和*/ stui.score4=0; for(j=1;j<4;j+) stui.score4=stui.score4+stui.scorej; void Average(STUDENT stu,int n,float avercourse,int coursesum) /*计算平均分数*/ int i; for (i=0;i<3;i+) avercoursei=

39、(float)coursesumi/n; /*计算每门课程平均分*/*强制类型转换*/ stui.averstudent=(float)stui.score4/3; /*计算每个学生平均分*/*强制类型转换*/ void High(STUDENT stu,STUDENT b,int n) /*按总分由高到低排列*/ int i,s=0; do for(i=0;i<n-1;i+) if (stui.score4<stui+1.score4) bi=stui; stui=stui+1; stui+1=bi; s+; while(s<n); void Down(STUDENT st

40、u,STUDENT b,int n) /*按学生成绩由低到高排列*/ int i,s=0; do for(i=0;i<n-1;i+) if (stui.score4>stui+1.score4) bi=stui; stui=stui+1; stui+1=bi; s+; while(s<n); void Score(STUDENT stu,STUDENT b,int n) /*按学号由小到大排列*/ int i,s=0; do for(i=0;i<n-1;i+) if (stui.score0>stui+1.score0) bi=stui; stui=stui+1;

41、 stui+1=bi; s+; while(s<n); void SortString(STUDENT stu,STUDENT b,int n) /*按姓名的字典顺序排出成绩表*/ int i,j; for(i=0;i<n-1;i+) for(j=i+1;j<n;j+) if(strcmp(,)<0) bi=stui; stui=stui+1; stui+1=bi; int Refernum(STUDENT stu,int n) /*按学号查询学生排名及其各科考试成绩*/ int i=0,t,num1; printf("请输

42、入所要查询的学号:"); scanf("%d",&num1); do if(i<=n) if(stui.score0=num1) return i; t=1; else t=0; i+; else t=1; return -1; while(t=0); int Refername(STUDENT stu,int n) /*按姓名查询学生排名及其各科考试成绩*/ int i=0,j,t; char prtNUM_N; printf("请输入需要查找的姓名n"); scanf("%c",&j); gets(prt); do if(i<=n) if(strcmp(,prt)=0) return i; t=1; else t=0; i+; else t=1; return -1; while(t=0); void Count(STUDENT stu,int n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论