学生成绩管理系统(1)目录摘要 (1)1.绪论 (1)2. 系统分析 (1)2.1功能需求 (1)2.2数据需求 (1)2.3性能需求 (2)3. 总体设计 .................................................................................. 错误!未定义书签。
3.1系统功能模块描述 (2)3.2录入函数功能设计 (3)3.3查找函数功能设计 (4)3.4统计函数功能设计 (5)3.5添加函数功能设计 (6)3.6更新函数功能设计 (7)3.7执行流程介绍设计 (8)4. 调试与测试 (8)4.1调试 (9)4.2测试 (10)5. 结论 (10)结束语 (10)参考文献 (10)附录1-用户手册 (11)附录2-源程序 (17)摘要随着科学教育事业的发展,学生成绩管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段。
但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
关键词:学习成绩查询;管理;C语言1.绪论随着科技的发展,愈来愈多的学校选择了运用学生成绩管理系统来管理学生的各项信息。
学生成绩管理系统是一个学校不可缺少的部分,学校可以利用这套程序进行学生成绩的各种信息管理,也方便查询修改成绩的各项信息,可以提高管理工作的效率和简化管理工作的程序。
有利的为学校节省了运作成本,优化资源利用率,这也正是编写本程序的目的所在。
根据课程设计任务书要求,本系统开发主要完成以下功能和性能。
1.录入学生数据信息(不用考虑学期),学生信息至少包括姓名、学号、数学成绩三方面,学生信息应及时保存在文件中;2.根据学号查询某生成绩;3.插入新的学生数据信息。
2. 系统分析2.1 功能需求本系统主要是学校对学生成绩管理的系统。
该系统需要有录入信息,删除信息,根据所给条件查询信息,修改信息,统计信息,循环显示主菜单,保存信息的功能,并且利用显示函数将学生的所有信息显示出来。
2.2数据需求需要向系统输入学号,姓名,数学成绩等信息。
2.3 性能需求在运行本程序时只要按照正确的操作方法不会出现无法运行的情况,系统稳定性好,安全,可靠。
3.总体设计3.1系统功能模块描述图3-1学生成绩管理系统模块图3.2 录入函数功能设计首先会给定一个要输入的人数界限,根据自己要输入的人数进行输入,系统会提示你输入学生的信息,其中包括姓名、性别、各科目的分数,系统会自动生成一个有序数列,即学号。
其执行流程图如下所示:图3-2录入函数设计3.3 查找函数功能设计查找函数有两种查找方法,分别为按姓名和学号查找,当输入为flag=1时,系统会提示按照姓名查找,当输入为flag=2时,系统则提示按照学号查找,其流程图为:图统计函数会统计各科目的最高分、最低分以及平均分的统计,并且按照操作进行科目统计。
会有4中选择,当flag=1时,对数学进行统计;当flag=2时,对英语进行统计,当flag=3时,对c成绩进行统计,当flag=4时,统计函数功能结束。
跳出循环。
如图3-4所示:图3-4 统计函数设计添加函数主要是对额外的学生记录进行添加,同前面一样,也是对其信息的输入,并且输入完成之后,再对学生成绩进行排序和统计,如图所示图3-5 添加函数设计更新函数包含了两个子函数,分别是修改和删除两项,修改主要是修改录入函数里面错误的内容,而删除主要是删除一些不必要的学生信息,其功能流程如图3-6所示图3-6 更新函数设计3.7执行流程介绍主要是主函数调用子函数来进行操作和子函数相互之间的调用来完成执行,如图:图3-7流程执行图4. 调试与测试4.1 调试调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者者来说也是最艰巨的任务。
调试的任务是及时改正测试过程中发现的软件错误。
具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。
然后仔细研究推断代码以确定问题的原因,并设法改正。
调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。
本系统调试过程中遇到问题、原因和解决方法如下面介绍。
(1)程序不能运行定义的指针,很多次引用,过个函数里面,定义的不明确,造成错误连连发生。
(2)不能正确输出信息,有乱码现象原因是键入信息的时候,没有一一对应,逗号的位置不正确,后来,用的是信息逐一输入,保证了信息的一一对应和高度的准确性,使程序可以正常运行。
(3)程序运行途中,出现错误,被迫中止其中定义字符数组,却没有定义长度,导致定义类型变成了字符型,而不能接受字符串,因此出现了错误。
4.2 测试软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。
或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。
过度测试则会浪费许多宝贵的资源。
到测试后期,即使找到了错误,然而付出了过高的代价。
测试数据过程如下。
当职工信息管理程序已经具备录入,利用显示函数将职工所有信息显示,删除,修改,按指定条件查询,统计,查询,保存信息,循环显示主菜单功能时,现在测试系统是否能够正确显示系统内部所有的职工信息,当系统中已存入一定的职工信息当执行显示功能时,系统会将内部职工信息全部列出,当系统中未存入任何职工的信息时执行显示职工系统内部信息,系统会提示“list null!”。
创建一条职工信息:工号:1 姓名:marry 性别:F 年龄:21 学历:U 工资:2458 联系电话:48425678则输出如下:the worker's information:No name sex age 学历pay telephone1 haha F 21 U 2458 484256785. 结论课程设计顺利完成,题目所要求的功能也都一一实现,可以对职工信息进行添加,修改,删除,查询,模糊查询,按条件查询,存储至文本文件等,在通常情况下,可以良好的运作。
不过这个程序还有些不够完善,例如有时候,输出的结果会因为字符的长短,与上面的提示栏对不上。
而且,由于自己英语的不够特别好,后几个功能不知道该怎么翻译,就直接写的汉字,显得程序主菜单有点乱,以后会加强英语,好好规划编程。
结束语为期两个礼拜的的软件综合课程设计实习终于顺利完成,在这期间,我学到了很多课堂上学不到的东西,而且,将所学付之于实践,理论联系实际,是令我很兴奋的,但同时也感觉到了难度。
对C语言,有了更深一步的了解,并且培养出了良好的思考方式,对于编程。
虽然困难很多,问题出现的也很多,但好在,顺利完成任务了,很有成就感。
.参考文献[1] 谭浩强. C语言程序设计(第三版).北京:清华大学出版社,2005.7附录1-用户手册主菜单测试进入系统后,主函数调用menu函数,显示主菜单,并提示用户根据屏幕输入选择。
截图如下图4-1所示:图4-1主菜单测试4.2录入功能测试主函数调用此函数后,屏幕依次提示用户输入人数,姓名、性别、计算机分数、数学分数和英语分数信息,截图如下图4-2所示:图4-2录入功能测试4.3浏览功能测试进入此功能后屏幕显示菜单,提示用户根据需要输入选择。
并观看全部信息。
截图如下图4-3所示:图4-3浏览功能测试4.4查找功能测试4.4.1按姓名查找按屏幕提示输入所要查找的姓名,如有符合条件的信息记录,则全部显示出来。
截图如下图4-4所示:图4-4按姓名查找测试4.4.2按学号查找按屏幕提示输入所要查找的学号,有符合的学生则显示此学生信息。
截图如下图5-4所示:图4-4按学号查找测试4.5排序功能测试按屏幕操作对学生记录进行排序。
截图如下图4-5所示:图4-5排序功能测试4.6统计功能测试按操作对学生的各们科目的最大,和最小以及平均分进行统计,截图如下图4-6所示:图4-6统计功能测试4.7更新功能测试4.7.1修改功能测试根据输入的学号找到指定的信息记录,然后可以选择修改的项。
如下图4-7所示:图4-7修改功能测试4.7.2删除功能测试根据指定的学号找到相应的信息记录,进行删除的操作。
截图如下图4-7所示:图4-7删除功能测试4.8 添加功能测试添加若干各学生的信息,同样包括他的名字,性别,学号及各科目分数。
截图如下4-8:图4-8添加功能测试附录2-源程序#include <stdio.h>#include"string.h"#include"time.h"#include"stdlib.h"int menu();void save();void incre();void load();void luru();int chazhao();void liulan();void tianjia();void paixu();void tongji();void shanchu_xiugai();#define N 50int cout[10];int K; //定义全局变量struct student //定义结构体变量student{char name[20];char sex[N];int id;float score[3];float sum;}stu[N],stu1;int menu() //菜单函数{int i,flag;system("cls"); //运行前清屏for(i=0;i<80;i++)printf("*");printf("\n- - - - - - - - - - - - - - - -学习信息管理系统- - - - - -- - - - - - - - - - \n");printf(" \t|1.录入学生信息|\t\t\t|2.浏览学生信息|\n");printf(" \t|3.查找学生信息|\t\t\t|4.对学生信息排序|\n");printf(" \t|5.统计学生信息|\t\t\t|6.添加学生信息|\n");printf(" \t|7.更新学生信息|\t\t\t|8.退出程序|\n");printf("\n- - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n");for(i=0;i<80;i++)printf("*");printf("\n\t输入选择类型1--8:");scanf("%d",&flag);return flag;}void save(){FILE *fp;if((fp=fopen("c:\\student","wb"))==NULL){printf("Can not open the file!\n");exit(0);}fputc(K,fp);for(int i=0;i<K;i++)if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1){printf("File can not be saved!\n ");exit(0);}fclose(fp);}void incre(){FILE *fp;if((fp=fopen("c:\\student","ab"))==NULL){printf("Can not open the file!\n");exit(0);}if(fwrite(&stu[K],sizeof(struct student),1,fp)!=1){printf("File can not be saved!\n ");exit(0);}fclose(fp);}void load(){FILE *fp;if((fp=fopen("c:\\student","rb"))==NULL){printf("Can not open the file!\n");exit(0);}K=fgetc(fp);for(int i=0;i<K;i++)if(fread(&stu[i],sizeof(struct student),1,fp)!=1){printf("File can not be saved!\n ");exit(0);}fclose(fp);}void luru() //录入函数{int i,j;int m,x,num;system("cls");printf("请输入要录入的学生人数,在(1-50)之间:");while(1){scanf("%d",&num); //用来控制需要录入学生的数目(用当循环是为了保证需要录入的学生数合法(1-100))if(1<=num&&num<=50)break;elseprintf("\t请重新输入人数(1-50):");}for(i=K;i<num+K;i++){printf("\t请输入学生信息:");printf("\n\tName %d:",i+1);scanf("%s",stu[i].name); //输入姓名srand((long)time(NULL)); //提供不重复的seedwhile(1) //保证产生的随机数不重复{m=0;x=rand()%10000+2010000; //控制随机数产生的范围for(j=0;j<i;j++)if(stu[j].id==x){m=1;break;}if(m==0)break;}stu[i].id=x;printf("\tID:%ld\n",x); //输出产生的随机数printf("\tSex:");scanf("%s",stu[i].sex); //输入性别stu[i].sum=0;printf("\t数学:");scanf("%f",&stu[i].score[0]); //输入分数printf("\t英语:");scanf("%f",&stu[i].score[1]);printf("\tc :");scanf("%f",&stu[i].score[2]);for(j=0;j<3;j++) //求出学生的总成绩{stu[i].sum+=stu[i].score[j];}}K+=num; //这样是为了达到重复批量录入的效果save();liulan();system("pause");}void liulan() //浏览函数{int i,j;load();printf("-------------------------------------------------------------------------\n");printf("姓名\t性别\t学号\t\t数学\t\t英语\t\tC语言\t总和\n");for(i=0;i<K;i++){printf("\n%s\t%s\t%d",stu[i].name,stu[i].sex,stu[i].id);//打印学生的信息for(j=0;j<3;j++)printf("\t\t%.f",stu[i].score[j]);printf("\t%.f\n",stu[i].sum);}printf("-------------------------------------------------------------------------\n");system("pause>null");}int chazhao() //查找函数{load();char name[20];int i,j=0,k,x=0,flag;long number;printf("\t你能够根据学生姓名或者学号来查找信息:1.名字,2,学号:");scanf("%d",&flag);if(flag==1) //当key==1时按name查找给学生{printf("\t请输入学生名字:");scanf("%s",name);for(j=0,i=0;i<K;i++)if(strcmp(name,stu[i].name)==0){cout[j++]=i;x=1;}}else if(flag==2){printf("\t请输入学生学号:");scanf("%ld",&number);for(j=0,i=0;i<K;i++)if(stu[i].id==number){cout[j++]=i;x=1;}}elsex=2;if(x==1) //当x=1时表示查找到学生{printf("该学生的信息为:\n");for(i=0;i<j;i++){printf("姓名\t性别\t学号\t\t数学\t英语\tC语言\t总和\n",cout[i]+1);printf("%s %s %ld",stu[cout[i]].name,stu[cout[i]]. sex,stu[cout[i]].id);for(k=0;k<3;k++)printf("\t%.f",stu[cout[i]].score[k]);printf(" %.f\n",stu[cout[i]].sum);}}else if(x==0)printf("\t\t对不起没有找到您需要的学生信息!\n");else{printf("\t请输入(1-2)!\n");j=chazhao();}system("pause>null");return j;}void paixu() //排序函数{load();int i,j;for(i=0;i<K-1;i++){for(j=0;j<K-i-1;j++){if(stu[j].sum<stu[j+1].sum) //以总分为标准按照冒泡法对学生的信息进行排序{stu1=stu[j];stu[j]=stu[j+1];stu[j+1]=stu1;}}}save();printf("\t按总分排序成功!\n");liulan(); //排序成功后自动调用浏览函数将排序结果输出}void tongji() //统计函数{load();int i,flag;float max,min,average,sum;printf("\t1.英语\t\t2.数学\t\t3.C\t4.back.\n");float num1,num2,num3,num4,num5; //用来统计各分数段学生的数目while(1){num1=num2=num3=num4=num5=0; //注意赋初值0应该放在当循环里面printf("\t\t请选择要统计科目:(1-4):");scanf("%d",&flag); //用来选择所需要统计分数段的科目if(1<=flag&&flag<=3){sum=0;for(i=0;i<K;i++){if(90<=stu[i].score[flag-1]&&stu[i].score[flag-1]<=100)num1++;else if(80<=stu[i].score[flag-1])num2++;else if(70<=stu[i].score[flag-1])num3++;else if(60<=stu[i].score[flag-1])num4++;elsenum5++;min=max=stu[0].score[flag-1]; //假设第一个学生的各门成绩既是最大值也是最小值if(stu[i].score[flag-1]>max) //求单门科目中的最高分max=stu[i].score[flag-1];if(stu[i].score[flag-1]<min) //求单门科目中的最小值min=stu[i].score[flag-1];sum+=stu[i].score[flag-1];}average=sum/K;printf("\t\tmax=%.2f\n",max);printf("\t\tmin=%.2f\n",min);printf("\t\taverage=%.2f\n",average);}else if(flag==4)break;else //当输入超过4或小于1时提示输入错误printf("\t请重新输入(1-4)!\n");}}void tianjia(){load();char flag;int i,j;int m,x;for(i=K;i<N;i++){incre();K++;printf("\t请输入学生信息:");printf("\n\tName %d:",i+1);scanf("%s",stu[i].name); //输入姓名srand((long)time(NULL)); //提供不重复的seedwhile(1) //保证产生的随机数不重复{m=0;x=rand()%10000+2010000; //控制随机数产生的范围for(j=0;j<i;j++)if(stu[j].id==x){m=1;break;}if(m==0)break;}stu[i].id=x;printf("\tID:%ld\n",x); //输出产生的随机数printf("\tSex:");scanf("%s",stu[i].sex); //输入性别stu[i].sum=0;printf("\t数学:");scanf("%f",&stu[i].score[0]);printf("\t英语:");scanf("%f",&stu[i].score[1]);printf("\tc :");scanf("%f",&stu[i].score[2]);for(j=0;j<3;j++) //求出学生的总成绩{stu[i].sum+=stu[i].score[j];}printf("\t请选择(Y(continue/N(back))):");getchar();flag=getchar();if(flag=='Y')continue;elsebreak;}save();}void xiugai(){int i,j,answ,number,flag=0;liulan();j=chazhao();if(j==1){number=cout[0];flag=1;}else if(j>1){while(1){printf("\t请输入名字:");scanf("%d",&number);number--;for(i=0;i<j;i++)if(number==cout[i])flag=1;if(flag==0)printf("\tThe student is not you ne ed amend,please check out and input again!\n");elsebreak;}}if(flag==1){printf("\t确定要修改该学生的信息么?(Y(continue)/N(back))!");getchar();answ=getchar();}if(answ=='Y'&&flag==1){printf("\t请输入修改后的学生信息:");printf("\n\tName %d:",number+1);scanf("%s",stu[number].name); //输入姓名printf("\t ID:%ld\n",stu[number].id);printf("\t Sex:");scanf("%s",stu[number].sex);stu[number].sum=0;printf("\t数学:");scanf("%f",&stu[i].score[0]);printf("\t英语:");scanf("%f",&stu[i].score[1]);printf("\tc :");scanf("%f",&stu[i].score[2]);for(j=0;j<3;j++) //求出学生的总成绩{stu[number].sum+=stu[number].score[j];}printf("\t\t该学生的信息已成功修改!\n");}save();}void shanchu(){int i,j,answ,number,flag=0;j=chazhao();if(j==1){number=cout[0];flag=1;}else if(j>1){while(1){printf("\t请输入名字:");scanf("%d",&number);number--;for(i=0;i<j;i++){if(number==cout[i])flag=1;}if(flag==0)printf("\tThe student is not you need deal,please checkout and input again!\n");elsebreak;}}if(flag==1){printf("\t请确认是否要处理该学生信息!(Y(continue)/N(back))!");getchar();answ=getchar();}if(answ=='Y'&&flag==1){for(i=number;i<K;i++)stu[i]=stu[i+1];K--;printf("\t\t该学生的信息已成功删除!\n");}save();}void shanchu_xiugai() //修改、删除函数{int key;printf("\t\t\t1.修改\t2.删除:");scanf("%d",&key);if(key==1)xiugai();else if(key==2)shanchu();else{printf("\t\tIllegal operation,please input(1-2)!\n");shanchu_xiugai();}}void main() //主函数{while(1){switch(menu()){case 1:luru();break;case 2:liulan();break;case 3:chazhao();break;case 4:paixu();break;case 5:tongji();break;case 6:tianjia();break;case 7:shanchu_xiugai();break;case 8:printf("\t\t");exit(0);default:printf("\t请重新输入:\n\t\t");system("pause>null");}}}完成日期:2010年07月18日。