输入n个学生的姓名及其3门功课成绩(整数),要求根据3门功课的平均成绩从高分到低分输出每个学生的姓名、3门功课成绩及平均成绩,若平均分相同则按姓名的字典序输出。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据首先输入一个正整数n(1<n<100),表示学生人数;然后是n行信息,分别表示学生的姓名(长度不超过10且由英文字母构成的字符串)和3门课成绩(正整数)。
输出格式:
对于每组测试,输出排序后的学生信息,每行一个学生信息:姓名、3门课成绩、平均成绩(保留2位小数)。每行数据之间留一个空格。
输入样例:
3
zhangsan 80 75 65
lisi 65 52 56
wangwu 87 86 95
输出样例:
wangwu 87 86 95 89.33
zhangsan 80 75 65 73.33
lisi 65 52 56 57.67
C语言代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
char name[10];
int k1;
int k2;
int k3;
double* pgf;
}graf;
int main()
{
int n, i, j;
double gf[10] = { 0 }, sum[10] = { 0 };
scanf("%d", &n);
graf* p = (graf*)malloc(n * sizeof(graf));
for (i = 0; i < n; i++)//初始化结构体
{
scanf("%s%d%d%d", p[i].name, &p[i].k1, &p[i].k2, &p[i].k3);
p[i].pgf = NULL;
}
for (i = 0; i < n; i++)//算和,将整型转化为浮点型
{
sum[i] = p[i].k1 + p[i].k2 + p[i].k3;
}
for (i = 0; i < n; i++)//算平均数,并且把地址给结构体
{
gf[i] = sum[i] / 3;
p[i].pgf = &gf[i];
}
graf* px[10] = { NULL };
for (i = 0; i < n; i++)//储存每一个结构体数据的首地址
{
px[i] = &p[i];
}
for (i = 1; i < n; i++)//判断平均数是否相等
{
if (*(px[i]->pgf) != *(px[0]->pgf))
break;
}
graf* pz;//创建一个中间量
if (i == n)//相等则按照姓名的字典顺序排序
{
for (i = 0; i < n; i++)//冒泡排序
{
for (j = i + 1; j < n; j++)
{
if (*(px[j]->name)< *(px[i]->name))//按名字排
{
pz = px[j];
px[j] = px[i];
px[i] = pz;
}
}
}
}
else//不相等则按照分数从高到低排序
{
for (i = 0; i < n; i++)//冒泡排序
{
for (j = i + 1; j < n; j++)
{
if (gf[j] > gf[i])//按分数排
{
pz = px[j];
px[j] = px[i];
px[i] = pz;
}
}
}
}
for (i = 0; i < n; i++)//输出结果
{
printf("%s %d %d %d %.2lf\n", px[i]->name, px[i]->k1, px[i]->k2, px[i]->k3, *(px[i]->pgf));
}
}