C语言简易成绩管理实习报告+源码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简易教学管理系统的设计与实现
【摘要】:本系统可以实现简易的学生成绩管理,功能有限,主要功能包括读取文件中存放的学生成绩单,并对其求每个人的平均分,然后按照平均分对其排名;另外还可以计算每门课程的平均分和标准差,并按照成绩对学生划分区段,将处理后的结果可以保存在新建的一个文件中,方便查看;通过此系统还可以将每个同学的成绩单单独的输出到文件中,保存在一个指定的文件夹中;值得一提的是次系统还可以按照特定的要求进行数据筛选,比如屏幕显示有不及格科目的同学的信息,屏幕显示符合设定的优等生的条件的学生;最后本系统还实现了显示每门课程的成绩分布图(横向的)。

一、设计思路
程序设计一般有两个部分组成,算法和数据结构,合理的选择和实现一个数据结构和车里这些数据结构具有同样的重要性。

在这个学生成绩管理系统中,算法都很简单,基本上没有什么很复杂的算法,难点主要在数据结构上面,因为这个系统涉及到得数据比较多,很多数据很容易混淆,所以,我设计了三个数据结构,分别如下://定义常数
#define MAX 100
#define KCS 5//实际课程数
int k;
struct Stu_Data_1 {
char Elem[15]; };
struct Stu_Data_2 {
char cou[10]; double ave; double bzc;
int best;
int better;
int good;
int pass;
int fail;
};
struct Stu_Credit {
char NO[10]; char course[10]; char cerdit[10]; };
首先是定义常量,这些常量的目的主要是为了程序的通用性和易修改性设计,#define KCS 5; 的目的是预先估计课程数目,在次设计成常量,方便扩展和修改,使其实用性更强,#define MAX 100; 的目的是预先估计学生的人数。

第一个数据结构是:Stu_Data_1,这个数据结构式本系统的核心,主要负责从文件中逐行读取数据放入其Elem中,用这个数据结构定义一个二维的数组,就可以很方便的对文件中的数据进行管理了,使整个函数的设计容易了很多。

第二个数据结构是:Stu_Data_2,这个数据结构的主要作用是用于存放对学生的成绩处理后的结果的。

char cou[10];存放课程名称,double ave;存放每科的平均分,double bzc;存放每科得标准差,下面的用于存放不同等级人数。

第三个数据结构是:Stu_Credit,这个数据结构主要负责将存放在文件中的各门课程所对应的学分读取出来,方便在程序执行中使用,用,NO来存放课程编号,用char course[10]来存放课程名称,用char cerdit[10]; 在存放最重要的课程学分,此数据结构主要用于在主函数中计算每个学生的加权平均分,在其他函数中基本上很好调用。

流程图
开始
读取成绩文件
是否成功
读取学分文件
是否成功
进入DO…WHILE循环
MENU
1 2 6
5
3 4
按平均分排名








































退



q
结束


二、主要函数及其功能
1、void Rank_List(int num[],struct Stu_Data_1 stu[MAX][KCS+2],double average[] ,int n),按平均分给每个同学进行排序,然后保存到另一个文件中;
2、void Ave_Sta_dev(struct Stu_Data_1 stu[MAX][KCS+2],int n),求各科的总体均分和标准差,结果存放在新建的一个文件中;
3、void Score_List(struct Stu_Data_1 stu[MAX][KCS+2], int n,double average[], int num[]),保存所有学生的成绩单,将所有的成绩单存放在一个指定的文件夹中;
4、void Unpass_List(struct Stu_Data_1 stu[MAX][KCS+2],struct Stu_Credit xuefen[],int n),屏幕显示所有不及格的人的不及格科目;
5、void Excellence_List(struct Stu_Data_1 stu[MAX][KCS+2],int num[],double average[],int n),找出优等生,并将他们保存到新建的文件中;
6、void Distribution(struct Stu_Data_1 stu[MAX][KCS+2],int n),绘制学生成绩柱状分布图
7、void Menu(),主菜单函数,主要用于调出主菜单;
三、系统详细设计及实现过程
程序采用模块化设计,主函数是程序的入口,个模块独
立,可分块调试。

While()循环保证程序的循环运
行;通过函数switch()使得到得返回值调用相应的各功能函数
,程序的主菜单如下:
总体来说,这个系统可以分为七个功能模块,其分别是:计算每个学生的加权平均分并进行排名,计算每门课程的总体均分,标准差以及分组情况,打印出每个学生的成绩单,显示有不及格科目的学生,显示符合优等生条件的学生和绘制每门课程的分布图。

