《高级语言程序设计》课程设计报告课题名称:学生成绩管理管理姓名:田宇班级:通信1412 学号:指导教师:陶恂电子信息学院2015年 07 月 10 日目录1 课题分析问题描述某班有最多不超过30人(具体人数键盘输入)参加期末考试,考试科目为数学(MT)、英语(EN)和物理(PH)。
学生成绩管理系统是一个非常实用的程序,如果能够把用户输入的数据存盘,下次运行时读出,就更有用了。
编程实现如下菜单驱动的学生成绩管理系统(1)录入每个学生的学号、姓名和各科考试成绩(2)计算每门课程的总分和平均分(3)计算每个学生的总分和平均分(4)按每个学生的总分由高到低排出名次表(5)按每个学生的总分由低到高排出名次表(6)按学号由小到大排出成绩表(7)按姓名的字典顺序排出成绩表(8)按学号查询学生排名及其考试成绩(9)按姓名查询学生排名及其考试成绩(10)按优秀(90-100)、良好(89-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分(12)将每个学生的记录信息写入文件(13)从文件中读出每个学生的记录信息并显示功能需求分析图1 系统功能模块图表系统设计数据结构设计系统处理的数据主要是学生信息,由C语言数据体表示struct student{char name[NUM_N]; //学生姓名int score[SCORE_N]; //学生成绩(物理数学英语)float averstudent; //平均成绩}STUDENT;函数设计与说明表函数列表菜单设计采用二级菜单设计,为保证程序有效性,先选择1项录入学生各项信息,再进入其他功能选择。
否是是文件清单与说明表系统实现管理系统菜单进入菜单选择界面,进行成绩单录入和各项功能的选择否是是学生成绩排名按每个学生的总分由高到低排出名次表进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。
再应用比较语句进行比较总分大小,按照从高到低进行输出显示开始进入菜单后选择该功能,用循环语句计算出存储在不同结构体中每个学生各科的分数之和即为总分。
再应用比较语句进行比较总分大小,按照从低到高进行输出显示开始进行输出显示Y学生成绩统计4菜单测试进入菜单选择,的选择进行该项功能。
可以进行选择图图图管理系统菜单进入菜单选择界面,选择想要执行的功能图录入每个学生的学号、姓名和各科考试成绩先选择1进入录入信息界面,再按要求输入总人数,然后根据弹出的格式依次输入学生信息,按回车结束输入后可选择是否继续进行其他功能。
图计算总分和平均分计算每门课程的总分和平均分测试输入成绩后,在菜单界面选择计算成绩功能进入二级菜单,选择计算每门课程的总分和平均分,则功能完成,然后可选择是否继续实现其他功能。
计算每个学生的总分和平均分测试输入成绩后,在菜单界面选择计算成绩功能进入二级菜单,选择计算每个学生的总分和平均分,则功能完成,然后可选择是否继续实现其他功能。
学生成绩排名按每个学生总分由高到低排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续图按每个学生总分由低到高排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续图按学号由大到小排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续图按姓名的在字典顺序排名先输入学生信息,在一级菜单选择排名,在二级菜单选择该功能,可以选择是否继续图查询学生成绩按学号查询学生排名及其考试成绩测试输入成绩后,在菜单界面选择查询功能进入二级菜单,选择按学号查询学生排名及其考试成绩,输入要查询的学号,则功能完成,然后可选择是否继续实现其他功能。
按姓名查询学生排名及其考试成绩测试输入成绩后,在菜单界面选择查询功能进入二级菜单,选择按姓名查询学生排名及其考试成绩,输入要查询的姓名,则功能完成,然后可选择是否继续实现其他功能。
学生成绩统计各等级学生的百分比先输入学生信息,在一级菜单选择统计进入该功能,可以选择是否继续图输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分测试输入学生个人信息后,进入菜单选择界面,选择菜单代码1,则完成此功能。
选择是否继续,进行其他操作。
将每个学生的记录信息写入文件测试输入学生个人信息后,进入菜单选择界面,选择菜单代码2,则完成此功能。
选择是否继续,进行其他操作。
从文件中读出每个学生的记录信息并显示测试输入学生个人信息后,进入菜单选择界面,选择菜单代码3,则完成此功能。
选择是否继续,进行其他操作。
5 课程设计遇到的问题及解决方法(1)在建立二级菜单是定义错误问题内容:在switch选择语句中定义变量,导致程序出错;问题分析:switch选择语句中不能定义变量;解决方法:重新定义变量在switch选择语句前,同时修改二级菜单选择的变量与一级菜单选择的变量不同。
(2)输出统计成绩百分比时错误问题内容:将第一门成绩输出错误,而后面课程的成绩百分比变为前一门成绩的百分比问题分析:学生成绩与学号的混淆,系统错将学号为学生成绩;解决方法:修改学生成绩的输出方式,将循环输出是定义的j=0改为j=1,输出的j<3改为j<4。
6 课程设计总结在结束了一个学年的C语言学习后,在下学期结束后我们迎来了为期一周的C语言程序设计的实训,尝试去编辑一个比以前复杂而且较长的程序。
在和同学讨论、分工合作,终于做出了这个让我们满意的成果。
短短的一个星期的设计让我有了和以前的不一样的感受。
以前做的程序短小而且内容少,就一两个知识点。
而这次的程序整整结合一个学年所学到知识,要在其中选择最好最方便的方法。
通过C语言实训,让我加深了对C语言的了解,而不只是单单的在课本中学到的那些理论,平时乏味的课程,通过自己动手亲自编写,变的生动有趣,而在自己动手的过程中,出现的问题很多,比理论要难的多,当一个程序写完以后,经常会有很多错误而没法解决。
不过,通过几天的实训,逐渐积攒了一些经验,有些错误可以很快就看出来。
对于这次的实训,我有很大的收获,对于C语言有了更深度的了解,平时在课堂上学习的理论知识可以转化为一些实际的技能。
但一个程序出错时,会去仔细的观察,思考,找出程序的错误点并修改;但程序成功运行时会有一种自豪感。
通过短短的几天,我认识到了我以前学习的不足之处,处在的问题,在老师和同学的帮助下去改正。
我相信这将是我学习C语言中的一个里程碑,它将促进我以后的学习。
参考文献1. 吉顺如,陶恂,曾祥绪.C程序设计教程与实验.清华大学出版社.20112. 吉顺如,计春雷.C程序设计习题集与课程设计指导.电子工业出版社.20123. 程序设计语言. 百度百科.附录源代码#include<>#include<>#include<>#define NUM_N 30#define N 100#define SCORE_N 7#define COURSE_N 6typedef struct student /*声明一个结构体模板STUDENT*/{char name[NUM_N];int score[SCORE_N];float averstudent;}STUDENT;int Input(STUDENT stu[],int n); /*函数原型声明*/int Refernum(STUDENT stu[],int n);int Refername(STUDENT stu[],int n);void Print(STUDENT 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 avercourse[],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 coursesum[COURSE_N]={0},count[NUM_N][COURSE_N]={0}; float avercourse[NUM_N];int i,j,p,n,op,r=0,m;char answer='Y';FILE *fp;STUDENT stu[NUM_N];STUDENT b[NUM_N];menu:;system("cls");printf(" *欢迎使用学生成绩管理系统*\n");printf("\n");printf(" 欢迎使用如下菜单\n");printf("\n");printf(" 1.录入每个学生的学号、姓名、各科考试成绩\n"); printf(" 2.计算成绩\n");printf(" 3.排名\n");printf(" 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 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);switch(m){case 1: printf("计算每门课程的总分和平均分\n"); /*调用Sum和Average函数*/Sum(stu,n,coursesum);for(i=0;i<3;i++)printf("课程[%d]总分=%d\n",i,coursesum[i]);Average(stu,n,avercourse,coursesum);for(i=0;i<3;i++)printf("课程[%d]平均分=%f\n",i,avercourse[i]);break;case 2:printf("计算每个学生的总分和平均分\n"); /*调用Sum和Average函数*/Sum(stu,n,coursesum);for(i=0;i<n;i++)printf("学生%d总分=%d\n",i+1,stu[i].score[4]);Average(stu,n,avercourse,coursesum); for(i=0;i<n;i++)printf("学生%d平均分=%f\n",i+1,stu[i].averstudent);break;}break;case 3: printf("1.按每个学生的总分由高到低排出名次表\n");printf("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;case 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,coursesum);SortString(stu,b,n);printf("姓名学号物理数学英语总分\n"); for(i=0;i<n;i++){puts(stu[i].name);for(j=0;j<5;j++){printf("%6ld",stu[i].score[j]);}printf("\n");}break;}break;case 4: printf("1.按学号查询学生排名及其考试成绩\n");printf("2.按姓名查询学生排名及其考试成绩\n");printf("请输入你的选择:\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",stu[i].score[j]);printf("%6ld\n",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",stu[i].name);for(j=0;j<5;j++)printf("%6ld",stu[i].score[j]);printf("%6ld\n",i+1);}else printf("查无此人\n");break;}break;case 5:printf("按优秀、良好、中等、及格、不及格对每门课程分别统计人数及其所占百分比\n"); /*调用Count函数*/Count(stu,n);break;case 6: printf("1.输出每个学生的学号、姓名、各科考试成绩,每门课程的总分和平均分\n");printf("2.将每个学生的记录信息写入文件\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,coursesum);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;if(op==0) goto 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);while (n>30){printf("人数应小于30\n");printf("总人数:\n");scanf("%d",&n);printf("姓名学号物理数学英语\n");for(i=0;i<n;i++){scanf("%s %d %d %d %d",&stu[i].name,&stu[i].score[0],&stu[i].sc ore[1],&stu[i].score[2],&stu[i].score[3]);}return(n);}void Print(STUDENT stu[],int n) /*输出函数*/{int i,j;printf("姓名学号物理数学英语总分\n");for(i=0;i<n;i++){printf("%s",stu[i].name);for(j=0;j<5;j++){printf("%6ld",stu[i].score[j]);}printf("\n");}void Sum(STUDENT stu[],int n,int coursesum[]) /*计算成绩总和*/ {int i,j;for(j=1;j<4;j++) /*计算每门课程成绩总和*/{coursesum[j-1]=0;for(i=0;i<n;i++){coursesum[j-1]=coursesum[j-1]+stu[i].score[j];}}for(i=0;i<n;i++) /*计算每个学生成绩总和*/{stu[i].score[4]=0;for(j=1;j<4;j++){stu[i].score[4]=stu[i].score[4]+stu[i].score[j];}}}void Average(STUDENT stu[],int n,float avercourse[],int coursesum[]) /*计算平均分数*/{int i;for (i=0;i<3;i++){avercourse[i]=(float)coursesum[i]/n; /*计算每门课程平均分*verstudent=(float)stu[i].score[4]/3; /*计算每个学生平均分*core[4]<stu[i+1].score[4]){b[i]=stu[i];stu[i]=stu[i+1];stu[i+1]=b[i];}}s++;}while(s<n);}void Down(STUDENT stu[],STUDENT b[],int n) /*按学生成绩由低到高排列*/{int i,s=0;do{for(i=0;i<n-1;i++){if (stu[i].score[4]>stu[i+1].score[4]){b[i]=stu[i];stu[i]=stu[i+1];stu[i+1]=b[i];}}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 (stu[i].score[0]>stu[i+1].score[0]){b[i]=stu[i];stu[i]=stu[i+1];stu[i+1]=b[i];}}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(stu[j].name,stu[i].name)<0){b[i]=stu[i];stu[i]=stu[i+1];stu[i+1]=b[i];}}}}int Refernum(STUDENT stu[],int n) /*按学号查询学生排名及其各科考试成绩*/{int i=0,t,num1;printf("请输入所要查询的学号:");scanf("%d",&num1);do{if(i<=n){if(stu[i].score[0]==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 prt[NUM_N];printf("请输入需要查找的姓名\n");scanf("%c",&j);gets(prt);do{if(i<=n){if(strcmp(stu[i].name,prt)==0){return i;t=1;}else t=0;i++;}else {t=1;return -1;}}while(t==0);}void Count(STUDENT stu[],int n) /*按优秀、良好、中等、及格、不及格对每门课程分别统计人数及其所占百分比*/{int i,j,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,grade;double n1,n2,n3,n4,n5;for(j=1;j<4;j++){for(i=0;i<n;i++){grade=stu[i].score[j]/10;switch (grade){case 10:case 9: sum1= sum1+1; break;case 8: sum2= sum2+1; break;case 7: sum3= sum3+1; break;case 6: sum4= sum4+1; break;case 5:case 4:case 3:case 2:case 1:case 0:sum5= sum5+1; break;}}n1=(double)sum1/(double)n;n2=(double)sum2/(double)n;n3=(double)sum3/(double)n;n4=(double)sum4/(double)n;n5=(double)sum5/(double)n;printf("第%d门\n",j);printf("优秀为:%d,百分比:%%%\n",sum1,n1*100); printf("良好为:%d,百分比:%%%\n",sum2,n2*100); printf("中等为:%d,百分比:%%%\n",sum3,n3*100); printf("及格为:%d,百分比:%%%\n",sum4,n4*100); printf("不及格为:%d,百分比:%%%\n",sum5,n5*100); sum1=0;sum2=0;sum3=0;sum4=0;sum5=0;}}void Printf(STUDENT stu[],int n,float avercourse[],int coursesum[]) /*输出每个学生的学号、姓名、各科考试成绩,课程的总分和平均分*/ {int i,j;printf("姓名学号物理数学英语总分平均分\n");for(i=0;i<n;i++){printf("%s",stu[i].name);for(j=0;j<5;j++){printf("%6ld",stu[i].score[j]);}printf(" %f",stu[i].averstudent);printf("\n");}}void Writetofile(STUDENT stu[],FILE *fp,int n) /*将每个学生的信息写入文件*/{int i;if((fp=fopen("","w"))==NULL){printf("Failure to open \n");exit(0);}for (i=0;i<n;i++){fprintf(fp,"%s%6ld%6ld%6ld%6ld%6ld %lf\n",stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].score[4], stu[i].averstudent);}fclose(fp);printf("文件录入完成\n");}void Readfromfile(FILE *fp,int n) /*从文件中读出学生的信息*/ {STUDENT b[N];int i;if((fp=fopen("","rb"))==NULL){printf("尚未生成此文件\n");exit(0);}for (i=0;!feof(fp);i++){fscanf(fp,"%s%6ld%6ld%6ld%6ld%6ld %f",&b[i].name, &b[i].score[0], &b[i].score[1], &b[i].score[2], &b[i].score[3], &b[i].score[4], &b[i].averstudent);}n=i;fclose(fp);for(i=0;i<n-1;i++){printf("%s%6ld%6ld%6ld%6ld%6ld %f\n",b[i].name, b[i].score[0], b[i].score[1], b[i].score[2], b[i].score[3], b[i].score[4], b[i].averstudent);}}。