搜档网
当前位置:搜档网 › 学生试卷分数统计C语言程序设计

学生试卷分数统计C语言程序设计

学生试卷分数统计C语言程序设计
学生试卷分数统计C语言程序设计

广州航海学院课程(C语言)设计任务书

注:1.任务书由指导教师填写后由教研室、系签署意见;

2.任务书应在学生课程设计开始前下达给学生;

3.任务书一式二份,设计人、指导教师各执一份。

C语言课程设计报告

系 (部) 信息与通信工程学院

专业班级计应171班

姓名学号曾雨祥201715010136

设计基地(实训室)信息楼605实训室

设计项目学生试卷分析统计

设计日期2017.12.25-2017.12.29设计成绩

指导教师张翚

学生试卷成绩分析系统

一.需求分析

1.适合人群

教师。

2.使用范围

小学至大学,人数数量不大。

二.概要设计

1.主函数main():初始化各变量并调用各函数。

2.输入模块accept_data():输入学生个人成绩。

3.计算模块count():依据学生成绩进行计算需要的各种数值。

4. 输出模块show_data():输出计算的各种数值。

程序功能结构图如图所示:

三.详细设计

本系统有一个主函数,3个功能模块,每个功能模块函数都是由主函数调用,分别说下:1.主函数main()

此函数初始化各变量并调用各函数。

代码如下:

int main() //平均分和标准差函数说明

{

int sum,max,min; //数据定义

double pass=0;

int grade[11]={0};

STUDENT stu[SIZE];

double ave[SIZE],f[SIZE];

printf("\n\n\t\t\t\t\t\t欢迎使用学生试卷管理系统!\a\n\n");

sum=accept_data(stu,grade); //输入数据(sum为总人数)

count(&max,&min,&pass,ave,f,stu,sum);//计算期末考试成绩的及格率最高分、最低分

//以及平时、期末和总评成绩的平均分和标准差

show_data(stu,sum,grade,max,min,pass,ave,f);

//输入所有学生的序号、平时成绩、期末成绩和总评成绩

//显示期末考试成绩的最高分、最低分以及平时、期末和总评成绩的平均分和标准差

return 0;

}

解析:主函数为程序之精华。主函数逐步调用模块来实现,步骤如图:

因为所有功能模块都在主函数之后,所有需要再主函数中声明定义功能模块的函数。

2.输入模块accept_data()

输入模块代码如下:

int accept_data(STUDENT stu[],int grade[])

