1.11 按绩点排名

                                     1.11  按绩点排名

1.11.1  题目内容

有一些班级的学生需要按绩点计算并排名。每门课程的成绩只有在 60 分以上(含),才予以计算绩点。课程绩点的计算公式为:(课程成绩–50)÷10×学分数。一个学生的总绩点为其所有课程绩点总和除以 10。
输入描述:输入数据中含有一些班级(数量≤20)。每个班级的第一行数据 n(≤10),a1,a2,a3,…,an,表示该班级共有 n 门课程,每门课程的学分分别为 a1,a2,a3,…,an;班级数据中的第二行数据为一个整数 m(≤50),表示本班级有 m 个学生;班级数据接下去有 m 行对应 m 个学生数据;每行学生数据中的第一个为字串 s1(s1中间没有空格),
表示学生姓名,后面跟有 n 个整数 s1,s2,s3,…,sn,表示该学生各门课程的成绩(0≤si≤100)。
输出描述:以班级为单位输出各个学生按绩点分从大到小的排名。如果绩点分相同,则按学生名字的 ASCII 串值从小到大排名。每个班级的排名输出之前应先给出一行,描述班级序号“class #:”(#表示班级序号),班级之间应空出一行。排名时,每个学生占一行,列出名字和总绩点。学生输出宽度为 10 个字符,左对齐,在空出一格后列出总绩点。
输入样例 

3 3 4 3 

张三 89 62 71 
Smith 98 50 80 
王五 67 88 91 
输出样例
class 1: 
王五 3.26 
Smith 2.34 
张三 2.28 

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <IOMANIP>//cout 的输出格式
using namespace std; 
struct student 
{ 
 string s; 
 double d; 
}; 
//编写比较函数
bool myComp(const student &s1,const student &s2) 
{ 
 if(s1.d!=s2.d)return s1.d>s2.d;//由大到小则使用“>”号
 if(s1.s!=s2.s)return s1.s<s2.s;//由小到大则使用“<”号
} 
int main(int argc, char* argv[]) 
{  
 int n;//班级数量
 int c;//课程数量
 double xf;//学分
 vector<double>vxf;//学分向量
 int p;//班级人数
 string name;//学生名称
 double score;//成绩
 student xs;//学生名称与总学分结构体
 vector<student>vxs;//最终学生名称与总学分
 cin>>n;//n 个班
 for(int i=0;i<n;i++)//处理每一个班
 { 
 cin>>c;//读入课程数量
 for(int j=0;j<c;j++)//读入每门课程的学分
 { 
 cin>>xf; 
 vxf.push_back(xf); 
 } 
 cin>>p;//读入班级人数
 //读入一个班的 p 个学生的名称与每门课成绩
 for(int k=0;k<p;k++) 
{ 
 cin>>name;//读入学生名称
 xs.s=name; 
 xf=0.0; 
 for(int m=0;m<c;m++)//读入每门课程的分数
 { 
 cin>>score; 
 //成绩要大于或等于 60 分才计算绩点
 if(score<60)continue; 
 xf=xf+(score-50)/10*vxf[m];//计算总学分
 } 
 xs.d=xf/10; 
 vxs.push_back(xs); 
 } 
 //输出每个班的情况
 cout<<(i?"\n":""); 
 cout<<"class "<<i+1<<":"<<endl; 
 sort(vxs.begin(),vxs.end(),myComp);//带自定义比较函数 myComp 
 for(vector<student>::iterator it=vxs.begin();it<vxs.end();it++) 
 { 
 cout<<fixed<<setprecision(2); 
 cout<<left<<setw(11); 
 cout<<(*it).s<<(*it).d<<endl; 
 } 
 vxf.clear();//清除向量
 vxs.clear();//清除向量
 } 
 return 0; 
} 

猜你喜欢

转载自blog.csdn.net/qq_41668789/article/details/82153827