航空航天大学课程设计报告大作业名称:C语言课程设计大作业题目:学生成绩管理系统设计院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:完成日期:2016年12月24日目录第1章概要设计 (1)1.1题目的容与要求 (1)1.2总体结构 (1)第2章详细设计 (2)2.1主模块 (2)2.2输入模块 (3)2.3显示模块 (3)2.4修改模块 (4)2.5删除模块 (4)2.6查询模块 (5)2.7统计模块 (6)第3章调试分析 (7)第4章使用说明 (8)参考文献 (12)附录(程序清单) (14)第1章概要设计1.1题目的容与要求容:学生成绩信息包括:姓名、学号、语文、数学、英语。
实现的主要功能有:1)信息维护。
包括学生成绩的输入、按学号删除、按学号修改等。
2) 信息查询。
输入学号或姓名,显示出该生三个科目的成绩,计算出三科总分并显示,按总分将所有学生成绩排序,显示出该生的名次。
3)成绩统计。
先输入任意一个科目,接着选择a或b来分别显示平均分或统计分数段学生,若选择a,则直接显示出该科目的平均分;若选择b,则提示用户输入一个分数段,显示所有该科目属于该分数段的学生信息,并给出学生总数。
要求:1)系统以菜单方式工作。
在不同的界面为用户给出具体提示。
2)系统利用C语言实现,源程序要有适当的注释。
3)采用VC环境进行运行调试。
1.2总体结构本程序主要分为七个模块(功能模块图见图1.1):结构体模块,输入模块,显示模块,修改模块,删除模块,查询模块,统计模块。
结构体模块:建立一个结构体模块,为链表存信息用。
输入模块:键盘输入每个学生的信息,并保存在文件中。
显示模块:显示全部学生的具体信息。
修改模块:修改某个学生的成绩信息。
删除模块:删除某个学生的全部信息。
查询模块:查询某个学生的具体信息。
统计模块:通过功能选择,统计并显示某一科目的平均分或某分数段学生的具体信息。
图1.1 功能模块图第2章 详细设计2.1主模块控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块,图2.1 主模块流程图注释:1.显示主菜单;2.选择不同序号执行不同功能;2.2输入模块图2.2 输入模块流程图注释:1. 循环输入每个学生的信息;2. 保存所有信息2.3显示模块2.3所示。
图2.3 显示模块流程图注释:1. 选择号好功能;2. 显示全部学生的具体信息。
2.4修改模块YN图2.4 修改模块流程图注释:1.输入要修改学生的学号;2.输入要修改的科目信息;3.修改成功,是否要继续修改。
是,继续;否,回到主菜单。
2.5删除模块按学号删除某学生的全部信息,流程图如图2.5所示。
图2.5 删除模块流程图注释:1.输入要删除的学生的学号;2.显示该生信息,是否删除。
是,删除;否,是否继续操作。
3.是否继续删除。
是,重复上述操作;否,退出回到主菜单。
2.6查询模块2.6所示。
Y注释:1.输入要查询的学生的学号;2.显示该生的具体信息;3.是否继续查询。
是,继续查询下一位;否,回到主菜单。
2.7统计模块通过选择不同功能,显示某个科目的平均分或某分数段学生的具体图2.7 统计模块流程图注释:1. 通过菜单选择科目;2. 通过菜单选择a或b功能,分别显示该科目平均分或某分数段学生信息;3. 是否继续查询?是,继续;否,回到主菜单。
第3章调试分析在这次课程设计中,程序编写的过程中遇到了很多问题,主要是函数实现方面问题较多。
问题1:查询函数chaxun( )中,会造成数据混乱,原因是for循环中某行代码运用错误,如下:for(i=0;i<n;i++){if(stu[i].num==x){k=i;/*找到要查询的同学学号,并用k记下其下标*/}OutputOneStudent(k);}将OutputOneStudent(k);拿出后,查询功能正常实现。
正确编写如下:for(i=0;i<n;i++){if(stu[i].num==x){k=i;/*找到要查询的同学学号,并用k记下其下标*/}}OutputOneStudent(k);问题2:统计函数tongji(),功能实现完后不能回到主菜单。
解决方法是,把功能函数gongneng()其中的while循环删掉。
第4章使用说明运行截图如下:1.输入成绩2.信息显示3.修改信息4.删除信息5.查询信息6.1统计信息----科目平均分6.2统计信息----科目某分数段学生信息7.退出系统参考文献1.王敬华,《C语言程序设计教程(第二版)》,清华大学出版社,2009年8月2.谭浩强,《C语言程序设计教程(第二版)》,清华大学出版社,1999年12月3.谭浩强,《C语言程序设计题解与上机指导》,清华大学出版社,2000年11月4.田淑清,《C语言程序设计辅导与习题集》,中国铁道出版社,2000年1月5.荣梅、梁晓林,《Visual C++实用教程》,冶金工业出版社,2004年附录(程序清单)程序代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 3struct student{int num; //学号char name[20]; //姓名float score[3]; //三门课成绩float sum; //总分float aver; //平均分}stu[N];void menu(); //主菜单功能void input(); //输入信息到结构体中void save(int x); //保存stud.dat文件函数void print(); //输出显示所有学生信息void SaveAllStudent(int n); //保存全部学生信息void xiugai(int n); //按学号修改成绩int shanchu(int n); //按学号删除void OutputOneStudent(int i); //查询一个学生的信息void chaxun(int n); //按学号查询成绩void tongji(); //统计科目信息void gongneng(int x); //a或b功能分别显示科目平均分或分数段学生信息int main(){printf("***********************************************************\n");printf("* *\n");printf("* Hwadee &学生成绩管理系统& Hwadee *\n");printf("* *\n");printf("******************************************************\n\n\n");printf("****************●●欢迎使用●●*******************\n");while(1){menu();}return 0;}/*主菜单***********************************************************/ void menu(){int choice;int n=N;printf("\n请选择功能:\n");printf("\n1:输入成绩\n2:显示信息\n3:修改成绩\n4:删除信息\n5:查询成绩\n6:成绩统计\n0:退出系统\n\n");printf("\n请选择序号:\n");scanf("%d",&choice);switch(choice){case 1:input();save(N);break;case 2:print();break;case 3:xiugai(n);break;case 4:shanchu(n);break;case 5:chaxun(n);break;case 6:tongji();break;case 0:printf ("\n谢谢使用,再见!\n\n");exit (-1);break;default:printf("输入错误!\n");break;}}/*写入函数****************************************************/ void input(){int i,j;printf("\n输入信息\n");for(i=0;i<N;i++){printf("输入学号:");scanf("%d",&stu[i].num);printf("输入姓名:");scanf("%s",&stu[i].name);for(j=0;j<N;j++){printf("第%d门成绩的分数:",j+1);scanf("%f",&stu[i].score[j]);}stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];stu[i].aver=stu[i].sum/3;printf("\n");}}/*写入文件***********************************************************/ void save(int x){FILE *fp;/*定义文件指针用于向文件读入数据*/int i;if((fp=fopen("student.dat","rb+"))==NULL)/*以二进制读,写方式打开文件*/{printf("cannot open file\n");exit(1);}for(i=0;i<N;i++){if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1){printf("file write error\n");}}fclose(fp);printf("\n\n信息保存成功!恭喜!!\n\n");}/*显示全部学生信息**************************************************/ void print(){int i;printf("学号姓名语文数学英语总分平均分\n");for(i=0;i<N;i++)printf("%d %s %.2f %.2f %.2f %.2f %.2f\n",stu[i ].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[ i].sum,stu[i].aver);}/*保存全部学生信息******************************************8*/void SaveAllStudent(int n){FILE *fp;if((fp=fopen("student.dat","wb"))==NULL){printf("文件打开失败!\n");exit(1);}fwrite(stu,sizeof(struct student),n,fp);fclose(fp);}/*修改学生信息************************************************/ void xiugai(int n){struct student temp;int k=-1,x,i;char c1='y';while(c1=='y'){printf("\n请输入要修改的同学的学号:");scanf("%d",&x);for(i=0;i<n;i++){if(x==stu[i].num){k=i;/*找到要修改的同学学号,并用k记下其下标*/ break;}}if(k<0){printf("\n输入学号有误,请重新输入!");}else{printf("\n请输入要修改学生修改后的的信息\n");printf("语文(空格)数学(空格)英语\t\n");scanf("%f %f %f",&temp.score[0],&temp.score[1],&temp.score[2]);temp.sum=(temp.score[0]+temp.score[1]+temp.score[2]);temp.aver=(temp.score[0]+temp.score[1]+temp.score[2])/3;stu[k].score[0]=temp.score[0];/*修改该学生信息*/stu[k].score[1]=temp.score[1];stu[k].score[2]=temp.score[2];stu[k].sum=temp.sum;stu[k].aver=temp.aver;printf("\n修改成功!恭喜!!\n");break;}SaveAllStudent(k);printf("\n继续修改操作吗?");printf("\n继续修改请按y;不进行修改请按n\n");getchar();c1=getchar();}printf("\n按任意键继续!\n");getchar();}/*删除学生信息*************************************************/ int shanchu(int n){int i,k=-1,x;char c1='y',c2;while(c1=='y'){c2='n';printf("\n请输入要删除的同学的学号:");scanf("%d",&x);for(i=0;i<n;i++){if(x==stu[i].num){k=i;/*找到要删除的同学学号,并用k记下其下标*/ break;}}if(k<0){printf("\n输入学号有误,请重新输入!");}else{printf("\n该同学信息如下:\n");OutputOneStudent(k);printf("\n\n确定删除?\n");printf("确定进行删除请按y;不进行删除请按n\n");getchar();c2=getchar();if(c2=='y'){for(i=k;i<n;i++){stu[i]=stu[i+1];}n--;/*学生人数减1*/printf("\n删除成功!恭喜!!\n");}elseprintf("\n取消删除!\n");printf("\n继续删除操作吗?");printf("\n继续删除请按y;不进行删除请按n\n");getchar();c1=getchar();}}save(n);printf("\n按任意键继续!\n");getchar();return (n);}/*查询一个学生信息********************************************/void OutputOneStudent(int i){printf("学号:%d 姓名:%s \n",stu[i].num,stu[i].name);printf("语文:%.1f 数学:%.1f 英语:%.1f 总分:%.1f 平均分:%.2f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum, stu[i].aver);}/*按学号查询学生信息**************************************/void chaxun(int n){int i,j,k,x;char c='y';while(c=='y'){k=-1;printf("\n请输入学生学号:");scanf("%d",&x);if(x>3||x<1){break;}for(i=0;i<n;i++){if(stu[i].num==x){k=i;/*找到要查询的同学学号,并用k记下其下标*/ }}OutputOneStudent(k);stu[x-1].num=1; //该生排名for(j=0;j<3;j++){if(stu[j].sum>stu[x-1].sum)stu[x-1].num++;}printf("\n该生排名为第%d名。