{int i=0,sum=0,temp,a1,a2;

FLAG flag;

printf("\n 请输入计算总成绩时使用平时成绩与期末成绩的比例,用整数表示(百分比例如:30 70):");

scanf("%d%d",&a1,&a2); //接收计算总评成绩的比例

while(i

{

printf("\n 请输入学号(输入-1可停止输入):");

scanf("%d",&stu[i].number); //输入学号

if (stu[i].number==-1) //序号时-1则跳出循环

{sum=i; //sum记录的是输入的人数

break;

}

printf("\n 请输入学生的平时成绩和期末成绩(百分制分数):");

flag=True;

while(flag==True) //重复读入两个成绩,读到正确的为止

{scanf("%d%d",&stu[i].score[0],&stu[i].score[1]);

if(stu[i].score[0]<=100&& stu[i].score[0]>=0&&\

stu[i].score[1]<=100&& stu[i].score[1]>=0)

flag=False; //输入的两个成绩合理

else

printf("\n\007 错误数据!请再次输入学生的平时成绩和期末成绩(百分制分数输入格式如:98 99):");

//输入的两个成绩不合理

}

temp=(int)(1.0*a1/100*stu[i].score[0]+1.0*a2/100 *

stu[i].score[1]);

//计算总评成绩

stu[i].score[2]=temp; //总评成绩存入数组

temp=(stu[i].score[1])/10; //计算分数段

if(temp==10) //分数段存入数组

grade[10]++; //100分存入数组元素grade[10]

else

grade[temp+1]++; //90~99分存入数组元素

grade[9]

//80~89分存入数组元素grade[8]

//70~79分存入数组元素grade[7],以此类推

i++;

}

return sum; //返回人数

}

解析:主函数引用该模块后,输入成绩比例,利用for语句连续分别输入学生的学号,平时成绩和期末成绩,如果输入成绩大于100分或者小于0分,则需要重新输入,如果正确则break,跳出for语句。开始计算总评成绩和各成绩分数段并存入结构体里。最后返回已输入成绩的学生个数到主函数。

3.计算模块count()

此函数计算各成绩的最高分,最低分,及格率,标准差,代码如下:

void count(int* max,int* min,double* pass,double ave[],double

f[],STUDENT stu[],int sum)

{int i,j,p_sum=0;

int total[3];

double temp;

*max=*min=stu[0].score[1]; //设卷面成绩的最高分、最低分初值

if(stu[0].score[1]>=60)

p_sum++;

for(i=1;i

{if((stu[i].score[1])>*max) //若高于最高分,将其覆盖*max=stu[i].score[1];

if((stu[i].score[1])<*min) //若低于最低分,将其覆盖

*min=stu[i].score[1];

if((stu[i].score[i])>=60)

p_sum++; //计算及格的人数

}

*pass=(1.0*p_sum/sum)*100; //计算及格率

for(i=0;i<=2;i++) //平时、期末、总评的初值设置为0

total[i]=0;

for(j=0;j<3;j++) //求平时、期末、总评3个总分for(i=0;i

{

total[j]=total[j]+stu[i].score[j];

}

for(j=0;j<3;j++) //求平时、期末、总评3个平均分

{

ave[j]=total[j]/sum;

}

for(j=0;j<3;j++) //求平均、期末、总评标准差{

f[j]=0; //标准差初值设置为0

for(i=0;i

{

temp=stu[i].score[j]-ave[j];

f[j]=f[j]+temp*temp;

}

f[j]=sqrt(fabs(f[j])/sum);

}

}

解析:此模块中,利用多个for语句来计算各个成绩的最高分、最低分、及格人数、总分,根据及格人数求出及格率,利用total数组存放总分来计算平均分,利用公式求得标准差。

4.输出函数show_data()

此模块输出计算好的三个成绩和各成绩段人数,代码如下:

void show_data(STUDENT stu[],int sum,int grade[],int max,int min,double pass,double ave[],double f[])

{

int i,j;

printf("\n\n\n----------------------------------------------------------------------------------------------------------------------\n\n\n ");

printf("\n\t\t\t\t\t学号平时成绩期末考试总评成绩\n"); //输出各成绩

for(i=0;i

{

printf("\t\t\t\t\t %4d ",stu[i].number);

for(j=0;j<3;j++)

printf("\t%4d ",stu[i].score[j]);

printf("\t\n");

}

{

char str1[3][20]={"\t\t\t\t平时成绩平均分","\t\t\t\t期末成绩平均分","\t\t\t\t总评成绩平均分"};

char str2[3][20]={"\t平时成绩标准差","\t期末成绩标准差","\t总评成绩标准差"};

printf("\n\n\n----------------------------------------------------------------------------------------------------------------------\n\n\n ");

printf("\n\t\t\t\t及格率=%6.2f%%\t最高分=%d\t最低分

=%d\n",pass,max,min);

//输出3次分别输出平时、期末、总评的平均分和标准差

for(j=0;j<3;j++)

printf("\n %s=%6.2f %s=%6.2f\n",str1[j],ave[j],str2[j],f[j]);

printf("\n\n\n----------------------------------------------------------------------------------------------------------------------");

printf("\n\n\n\t\t\t\t\t期末成绩中的各分数段为:\n\n"); //输出各分数段

printf("\t\t\t\t\t60分以下:%d个

\n\n",grade[0]+grade[1]+grade[2]+grade[3]+grade[4]+grade[5]+grade[6]) ;

printf("\t\t\t\t\t60-69分段:%d个\n\n",grade[7]);

printf("\t\t\t\t\t70-79分段:%d个\n\n",grade[8]);

printf("\t\t\t\t\t80-89分段:%d个\n\n",grade[9]);

printf("\t\t\t\t\t90-99分段:%d个\n\n",grade[10]);

printf("\t\t\t\t\t100分:%d个\n\n",grade[11]);

}

}

解析:此模块利用数组和for语句连续输出输入的数值以及经过计算模块的各种数值。

5.总代码

#include"stdio.h"

#include"string.h"

#include"conio.h"

#include"math.h"

#define SIZE 300

typedefstruct student //学生数据结构体声明

{int number; //学号

int score[3]; //平时、期末和总评成绩

} STUDENT;

typedefenum boolen //枚举定义

{ False,True

} FLAG;

int accept_data(STUDENT stu[],int grade[]);//输入数据函数声明

void count(int* max,int* min,double* pass,double ave[],double

f[],STUDENT stu[],int sum);

void show_data(STUDENT stu[],int sum,int grade[],int max,int min,double pass,double ave[],double f[]);//输入所有学生的序号、平时成绩

//期末成绩和总评成绩函数说明

//显示期末考试成绩的及格率、最高分、最低分以及平时、期末和总评成绩的

//主函数

int main() //平均分和标准差函数说明

{

int sum,max,min; //数据定义

double pass=0;

int grade[11]={0};

STUDENT stu[SIZE];

double ave[SIZE],f[SIZE];

printf("\n\n\t\t\t\t\t\t欢迎使用学生试卷管理系统!\a\n\n");

sum=accept_data(stu,grade); //输入数据(sum为总人数)

count(&max,&min,&pass,ave,f,stu,sum);//计算期末考试成绩的及格率最高分、最低分

//以及平时、期末和总评成绩的平均分和标准差

show_data(stu,sum,grade,max,min,pass,ave,f);

//输入所有学生的序号、平时成绩、期末成绩和总评成绩

//显示期末考试成绩的最高分、最低分以及平时、期末和总评成绩的平均分和标准差

return 0;

}

//输入模块

int accept_data(STUDENT stu[],int grade[])

{int i=0,sum=0,temp,a1,a2;

FLAG flag;

printf("\n 请输入计算总成绩时使用平时成绩与期末成绩的比例,用整数表示(百分比例如:30 70):");

scanf("%d%d",&a1,&a2); //接收计算总评成绩的比例

while(i

{

printf("\n 请输入学号(输入-1可停止输入):");

scanf("%d",&stu[i].number); //输入学号

if (stu[i].number==-1) //序号时-1则跳出循环

{sum=i; //sum记录的是输入的人数

break;

}

printf("\n 请输入学生的平时成绩和期末成绩(百分制分数):");

flag=True;

while(flag==True) //重复读入两个成绩,读到正确的为止

{scanf("%d%d",&stu[i].score[0],&stu[i].score[1]);

if(stu[i].score[0]<=100&& stu[i].score[0]>=0&&\

stu[i].score[1]<=100&& stu[i].score[1]>=0)

flag=False; //输入的两个成绩合理

else

printf("\n\007 错误数据!请再次输入学生的平时成绩和期末成绩(百分制分数输入格式如:98 99):");

//输入的两个成绩不合理

}

temp=(int)(1.0*a1/100*stu[i].score[0]+1.0*a2/100 *

stu[i].score[1]);

//计算总评成绩

stu[i].score[2]=temp; //总评成绩存入数组

temp=(stu[i].score[1])/10; //计算分数段

if(temp==10) //分数段存入数组

grade[10]++; //100分存入数组元素grade[10]

else

grade[temp+1]++; //90~99分存入数组元素

grade[9]

//80~89分存入数组元素grade[8]

//70~79分存入数组元素grade[7],以此类推

i++;

}

return sum; //返回人数

}

//计算模块

void count(int* max,int* min,double* pass,double ave[],double

f[],STUDENT stu[],int sum)

{int i,j,p_sum=0;

int total[3];

double temp;

*max=*min=stu[0].score[1]; //设卷面成绩的最高分、最低分初值

if(stu[0].score[1]>=60)

p_sum++;

for(i=1;i

{if((stu[i].score[1])>*max) //若高于最高分,将其覆盖*max=stu[i].score[1];

if((stu[i].score[1])<*min) //若低于最低分,将其覆盖

*min=stu[i].score[1];

if((stu[i].score[i])>=60)

p_sum++; //计算及格的人数

}

*pass=(1.0*p_sum/sum)*100; //计算及格率

for(i=0;i<=2;i++) //平时、期末、总评的初值设置为0

total[i]=0;

for(j=0;j<3;j++) //求平时、期末、总评3个总分for(i=0;i

{

total[j]=total[j]+stu[i].score[j];

}

for(j=0;j<3;j++) //求平时、期末、总评3个平均分

{

ave[j]=total[j]/sum;

}

for(j=0;j<3;j++) //求平均、期末、总评标准差{

f[j]=0; //标准差初值设置为0

for(i=0;i

{

temp=stu[i].score[j]-ave[j];

f[j]=f[j]+temp*temp;

}

f[j]=sqrt(fabs(f[j])/sum);

}

}

//输出模块

void show_data(STUDENT stu[],int sum,int grade[],int max,int min,double pass,double ave[],double f[])

{

int i,j;

printf("\n\n\n----------------------------------------------------------------------------------------------------------------------\n\n\n ");

printf("\n\t\t\t\t\t学号平时成绩期末考试总评成绩\n"); //输出各成绩

for(i=0;i

{

printf("\t\t\t\t\t %4d ",stu[i].number);

for(j=0;j<3;j++)

printf("\t%4d ",stu[i].score[j]);

printf("\t\n");

}

{

char str1[3][20]={"\t\t\t\t平时成绩平均分","\t\t\t\t期末成绩平均分","\t\t\t\t总评成绩平均分"};

char str2[3][20]={"\t平时成绩标准差","\t期末成绩标准差","\t总评成绩标准差"};

printf("\n\n\n----------------------------------------------------------------------------------------------------------------------\n\n\n ");

printf("\n\t\t\t\t及格率=%6.2f%%\t最高分=%d\t最低分

=%d\n",pass,max,min);

//输出3次分别输出平时、期末、总评的平均分和标准差

for(j=0;j<3;j++)

printf("\n %s=%6.2f %s=%6.2f\n",str1[j],ave[j],str2[j],f[j]);

printf("\n\n\n-------------------------------------------------------

---------------------------------------------------------------");

printf("\n\n\n\t\t\t\t\t期末成绩中的各分数段为:\n\n"); //输出各分数段

printf("\t\t\t\t\t60分以下:%d个

\n\n",grade[0]+grade[1]+grade[2]+grade[3]+grade[4]+grade[5]+grade[6]) ;

printf("\t\t\t\t\t60-69分段:%d个\n\n",grade[7]);

printf("\t\t\t\t\t70-79分段:%d个\n\n",grade[8]);

printf("\t\t\t\t\t80-89分段:%d个\n\n",grade[9]);

printf("\t\t\t\t\t90-99分段:%d个\n\n",grade[10]);

printf("\t\t\t\t\t100分:%d个\n\n",grade[11]);

}

}

4.调试分析

初始程序UI界面说明少,用户可能不会用。

经过调试,添加了输入说明,输出界面更加简洁明了。

5.测试结果

以下为程序运行过程及结果如下图

相关主题