[sort排序] 8. 成绩排序(自定义排序、宏定义、常规解法)

1. 题目来源

链接:成绩排序

2. 题目说明

在这里插入图片描述

3. 题目解析

方法一:sort()+自定义排序+常规解法

题意很明确,按照各科进行排序并输出对应的人名,最后按照总分排序输出人名即可。也是练习练习自定义排序和结构题吧。值得注意的是分数相同人名按照字典序进行输出。重复代码很多。

参见代码如下:

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

struct student {
    int a, b, c, d, sum;
    string name;
};

bool cmp1(student a, student b) {
    if (a.a == b.a) {
        return a.name < b.name;
    }
    return a.a > b.a;
}

bool cmp2(student a, student b) {
    if (a.b == b.b) {
        return a.name < b.name;
    }
    return a.b > b.b;
}

bool cmp3(student a, student b) {
    if (a.c == b.c) {
        return a.name < b.name;
    }
    return a.c > b.c;
}

bool cmp4(student a, student b) {
    if (a.d == b.d) {
        return a.name < b.name;
    }
    return a.d > b.d;
}

bool cmp5(student a, student b) {
    if (a.sum == b.sum) {
        return a.name < b.name;
    }
    return a.sum > b.sum;
}

int main() {
    int n;
    student s[105];
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> s[i].name >> s[i].a >> s[i].b >> s[i].c >> s[i].d;
        s[i].sum = s[i].a + s[i].b + s[i].c + s[i].d;
    }
    sort(s, s + n, cmp1);
    for (int i = 0; i < 4; i++) {
        if (i) {
        	cout << " ";
        }
        cout << s[i].name;
    }
    cout << endl;
    sort(s, s + n, cmp2);
    for (int i = 0; i < 4; i++) {
        if (i) {
        	cout << " ";
        }
        cout << s[i].name;
    }
    cout << endl;
    sort(s, s + n, cmp3);
    for (int i = 0; i < 4; i++) {
        if (i) {
		   	  cout << " ";
        }
        cout << s[i].name;
    }
    cout << endl;
    sort(s, s + n, cmp4);
    for (int i = 0; i < 4; i++) {
        if (i) {
			   cout << " ";
        }
        cout << s[i].name;
    }
    cout << endl;
    sort(s, s + n, cmp5);
    for (int i = 0; i < 4; i++) {
        if (i) {
        	cout << " ";
        }
        cout << s[i].name;
    }
    cout << endl;
    return 0;
}

方法二:sort()+宏定义+自定义排序+巧妙解法

宏定义真的是千变万化,有点东西。看看就好吧~

参见代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
using namespace std;

struct Student {
    string name;
    int score[4];
    int total_score;
    void read() {
        cin >> name;
        for (int i = 0; i < 4; i++) {
            cin >> score[i];
            total_score += score[i];
        }
        return ;
    }
};

#define MAX_N 100
#define cmp(x, y) bool cmp##x(Student &s1, Student &s2) { \
    if (s1.y > s2.y) return true; \
    if (s1.y == s2.y && s1.name < s2.name) return true; \
    return false; \
}

Student stu[MAX_N];

cmp(0, score[0]);
cmp(1, score[1]);
cmp(2, score[2]);
cmp(3, score[3]);
cmp(total, total_score);

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        stu[i].read();
    }
    sort(stu, stu + n, cmp0);
    for (int i = 0; i < 4; i++) {
        if (i) cout << " ";
        cout << stu[i].name;
    }
    cout << endl;
    sort(stu, stu + n, cmp1);
    for (int i = 0; i < 4; i++) {
        if (i) cout << " ";
        cout << stu[i].name;
    }
    cout << endl;
    sort(stu, stu + n, cmp2);
    for (int i = 0; i < 4; i++) {
        if (i) cout << " ";
        cout << stu[i].name;
    }
    cout << endl;
    sort(stu, stu + n, cmp3);
    for (int i = 0; i < 4; i++) {
        if (i) cout << " ";
        cout << stu[i].name;
    }
    cout << endl;
    sort(stu, stu + n, cmptotal);
    for (int i = 0; i < 4; i++) {
        if (i) cout << " ";
        cout << stu[i].name;
    }
    cout << endl;
    return 0;
}
发布了391 篇原创文章 · 获赞 329 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/yl_puyu/article/details/105002840