在不知道学生人数和每个学生课程数量的情况下对学生的平均成绩排序
题目要求是对学生平均成绩进行排序,降序。如果分数相同则按输入的前后顺序输出
输入描述:
wu 90 78 66
wang 78 56
li 99
xiaoming 67 89 56 90
输出描述:
li 99
wu 78
xiaoming 76
wang 67
解题思路:定义一个Stu类来存放学生的姓名和平均分数,然后用sort函数对学生的平均分数进行排序,这题只要的难点是判断学生分数的输入结束(因为我们事先并不知道学生到底选了几科课程)解决方法是先读取一行再用stringstream分出姓名和分数,应为stringstream有类型转换所以即使姓名是string分数是int也是没影响的。
#include <iostream> #include <sstream> #include <vector> #include <algorithm> using namespace std; typedef struct { string name; int ave; }Stu; vector<Stu> vec; int cmp(const Stu& lhs, const Stu& rhs) { return lhs.ave > rhs.ave; } int main() { string line; stringstream ss; while (getline(cin, line) && line != "") { Stu s; int cnt = 0; double sum = 0.0; double score; ss.clear(); ss << line; //cout << ss << endl; ss >> s.name; //cout << s.name << endl; while (ss >> score) { sum += score; cnt++; } s.ave = (int)(sum / (double)cnt + 0.5);//这里+0.5的意思是如果4舍5入 //cout << s.ave << endl; vec.push_back(s); } sort(vec.begin(), vec.end(),cmp); for (int i = 0; i < vec.size(); ++i) { cout << vec[i].name << " " << vec[i].ave << endl; } return 0; }
输出结果截图:
解释:ctrl+z是结束输入