7-6 成绩排序

输入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));
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值