1、主函数功能实现
主函数首先是要求输入存放学生成绩的文件,然后在读取每门课程所对应的学分,其界面如下:
如果输入的文件名不正确,则会提示重新输入文件名,知道输入正确的文件名,即读取文件中的数据成功,读取到数据后在主函数中会对其进行处理,分别计算出其平均分和排名。

2、计算加权平均分模块
此模块的功能主要是通过函数void Rank_List(int num[],struct Stu_Data_1 stu[MAX][KCS+2],double average[] ,int n),来实现的,其基本实现思路是:直接将在主函数中计算好的排名,在加上一些信息保存到新建的一个文件中,其执行完后如下:
如果在这个界面选择y,则会通过系统调用打开对应的文件。

关闭文件后可以进行下一步操作。

3、计算各科均分及标准差和分组情况模块
这个模块要实现的功能很多,主要是通过void Ave_Sta_dev(struct Stu_Data_1 stu[MAX][KCS+2],int n),函数来实现的。

其处理完后保存到文件中,其格式如下:
4、打印出每个学生的成绩单
这个模块相对比较难一点,主要是要建立一个文件夹,在本系统中通过:system("md score"),来建立一个文件夹,建立好文件夹后然后按照一定得规则保存到这个新建的文件夹中,文件的前面的名字是
自己输入的,其界面如下:
5、显示不及格学生的信息
这个功能很简单,主要是通过函数int check(int k ,struct Stu_Data_1 stu[MAX][KCS+2])函数判断给定的数据是否存在不及格科目;然后通过void Unpass_List(struct Stu_Data_1 stu[MAX][KCS+2],struct Stu_Credit xuefen[],int n)函数显示在屏幕上面;方便查看,这个部分不保存到文件中,显示界面如下:
6、显示优等生学生的信息
这个模块和上面的基本上一样,首先通过:int yds(int k ,struct Stu_Data_1 stu[MAX][KCS+2],int num[],double average[])来判断给定的学生是否满足优等生的条件。

