P1183 结构体-结构体内重载 `<` - 学生成绩排序

暂无评定 传统题 GESP结构体排序 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

P1183结构体-结构体内重载 `<` - 学生成绩排序

暂无评定 传统题 GESP结构体排序 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

题目描述

定义一个结构体 Student,包含以下成员:

  • string name(姓名)
  • int chinese(语文成绩)
  • int math(数学成绩)
  • int total(总分,在输入后自动计算)

在结构体内部,重载 < 运算符,使得两个 Student 对象可以按以下规则比较(升序,即“小”的排在前面):

  1. 总分低的 更小(即按总分升序排列)。
  2. 如果总分相同,语文成绩低的 更小。
  3. 如果语文成绩也相同,姓名字典序小的 更小(即按 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 是必须的,友元函数这里不是必须。