编程要求
学员需要设计一个学员信息表,并在主函数中读取输入,根据输入的内容作出相应的动作。
输入共有4种,格式如下:
A <姓名> <分数>,向信息表的末尾添加一条记录,内容为<姓名> <分数>,分数均为整数。
注意:如果表中已有同一个人的记录,那就只更新分数。
R <姓名>,删除表中指定姓名的条目,不存在则不做处理。
P,按照<姓名> <分数>的格式打印整个信息表,每条记录占1行。如果表为空,则输出一行[空]。
S,将整个信息表的数据按照分数的降序排序。
注意 :为了保证排序结果稳定,输入的数据保证不会有两条记录有相同的分数。
每种格式的输入占一行,测试有多行输入。详细见测试说明。
测试说明
测试输入:
A 小明 89
A 小张 91
A 小李 67
P
R 小李
S
P
预期输出:
小明 89
小张 91
小李 67
小张 91
小明 89
#include
#include
#include
#include
#include
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.gradebool operator==(student &a,student &b)
{
return a.name==b.name;
}
ostream &operator<<(ostream &out,student &a){
out<" "<return out;
}
void swap(student &a,student &b){
student temp;
temp=a;
a=b;
b=temp;
}
int main()
{
char a;
student m;
vector 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::iterator it=s.begin();it!=s.end();it++)
{
if(*it==m){
swap(s.back(),*it);
s.pop_back();
}
}
break;
case 'P':
for(vector::iterator it=s.begin();it!=s.end();it++){
cout<<*it;
flag=1;
}
if(flag==0)cout<break;
case 'S':
for(vector::iterator it=s.begin();it!=s.end();it++){
for(vector::iterator its=it+1;its!=s.end();its++){
if(*it<*its)swap(*it,*its);
}
}
break;
default:break;
}
}
return 0;
}
似乎是在删除或者降序排列的时候出的问题,但又一直不知道怎么改,求解QAQ
https://blog.csdn.net/jingguo_/article/details/102924538
不知道你这个问题是否已经解决, 如果还没有解决的话:该回答引用GPTᴼᴾᴱᴺᴬᴵ
这份代码的逻辑基本正确,但是在进行降序排列和删除时,存在一些小问题。
1.删除
在删除的时候,如果存在多条记录拥有相同的姓名,那么删除只会删除第一条遇到的记录。可以在找到要删除的记录之后,将其与最后一条记录进行交换,并删除最后一条记录,这样就可以删除所有匹配的记录。
修改后的代码:
case 'R':
cin >> n;
m = student(n);
for (vector<student>::iterator it = s.begin(); it != s.end(); it++) {
if (*it == m) {
swap(*it, s.back());
s.pop_back();
it--; // 因为交换了位置,需要将指针向前移一位
}
}
break;
2.降序排列
在降序排列时,可以使用STL中的sort函数,同时指定排序规则为按照分数降序排列。
修改后的代码:
case 'S':
sort(s.begin(), s.end(), greater<student>());
break;
这里使用了STL中的greater函数,将其作为sort函数的第三个参数,表示按照降序排列。这样就可以实现稳定的降序排列了。