当前位置:文档之家› 学生管理系统课程设计

学生管理系统课程设计

重庆理工大学课程设计课程程序设计基础C 题目 C语言综合程序设计院系名称商贸信息学院班级计算机应用技术一班学生姓名吴昊学号 20920310119 指导教师卢玲评阅教师时间 2010年6月1 问题描述5.4题目五:学生成绩管理系统设计学生成绩信息包括:学期,学号,班别,姓名,四门课程成绩(语文、数学、英语和计算机)。

主要功能:(1)能按学期、按班级完成对学生成绩的录入、修改(2)能按班级统计学生的成绩,求学生的总分及平均分,设计并输出统计报表(3)能查询学生成绩,不及格科目及学生名单(4)能按班级输出学生的成绩单(5)能按班级,按课程,对学生成绩进行排序。

要求:使用二进制文件方式存储数据,系统以菜单方式工作2 系统分析2.1 题目要求本系统可以对学生的成绩信息进行简单的管理操作:主菜单包括9个选项:1.学生成绩浏览如果未导入学生成绩,系统会提示导入成绩,成绩导入后,可以用本功能浏览成绩。

2.学生成绩录入当学生成绩未导入是会自动提示对学生成绩的录入,可以按学期,按班级完成对学生成绩的录入。

3.学生成绩修改当需要修改学生成绩时,本功能可以修改学生的成绩,可以按学期,按班级完成对学生成绩的修改。

4.按班级统计学生成绩的总分和平均分可以对计算学生的成绩的总分和平均分,并按班级统计出来。

5.学生成绩查询完成对学生成绩的查询,本功能是按照学号查询。

6. 学生成绩保存可以将学生成绩存入磁盘文件,并从磁盘里读出学生成绩,信息保存在e:\\wh.dat。

7.学生成绩未存盘时导入当磁盘文件不存在会提示导入学生的成绩。

8.按班级输出学生成绩可以按班级输出学生的成绩单,其中包括学生的四门课的成绩不及格科目和学生的名单。

9.学生成绩排序能按班级,按课程,对学生成绩进行排序。

按班级排序时可以对某个班级学生的成绩排序,按课程排序时是对某一门课的排序。

2.2算法设计模块一:学生成绩浏览模块该模块实现对学生成绩的浏览功能,但前提是学生的信息已经保存,实现算法如下:①输出学生信息的标题②检索信息数组③用循环实现对学生信息的对应输出模块二:学生成绩录入模块该模块实现对学生成绩的录入功能,通过菜单的选择,调用两个子函数实现成绩的录入。

①输出按不同方式录入学生成绩的选择菜单,一是按学期录入,二是按班级录入②调用按学期录入的函数③选择学期用循环完成对学生信息的录入④保存学生信息,并回到录入函数⑤调用按班级录入的函数⑥选择班级用循环完成对学生信息的录入⑦保存学生信息,并回到录入函数模块三:学生成绩修改模块该模块实现对学生成绩的修改功能,通过菜单的选择,调用两个子函数实现对学生的成绩的修改。

①输出按不同方式修改学生成绩的选择菜单,一是按学期修改,二是按班级修改②调用按学期修改的函数③选择学期用循环完成对学生成绩的修改,修改的科目包括语文,数学,英语,计算机④保存学生成绩信息,并回到修改函数⑤调用按班级修改的函数⑥选择班级用循环完成对学生成绩的修改,修改的科目包括语文,数学,英语,计算机⑦保存学生成绩信息,并回到修改函数模块四:按班级统计学生成绩的总分和平均分模块该模块可以计算学生成绩的总分和平均分①输出选择的班级②通过检索数组选出某个班③通过循环输出这个班的每个学生的总分和平均分模块五:学生成绩查询模块该模块能通过学生的学号查询学生的成绩①输入要查询的学生的学号②通过检索数组选出对应的学生③调用输出函数输出学生相关的信息模块六:学生成绩保存模块该模块可以保存学生信息的导入,修改,录入①定义文件的保存位置②通过数组写入要保存的文件③关闭磁盘文件模块七:学生成绩为存盘时导入模块该模块可以在学生成绩为存盘是完成对学生成绩的导入并存盘①输出是否创建的提示②选择是否创建③提示已经导入,并关闭磁盘文件模块八:按班级输出学生成绩模块该模块可以从多个班级里选择某班学生的成绩并输出①输入要选择的班级②检索数组选出该班③输出该班学生的相关信息模块九:学生成绩排序模块该模块可以对学生的成绩按不同的方式排序①输出排序方式的菜单②调用按班级排序的函数③输出菜单后用冒泡法对总分进行比较,按从大到小的顺序输出④保存并回到排序函数⑤调用按课程对学生排序的函数⑥通过冒泡法分别对语文,数学,英语,计算机的成绩进行对比,按从大到小输出⑦保存并回到排序的函数模块十:退出模块退出系统2.3流程图在对学生成绩的录入,修改,求平均分和总分,输出学生的成绩时都要求按不同的方式完成,比如录入,修改,输出成绩扥等。

