您好,欢迎访问三七文档
#includestdio.h#includestring.h//字符串处理#includeconio.h//控制台输入输出#includemath.h//定义数学函数#defineSIZE300typedefstructstudent//加typedef的作用给结构体structstudent取的别名STUDENT{intnumber;//学号intscore[3];//期末平时总评}STUDENT;typedefenumboolen//枚举定义{False,True}FLAG;intaccept_data(STUDENTstu[],intgrade[]);//输入数据函数声明voidshow_data(STUDENTstu[],intsum,intgrade[]);//输出所有学生的序号,品势成绩,//期末成绩和总评成绩函数说明voiddraw(intgrade[]);//画直方图函数声明voidcount(int*max,int*min,double*pass,doubleave[],doublef[],STUDENTstu[],intsum);voidshow_data2(intmax,intmin,doublepass,doubleave[],doublef[]);//显示期末考试的及格率最高分最低分以及平时期末和总评成绩的平均分和标准差函数说明intmain(){intsum,max,min;doublepass=0;intgrade[11]={0};STUDENTstu[SIZE];doubleave[SIZE],f[SIZE];sum=accept_data(stu,grade);//函数返回人数录入学生成绩及各分数段人数show_data(stu,sum,grade);//输出所有学生数据draw(grade);//输出模拟直方图count(&max,&min,&pass,ave,f,stu,sum);//最高分最低分及格率平均分标准差结构体人数show_data2(max,min,pass,ave,f);//输出标准差等等return0;}/*接收学生数据*/intaccept_data(STUDENTstu[],intgrade[]){inti=0,sum=0,temp,a1,a2;FLAGflag;printf(\n请输入计算总评成绩时使用平时成绩与期末成绩的比例,用整数表示:);scanf(%d%d,&a1,&a2);//平时成绩期末成绩比例while(iSIZE){printf(\n请输入学号:);//录入学号scanf(%d,&stu[i].number);if(stu[i].number==-1){sum=i;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;elseprintf(\n\007数据错误!请再次输入学生的平时成绩和期末成绩:);//\007的作用貌似使电脑蜂鸣器发声}temp=(int)(1.0*a1/100*stu[i].score[0]+1.0*a2/100*stu[i].score[1]);//计算总评成绩并强制转换//temp=(int)(1.0*a1/100*100+1.0*a2/100*100);//计算总评成绩并强制转换stu[i].score[2]=temp;//将总评成绩存入结构体数组第三个元素temp=(stu[i].score[1])/10;//各个分数段人数if(temp==10)grade[10]++;elsegrade[temp+1]++;//对应的加一i++;}returnsum;//返回人数}/*传入结构体数组人数各个分数段人数*/voidshow_data(STUDENTstu[],intsum,intgrade[]){inti,j;for(i=0;isum;i++)//输出学号{printf(%4d,stu[i].number);for(j=0;j3;j++)//输出对应学号的成绩printf(%4d,stu[i].score[j]);printf(\n);}for(i=1;i=10;i++)//输出各个分数段人数printf(%d,grade[i]);}/*最高分最低分及格率平均分标准差结构体人数*/voidcount(int*max,int*min,double*pass,doubleave[],doublef[],STUDENTstu[],intsum){inti,j,p_sum=0;inttotal[3];doubletemp;*max=*min=stu[0].score[1];//设卷面成绩最高分最低分初值if(stu[0].score[1]=60)//第一个人的卷面成绩是否大于60p_sum++;for(i=1;isum;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[1]=60)//大于60的及格人数加一p_sum++;}*pass=(1.0*p_sum/sum)*100;//计算及格率for(i=0;i=2;i++)//平时期末总评初值设为0total[i]=0;for(j=0;j3;j++)//求平时期末总评3个总分for(i=0;isum;i++){total[j]=total[j]+stu[i].score[j];}for(j=0;j3;j++)//求平时期末总评3个平均分{ave[j]=total[j]/sum;}for(j=0;j3;j++)//计算平时期末总评标准差{f[j]=0;//标准差清零for(i=0;isum;i++)//计算标准差公式见谭浩强4版学习辅导209页{temp=stu[i].score[j]-ave[j];f[j]=f[j]+temp*temp;}f[j]=sqrt(fabs(f[j])/sum);//得出标准差}}/*输出平时成绩平均分期末成绩平均分总评成绩平均分*//*输出平时成绩标准差期末成绩标准差总评成绩标准差*/voidshow_data2(intmax,intmin,doublepass,doubleave[],doublef[]){intj;charstr1[3][20]={平时成绩平均分,期末成绩平均分,总评成绩平均分};charstr2[3][20]={平时成绩标准差,期末成绩标准差,总评成绩标准差};printf(\n及格率=%6.2f%%最高分=%d最低分=%d\n,pass,max,min);for(j=0;j3;j++)printf(\n%s=%6.2f%s=%6.2f\n,str1[j],ave[j],str2[j],f[j]);}/*输出模拟直方图*/voiddraw(intgrade[]){inti,j,max,k,temp,x;charscreen[22][44];//定义一个字符型数组printf(\n模拟直方图\n);max=0;for(i=1;i=10;i++)if(grade[i]max)max=grade[i];//找出人数最多的分数段for(i=1;i=10;i++){grade[i]=(int)(10.0*grade[i]/max+0.5);//计算显示时输出的*号个数}for(i=0;i=21;i++)//将输出点清零for(j=0;j=41;j++)screen[i][j]=0;for(i=0;i=41;i++)//画X轴screen[21][i]='-';screen[21][41]='X';screen[0][0]='Y';//画Y轴for(i=1;i=21;i++)screen[i][0]='|';k=1;for(x=1;x=10;x++,k=k+4)//将符合条件的点赋值为*号{temp=grade[x];//取分数的值if(temp!=0)//分数不为0赋值为*号for(i=1;i=temp;i++){for(j=1;j=4;j++)//每行对应4个*号{screen[20-i+1][j+k]='*';}}}for(i=0;i=21;i++)//以下打印模拟直方图{for(j=0;j=41;j++)if(screen[i][j]!=0)printf(%c,screen[i][j]);elseprintf();printf(\n);}printf(0102030405060708090100\n);getch();//按任意键进行下一步}
本文标题:学生试卷分数统计
链接地址:https://www.777doc.com/doc-4372065 .html