解题思路:

    

    首先通过结构体来存储这些数据

struct student{
	char name[200];
	int age;
	int score;
}stu[1005];


        之后再依次进行排序,我这里选用的是冒泡排序,这样才更容易组合


冒泡排序(Bubble Sort),是一种较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

20190816163307192.gif

// 冒泡排序<参考代码>
void BubbleSort(int arr[], int length)
{
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < length -  i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp;
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
			//位置1
		}
	}
}
//这样子就是从小到大的冒泡排序

知道这些后,就解这道题的时候,就只需要在冒泡排序的位置1处加上题目的额外要求就可以了



注意事项:


    这道题的比较名字可以用strcmp函数来进行比较

原型:int strcmp(const char *s1, const char *s2);
头文件:#include <string.h>

功能:用来比较两个字符串

参数:s1、s2为两个进行比较的字符串

返回值:若s1、s2字符串相等,则返回零;若s1大于s2,则返回大于零的数;否则,则返回小于零的数。

说明:strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字
符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。




    本题的排序规律:

            1、成绩低的在上面

            2、成绩相同时,名字小的在上面(用strcmp比较)

            3、名字也相同时,年龄小的在上面



参考代码:

#include <stdio.h>
#include <string.h>
 struct student{
	char name[200];
	int age;
	int score;
}stu[1005];

int main()
{
	int n;
	struct student t;
	while(~scanf("%d", &n))
	{
	for (int i = 0; i < n; i++)
		scanf("%s%d%d", stu[i].name, &stu[i].age, &stu[i].score);
	for (int i = 0; i < n - 1; i++)
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (stu[j].score > stu[j + 1].score)
			{
				t = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = t;
			}
			else if (stu[j].score == stu[j + 1].score)
			{
				if (strcmp(stu[j].name,stu[j + 1].name) > 0)
				{
					t = stu[j];
					stu[j] = stu[j + 1];
					stu[j + 1] = t;
				}
				else if (strcmp(stu[j].name,stu[j+1].name) == 0)
				{
					if (stu[j].age > stu[j + 1].age)
					{
						t = stu[j];
						stu[j] = stu[j + 1];
						stu[j + 1] = t;
					}
				}
			}
		}
	for (int i = 0; i < n; i++)
		printf("%s %d %d\n", stu[i].name, stu[i].age, stu[i].score);
	}
	return 0;
}


点赞(0)
 

0.0分

31 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 13 条评论

crj 9月前 回复TA
@陆离 多组输入呗
童蒙 1年前 回复TA
@rxZhou 可以,但是冒泡排序不需要
未央 1年前 回复TA
真的牛
dotcpp0631211 2年前 回复TA
@rxZhou 数组的定义是1到n,但是数组的下标是0到n-1
陆离 2年前 回复TA
为什么所有的语句都在while里面啊,不懂
rxZhou 2年前 回复TA
为什么是用n-1,n不行吗
渴望学到知识的菜鸟 2年前 回复TA
@1024 不会的,因为n改变了,并且都重新赋值过了,所以没有影响
1024 2年前 回复TA
上一组的输入不会影响这一组的结果吗?
KK 2年前 回复TA
@KK while(~scanf("%d", &n))就是当没有输入的时候退出循环  和while(scanf("%d",&n)!=EOF)一个意思
JCW 2年前 回复TA
@KK 第13行怎么理解啊