//对学生的成绩管理。
//1.录入学生信息(学号,姓名,三门成绩)。
//2.计算每个学生3门成绩的平均值。
//3.按照平均值对学生进行升序排序。
//4.输出排好序的学生信息。
#include<stdio.h>
#define N 20
struct student{
int id;
char name[20];
int score[3];
double aver;
};
void Input(struct student st[],int n){ //从键盘录入n个学生信息
int i,j;
for(i=0;i<n;i++){
printf("请输入第%d个学生的信息:",i+1);
scanf("%d",&st[i].id);
scanf("%s",&st[i].name);
for(j=0;j<3;j++){
scanf("%d",&st[i].score[j]);
}
}
}
void Aver(struct student st[],int n){ //计算该n个学生的平均成绩
int i,j;
for(i=0;i<n;i++){
int s=0;
printf("%d号学生的平均成绩为:",st[i].id);
for(j=0;j<3;j++){ //同一个学生的3个成绩
s=s+st[i].score[j];
}
st[i].aver=s/3.0; //3.0是为了不丢失数据精度
printf("%.2lf",st[i].aver);
printf("\n");
}
}
/*简单交换法排序
根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置
换交排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动
不稳定
*/
void Sort(struct student st[],int n){
int i,j,x;
struct student t;
for(i=0;i<n-1;i++){ //n个数进行n-1轮比较
for(j=i+1;j<n;j++){ //下标为i的数与i后面的每一个数都需比较一次,从st[i]到st[n-1],用j作下标来移动
if(st[j].aver<st[i].aver){ //如果后面有比st[i]小的数,则与st[i]交换
t=st[i];
st[i]=st[j];
st[j]=t;
}
}
}
}
void Output(struct student st[],int n){ //输出学生信息
int i,j;
for(i=0;i<n;i++){
printf("%-4d",st[i].id);
printf("%s",st[i].name);
for(j=0;j<3;j++){
printf("%4d",st[i].score[j]);
}
printf("\t");
printf("%.2lf",st[i].aver);
printf("\n");
}
}
int main(){
int m;
struct student st[N];
printf("请输入学生人数:");
scanf("%d",&m);
printf("请输入所有学生的信息:\n");
Input(st,m);
printf("\n");
printf("学生的平均成绩为:\n");
Aver(st,m);
printf("\n");
Sort(st,m);
printf("输出按平均成绩排序后学生的信息:\n");
printf("id name s1 s2 s3 aver\n"); //打印表头
Output(st,m);
printf("\n");
}
控制台打印信息如图: