成绩60分及以上的课程才予以计算绩点
绩点计算公式:[(课程成绩-50) / 10 ] * 学分
学生总绩点为所有绩点之和除以10
输入格式:
班级数
课程数 各个课程的学分
班级人数
姓名 各科成绩
输出格式:
class 班级号:
姓名(占10个字符,左对齐) 绩点
先按绩点排序,再按姓名ASCII码排序。
输入样例:
1
3 3 4 3
3
张三 89 62 71
Smith 98 50 80
王五 67 88 91
输出样例
class 1:
王五 3.26
Smith 2.34
张三 2.28
#include<iostream>
#include<fstream>
#include<vector>
#include<set>
#include<string>
#include<iomanip>
using namespace std;
struct Student{
string name;
double score;
Student(string n, double s):name(n),score(s){}
bool operator<(const Student& s) const {
if(this->score != s.score)
return this->score > s.score;
else
return this->name < s.name;
}
};
int main(){
ifstream cin("data.txt");
//读取班级数,并对每个班级的数据进行操作
int classNum = 0;
while(cin >> classNum){
cout << "class #:" << classNum<< endl;
//读入课程数,并记录课程的学分
int courseNum = 0;
cin >> courseNum;
vector<int> xuefenVec(courseNum);
for(int i = 0; i < courseNum; ++i)
cin >> xuefenVec[i];
//读入学生数,并将学生用set进行排序
int stuNum = 0;
cin >> stuNum;
set<Student> stuSet;
for(int i = 0; i < stuNum; ++i){
string name;
cin >> name;
double sum = 0;
for(int j = 0; j < courseNum; ++j){
double score = 0;
cin >> score;
if (score >= 60){
sum += ((score-50)/10)*xuefenVec[j];
}
}
Student s(name, sum/10);
stuSet.insert(s);
}
//按序输出学生信息
for(set<Student>::iterator it = stuSet.begin(); it != stuSet.end(); ++it){
cout << left << setw(10);
cout << it->name << it->score << endl;
}
cout << endl;
}
return 0;
}