对于n个学生m门课程的成绩,按平均成绩从大到小输出学生的学号(不处理那些有功课不及格的学生),对于平均成绩相同的情况,学号小的排在前面。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组数据首先输入2个正整数n,m(1≤n≤50,1≤m≤5),表示有n个学生和m门课程,然后是n行m列的整数,依次表示学号从1到n的学生的m门课程的成绩。 输出格式: 对于每组测试,在一行内按平均成绩从大到小输出没有不及格课程的学生学号(每两个学号之间留一空格)。若无满足条件的学生,则输出“NULL”(引号不必输出)。用c++做
时间: 2024-03-20 07:45:33 浏览: 199
以下是C++代码实现:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Student {
int id;
double average;
bool operator<(const Student& other) const {
if (average == other.average) {
return id < other.id;
}
return average > other.average;
}
};
int main() {
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
vector<Student> students;
for (int i = 0; i < n; i++) {
int id;
double sum = 0;
bool hasFailed = false;
for (int j = 0; j < m; j++) {
int score;
cin >> score;
if (score < 60) {
hasFailed = true;
}
sum += score;
}
if (!hasFailed) {
Student student;
student.id = i + 1;
student.average = sum / m;
students.push_back(student);
}
}
if (students.empty()) {
cout << "NULL" << endl;
} else {
sort(students.begin(), students.end());
for (int i = 0; i < students.size(); i++) {
cout << students[i].id << " ";
}
cout << endl;
}
}
return 0;
}
```
解释一下代码思路:
首先输入测试数据的组数 T,然后循环 T 次,每次输入学生数量 n 和课程数量 m,接着循环 n 次,每次输入每个学生的 m 门课程成绩,并计算平均成绩。如果该学生没有不及格的课程(即所有成绩都大于等于 60 分),就将该学生的学号和平均成绩存入一个结构体中,再存入一个 vector 中。
最后,如果 vector 为空,说明没有满足条件的学生,输出 "NULL";否则,按照平均成绩从大到小排序,输出每个学生的学号即可。在排序时,如果平均成绩相同,按照学号从小到大排序。
阅读全文