C语言课程设计成绩管理系统报告+源码.docx
《C语言课程设计成绩管理系统报告+源码.docx》由会员分享,可在线阅读,更多相关《C语言课程设计成绩管理系统报告+源码.docx(23页珍藏版)》请在冰豆网上搜索。
C语言课程设计成绩管理系统报告+源码
简易教学管理系统的设计与实现
【摘要】:
本系统可以实现简易的学生成绩管理,功能有限,主要功能包括读取文件中存放的学生成绩单,并对其求每个人的平均分,然后按照平均分对其排名;另外还可以计算每门课程的平均分和标准差,并按照成绩对学生划分区段,将处理后的结果可以保存在新建的一个文件中,方便查看;通过此系统还可以将每个同学的成绩单单独的输出到文件中,保存在一个指定的文件夹中;值得一提的是次系统还可以按照特定的要求进行数据筛选,比如屏幕显示有不及格科目的同学的信息,屏幕显示符合设定的优等生的条件的学生;最后本系统还实现了显示每门课程的成绩分布图(横向的)。
流程图
二、主要函数及其功能
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()循环保证程序的循环运
行;通过函数switch()使得到得返回值调用相应的各功能函数
,程序的主菜单如下:
总体来说,这个系统可以分为七个功能模块,其分别是:
计算每个学生的加权平均分并进行排名,计算每门课程的总体均分,标准差以及分组情况,打印出每个学生的成绩单,显示有不及格科目的学生,显示符合优等生条件的学生和绘制每门课程的分布图。
1、主函数功能实现
主函数首先是要求输入存放学生成绩的文件,然后在读取每门课程所对应的学分,其界面如下:
如果输入的文件名不正确,则会提示重新输入文件名,知道输入正确的文件名,即读取文件中的数据成功,读取到数据后在主函数中会对其进行处理,分别计算出其平均分和排名。
2、计算加权平均分模块
此模块的功能主要是通过函数voidRank_List(intnum[],structStu_Data_1stu[MAX][KCS+2],doubleaverage[],intn),来实现的,其基本实现思路是:
直接将在主函数中计算好的排名,在加上一些信息保存到新建的一个文件中,其执行完后如下:
如果在这个界面选择y,则会通过系统调用打开对应的文件。
关闭文件后可以进行下一步操作。
3、计算各科均分及标准差和分组情况模块
这个模块要实现的功能很多,主要是通过voidAve_Sta_dev(structStu_Data_1stu[MAX][KCS+2],intn),函数来实现的。
其处理完后保存到文件中,其格式如下:
4、打印出每个学生的成绩单
这个模块相对比较难一点,主要是要建立一个文件夹,在本系统中通过:
system("mdscore"),来建立一个文件夹,建立好文件夹后然后按照一定得规则保存到这个新建的文件夹中,文件的前面的名字是自己输入的,其界面如下:
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)来显示在屏幕上,其见面如下:
7、绘制各科成绩的分布图
这个模块主要是通过一个简单的算法实现的,具体算法可以查看源代码,其基本实现思想是:
先确定不同分数段的人数,然后按照人数的多少来打印特定的一个符号,其符号是:
printf("█");其分布图如下:
四、数据测试
数据测试基本上在上面的实现中都已经说明的很清楚了,下面附上处理后的各个数据文件的截图:
按照加权平均分排名的结果:
各科目的总体分布情况:
各个学生的成绩单如下:
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)//按平均分排名
{
FILE*fp;
intj;
if((fp=fopen("Data1.txt","wb"))==NULL)
{
printf("……………此文件不可以打开,保存失败…………\n");
exit
(1);
}
fprintf(fp,"名次");
for(j=0;jfprintf(fp,"平均分");
fprintf(fp,"\r\n");
for(k=1;k{
fprintf(fp,"%-6d",num[k]);
for(j=0;jfprintf(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;a//------------------------------------------------------------------------------
for(a=2;a{
for(k=1,m=0;kda[a-1].ave=m/(n-1);
}//计算各科平均分
//-------------------------------------------------------------------------------------
for(k=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;afor(k=1;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;a{
for(k=1,ss=0;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;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");
}
fclose(fp);
printf("……………保存成功…………\n");
}
//--------------------------------------------------------------------------------------
intcheck(intk,structStu_Data_1stu[MAX][KCS+2])
{
inta;
for(a=2;aif(atof(stu[k][a].Elem)<60)return1;
return0;
}
//----------------------------------------------------------------------------------------
intyds(intk,structStu_Data_1stu[MAX][KCS+2],intnum[],doubleaverage[])
{
inta;
if(average[k]>92)return1;
if(num[k]<6)return1;
if(average[k]>88)
{
for(a=2;aif(atof(stu[k][a].Elem)>=99)return1;
}
return0;
}
//-------------------------------------------------------------------------------------------------
voidScore_List(structStu_Data_1stu[MAX][KCS+2],intn,doubleaverage[],intnum[])
{
inta;
charno[5];
charclas[10]={""};
printf("请输入班级名:
");
scanf("%s",clas);
system("mdscore");
for(k=1;k{
itoa(k,no,10);
charfilename[20]={""};
charadd[20]={"score\\"};
strcpy(add+strlen(add),clas);
strcpy(filename+strlen(filename),add);
strcpy(filename+strlen(filename),no);
strcpy(filename+strlen(filename),".txt");
FILE*fp;
if((fp=fopen(filename,"wb"))==NULL)
{
printf("……………此文件不可以打开,保存失败…………\n");
exit
(1);
}
for(intj=0;jfprintf(fp,"平均分名次");
fprintf(fp,"\r\n");
for(a=0;afprintf(fp,"%-9s",stu[k][a].Elem);
fprintf(fp,"%-8.2f",average[k]);
fprintf(fp,"%-6d",num[k]);
fprintf(fp,"\r\n");
fclose(fp);
}
printf("文件已保存到程序跟目录下SCORE文件夹里.\n");
}//打印每个学生的成绩单
//-------------------------------------------------------------------------------------------------
voidUnpass_List(structStu_Data_1stu[MAX][KCS+2],structStu_Creditxuefen[],intn)
{
inta,p;
intcheck(intk,structStu_Data_1stu[MAX][KCS+2]);
printf("学号姓名课程名称(学分):
成绩课程名称(学分):
成绩课程名称(学分):
成绩\n");
for(k=1;k{
if(check(k,stu))
{
printf("%-6s%-8s",stu[k][0].Elem,stu[k][1].Elem);
for(a=2,p=0;aif(atof(stu[k][a].Elem)<60){
p++;
if(p>3){
printf("\n");
printf("%-9s(%s):
%-5s",stu[0][a].Elem,xuefen[a-1].cerdit,stu[k][a].Elem);
p=p%3;
}
printf("%-9s(%s):
%-5s",stu[0][a].Elem,xuefen[a-1].cerdit,stu[k][a].Elem);
}
printf("\n");
}
}
}//显示不及格的同学
//------------------------------------------------------------------------------------------------------
voidExcellence_List(structStu_Data_1stu[MAX][KCS+2],intnum[],doubleaverage[],intn)
{
inta;
intyds(intk,structStu_Data_1stu[MAX][KCS+2],intnum[],doubleaverage[]);
//----------------------------------------------------------------------------------------------
if(KCS>5)
{
FILE*fp;
if((fp=fopen("Data3.txt","wb"))==NULL)
{
printf("……………此文件不可以打开,保存失败…………\n");
exit
(1);
}
fprintf(fp,"名次");
for(intj=0;jfprintf(fp,"平均分");
fprintf(fp,"\r\n");
for(k=1;k{
if(yds(k,stu,num,average))
{
fprintf(fp,"%-6d",num[k]);
for(a=0;afprintf(fp,"%-6.1f",average[k]);
fprintf(fp,"\r\n");
}
}
fclose(fp);
printf("\n由于科目过多屏幕无法正常显示,数据以保存到文件Data3.txt中,是否现在打开(y/n)");
charz;
scanf("%c",&z);
if(z=='y')
{
printf("\n请关闭文件,使程序继续执行。
\n");
system("Data3.txt");
}
return;
}//当科目大于5时执行该IF
//-------------------------------------------------------------------------------------------------
printf("名次");
for(intj=0;jprintf("平均分");
printf("\n");
for(k=1;k{
if(yds(k,stu,num,average))
{
printf("%-6d",num[k]);
for(a=0;aprintf("%-6.2f",average[k]);
printf("\n");
}
}
}//显示优等生
//-------------------------------------------------------------------------------------------------------
voidMenu()
{
system("cls");
printf("\n-------------------------------\n");
printf("|1-保存学生排名后成绩单|\n");
printf("|2-保存学生成绩分布情况|\n");
printf("|3-打印每位同学的成绩|\n");
printf("|4-显示存在不及格科目同学|\n");
printf("|5-显示优等生名单|\n");
printf("|6-显示分布图|\n");
printf("|Q-quit|\n");
printf("-------------------------------\n");
printf("PleaseinputKey\n");
}
voidDistribution(structStu_Data_1stu[MAX][KCS+2],intn)
{
intc,j,figure[11]={0};
for(c=2;c{
printf("===%s成绩分布图===\n",stu[0][c].Elem);
for(k=1;k<11;k++)figure[k]=0;
for(k=1;k{
figure[atoi(stu[k][c].Elem)/10]++;
}
for(inta=10;a>-1;a--)
{
if(a==10)
printf("100:
");