-1-简易教学管理系统的设计与实现【摘要】:本系统可以实现简易的学生成绩管理,功能有限,主要功能包括读取文件中存放的学生成绩单,并对其求每个人的平均分,然后按照平均分对其排名;另外还可以计算每门课程的平均分和标准差,并按照成绩对学生划分区段,将处理后的结果可以保存在新建的一个文件中,方便查看;通过此系统还可以将每个同学的成绩单单独的输出到文件中,保存在一个指定的文件夹中;值得一提的是次系统还可以按照特定的要求进行数据筛选,比如屏幕显示有不及格科目的同学的信息,屏幕显示符合设定的优等生的条件的学生;最后本系统还实现了显示每门课程的成绩分布图(横向的)。流程图-2-开始读取成绩文件是否成功读取学分文件是否成功进入DO…WHILE循环MENU126534按平均分排名对学生成绩进行综合分析保存每位同学成绩显示不及格学生显示优等生名单打印成绩分布图退出程序q结束否否-3-二、主要函数及其功能1、voidRank_List(intnum[],structStu_Data_1stu[MAX][KCS+2],doubleaverage[],intn),按平均分给每个同学进行排序,然后保存到另一个文件中;2、voidAve_Sta_dev(structStu_Data_1stu[MAX][KCS+2],intn),求各科的总体均分和标准差,结果存放在新建的一个文件中;3、voidScore_List(structStu_Data_1stu[MAX][KCS+2],intn,doubleaverage[],intnum[]),保存所有学生的成绩单,将所有的成绩单存放在一个指定的文件夹中;4、voidUnpass_List(structStu_Data_1stu[MAX][KCS+2],structStu_Creditxuefen[],intn),屏幕显示所有不及格的人的不及格科目;5、voidExcellence_List(structStu_Data_1stu[MAX][KCS+2],intnum[],doubleaverage[],intn),找出优等生,并将他们保存到新建的文件中;6、voidDistribution(structStu_Data_1stu[MAX][KCS+2],intn),绘制学生成绩柱状分布图7、voidMenu(),主菜单函数,主要用于调出主菜单;三、系统详细设计及实现过程程序采用模块化设计,主函数是程序的入口,个模块独立,可分块调试。While()循环保证程序的循环运-4-行;通过函数switch()使得到得返回值调用相应的各功能函数,程序的主菜单如下:总体来说,这个系统可以分为七个功能模块,其分别是:计算每个学生的加权平均分并进行排名,计算每门课程的总体均分,标准差以及分组情况,打印出每个学生的成绩单,显示有不及格科目的学生,显示符合优等生条件的学生和绘制每门课程的分布图。1、主函数功能实现主函数首先是要求输入存放学生成绩的文件,然后在读取每门课程所对应的学分,其界面如下:-5-如果输入的文件名不正确,则会提示重新输入文件名,知道输入正确的文件名,即读取文件中的数据成功,读取到数据后在主函数中会对其进行处理,分别计算出其平均分和排名。2、计算加权平均分模块此模块的功能主要是通过函数voidRank_List(intnum[],structStu_Data_1stu[MAX][KCS+2],doubleaverage[],intn),来实现的,其基本实现思路是:直接将在主函数中计算好的排名,在加上一些信息保存到新建的一个文件中,其执行完后如下:-6-如果在这个界面选择y,则会通过系统调用打开对应的文件。关闭文件后可以进行下一步操作。3、计算各科均分及标准差和分组情况模块这个模块要实现的功能很多,主要是通过voidAve_Sta_dev(structStu_Data_1stu[MAX][KCS+2],intn),函数来实现的。其处理完后保存到文件中,其格式如下:-7-4、打印出每个学生的成绩单这个模块相对比较难一点,主要是要建立一个文件夹,在本系统中通过:system(mdscore),来建立一个文件夹,建立好文件夹后然后按照一定得规则保存到这个新建的文件夹中,文件的前面的名字是自己输入的,其界面如下:-8-5、显示不及格学生的信息这个功能很简单,主要是通过函数intcheck(intk,structStu_Data_1stu[MAX][KCS+2])函数判断给定的数据是否存在不及格科目;然后通过voidUnpass_List(structStu_Data_1stu[MAX][KCS+2],structStu_Creditxuefen[],intn)函数显示在屏幕上面;方便查看,这个部分不保存到文件中,显示界面如下:6、显示优等生学生的信息这个模块和上面的基本上一样,首先通过:intyds(intk,structStu_Data_1stu[MAX][KCS+2],intnum[],doubleaverage[])来判断给定的学生是否满足优等生的条件。然后通过voidExcellence_List(structStu_Data_1stu[MAX][KCS+2],intnum[],doubleaverage[],intn)来显示在-9-屏幕上,其见面如下:7、绘制各科成绩的分布图这个模块主要是通过一个简单的算法实现的,具体算法可以查看源代码,其基本实现思想是:先确定不同分数段的人数,然后按照人数的多少来打印特定的一个符号,其符号是:printf(█);其分布图如下:-10-四、数据测试数据测试基本上在上面的实现中都已经说明的很清楚了,下面附上处理后的各个数据文件的截图:按照加权平均分排名的结果:-11-各科目的总体分布情况:-12-各个学生的成绩单如下:Stu_Date.h#defineMAX100#defineKCS5//实际课程数intk;structStu_Data_1{charElem[15];};structStu_Credit{charNO[10];charcourse[10];charcerdit[10];};structStu_Data_2{charcou[10];doubleave;doublebzc;intbest;intbetter;intgood;intpass;intfail;};voidRank_List(intnum[],structStu_Data_1stu[MAX][KCS+2],doubleaverage[],intn)//按平均分排名-13-{FILE*fp;intj;if((fp=fopen(Data1.txt,wb))==NULL){printf(……………此文件不可以打开,保存失败…………\n);exit(1);}fprintf(fp,名次);for(j=0;jKCS+2;j++)fprintf(fp,%-9s,stu[0][j].Elem);fprintf(fp,平均分);fprintf(fp,\r\n);for(k=1;kn;k++){fprintf(fp,%-6d,num[k]);for(j=0;jKCS+2;j++)fprintf(fp,%-9s,stu[k][j].Elem);fprintf(fp,%-6.1f,average[k]);fprintf(fp,\r\n);}fclose(fp);printf(…………保存成功………………\n);}//--------------------------------------------------------------------------voidAve_Sta_dev(structStu_Data_1stu[MAX][KCS+2],intn)//求各科平均分、标准差{doubless,m;structStu_Data_2da[KCS+2];FILE*fp;if((fp=fopen(Data2.txt,wb))==NULL){printf(……………此文件不可以打开,保存失败…………\n);exit(1);}inta;for(a=1;aKCS+1;a++)strcpy(da[a].cou,stu[0][a+1].Elem);//------------------------------------------------------------------------------for(a=2;aKCS+2;a++){for(k=1,m=0;kn;k++)m=m+atoi(stu[k][a].Elem);da[a-1].ave=m/(n-1);}//计算各科平均分-14-//-------------------------------------------------------------------------------------for(k=1;kKCS+1;k++){da[k].best=0;da[k].better=0;da[k].good=0;da[k].fail=0;da[k].pass=0;}for(a=2;aKCS+2;a++)for(k=1;kn;k++){if(atoi(stu[k][a].Elem)=90)da[a-1].best++;//优秀if(atoi(stu[k][a].Elem)90&&atoi(stu[k][a].Elem)=80)da[a-1].better++;//良好if(atoi(stu[k][a].Elem)80&&atoi(stu[k][a].Elem)=70)da[a-1].good++;//中等if(atoi(stu[k][a].Elem)70&&atoi(stu[k][a].Elem)=60)da[a-1].pass++;//及格if(atoi(stu[k][a].Elem)60)da[a-1].fail++;//不及格}//科目分等级//----------------------------------------------------------------------------------------------for(a=2;aKCS+2;a++){for(k=1,ss=0;kn;k++){ss+=(atof(stu[k][a].Elem)-da[a-1].ave)*(atof(stu[k][a].Elem)-da[a-1].ave);}da[a-1].bzc=sqrt(ss/(n-1));}//求出各科标准差//---------------------------------------------------------------------------------------fprintf(fp,编号课程名称平均分标准差优秀良好中等及格不及格\n);fprintf(fp,\r\n);for(k=1;kKCS+1;k++){fprintf(fp,%-6d%-10s%-8.1f%-10.2f%-5d%-5d%-6d%-6d%-6d\n,k,da[k].cou,da[k].ave,da[k].bzc,da[k].best,da[k].better,da[k].good,da[k].pass,da[k].fail);fprintf(fp,\r\n);-15-}fclose(fp);printf(……………保存成功…………\n);}//--------------------------------------------------------------------------------------intcheck(intk,structStu_Data_1stu[MAX][KCS+2]){inta;for(a=2;aKCS+2;a++)if(atof(stu[k][a].Elem)60)return1;return0;}//------------------------