案例7-1 模拟EXCEL排序 (25 分)(根据结构体某一元素排序)

Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。

输入格式:
输入的第一行包含两个正整数N(≤10​5​​ ) 和C,其中N是纪录的条数,C是指定排序的列号。之后有 N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩([0, 100]内的整数)组成,相邻属性用1个空格隔开。

输出格式:
在N行中输出按要求排序后的结果,即:当C=1时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当C=3时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
在这里插入图片描述
在这里插入图片描述
题目思路:

1.这是一道常规的根据结构体某个元素排序需要用到sort函数。
2.注意到题目中说,如果姓名或者分数相同时,按照学号排序,这一点在定义cmp函数的时候需要体现出来。
3.题目中说姓名是不超过8个字符的字符串,实际上姓名数组只开到8是不够的(在这一点耗了挺久,后来我改成18就对了)。
4.最终输出的时候学号前面的0000的输出可能有的人会不懂怎么输出,需要用到printf("%.6d", num), 这里的%.6d意味着“最多输出6位,不够的用0补全
”。
5.关于字典序的输出需要使用到strcmp()函数,因为这个函数比较的原则就是按照字典序进行比较。
补充:字典序
对于两个字符串str1, str2, 存在正整数k,满足str[0, 1, 2, … k - 1] = str[0,1,2,…,k-1], 且str1[k] < str2[k] 则我们称str1的字典序小于str2的字典序。
例子: “aaa” 的字典序 小于"aab"的字典序。(如果还不明白随时call我也可以)
6.需要注意的点应该就这么多,希望这篇文章能帮到你。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

struct Excel {
    
    
	int id;
	char name[8];
	int score;
};
bool cmp1(Excel a, Excel b)
{
    
     
	return a.id < b.id; 
};
bool cmp2(Excel a, Excel b)
{
    
     
	if (strcmp(a.name, b.name) == 0)
		return a.id < b.id;
	else 
		return strcmp(a.name, b.name) < 0; 
};
bool cmp3(Excel a, Excel b) 
{
    
     
	if (a.score == b.score)
		return a.id < b.id;
	else
		return a.score < b.score; 
};
int main()
{
    
    
	int n, m;
	cin >> n >> m;
	Excel excel[1000];

	for (int i = 0; i < n; i++)
		 cin >> excel[i].id >> excel[i].name >> excel[i].score;

	if (m == 1)
		sort(excel, excel + n, cmp1);
	else if (m == 2)
		sort(excel, excel + n, cmp2);
	else if (m == 3)
		sort(excel, excel + n, cmp3);
	for (int i = 0; i < n; i++)
		printf("%.6d %s %d\n", excel[i].id, excel[i].name, excel[i].score);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/xdg15294969271/article/details/113975039