结构体应用-统计学生成绩
设计一个程序,统计一个班(最多有35人)的学生成绩,要求能实现如四个功能:
(1)由键盘输入每个学生的学号和四门课程的成绩。
(2)计算每个学生的平均分和总分。
(3)按总分从高到低排出名次,并按名次输出每个学生的情况,包括:学号、各科成绩、平均分和总分。
(4)根据用户要求输出某门课程(由键盘输入课程号)成绩在90分以上(含90分)且总分在前五名的学生情况,包括:学号、各科成绩、平均分和总分。
具体要求如下:
(1)每个功能为一个独立的函数。
(2)所有的输入之前都要有提示。
方法说明:
首先,在主函数中定义以下几个数组:
num[35] 整型一维数组,依次(按输入的顺序)存放学生的学号。
a[35][6] 实型二维数组,其中的每一行依次(按输入的顺序)存放一个学生的四门课程(课程号分别为1,2,3,4)的成绩、平均分与总分。
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();
}
#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();
}