编程要求
学员需要设计一个学员信息表,并在主函数中读取输入,根据输入的内容作出相应的动作。
输入共有4种,格式如下:
A <姓名> <分数>,向信息表的末尾添加一条记录,内容为<姓名> <分数>,分数均为整数。
注意:如果表中已有同一个人的记录,那就只更新分数。
R <姓名>,删除表中指定姓名的条目,不存在则不做处理。
P,按照<姓名> <分数>的格式打印整个信息表,每条记录占1行。如果表为空,则输出一行[空]。
S,将整个信息表的数据按照分数的降序排序。
注意 :为了保证排序结果稳定,输入的数据保证不会有两条记录有相同的分数。
每种格式的输入占一行,测试有多行输入。详细见测试说明。
测试说明
测试输入:
A 小明 89
A 小张 91
A 小李 67
P
R 小李
S
P
预期输出:
小明 89
小张 91
小李 67
小张 91
小明 89
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include<cstdio>
using namespace std;
class student{
public:
string name;
int grade;
student(){}
student(string n,int g):name(n),grade(g){}
student(string n):name(n){}
};
bool operator<(student &a,student &b)
{
return a.grade<b.grade;
}
bool operator==(student &a,student &b)
{
return a.name==b.name;
}
ostream &operator<<(ostream &out,student &a){
out<<a.name<<" "<<a.grade<<endl;
return out;
}
void swap(student &a,student &b){
student temp;
temp=a;
a=b;
b=temp;
}
int main()
{
char a;
student m;
vector <student> s;
while((a=getchar())!=EOF){
string n;
int g,flag=0;
switch(a){
case 'A':
cin>>n>>g;
s.push_back(student(n,g));
break;
case 'R':
cin>>n;
m=student(n);
for(vector<student>::iterator it=s.begin();it!=s.end();it++)
{
if(*it==m){
swap(s.back(),*it);
s.pop_back();
}
}
break;
case 'P':
for(vector<student>::iterator it=s.begin();it!=s.end();it++){
cout<<*it;
flag=1;
}
if(flag==0)cout<<endl;
break;
case 'S':
for(vector<student>::iterator it=s.begin();it!=s.end();it++){
for(vector<student>::iterator its=it+1;its!=s.end();its++){
if(*it<*its)swap(*it,*its);
}
}
break;
default:break;
}
}
return 0;
}
似乎是在删除或者降序排列的时候出的问题,但又一直不知道怎么改,求解QAQ