然后通过void Excellence_List(struct Stu_Data_1 stu[MAX][KCS+2],int num[],double average[],int n)来显示在
屏幕上,其见面如下:
7、绘制各科成绩的分布图
这个模块主要是通过一个简单的算法实现的,具体算法可以查看源代码,其基本实现思想是:先确定不同分数段的人数,然后按照人数的多少来打印特定的一个符号,其符号是:printf("█");其分布图如下:
四、数据测试
数据测试基本上在上面的实现中都已经说明的很清楚了,下面附上处理后的各个数据文件的截图:
按照加权平均分排名的结果:
各科目的总体分布情况:
各个学生的成绩单如下:
Stu_Date.h
#define MAX 100
#define KCS 5//实际课程数
int k;
struct Stu_Data_1
{
char Elem[15];
};
struct Stu_Credit
{
char NO[10];
char course[10];
char cerdit[10];
};
struct Stu_Data_2
{
char cou[10];
double ave;
double bzc;
int best;
int better;
int good;
int pass;
int fail;
};
void Rank_List(int num[],struct Stu_Data_1 stu[MAX][KCS+2],double average[] ,int n)//按平均分排名
{
FILE *fp;
int j;
if((fp=fopen("Data1.txt","wb"))==NULL)
{
printf("……………此文件不可以打开,保存失败…………\n");
exit(1);
}
fprintf(fp,"名次");
for(j=0;j<KCS+2;j++) fprintf(fp,"%-9s",stu[0][j].Elem );
fprintf(fp,"平均分");
fprintf(fp,"\r\n");
for(k=1;k<n;k++)
{
fprintf(fp,"%-6d",num[k]);
for(j=0;j<KCS+2;j++) fprintf(fp,"%-9s",stu[k][j].Elem );
fprintf(fp,"%-6.1f",average[k]);
fprintf(fp,"\r\n");
}
fclose(fp);
printf("…………保存成功………………\n");
}
//--------------------------------------------------------------------------
void Ave_Sta_dev(struct Stu_Data_1 stu[MAX][KCS+2],int n)//求各科平均分、标准差{
double ss,m;
struct Stu_Data_2 da[KCS+2];
FILE *fp;
if((fp=fopen("Data2.txt","wb"))==NULL)
{
printf("……………此文件不可以打开,保存失败…………\n");
exit(1);
}
int a;
for(a=1;a<KCS+1;a++) strcpy(da[a].cou,stu[0][a+1].Elem);
//------------------------------------------------------------------------------
for(a=2;a<KCS+2;a++)
{
for(k=1,m=0;k<n;k++) m=m+atoi(stu[k][a].Elem);
da[a-1].ave=m/(n-1);
}//计算各科平均分
//-------------------------------------------------------------------------------------
for(k=1;k<KCS+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;a<KCS+2;a++)
for(k=1;k<n;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<KCS+2;a++)
{
for(k=1,ss=0;k<n;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<KCS+1;k++)
{
fprintf(fp,"%-6d%-10s%-8.1f%-10.2f%-5d%-5d%-6d%-6d%-6d\n",k,da[k].cou,da[k].av e,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");
}
//--------------------------------------------------------------------------------------
int check(int k ,struct Stu_Data_1 stu[MAX][KCS+2])
{
int a;
for(a=2;a<KCS+2;a++)
if(atof(stu[k][a].Elem)<60) return 1;
return 0;
}
//----------------------------------------------------------------------------------------
int yds(int k ,struct Stu_Data_1 stu[MAX][KCS+2],int num[],double average[])
{
int a;
if(average[k]>92) return 1;
if(num[k]<6) return 1;
if(average[k]>88)
{
for(a=2;a<KCS+2;a++)
if(atof(stu[k][a].Elem)>=99) return 1;
}
return 0;
}
//-------------------------------------------------------------------------------------------------
void Score_List(struct Stu_Data_1 stu[MAX][KCS+2], int n,double average[], int num[])
{
int a;
char no[5];
char clas[10]={""};
printf("请输入班级名:");
scanf("%s",clas);
system("md score");
for(k=1;k<n;k++)
{
itoa(k,no,10);
char filename[20]={""};
char add[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(int j=0;j<KCS+2;j++) fprintf(fp,"%-9s",stu[0][j].Elem );
fprintf(fp,"平均分名次");
fprintf(fp,"\r\n");
for(a=0;a<KCS+2;a++)
fprintf(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");
}//打印每个学生的成绩单
//-------------------------------------------------------------------------------------------------
void Unpass_List(struct Stu_Data_1 stu[MAX][KCS+2],struct Stu_Credit xuefen[],int n)
{
int a,p;
int check(int k ,struct Stu_Data_1 stu[MAX][KCS+2]);
printf("学号姓名课程名称(学分):成绩课程名称(学分):成绩课程名称(学分):成绩\n");
for(k=1;k<n;k++)
{
if(check(k,stu))
{
printf("%-6s%-8s",stu[k][0].Elem,stu[k][1].Elem);
for(a=2,p=0;a<KCS+2;a++)
if(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");
}
}
}//显示不及格的同学
//------------------------------------------------------------------------------------------------------
void Excellence_List(struct Stu_Data_1 stu[MAX][KCS+2],int num[],double average[],int n)
{
int a;
int yds(int k ,struct Stu_Data_1 stu[MAX][KCS+2],int num[],double average[]) ; //---------------------------------------------------------------------------------------------- if(KCS>5)
{
FILE *fp;
if((fp=fopen("Data3.txt","wb"))==NULL)
{
printf("……………此文件不可以打开,保存失败…………\n");
exit(1);
}
fprintf(fp,"名次");
for(int j=0;j<KCS+2;j++) fprintf(fp,"%-9s",stu[0][j].Elem );
fprintf(fp,"平均分");
fprintf(fp,"\r\n");
for(k=1;k<n;k++)
{
if(yds(k,stu,num,average))
{
fprintf(fp,"%-6d",num[k]);
for(a=0;a<KCS+2;a++) fprintf(fp,"%-9s",stu[k][a].Elem );
fprintf(fp,"%-6.1f",average[k]);
fprintf(fp,"\r\n");
}
}
fclose(fp);
printf("\n由于科目过多屏幕无法正常显示,数据以保存到文件Data3.txt中,是否现在打开(y/n)");
char z;
scanf("%c",&z);
if(z=='y')
{
printf("\n请关闭文件,使程序继续执行。

\n");
system("Data3.txt");
}
return;
}//当科目大于5时执行该IF
//------------------------------------------------------------------------------------------------- printf("名次");
for(int j=0;j<KCS+2;j++) printf("%-9s",stu[0][j].Elem );
printf("平均分");
printf("\n");
for(k=1;k<n;k++)
{
if(yds(k,stu,num,average))
{
printf("%-6d",num[k]);
for(a=0;a<KCS+2;a++) printf("%-9s",stu[k][a].Elem );
printf("%-6.2f",average[k]);
printf("\n");
}
}
}//显示优等生
//------------------------------------------------------------------------------------------------------- void Menu()
{
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 ("Please input Key\n");
}
void Distribution(struct Stu_Data_1 stu[MAX][KCS+2],int n)
{
int c,j,figure[11]={0};
for(c=2;c<KCS+2;c++)
{
printf("=== %s成绩分布图===\n",stu[0][c].Elem );
for(k=1;k<11;k++) figure[k]=0;
for(k=1;k<n;k++)
{
figure[atoi(stu[k][c].Elem)/10]++;
}
for(int a=10;a>-1;a--)
{
if(a == 10)
printf("100 :");
else
printf("%d--%d :",a*10,(a*10)+9);
for(int b=0;b<figure[a];b++)
{
printf("█");
}
printf("\n\n");
}
printf("按任意键打印下一科的分布图......\n");
getch();
}
}
MAIN.CPP
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "math.h"
#include "Stu_Data.h"
main()
{
char x,z;
int i,j,k,num[MAX];//num-存放名次
double m,average[MAX],q[KCS+2];//average- 存放每位学生平均分q-用于计算平均分
struct Stu_Data_1 stu[MAX][KCS+2];//stu-存放学生各科成绩
struct Stu_Credit Cre[KCS+2];//Cre-存放个科学分
char File_1[30],File_2[30];
//----------------------------------------------------------------------------------------------------
FILE *fp;
printf("请输入存放学生成绩的文件的完整路径.\n\n例如C盘下TC文件夹的xx0702.txt,格式为:c:\\tc\\xx0702.txt\n\n");
printf("若文件与程序在同一文件夹下可直接输入文件名。

\n\n");
LP: printf("文件路径:");
scanf("%s",File_1);
if((fp=fopen(File_1,"rb"))==NULL)
{
printf("打开文件失败!\n\n");
printf("请重新输入\n\n");
goto LP;
}
i=0;
while(!feof(fp))
{
for(j=0;j<KCS+2;j++)
{
fscanf(fp,"%s\n",stu[i][j].Elem );
}
i++;
}
fclose(fp);
printf("\n读取成功!\n\n");
printf("按任意键继续.......\n\n");
getch();
//----------------------------------------------------------------------------------------------------------------------
printf("请输入存放学科学分的文件的完整路径.\n\n例如C盘下TC文件夹的xx0702.txt,格式为:c:\\tc\\xx0702.txt\n\n");
printf("若文件与程序在同一文件夹下可直接输入文件名。

\n\n");
Lp: printf("文件路径:");
scanf("%s",File_2);
if((fp=fopen(File_2,"rb"))==NULL)
{
printf("打开文件失败!\n\n");
printf("请重新输入\n\n");
goto Lp;
}
k=0;
while(!feof(fp))
{
fscanf(fp,"%s%s%s\n",&Cre[k].NO,&Cre[k].course,&Cre[k].cerdit);
k++;
}
fclose(fp);
printf("\n读取成功!\n");
printf("\n按任意键进入主菜单.......");
getch();
//---------------------------------------------------------------------------------------------------------- for(q[0]=0,k=1;k<KCS+2;k++) q[0]+=atof(Cre[k].cerdit);//将学分总和存入q[0] for(k=1;k<KCS+2;k++) q[k]=atof(Cre[k].cerdit)/q[0];//求出权值
for(k=1;k<i;k++)
{
average[k]=0;
for(j=2;j<KCS+2;j++) average[k]+=atof(stu[k][j].Elem) *q[j-1];
}//求出加权平均分
//-------------------------------------------------------------------------------------------------------------- int a;
for(k=1;k<i;k++)
{
num[k]=1;
for(a=1;a<i;a++) if(average[k]<average[a]) num[k]++;
}//求出名次
//---------------------------------------------------------------------------------------------------------
do
{
Menu();
fflush(stdin);
x=getch();
switch(x)
{
{
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;
}
case'2':
{
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;
}
case'3':
{
Score_List(stu,i,average,num);
printf("\n按任意键返回主菜单.......");
getch();
break;
}
case'4':
{
system("cls");
printf("....................含不及格科目学生名单...............\n");
Unpass_List(stu,Cre,i);
printf("\n按任意键返回主菜单.......");
getch();
break;
}
case'5':
{
system("cls");
printf("....................优等生学生名单...............\n");
Excellence_List(stu,num,average,i);
printf("\n按任意键返回主菜单.......");
getch();
break;
}
case'6':
{
Distribution(stu,i);
}
}
}while(x!='q');
}。

相关文档
最新文档