题目描述
定义一个结构体 Student,包含以下成员:
string name(姓名)int chinese(语文成绩)int math(数学成绩)int total(总分,在输入后自动计算)
在结构体内部,重载 < 运算符,使得两个 Student 对象可以按以下规则比较(升序,即“小”的排在前面):
- 总分低的 更小(即按总分升序排列)。
- 如果总分相同,语文成绩低的 更小。
- 如果语文成绩也相同,姓名字典序小的 更小(即按
name < other.name)。
输入 n 个学生的信息,将它们存入结构体数组,然后使用 sort 对数组进行排序(因为重载了 <,可以直接写 sort(stu, stu + n)),最后按顺序输出每个学生的姓名、语文、数学、总分。
输入
第一行一个整数 n(1 ≤ n ≤ 1000)。
接下来 n 行,每行一个学生的姓名(不含空格,长度≤20)、语文成绩、数学成绩,用空格隔开。
成绩均为 0 到 100 之间的整数。
输出
共 n 行,每行格式为:姓名 语文 数学 总分,中间用空格隔开。
输出顺序必须按题目定义的“升序”规则(总分低→高,同分语文低→高,同语文姓名小→大)。
样例输入
4
Alice 90 80
Bob 85 85
Charlie 90 85
David 85 90
样例输出
Bob 85 85 170
Alice 90 80 170
David 85 90 175
Charlie 90 85 175
解释:
- 先按总分升序:170(Bob, Alice),175(David, Charlie)。
- 总分170中,语文85(Bob) < 语文90(Alice),所以 Bob 在 Alice 前。
- 总分175中,语文85(David) < 语文90(Charlie),所以 David 在 Charlie 前。
要求:
- 必须定义
struct Student,并在结构体中包含total成员,用于存储总分。 - 必须在结构体内部重载
<运算符,形式为:bool operator<(const Student &other) const { // 比较规则 } - 必须使用
#include <algorithm>中的sort函数,且调用时只传入首尾指针(不需要第三个参数),因为结构体已定义<。 - 不能在结构体外定义额外的比较函数。
提示:
- 重载
<运算符的语法固定,记得加const修饰成员函数和参数。 - 比较规则中,需要先判断总分,再判断语文,最后判断姓名。
- 由于
total是成员,可以在输入后立即计算:total = chinese + math;。 - 调用
sort(stu, stu + n);即可,编译器会使用我们定义好的<进行比较。
写法拓展
结构体内部 + friend 重载 < 运算符写法
friend bool operator<(const Student &s1, const Student &s2) {
// 比较规则不变
if (s1.total != s2.total)
return s1.total < s2.total;
if (s1.chinese != s2.chinese)
return s1.chinese < s2.chinese;
return s1.name < s2.name;
}
提示:
- friend 写法里,
const可以不加,代码正常运行。 - 只有成员函数重载的末尾 const 是必须的,友元函数这里不是必须。