广州航海学院课程(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.测试结果 以下为程序运行过程及结果如下图