学生试卷分数统计


前言

学习完c语言参考教材写了个程序,教师可以根据考试分数分布情况画出直方图。使用模块化程序,分解为几个函数,函数的功能和调用关系如下
在这里插入图片描述

一程序代码如下

#include"stdio.h"
#include"string.h"
#include"conio.h"
#include"math.h"
#define SIZE 300
typedef struct student
{int number;
 int score[3];
 }STUDENT;
 typedef enum boolen
 {False,True
  }FLAG;
  int accept_data(STUDENT stu[],int grade[]);
  void show_data(STUDENT stu[],int sum,int grade[]);
  void draw(int grade[]);
  void count(int*max,int*min,double *pass,double ave[],double f[],STUDENT stu[],int sum);
  void show_data2(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];
   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);
   return 0;
   }

   int accept_data(STUDENT stu[],int grade[])
   {int i=0,sum=0,temp,a1,a2;
    FLAG flag;
    printf("\n请输入计算总评成绩时使用平时成绩与期末成绩的比例,用整数表示");
    scanf("%d%d",&a1,&a2);
    while(i<SIZE)
    {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;
       else
        printf("\n\007错误数据!请再次输入学生的平时成绩和期末成绩:");
       }
       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]++;
       else
          grade[temp+1]++;
          i++;
     }
     return sum;
    }

    void show_data(STUDENT stu[],int sum,int grade[])
    {int i,j;
     for(i=0;i<sum;i++)
     {printf("%4d",stu[i].number);
     for(j=0;j<3;j++)
     printf("%4d",stu[i].score[j]);
     printf("\n");
      }
      for(i=1;i<10;i++)
      printf(" %d",grade[i]);
     }
     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<sum;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)
         p_sum++;
      }
      *pass=(1.0*p_sum/sum)*100;
      for(i=0;i<=2;i++)
        total[i]=0;
      for(j=0;j<3;j++)
         for(i=0;i<sum;i++)
         {total[j]=total[j]+stu[i].score[j];
          }
      for(j=0;j<3;j++)
         {ave[j]=total[j]/sum;
          }
      for(j=0;j<3;j++)
         {f[j]=0;
          for(i=0;i<sum;i++)
             {temp=stu[i].score[j]-ave[j];
             f[j]=f[j]+temp*temp;
          }
          f[j]=sqrt(fabs(f[j])/sum);
        }
  }

  void show_data2(int max,int min,double pass,double ave[],double f[])
  {int j;
   char str1[3][20]={"平时成绩平均分","期末成绩平均分","总评成绩平均分"};
   char str2[3][20]={"平时成绩标准差","期末成绩标准差","总评成绩标准差"};
   printf("\n及格率=%6.2f%% 最高分=%d 最低分=%d\n",pass, max,min);
   for(j=0;j<3;j++)
      printf("\n %s=6.2f %s=%6.2f\n",str1[j],ave[j],str2[j],f[j]);
    }

  void draw(int grade[])
  {int i,j,max,k,temp,x;
   char screen[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)(20.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++)
       screen[21][i]='-';
    screen[21][41]='X';
    screen[0][0]='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)
        for(i=1;i<=temp;i++)
        {for(j=1;j<=4;j++)
         {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]);
        else
           printf(" ");
        printf("\n");
    }
    printf("0 10 20 30 40 50 60 70 80 90 100\n");
    getch();
   }

运行结果如下
在这里插入图片描述

总结

感觉不是很完美,但是还是很开心。看到错误地方求大佬指正,谢谢。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值