结构体应用-统计学生成绩

 

    设计一个程序,统计一个班(最多有35)的学生成绩,要求能实现如四个功能:

 (1)由键盘输入每个学生的学号和四门课程的成绩。

 (2)计算每个学生的平均分和总分。

 (3)按总分从高到低排出名次,并按名次输出每个学生的情况,包括:学号、各科成绩、平均分和总分。

 (4)根据用户要求输出某门课程(由键盘输入课程号)成绩在90分以上(90)且总分在前五名的学生情况,包括:学号、各科成绩、平均分和总分。

 具体要求如下:

 (1)每个功能为一个独立的函数。

 (2)所有的输入之前都要有提示。

 方法说明:

 首先,在主函数中定义以下几个数组:

 num[35]   整型一维数组,依次(按输入的顺序)存放学生的学号。

 a[35][6]  实型二维数组,其中的每一行依次(按输入的顺序)存放一个学生的四门课程(课程号分别为1234)的成绩、平均分与总分。

 order[35] 整型一维数组,按名次存放学生情况的输入序号,即order[k]存放第k+1(C语言中数组下标是从0开始)学生情况的输入序号。

 然后依次调用四个功能函数。

#include<stdio.h>
#include
<conio.h>
#define M 35  /*调试时可将此数值该得小一些*/
#define N 6
int number=0;

void input(int num[M],float a[M][N])
{
 
int k=0,n;
 
float a0,a1,a2,a3;
 printf(
"请输入学生信息:\n");
 printf(
"学号\t课程[1]\t课程[2]\t课程[3]\t课程[4]\n");
 scanf(
"%d%f%f%f%f",&n,&a0,&a1,&a2,&a3);
 
while(n>=0 && k<35)
 
{
     number
++;
     num[k]
=n;
     a[k][
0]=a0;
     a[k][
1]=a1;
     a[k][
2]=a2;
     a[k][
3]=a3;
     k
++;
     scanf(
"%d%f%f%f%f",&n,&a0,&a1,&a2,&a3);
 }

}



void count(float a[M][N])
{
 
int k;
 
for(k=0;k<N;k++)
   
{a[k][5]=a[k][0]+a[k][1]+a[k][2]+a[k][3];
    a[k][
4]=a[k][5]/4;}

}


void sort(float a[M][N],int order[M])
{
 
int i,j,k,n,temp;
 
float d;
 
for(i=0;i<M;i++)
  order[i]
=i;
 
for(i=0;i<M;i++)
  
{
   n
=order[i];d=a[n][5];k=i;
   
for(j=i+1;j<M;j++)
   
{
         n
=order[j];
         
if(a[n][5]>d)
         
{
             d
=a[n][5];k=j;
         }

  }

  
if(k!=i)
   
{temp=order[i];order[i]=order[k];order[k]=temp;}
  }

  printf(
"学生信息排序后结果为:\n");
  printf(
"名次\t学号\t课程[1]\t课程[2]\t课程[3]\t课程[4]\t平均分\t总分\n");
  
for(i=0;i<number;i++)
  
{
        k
=order[i];
        printf(
"第%d名\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n",i+1,k+1,a[k][0],a[k][1],a[k][2],a[k][3],a[k][4],a[k][5]);
  }

}


void serch(int num[M],float a[M][N],int order[M])
{
 
int m=0,i,j,k,flag=0;
 
while(m<1 || m>4)
 
{
     printf(
"请输入课程号(1或2或3或4):");
     scanf(
"%d",&m);
 }

 printf(
"学号\t课程[1]\t课程[2]\t课程[3]\t课程[4]\t平均分\t总分\n");
 
for(i=0;i<5;i++)
 
{
  k
=order[i];
  
if(a[k][m-1]>=90)
  
{
   printf(
"%d\t",num[k]);
   flag
=1;
   
for(j=0;j<N;j++)
         printf(
"%.2f\t",a[k][j]);
   printf(
"\n");
  }

 }

 
if(flag==0)printf("无学生信息!\n");
}



void main()
{
 
int num[M]={0};
 
float a[M][N]={0};
 
int order[M];
 
char flag;
 input(num,a);
 count(a);
 sort(a,order);
 printf(
"是否需要查询?(y/n):");
 getchar();
 scanf(
"%c",&flag);
 
while(flag=='Y'||flag=='y')
 
{
     serch(num,a,order);
   printf(
"是否需要查询?(y/n):");
     getchar();
   scanf(
"%c",&flag);
 }

getch();
}

posted @ 2007-01-24 15:18  齐心  Views(2101)  Comments(1Edit  收藏  举报