C++结构体教程(基础)
如有不对的地方望读者可以指出
一、为什么要用结构体
如果你要存储许多学生的许多学科的考试成绩,你肯定会定义许多一维数组或是定义一个二维数组,例如
int chinese[100005],math[100005],english[100005];
int student[100005][4];。
这是一种存储信息的方法。但是我们可以看到,对于使用多个一维数组存储的方式来说,每个数据没有直接的关联(每个学科的分数都是独立的),如果我们想交换两个学生的位置,那么我们就需要做 \(3\) 次交换才能将两个学生的位置及其分数全部交换;对于使用多个二维数组,无法得知第一维数组和第二维数组表示的是什么,可能你过几天再看这个代码就不知道它们分别表示什么了(当然你说你用注释我也没有意见)。
二、定义结构体
定义方式一
struct 结构类型名称{
成员一
……
}结构变量;
定义方式二
struct 结构类型名称{
成员一
……
};
结构名称 结构变量;
需要注意
1.struct 结构体是关键字
2.结构体类型名、结构体变量名定义规则与变量定义规则一样
3.不够有多少个成员,必须要有大括号
4.定义方式一和二的结构变量后的那个分号一定不能少!
现在我们来举一个例子
第一种定义方式
struct student{//定义一个结构体,结构类型名称为student
int chinese,math,english;//这个结构体有3个成员,都是整型变量分别是chinese、math、english
}stu,stud[100005];//定义一个结构体变量和一个结构体数组,分别为stu和stud[100005]
第二种定义方式
struct student{//定义一个结构体,结构类型名称为student
int chinese,math,english;//这个结构体有3个成员,都是整型变量分别是chinese、math、english
};
student stu,stud[100005];//定义一个结构体变量和一个结构体数组,分别为stu和stud[100005]
上方举这一的例子,student为结构类型,chinese、math、english 为结构体成员,stu、stud[100005] 为结构体变量和结构体数组(千万不要把结构类型、结构体成员和结构体变量弄混淆了)。
这样我们就可以把 chinese、math、english“绑定”在一起了。
注意:结构体成员可以为任意数据类型,结构类型(这就是链表的建法);结构体成员也可以是一个数组。
如何理解结构体变量?
它就和数据类型平起平坐了,例如整型的定义方式是这样的 int a,b[100000];,而结构体变量的定义方式和它差不多student stu,stud[100005];(student 是结构类型名)。只不过结构体变量可能有许多成员,而普通变量相当于只有一个成员。当你弄不清结构体变量在定义或调用时,你可以把它看做是int。
三、结构体的使用
1.访问结构体成员
使用点(.)运算符可以访问结构变量的成员。
结构变量.结构体成员;
例如
stu.chinese=130,stud[108].math=150;
2.结构体变量调用
#include<bits/stdc++.h>
using namespace std;
struct student{
int chinese,math,english;
}stud[15];
int main(){
stud[1].chinese=150,stud[1].math=145,stud[1].english=120;
stud[2].chinese=120,stud[2].math=150,stud[2].english=110;
stud[3]=stud[1];
swap(stud[2],stud[1]);//swap函数的作用是交换
cout<<stud[1].chinese<<" "<<stud[1].math<<" "<<stud[1].english<<endl;
cout<<stud[2].chinese<<" "<<stud[2].math<<" "<<stud[2].english<<endl;
cout<<stud[3].chinese<<" "<<stud[3].math<<" "<<stud[3].english<<endl;
return 0;
}
输出:
120 150 110
150 145 120
150 145 120
四、结构体排序
结构体配合 sort(可以点,建议先了解一下)函数可以很快速的把结构体数组里的元素排好序。
1.排序规则
struct student{
int chinese,math,english,num;//num是学号
}stud[100005];
int cmp(student a,student b){
if(a.chinese+a.english+a.math==b.chinese+b.english+b.math){
if(a.math==b.math){
if(a.english==b.english)return a.num<b.num;
return a.english>b.english;
}
return a.math>b.math;
}
return a.chinese+a.english+a.math>b.chinese+b.english+b.math;
}
上面这个代码实现了对学生成绩的排序,总分高的排前面,总分一样比语文,依次是数学和英语,如果均相同,谁学号小谁排前面。
由此可见,结构体数组的排序函数和普通数组的排序规则函数都差不多,只不过在定义时参数需要定义结构体变量,其余的就是根据要求定义排序规则。
2.排序
#include<bits/stdc++.h>
using namespace std;
struct student{
int chinese,math,english,num;//num是学号
}stud[100005];
int cmp(student a,student b){
if(a.chinese+a.english+a.math==b.chinese+b.english+b.math){
if(a.math==b.math){
if(a.english==b.english)return a.num<b.num;
return a.english>b.english;
}
return a.math>b.math;
}
return a.chinese+a.english+a.math>b.chinese+b.english+b.math;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>stud[i].chinese>>stud[i].math>>stud[i].english>>stud[i].num;
sort(stud+1,stud+n+1,cmp);
for(int i=1;i<=n;i++)
cout<<stud[i].chinese<<" "<<stud[i].math<<" "<<stud[i].english<<" "<<stud[i].num<<endl;
return 0;
}
输入:
10
96 118 38 1
137 8 40 2
116 143 44 3
25 90 73 4
147 39 20 5
148 71 13 6
123 27 69 7
104 67 34 8
144 39 64 9
127 123 94 10
输出:
127 123 94 10
116 143 44 3
96 118 38 1
144 39 64 9
148 71 13 6
123 27 69 7
147 39 20 5
104 67 34 8
25 90 73 4
137 8 40 2
所以 sort 函数应该这样写:
sort(结构体数组名+排序范围开始于结构体数组第几个元素,结构体数组名+排序范围结束于结构体数组第几个元素,排序规则);

浙公网安备 33010602011771号