W
e
l
c
o
m
e
: )

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为结构类型,chinesemathenglish 为结构体成员,stustud[100005] 为结构体变量和结构体数组(千万不要把结构类型、结构体成员和结构体变量弄混淆了)。

这样我们就可以把 chinesemathenglish“绑定”在一起了。

注意:结构体成员可以为任意数据类型,结构类型(这就是链表的建法);结构体成员也可以是一个数组。


如何理解结构体变量?
它就和数据类型平起平坐了,例如整型的定义方式是这样的 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(结构体数组名+排序范围开始于结构体数组第几个元素,结构体数组名+排序范围结束于结构体数组第几个元素,排序规则);
posted @ 2024-03-24 16:28  YYM_CAFE  阅读(95)  评论(0)    收藏  举报