《C语言课程设计学生成绩管理系统+源码.doc》由会员分享,可在线阅读,更多相关《C语言课程设计学生成绩管理系统+源码.doc(25页珍藏版)》请在三一办公上搜索。
1、简易教学管理系统的设计与实现【摘要】:本系统可以实现简易的学生成绩管理,功能有限,主要功能包括读取文件中存放的学生成绩单,并对其求每个人的平均分,然后按照平均分对其排名;另外还可以计算每门课程的平均分和标准差,并按照成绩对学生划分区段,将处理后的结果可以保存在新建的一个文件中,方便查看;通过此系统还可以将每个同学的成绩单单独的输出到文件中,保存在一个指定的文件夹中;值得一提的是次系统还可以按照特定的要求进行数据筛选,比如屏幕显示有不及格科目的同学的信息,屏幕显示符合设定的优等生的条件的学生;最后本系统还实现了显示每门课程的成绩分布图(横向的)。 一、设计思路 程序设计一般有两个部分组成,算法和
2、数据结构,合理的选择和实现一个数据结构和车里这些数据结构具有同样的重要性。在这个学生成绩管理系统中,算法都很简单,基本上没有什么很复杂的算法,难点主要在数据结构上面,因为这个系统涉及到得数据比较多,很多数据很容易混淆,所以,我设计了三个数据结构,分别如下:/定义常数#define MAX 100#define KCS 5/实际课程数int k;struct Stu_Data_1char Elem15;struct Stu_Data_2char cou10;double ave;double bzc;int best;int better;int good;int pass;int fail;s
3、truct Stu_Creditchar NO10;char course10;char cerdit10;首先是定义常量,这些常量的目的主要是为了程序的通用性和易修改性设计,#define KCS 5; 的目的是预先估计课程数目,在次设计成常量,方便扩展和修改,使其实用性更强,#define MAX 100; 的目的是预先估计学生的人数。第一个数据结构是:Stu_Data_1,这个数据结构式本系统的核心,主要负责从文件中逐行读取数据放入其Elem中,用这个数据结构定义一个二维的数组,就可以很方便的对文件中的数据进行管理了,使整个函数的设计容易了很多。第二个数据结构是:Stu_Data_2,这
4、个数据结构的主要作用是用于存放对学生的成绩处理后的结果的。char cou10;存放课程名称,double ave;存放每科的平均分,double bzc;存放每科得标准差,下面的用于存放不同等级人数。第三个数据结构是:Stu_Credit,这个数据结构主要负责将存放在文件中的各门课程所对应的学分读取出来,方便在程序执行中使用,用,NO来存放 课程编号,用 char course10来存放课程名称,用 char cerdit10; 在存放最重要的课程学分,此数据结构主要用于在主函数中计算每个学生的加权平均分,在其他函数中基本上很好调用。流程图开始读取成绩文件是否成功读取学分文件是否成功进入DO
5、WHILE循环MENU126534按平均分排名对学生成绩进行综合分析保存每位同学成绩显示不及格学生显示优等生名单打印成绩分布图退出程序q结束否否二、主要函数及其功能 1、void Rank_List(int num,struct Stu_Data_1 stuMAXKCS+2,double average ,int n),按平均分给每个同学进行排序,然后保存到另一个文件中; 2、void Ave_Sta_dev(struct Stu_Data_1 stuMAXKCS+2,int n),求各科的总体均分和标准差,结果存放在新建的一个文件中; 3、void Score_List(struct Stu
6、_Data_1 stuMAXKCS+2, int n,double average, int num),保存所有学生的成绩单,将所有的成绩单存放在一个指定的文件夹中; 4、void Unpass_List(struct Stu_Data_1 stuMAXKCS+2,struct Stu_Credit xuefen,int n),屏幕显示所有不及格的人的不及格科目; 5、void Excellence_List(struct Stu_Data_1 stuMAXKCS+2,int num,double average,int n),找出优等生,并将他们保存到新建的文件中; 6、void Distr
7、ibution(struct Stu_Data_1 stuMAXKCS+2,int n),绘制学生成绩柱状分布图 7、void Menu(),主菜单函数,主要用于调出主菜单;三、系统详细设计及实现过程 程序采用模块化设计,主函数是程序的入口,个模块独立,可分块调试。While()循环保证程序的循环运行;通过函数switch()使得到得返回值调用相应的各功能函数,程序的主菜单如下: 总体来说,这个系统可以分为七个功能模块,其分别是:计算每个学生的加权平均分并进行排名,计算每门课程的总体均分,标准差以及分组情况,打印出每个学生的成绩单,显示有不及格科目的学生,显示符合优等生条件的学生和绘制每门课程
8、的分布图。1、主函数功能实现 主函数首先是要求输入存放学生成绩的文件,然后在读取每门课程所对应的学分,其界面如下: 如果输入的文件名不正确,则会提示重新输入文件名,知道输入正确的文件名,即读取文件中的数据成功,读取到数据后在主函数中会对其进行处理,分别计算出其平均分和排名。2、计算加权平均分模块 此模块的功能主要是通过函数void Rank_List(int num,struct Stu_Data_1 stuMAXKCS+2,double average ,int n),来实现的,其基本实现思路是: 直接将在主函数中计算好的排名,在加上一些信息保存到新建的一个文件中,其执行完后如下: 如果在这
9、个界面选择y,则会通过系统调用打开对应的文件。关闭文件后可以进行下一步操作。3、计算各科均分及标准差和分组情况模块这个模块要实现的功能很多,主要是通过void Ave_Sta_dev(struct Stu_Data_1 stuMAXKCS+2,int n),函数来实现的。其处理完后保存到文件中,其格式如下:4、打印出每个学生的成绩单这个模块相对比较难一点,主要是要建立一个文件夹,在本系统中通过:system(md score),来建立一个文件夹,建立好文件夹后然后按照一定得规则保存到这个新建的文件夹中,文件的前面的名字是自己输入的,其界面如下:5、显示不及格学生的信息这个功能很简单,主要是通过
10、函数int check(int k ,struct Stu_Data_1 stuMAXKCS+2)函数判断给定的数据是否存在不及格科目;然后通过void Unpass_List(struct Stu_Data_1 stuMAXKCS+2,struct Stu_Credit xuefen,int n)函数显示在屏幕上面;方便查看,这个部分不保存到文件中,显示界面如下: 6、显示优等生学生的信息这个模块和上面的基本上一样,首先通过:int yds(int k ,struct Stu_Data_1 stuMAXKCS+2,int num,double average)来判断给定的学生是否满足优等生的
11、条件。然后通过 void Excellence_List(struct Stu_Data_1 stuMAXKCS+2,int num,double average,int n)来显示在屏幕上,其见面如下: 7、绘制各科成绩的分布图 这个模块主要是通过一个简单的算法实现的,具体算法可以查看源代码,其基本实现思想是:先确定不同分数段的人数,然后按照人数的多少来打印特定的一个符号,其符号是:printf();其分布图如下: 四、数据测试 数据测试基本上在上面的实现中都已经说明的很清楚了,下面附上处理后的各个数据文件的截图: 按照加权平均分排名的结果:各科目的总体分布情况:各个学生的成绩单如下: St
12、u_Date.h#define MAX 100#define KCS 5/实际课程数int k;struct Stu_Data_1char Elem15;struct Stu_Creditchar NO10;char course10;char cerdit10;struct Stu_Data_2char cou10;double ave;double bzc;int best;int better;int good;int pass;int fail;void Rank_List(int num,struct Stu_Data_1 stuMAXKCS+2,double average ,in
13、t n)/按平均分排名FILE *fp;int j; if(fp=fopen(Data1.txt,wb)=NULL) printf(此文件不可以打开,保存失败n); exit(1); fprintf(fp,名次 );for(j=0;jKCS+2;j+) fprintf(fp,%-9s,stu0j.Elem ); fprintf(fp,平均分); fprintf(fp,rn); for(k=1;kn;k+) fprintf(fp,%-6d,numk); for(j=0;jKCS+2;j+) fprintf(fp,%-9s,stukj.Elem ); fprintf(fp,%-6.1f,avera
14、gek); fprintf(fp,rn); fclose(fp); printf(保存成功n);/-void Ave_Sta_dev(struct Stu_Data_1 stuMAXKCS+2,int n)/求各科平均分、标准差double ss,m;struct Stu_Data_2 daKCS+2; FILE *fp; if(fp=fopen(Data2.txt,wb)=NULL) printf(此文件不可以打开,保存失败n); exit(1); int a; for(a=1;aKCS+1;a+) strcpy(daa.cou,stu0a+1.Elem); /-for(a=2;aKCS+2
15、;a+)for(k=1,m=0;kn;k+) m=m+atoi(stuka.Elem);daa-1.ave=m/(n-1);/计算各科平均分/-for(k=1;kKCS+1;k+)dak.best=0;dak.better=0;dak.good=0;dak.fail=0;dak.pass=0;for(a=2;aKCS+2;a+)for(k=1;k=90) daa-1.best+;/优秀if(atoi(stuka.Elem)=80) daa-1.better+;/良好 if(atoi(stuka.Elem)=70) daa-1.good+;/中等if(atoi(stuka.Elem)=60) d
16、aa-1.pass+;/及格if(atoi(stuka.Elem)60) daa-1.fail+;/不及格/科目分等级/- for(a=2;aKCS+2;a+)for(k=1,ss=0;kn;k+)ss+=(atof(stuka.Elem)-daa-1.ave)*(atof(stuka.Elem)-daa-1.ave);daa-1.bzc=sqrt(ss/(n-1);/求出各科标准差/- fprintf(fp,编号 课程名称 平均分 标准差 优秀 良好 中等 及格 不及格n); fprintf(fp,rn); for(k=1;kKCS+1;k+) fprintf(fp,%-6d%-10s%-8
17、.1f%-10.2f%-5d%-5d%-6d%-6d%-6dn,k,dak.cou,dak.ave,dak.bzc,dak.best,dak.better,dak.good,dak.pass,dak.fail ); fprintf(fp,rn); fclose(fp); printf(保存成功n);/- int check(int k ,struct Stu_Data_1 stuMAXKCS+2) int a; for(a=2;aKCS+2;a+)if(atof(stuka.Elem)92) return 1;if(numk88)for(a=2;a=99) return 1;return 0;
18、/-void Score_List(struct Stu_Data_1 stuMAXKCS+2, int n,double average, int num) int a;char no5; char clas10=; printf(请输入班级名:);scanf(%s,clas); system(md score); for(k=1;kn;k+) itoa(k,no,10); char filename20=; char add20=score; strcpy(add+strlen(add),clas); strcpy(filename+strlen(filename),add); strcp
19、y(filename+strlen(filename),no); strcpy(filename+strlen(filename),.txt); FILE *fp; if(fp=fopen(filename,wb)=NULL) printf(此文件不可以打开,保存失败n); exit(1); for(int j=0;jKCS+2;j+) fprintf(fp,%-9s,stu0j.Elem ); fprintf(fp,平均分 名次); fprintf(fp,rn); for(a=0;aKCS+2;a+) fprintf(fp,%-9s,stuka.Elem ); fprintf(fp,%-8.
20、2f,averagek); fprintf(fp,%-6d,numk); fprintf(fp,rn); fclose(fp); printf(文件已保存到程序跟目录下SCORE文件夹里.n);/打印每个学生的成绩单/-void Unpass_List(struct Stu_Data_1 stuMAXKCS+2,struct Stu_Credit xuefen,int n)int a,p;int check(int k ,struct Stu_Data_1 stuMAXKCS+2);printf(学号 姓名 课程名称(学分):成绩 课程名称(学分):成绩 课程名称(学分):成绩n);for(k
21、=1;kn;k+)if(check(k,stu)printf(%-6s%-8s,stuk0.Elem,stuk1.Elem);for(a=2,p=0;aKCS+2;a+)if(atof(stuka.Elem)3)printf(n );printf(%-9s(%s):%-5s,stu0a.Elem,xuefena-1.cerdit,stuka.Elem);p=p%3;printf(%-9s(%s):%-5s,stu0a.Elem,xuefena-1.cerdit,stuka.Elem);printf(n);/显示不及格的同学/-void Excellence_List(struct Stu_Da
22、ta_1 stuMAXKCS+2,int num,double average,int n)int a;int yds(int k ,struct Stu_Data_1 stuMAXKCS+2,int num,double average) ;/-if(KCS5)FILE *fp;if(fp=fopen(Data3.txt,wb)=NULL) printf(此文件不可以打开,保存失败n); exit(1); fprintf(fp,名次 );for(int j=0;jKCS+2;j+) fprintf(fp,%-9s,stu0j.Elem );fprintf(fp,平均分);fprintf(fp
23、,rn);for(k=1;kn;k+)if(yds(k,stu,num,average)fprintf(fp,%-6d,numk);for(a=0;aKCS+2;a+) fprintf(fp,%-9s,stuka.Elem );fprintf(fp,%-6.1f,averagek);fprintf(fp,rn);fclose(fp);printf(n由于科目过多屏幕无法正常显示,数据以保存到文件Data3.txt中,是否现在打开(y/n);char z;scanf(%c,&z);if(z=y) printf(n请关闭文件,使程序继续执行。n);system(Data3.txt);return;
24、/当科目大于5时执行该IF/-printf(名次 );for(int j=0;jKCS+2;j+) printf(%-9s,stu0j.Elem ); printf(平均分);printf(n);for(k=1;kn;k+)if(yds(k,stu,num,average)printf(%-6d,numk);for(a=0;aKCS+2;a+) printf(%-9s,stuka.Elem );printf(%-6.2f,averagek);printf(n);/显示优等生/-void Menu() system(cls); printf (n -n); printf (| 1-保存学生排名后
25、成绩单 |n); printf (| 2-保存学生成绩分布情况 |n); printf (| 3-打印每位同学的成绩 |n); printf (| 4-显示存在不及格科目同学 |n); printf (| 5-显示优等生名单 |n); printf (| 6-显示分布图 |n); printf (| Q-quit |n); printf ( -n); printf (Please input Keyn);void Distribution(struct Stu_Data_1 stuMAXKCS+2,int n)int c,j,figure11=0;for(c=2;cKCS+2;c+)print
26、f(= %s成绩分布图 =n,stu0c.Elem );for(k=1;k11;k+) figurek=0;for(k=1;k-1;a-) if(a = 10)printf(100 :);elseprintf(%d-%d :,a*10,(a*10)+9);for(int b=0;bfigurea;b+)printf();printf(nn);printf(按任意键打印下一科的分布图.n);getch(); MAIN.CPP#include stdio.h#include stdlib.h#include string.h#include conio.h#include math.h#inclu
27、de Stu_Data.h main()char x,z;int i,j,k,numMAX;/num-存放名次double m,averageMAX,qKCS+2;/average- 存放每位学生平均分 q-用于计算平均分struct Stu_Data_1 stuMAXKCS+2;/stu-存放学生各科成绩struct Stu_Credit CreKCS+2;/Cre-存放个科学分char File_130,File_230;/-FILE *fp;printf(请输入存放学生成绩的文件的完整路径.nn例如C盘下TC文件夹的xx0702.txt,格式为:c:tcxx0702.txtnn);pri
28、ntf(若文件与程序在同一文件夹下可直接输入文件名。nn);LP:printf(文件路径:);scanf(%s,File_1);if(fp=fopen(File_1,rb)=NULL)printf(打开文件失败!nn);printf(请重新输入nn);goto LP;i=0;while(!feof(fp)for(j=0;jKCS+2;j+)fscanf(fp,%sn,stuij.Elem );i+;fclose(fp);printf(n读取成功!nn);printf(按任意键继续.nn);getch();/-printf(请输入存放学科学分的文件的完整路径.nn例如C盘下TC文件夹的xx070
29、2.txt,格式为:c:tcxx0702.txtnn);printf(若文件与程序在同一文件夹下可直接输入文件名。nn);Lp:printf(文件路径:);scanf(%s,File_2);if(fp=fopen(File_2,rb)=NULL)printf(打开文件失败!nn);printf(请重新输入nn);goto Lp; k=0;while(!feof(fp)fscanf(fp,%s%s%sn,&Crek.NO,&Crek.course,&Crek.cerdit);k+;fclose(fp);printf(n读取成功!n);printf(n按任意键进入主菜单.);getch();/-f
30、or(q0=0,k=1;kKCS+2;k+) q0+=atof(Crek.cerdit);/将学分总和存入q0for(k=1;kKCS+2;k+) qk=atof(Crek.cerdit)/q0;/求出权值for(k=1;ki;k+)averagek=0;for(j=2;jKCS+2;j+) averagek+=atof(stukj.Elem) *qj-1;/求出加权平均分/-int a;for(k=1;ki;k+) numk=1; for(a=1;ai;a+) if(averagekaveragea) numk+; /求出名次/-doMenu();fflush(stdin);x=getch(
31、);switch(x)case 1 : Rank_List(num,stu,average,i);printf(n数据已经保存到程序根目录下Data1.txt文件中,是否现在打开文件?(y/n):);scanf(%c,&z);if(z=y) printf(n请关闭文件,使程序继续执行。n);system(Data1.txt);printf(n按任意键返回主菜单.);getch();break;case2:Ave_Sta_dev(stu,i);printf(n数据已经保存到程序根目录下Data2.txt文件中,是否现在打开文件?(y/n):);scanf(%c,&z);if(z=y) printf(n请关闭文件,使程序继续执行。n);system(Data2.txt);printf(n按任意键返回主菜单.);getch();break;case3:Score_List(stu,i,average,num);printf(n按任意键返回主菜单.);getch();break;case4:system(cls);printf(.含不及格科目学生名单.n);Unpass_List(stu,Cre,i);