在之前的学习中,我们知道了数组的使用方法。它可以设置成任意维度。以下是数组的演示图片:
可以直接调用 a[i] , 访问 a 数组的第 i 个元素。
但是有些情境下,我们无法使用数组更方便地解决问题。
比如,现在有 n 个学生考语文和数学两门科目,每个学生每门课都有一个成绩,需要存储这些成绩,并且直观地输出这些成绩。如何解决?
首先我们可能会想到用二维数组的方法, a[1~n][1] 表示语文,a[1~n][2] 表示数学。但是这样并不方便。我们需要一个结构体存储两个科目的成绩。具体写法如下:
struct node{
int yuwen,shuxue;
};
node a[100010];
其中 struct 指结构体类的名称,node 是该结构体的名称,需要用 node 定义一个结构体,当然 node 这个名称可以随意修改。int yuwen,shuxue 是结构体里面的变量,而 a 是访问时的名称,即访问第 i 位学生的语文成绩为 a[i].yuwen。
例题 1
本题的思路如下:
将 k 从 1 至 n 进行循环读入,每次读入 a[k].yuwen 和 a[k].shuxue。
然后,输出 a[i].yuwen 即可。
本题中的结构体的存储方式如下:
代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int yuwen,shuxue;
};
node a[100010];
int main(){
int n,i;
cin>>n>>i;
for(int k=1;k<=n;k++){
cin>>a[k].yuwen>>a[i].shuxue;
}
cout<<a[i].yuwen;
return 0;
}
例题 2
前言:我们已经学会了基本单维度数组排序 & 自定义排序。那么怎样做结构体排序呢?
首先,我们需要按照年龄排序,即以 年份 为优先,以 月份 为次优先。
那么,就可以用 sort 排序。
我们知道单维度数组排序的方法为 sort(a+1,a+1+n,cmp);,结构体也是这样。只不过我们需要自定义 cmp 函数。
首先定义 node:
struct node{
string name,male;
int n,y;
}arr[105];
然后写 cmp 函数:
bool cmp(node a,node b){
if(a.n==b.n){
return a.y>b.y;
}else{
return a.n>b.n;
}
}
注意这里的函数参数名中用 node a,node b!!!
内部,即首要判断年份是否相等,若相等则月数高者年龄小。若不相等,则年份大年龄小。
这就是排序的写法。
代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
string name,male;
int n,y;
}arr[105];
bool cmp(node a,node b){
if(a.n==b.n){
return a.y>b.y;
}else{
return a.n>b.n;
}
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>arr[i].name>>arr[i].male>>arr[i].n>>arr[i].y;
sort(arr+1,arr+1+n,cmp);
for(int i=1;i<=n;i++) cout<<arr[i].name<<' '<<arr[i].male<<' '<<arr[i].n<<' '<<arr[i].y<<endl;
return 0;
}
洛谷名:艾因斯坦
记得关注哦!
本文含有隐藏内容,请 开通VIP 后查看