这里我写一个菜单,用一个主函数,分别调用两个子函数。

在成绩修改时注意输出的数据的对应,最后哟啊保存修改的数据,这里最容易被忽略,如果不保存的话,就白费心机啦。

注意自己定义的头文件的数据类型和源文件里面的数据类型要符合,这个函数有点大,随意这种细节一般容易出错。

在输入一个函数数据的时候,应该清空键盘区,很容易出错。

总之来说,编译的时候会有很多错,但是经过改正过后,发现很多都是不必要的或是细节问题。

3 系统实现3.1 题目一#include <stdio.h>#include <windows.h>#include <string.h>#include <stdlib.h>#include "student.h"int number;void view (struct student people[]){int i;printf("\t\t\t\t学生成绩管理系统\n");printf("\t\t\n");printf("\t\t\n");printf("学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\n");printf("********************************************************* *******\n");for(i=0;i<=number-1;i++){printf("%s\t",people[i].sem);printf("%s\t",people[i].num);printf("%d\t",people[i].clas);printf("%s\t",people[i].name);printf("%4d\t",people[i].chinese);printf("%4d\t",people[i].math);printf("%4d\t",people[i].english);printf("%4d\t",people[i].computer);printf("\n");printf("--------------------------------------------------------------------------------\n");}}//******************************************************************* *************************//按班级统计学生总分和平均分//******************************************************************* *************************void grade(struct student people[]){int clas;int aver=0;int sum=0;scanf("%d",&clas);for (int i=0;i<number;i++){if(people[i].clas==clas) //查找班级{sum=people[i].chinese+people[i].math+people[i].english+people[i]. computer;aver=sum/4;printf("第%d个学生总分为:%d\n",i+1,sum);printf("第%d个学生的平均分为:%d\n",i+1,aver);}}//******************************************************************* *************************//输出某一个学生的信息//******************************************************************* *************************void prnt(struct student people[],int i){printf("------------------------------------------------------------------------------\n");printf("姓名\t语文\t数学\t英语\t计算机\t不及格科目\t学生名单\n");printf("------------------------------------------------------------------------------\n");for(i=0;i<number;i++){printf("%s\t",people[i].name);printf("%.1f\t",people[i].chinese);printf("%.1f\t",people[i].math);printf("%.1f\t",people[i].english);printf("%.1f\t",people[i].computer);while(1) //输出不及格的学生的成绩{if(people[i].chinese<60)printf("语文,");if(people[i].math<60)printf("数学,");if(people[i].english<60)printf("英语,");if(people[i].computer<60)printf("计算机\t");break;printf("%s",people[i].name); //输出学生的名单}printf("\n");printf("--------------------------------------------------------------------------------\n");}//******************************************************************* *************************// 按照学号查询学生信息//******************************************************************* *************************void search(struct student people[]){char num[20];int i;printf("\n请输入你要查询的学生学号:");fflush(stdin);gets(num);for(i=0;i<number;i++){if (strcmp(people[i].num,num)==0){prnt(people,i);}}}//******************************************************************* *************************// 按班级输出学生的成绩单//******************************************************************* *************************void search_clas(struct student people[]){int clas;printf("请输入班级:");fflush(stdin);scanf("%d",&clas);for (int i=0;i<number;i++){if(people[i].clas==clas){prnt(people,i); //调用prnt 函数输出成绩单}}}//******************************************************************* *************************// 将信息存入磁盘文件//******************************************************************* *************************void save(struct student people[]){FILE *fp;int i;fp=fopen("e:\\wh.dat","wb+");for(i=0;i<number;i++){fwrite(&people[i],sizeof(student),1,fp);}fclose(fp); //关闭磁盘文件}//***********************************************// 按学期修改学生成绩//***********************************************void xiugai_sem(struct student people[]){int chinese,math,english,computer; //定义新的成绩变量char sem[20];printf("输入学期:");fflush(stdin);scanf("%s",sem);for (int i=0;i<number;i++){if(strcmp(people[i].sem,sem)==0){prnt(people,i);}printf("修改语文,数学,英语,计算机的成绩:");scanf("%f%f%f%f",&chinese,&math,&english,&computer);people[i].chinese=chinese;people[i].math=math;people[i].english=english;people[i].computer=computer; //把新的成绩赋给people[i]}save(people);}//***********************************************// 按班级修改学生成绩//***********************************************void xiugai_clas(struct student people[]){int chinese,math,english,computer;int clas;printf("输入班级:");fflush(stdin);scanf("%d",&clas);for (int i=0;i<number;i++){if(people[i].clas==clas){prnt(people,i);}printf("修改语文,数学,英语,计算机的成绩:");scanf("%f%f%f%f",&chinese,&math,&english,&computer);people[i].chinese=chinese;people[i].math=math;people[i].english=english;people[i].computer=computer;}save(people);}void xiugai(struct student people[]) //修改学生成绩{int xuan;while(1){printf("************ 1 按学期修改学生成绩\n");printf("************ 2 按班级修改成绩\n");printf("************ 0 返回上一级目录\n");printf("请选择:\n");scanf("%d",&xuan);switch(xuan){case 1:xiugai_sem(people);break;case 2:xiugai_clas(people);break;}if(xuan==0)break;}}//*********************************************// 按学期录入学生成绩//*********************************************void luru_sem(struct student people[]){struct student temp;printf("请输入学生人数\n");scanf("%d",&number);printf("学期\n"); //选择要输入学生的学期fflush(stdin);scanf("%s",temp.sem);for(int i=0;i<number;i++){printf("请输入学生信息:\n");printf("学号:");fflush(stdin);gets(temp.num);printf("班别:");fflush(stdin);scanf("%d",&temp.clas);printf("姓名:");fflush(stdin);gets();printf("学生成绩:");fflush(stdin);scanf("%d",&temp.chinese);fflush(stdin);scanf("%d",&temp.math);fflush(stdin);scanf("%d",&temp.english);fflush(stdin);scanf("%d",&puter);printf("\n");people[i]=temp;}save(people);}//***********************************************// 按班级录入学生成绩//***********************************************void luru_clas(struct student people[]){struct student temp;printf("请输入学生人数:");scanf("%d",&number);printf("班级:"); //输入要录入的学生的班级fflush(stdin);scanf("%d",&temp.clas);int i;for(i=0;i<number;i++){printf("请输入学生信息:\n");printf("学期:");scanf("%s",temp.sem);printf("学号:");fflush(stdin);gets(temp.num);printf("姓名:");fflush(stdin);gets();printf("学生成绩:");fflush(stdin);scanf("%d",&temp.chinese);fflush(stdin);scanf("%d",&temp.math);fflush(stdin);scanf("%d",&temp.english);fflush(stdin);scanf("%d",&puter);printf("\n");people[i]=temp;}save(people); //保存}void luru(struct student people[]) //录入学生成绩{int xuan;while(1){printf("************ 1 按学期录入学生成绩\n");printf("************ 2 按班级录入学生成绩\n");printf("************ 0 返回上一级目录\n");scanf("%d",&xuan);switch(xuan){printf("请选择:\n");case 1:luru_sem(people);break;case 2:luru_clas(people);break;}if(xuan==0)break;}}//*****************************************// 导入磁盘文件信息//*****************************************void load(struct student people[]){FILE *fp;if((fp=fopen("e:\\wh.dat","rb+"))==NULL){printf("磁盘并不存在,是否创建?(y/n)");if(getchar()=='y'){luru(people);return ;}else exit(0);}int i=0;printf("\n正在导入数据,请等待......\n");while(!feof(fp)){fread(&people[i],sizeof(student),1,fp);i++;}fclose(fp); //关闭磁盘文件number=--i;printf("\n导入成功!\n");}//*****************************************// 按班级对学生成绩排序//*****************************************void paixu_clas(struct student people[]){struct student arry[1024],temp; //新定义一个数组arry[] int clas,j=0;printf("请输入班级:");fflush(stdin);scanf("%d",&clas);for (int i=0;i<number;i++){if(people[i].clas==clas){arry[j]=people[i];j++;}printf("\t\n");printf("学期\t学号\t班别\t姓名\t语文\t数学\t英语\t计算机\t总分\n");printf("********************************************************* **************\n");for (int m=0;m<j-1;m++){for (int n=0;n<j-1-m;n++)if(arry[n].chinese+arry[n].computer+arry[n].math+arry[n].english< arry[n+1].chinese+arry[n+1].computer+arry[n+1].math+arry[n+1].english ){temp=arry[n];arry[n]=arry[n+1];arry[n+1]=temp;}}for (i=0;i<j;i++){printf("%s\t",arry[i].sem);printf("%s\t",arry[i].num);printf("%d\t",arry[i].clas);printf("%s\t",arry[i].name);printf("%4d\t",arry[i].chinese);printf("%4d\t",arry[i].math);printf("%4d\t",arry[i].english);printf("%4d\t",arry[i].computer);printf("%4d\t",arry[i].computer+arry[i].chinese+arry[i].math+arry [i].english);printf("\n");printf("--------------------------------------------------------------------------------\n");}}//*****************************************// 按课程对学生成绩排序//*****************************************void paixu_ke(struct student people[]){struct student temp;for (int i=0;i<number-1;i++)for (int j=0;j<number-1-i;j++){if (people[j].chinese<people[j+1].chinese){temp=people[j];people[j]=people[j+1];people[j+1]=temp;}}printf("\t\t\n");printf("学期\t学号\t班别\t姓名\t语文\n");printf("**************************************\n");for(i=0;i<number;i++){printf("%s\t",people[i].sem);printf("%s\t",people[i].num);printf("%d\t",people[i].clas);printf("%s\t",people[i].name);printf("%4d\t\n",people[i].chinese);}for (i=0;i<number-1;i++)for (int j=0;j<number-1-i;j++){if (people[j].chinese<people[j+1].chinese){temp=people[j];people[j]=people[j+1];people[j+1]=temp;}}printf("\t\t\n");printf("学期\t学号\t班别\t姓名\t数学\n");printf("***************************************\n");for(i=0;i<number;i++){printf("%s\t",people[i].sem);printf("%s\t",people[i].num);printf("%d\t",people[i].clas);printf("%s\t",people[i].name);printf("%4d\t\n",people[i].math);}for (i=0;i<number-1;i++)for (int j=0;j<number-1-i;j++){if (people[j].math<people[j+1].math){temp=people[j];people[j]=people[j+1];people[j+1]=temp;}}printf("学期\t学号\t班别\t姓名\t英语\n");printf("*****************************************\n");for(i=0;i<number;i++){printf("%s\t",people[i].sem);printf("%s\t",people[i].num);printf("%d\t",people[i].clas);printf("%s\t",people[i].name);printf("%4d\t\n",people[i].english);}for (i=0;i<number-1;i++)for (int j=0;j<number-1-i;j++){if (people[j].english<people[j+1].english){temp=people[j];people[j]=people[j+1];people[j+1]=temp;}}printf("学期\t学号\t班别\t姓名\t计算机\n");printf("*****************************************\n");for(i=0;i<number;i++){printf("%s\t",people[i].sem);printf("%s\t",people[i].num);printf("%d\t",people[i].clas);printf("%s\t",people[i].name);printf("%4d\t\n",people[i].computer);}for (i=0;i<number-1;i++)for (int j=0;j<number-1-i;j++){if (people[j].computer<people[j+1].computer){temp=people[j];people[j]=people[j+1];people[j+1]=temp;}}}void paixu(struct student people[]) //对学生成绩排序{int xuan;while(1){printf("************ 1 按班级对学生成绩排序\n");printf("************ 2 按课程对学生成绩排序\n");printf("************ 0 返回上一级目录\n");printf("请选择:\n");scanf("%d",&xuan);switch(xuan){case 1:paixu_clas(people);break;case 2:paixu_ke(people);break;}if(xuan==0)break;}}//***********************************// 主函数//***********************************void main(){int sel;system ("cls");system ("color F9");struct student people[1024];load(people);for(;;){{printf("\t\t\n");printf("\n");printf("\t\t 学生成绩管理系统\n");printf("\t\t\n");printf("\t\t\n");printf("\t\t***********************************\n");printf("\t\t\t1 学生成绩浏览\n");printf("\t\t\t2 学生成绩录入\n");printf("\t\t\t3 学生成绩修改\n");printf("\t\t\t4 按班级统计学生成绩的总分和平均分\n"); printf("\t\t\t5 学生成绩查询\n");printf("\t\t\t6 学生成绩保存\n");printf("\t\t\t7 学生成绩未存盘时导入\n");printf("\t\t\t8 按班级输出学生成绩\n");printf("\t\t\t9 学生成绩排序\n");printf("\t\t\n");printf("\t\t\t0 谢谢使用再见!\n");printf("\t\t\n");}printf("请选择:\n");scanf("%d",&sel);switch(sel){case 1:view(people);break;case 2:luru(people);break;case 3:xiugai(people);break;case 4:grade(people);break;case 5:search(people);break;case 6:save(people);break;case 7:load(people);break;case 8:search_clas(people);break;case 9:paixu(people);break;case 0:printf("谢谢使用再见!\n");break;}if(sel==0)break;}}4系统测试4.1 如何设计测试数据我是按顺序编写每个函数的每个功能的,每写完一个就输入数据运行测试,输入数据时数据类型要准确,以避免错误,有些函数往往要重新写好几遍,应为有时不确定是否正确,就要输入数据进行测试,看是否正确,有很多的函数都要调用其他的函数,所以函数的关联很大,输入数据时就要考虑清楚。

相关主题