题目描述:
总成绩是按平时成绩和考试成绩加一块的,平时成绩占30%,考试成绩占70%。(平时成绩和考试成绩均为100)
按照总成绩排下序,总成绩相同的看考试成绩,考试成绩相同的看平时成绩,都相同的看姓名。(成绩按从大到小,姓名按字典序)。
输入描述:
先输入一个整数n,代表有n个学生,接下来有n行,(0<n<30)
每行有一个字符串和两个实数,其中包括学生的姓名,平时成绩和考试成绩。
输出描述:
按他们的总成绩从大到小输出,每行包括学生姓名,平时成绩,考试成绩和总成绩。
代码:
#include<iostream>
#include <set> //set集合容器头文件
#include <string> //string容器头文件
#include <cstdio>//使用c语言中的语句
using namespace std;
struct Student //定义一个结构体类型,(名字,平时分,考试分,总分为一个组合数据)
{
string name; //学生名字
double pf; //该学生的平时分
double kf; //该学生的考试分
double zf; //该学生的总分
bool operator <(const Student &a) const //自己设计一个排序方式进行数据排序
{
if(a.zf!=zf) //先比较总分
return a.zf<zf; //返回两者中的大值(结构体中"<"返回大值,正好相反)
else if(a.kf!=kf) //总分相等比较考试分
return a.kf<kf; //返回大值
else if(a.pf!=pf) //考试分相等比较平时分
return a.pf<pf; //返回大值(从大到小)
else //平时分相等比较名字
return a.name>name; //(名字按字典序)从小到大
}
};
int main()
{
int n,Kf,Pf,i;//定义变量
string c; //创建string类型的c
Student student; //学生类的变量名student
multiset<Student> s; //创建多重集合容器s(里面元素为学生类型)
cin>>n;输入总共有几组数据
while(n--)
{
cin>>c;//输入名字
cin>>Pf>>Kf;//输入平时分考试分
student.name=c;
student.pf=Pf;
student.kf=Kf;
student.zf=Pf*0.3+Kf*0.7; //总成绩的计算
s.insert(student); //把学生信息插入到多重集合容器中
}
multiset<Student>::iterator it; //定义迭代器变量
for(it=s.begin();it!=s.end();it++)//用迭代器访问s中元素
{
cout<<(*it).name;//输出学生名字
printf(" %.2lf %.2lf %.2lf\n",(*it).pf,(*it).kf,(*it).zf);
}
return 0;
}