【全网最细PAT题解】【PAT乙】1004 成绩排名(vector动态数组对结构体排序)

70 篇文章 0 订阅

题目链接

1004 成绩排名

题目描述

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:
每个测试输入包含 1 个测试用例,格式为

第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
  ... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112

题目大意

就是给出一组学生的姓名、学号、成绩,让你输出成绩最高和最低的学生的姓名和学号

本题用到了vector动态数组对结构体进行排序
涉及到了以下知识点

  • vector动态数组的初始化
//首先要导入vector的头文件,因为本题直接用的万能头文件,所以不需要单独导入
#include<bits/stdc++.h>		//万能头文件
//STL容器的创建方法为	vector<数据类型> 变量名称
vector<int> a;		//这就是创建了一个变量名为a的int类型动态数组

//如果想要创建一个关于自定义结构体的数组,则需要先定义一个结构体
struct Node{
	int a;
	string b;
};
//然后把vector中的数据类型改为结构体即可
vector<Node> v;		//创建一个变量名为v,Node类型的动态数组
  • vector动态数组的插入操作
//具体操作为:变量名.push_back(vector动态数组中相同的数据类型)
vector<int> v;	//创建一个int类型的动态数组
int a = 1;
v.push_back(a);		//把int类型的a变量存入动态数组v中

//结构体也是类似
struct Node{
	int a;
	string b;
};
vector<Node> v;	
Node tempNode;
tempNode.a=1;
tempNode.b="hello";
v.push_back(Node);	//将Node类型的数据压入动态数组v中
  • vector动态数组的排序函数sort
//一般用sort函数来对动态数组v进行排序
//v.begin()代表v的第一个元素(类似于普通数组的a[0]),返回第一个元素的迭代器
//v.end()代表v的最后一个元素,返回最后一个元素的迭代器
//具体格式为sort(开始排序的第一个位置的迭代器,结束排序位置的迭代器,排序函数(第三个变量排序函数在对基础类型进行从小到大排序的时候非必要,可以省略))
sort(v.begin(),v.end(),cmp);
//cmp是自定义的排序函数,基础类型进行从小到大排序的时候非必要,可以省略
  • 自定义排序规则cmp函数
struct Node{
	int a;
	string b;
};
vector<Node> v;	
//cmp函数返回类型为bool,需要两个形参,类型为vector数组的类型,返回值是比较大小的结果
bool cmp(Node a,Node b){
	return a.a>b.a;
	//返回按照结构体中a从大到小的顺序
}
bool cmp(Node a,Node b){
	return a.a<b.a;
	//返回结构体中a从小到大的顺序
}

注意当重写cmp 函数时,返回值只能存在大于或者小于,不能存在大于等于,小于等于这种情况(不能带等号)

  • 动态数组的输出
//v.size()函数返回的是int类型的动态数组大小,代表动态数组v此时有多少个元素
//对于动态数组vector来说,可以理解为普通数组的遍历
struct Node{
	int a;
	string b;
};
vector<Node> v;	
for(int i=0;i<v.size();i++){
	cout<<v[i].a<<" "<<v[i].b<<endl;
}
//在STL容器中,仅限于动态数组可以这么遍历,其他的大部分还是要用到迭代器进行遍历,等后续用到后可以再进行讲解

题解

#include<bits/stdc++.h>
using namespace std;
struct Node{		//代表一个学生
    string name;		//代表学生姓名
    string ID;			//代表学生学号
    int grade;			//代表学生成绩
};
vector<Node> v;			//定义Node类型的动态数组
bool cmp(Node a,Node b){		//自定义排序函数cmp
    return a.grade>b.grade;		//注意返回值不能带等号,是大于不是大于等于
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        Node tempNode;			//定义存储输入的Node类型数据
        cin>>tempNode.name>>tempNode.ID>>tempNode.grade;
        v.push_back(tempNode);		//接受到输入后压入动态数组中
    }
    sort(v.begin(),v.end(),cmp);		//对动态数组结构体中的grade进行从大到小排序	
    cout<<v[0].name <<" "<<v[0].ID<<endl;		
    cout<<v[n-1].name<<" "<<v[n-1].ID<<endl;
	//分别输出成绩最高与最低的学生的姓名和学号
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值