结构体-知识总结 概念 在C++中,结构体(struct)是一种用户自定义的数据类型,可以将不同类型的数据组合在一起。 结构体提供了一种方便的方法来处理与现实实体相关的数据,例如学生、书籍、点等。 结构体可以包含成员变量(数据)和成员函数(方法),虽然与类(class)类似,但成员函数通常主要用于简单的数据聚合,并且在竞赛中我们通常不会使用成员函数。
定义结构体 定义方法 结构体的定义使用struct关键字,后跟结构体的名称和一组包含在大括号{}中的成员变量,以分号结尾。 结构体名称一般使用首字母大写的方式来命名。 成员变量代表具体要存储的内容,可以是任何基本数据类型,也可以是其他结构体。 结构体的定义必须要以分号结尾 一般把结构体的定义写在主函数外面
代码示例 定义一个只有基础数据类型的结构体:Person
1#include <iostream>
2using namespace std;
3
4struct Person{
5 string name; // 姓名
6 int age; // 年龄
7 double height; // 身高
8 double weight; // 体重
9};定义一个包含数组的结构体:Transcript
1#include <iostream>
2using namespace std;
3
4struct Transcript{
5 string class_id; // 班级编号
6 int scores[100]; // 成绩数组
7};定义一个包含结构体数组的结构体:Group
1#include <iostream>
2using namespace std;
3
4struct Person{
5 string name; // 姓名
6 int age; // 年龄
7 double height; // 身高
8 double weight; // 体重
9};
10
11struct Group{
12 int group_id;
13 Person persons[100];
14};结构体使用 结构体是一种自定义的数据类型,因此我们需要把结构体当做数据类型来使用即可,获取自定义结构体中变量中的的成员变量时,需要使用.符号。
结构体变量 使用自定义的结构体定义变量与定义基础数据类型的变量没有区别,仅需要将基础数据类型的关键字改为自定义的结构体名称即可。
在主函数内定义自定义结构体类型的变量代码示例:
1#include <iostream>
2using namespace std;
3
4struct Point {
5 int x;
6 int y;
7};
8
9int main() {
10 // 定义Point类型的变量p1,使用.的方式对其进行赋值。
11 Point p1;
12 p1.x = 3;
13 p1.y = 6;
14
15 // 定义Point类型的变量p2,使用初始化列表的方式对其成员变量进行初始化
16 // 此方法需要注意:仅可以对基础数据类型的成员变量进行初始化
17 Point p2 = {10, 20}; // 列表初始化
18
19 cout << "Point p1: (" << p1.x << ", " << p1.y << ")" << endl;
20 cout << "Point p2: (" << p2.x << ", " << p2.y << ")" << endl;
21
22 return 0;
23}在定义结构体的同时定义结构体类型的变量代码示例:
1#include <iostream>
2using namespace std;
3
4// 定义Point类型结构体
5// 定义Point类型的变量p1,不对p1进行初始化
6// 定义Point类型的变量p2,使用列表的方式对p2进行初始化
7// 在此处定义的p1和p2是全局变量
8struct Point {
9 int x;
10 int y;
11}p1, p2{4, 8};
12
13int main() {
14 // 主函数内可以直接使用p1和p2
15 p1.x = 3;
16 p1.y = 6;
17
18 cout << "Point p1: (" << p1.x << ", " << p1.y << ")" << endl;
19 cout << "Point p2: (" << p2.x << ", " << p2.y << ")" << endl;
20
21 return 0;
22}结构体数组 使用自定义的结构体定义变量与定义基础数据类型的变量没有区别,仅需要将基础数据类型的关键字改为自定义的结构体名称即可。
1#include <iostream>
2using namespace std;
3
4struct Point {
5 int x;
6 int y;
7};
8
9// 定义Point类型的数组p
10Point p[1000];
11
12int main() {
13 // 对结构体数组p进行赋值
14 for (int i = 0; i < 1000; ++i) {
15 p[i].x = i;
16 p[i].y = i;
17 }
18
19 return 0;
20}结构体与函数 可以把自定义结构体类型的变量当做参数传递给函数,也可以让一个函数返回一个自定义结构体类型的数据。
1#include <iostream>
2using namespace std;
3
4struct Point {
5 int x;
6 int y;
7};
8
9// 输出一个Point类型的变量的成员变量
10void printPoint(Point p) {
11 cout << "Point: (" << p.x << ", " << p.y << ")" << endl;
12}
13
14// 创建一个Point类型的变量Point createPoint(int x, int y) {1Point p;
2p.x = x;
3p.y = y;
4return p;
5}
6
7int main() {
8Point p1 = createPoint(10, 20);
9printPoint(p1);
10
11return 0;
12}联合体-知识总结 概念 在C++中,联合体(union)是一种用户自定义的数据类型,类似于结构体(struct),但具有不同的内存管理方式。联合体中的所有成员共享同一块内存,意味着在任一时刻,联合体只能存储其中一个成员的值。联合体主要用于需要高效地使用内存的场景。
应用场景 联合体通常用于以下场景: 节省内存空间:在需要节省内存的地方,联合体可以高效地存储不同类型的数据。 处理多种数据类型:在需要处理多种数据类型但同一时刻只需要一种的场景,联合体是一个有效的解决方案。
定义联合体 联合体的定义使用union关键字,后跟结构体的名称和一组包含在大括号{}中的成员变量,以分号结尾。 联合体名称一般使用首字母大写的方式来命名。 成员变量代表具体要存储的内容,可以是任何基本数据类型。 联合体的定义必须要以分号结尾 一般把联合体的定义写在主函数外面
#include <iostream>
using namespace std;union Data {1int i;
2float f;
3char c;
4};
5
6int main() {
7Data data;
8
9data.i = 10;
10cout << "data.i: " << data.i << endl;
11
12data.f = 3.14;
13cout << "data.f: " << data.f << endl;
14
15data.c = 'a';
16cout << "data.c: " << data.c << endl;
17
18// 注意:此时访问其他成员将得到未定义的结果
19cout << "data.i: " << data.i << endl;
20
21return 0;
22}联合体的使用 联合体的使用方式和结构体基本一致。
#include <iostream>
using namespace std;union Data {1int i;
2float f;
3char c;
4};
5
6int main() {
7Data data = {10}; // 初始化整数成员
8
9cout << "data.i: " << data.i << endl;
10
11data = {3.14f}; // 初始化浮点数成员
12cout << "data.f: " << data.f << endl;
13
14data = {'a'}; // 初始化字符成员
15cout << "data.c: " << data.c << endl;
16
17return 0;
18}匿名联合体 在某些情况下,联合体可以是匿名的,即没有名称的联合体。匿名联合体的成员直接属于包含它的作用域。
1#include <iostream>
2using namespace std;
3
4struct Test {
5 union {
6 int i;
7 float f;
8 };
9
10 void print() {
11 cout << "i: " << i << ", f: " << f << endl;
12 }
13};
14
15int main() {
16 Test t;
17 t.i = 10;
18 t.print();
19
20 t.f = 3.14f;
21 t.print();
22
23 return 0;
24}注意事项 同一时刻只能存储一个成员的值:因为所有成员共享同一块内存,同时只能有一个成员存储有效数据。 访问未定义行为:如果在给某个成员赋值后访问其他成员,会产生未定义行为,因为这些成员的值会被覆盖。
错误的题目要弄懂,不会的千万要来问老师⚠️
总结作业非常重要,请务必认真完成✔️
考试只有一次提交机会,请务必本地检查正确后再提交❇️
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
L2-19.结构体与联合体-选择题 在C++中,如何声明一个结构体?
A) struct MyStruct { int x; float y; };
B) class MyStruct { int x; float y; };
C) MyStruct struct { int x; float y; };
D) struct MyStruct;如何在C++中创建结构体MySctruct的一个实例?
A) MyStruct instance;
B) struct MyStruct{ int a; } instance;
C) new MyStruct;D) A和B都是
在C++中,如何初始化结构体的成员?
A) MyStruct obj; obj.x = 10; obj.y = 20.5;
B) MyStruct obj = {10, 20.5};
C) MyStruct obj(10, 20.5);D) A和B都是
如果结构体 MyStruct 有两个成员 x 和 y,如何使用指针访问这些成员?
A) MyStruct* ptr; ptr->x; ptr->y;
B) MyStruct* ptr; (*ptr).x; (*ptr).y;
C) MyStruct* ptr; ptr.x; ptr.y;D) A和B都是
如何在C++中为结构体的成员设置默认值?
A) struct MyStruct { int x = 0; float y = 0.0; };
B) struct MyStruct { int x(0); float y(0.0); };
C) MyStruct obj = {0, 0.0};D) A和C都是
在C++中,结构体可以作为函数返回类型吗? A) 可以 B) 不可以 C) 只有在使用指针时可以 D) 只有在使用引用时可以
在C++中,如果有一个结构体 MyStruct 和一个数组 MyStruct arr[10];,如何访问数组第一个元素的成员变量 x?
A) arr[0].x;
B) arr.x[0];
C) (*arr).x;
D) arr->x;如何初始化一个包含3个 MyStruct 结构体的数组?
A) MyStruct arr[3] = {MyStruct(), MyStruct(), MyStruct()};
B) MyStruct arr[3] = {MyStruct(1, 2), MyStruct(3, 4), MyStruct(5, 6)};
C) MyStruct* arr = new MyStruct3;D) 所有上述
在C++语言中,可以通过定义结构体,定义一个新的数据类型。 A) 正确 B) 错误
在C++语言中 ,可以定义结构体类型的数组变量 ,定义结构体时也可以包 含数组成员。 A) 正确 B) 错误
L2-19.结构体与联合体-选择题答案 A 解析:A选项是一个正确的结构体声明。它定义了一个名为MyStruct的结构体,其中包含两个成员:一个名为x的整型变量和一个名为y的浮点型变量。 D 解析: D 解析:可以在创建结构体对象后单独设置成员值(选项 A),也可以在创建时通过列表初始化(选项 B)。 D 解析:使用箭头运算符 ->(选项 A)或解引用运算符后使用点运算符 .(选项 B)都可以访问成员。 A 解析:C++支持在结构体定义中直接为成员变量设置默认值。 A 解析:结构体确实可以作为函数的返回类型。这意味着函数可以返回一个结构体的实例。 A 解析:使用点运算符 . 直接访问数组第一个元素的成员。 D 解析: A 解析:本题是C++语言的知识,定义结构体可以认为定义一个新的数据类型。 A 解析:本题是C++结构体的知识,可以包含数组。
L2194题解+参考代码 题目链接 排队:L2194
题解 我们需要对一组学生按照特定规则排序:女生排在前,男生排在后;同一性别的学生按身高升序排列。为了实现这个功能,可以使用结构体来存储每个学生的信息,并使用排序算法进行排序。
算法步骤 定义结构体:定义一个结构体 Student,包含两个成员变量:height 和 gender。 读取输入:读取学生的数量 n 和每个学生的身高与性别。 排序规则:定义排序规则: 女生排在前,男生排在后; 相同性别的学生按身高升序排列。 排序:使用 sort 函数和自定义的比较函数对学生数组进行排序。 输出结果:输出排序后的学生身高。
示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4// 定义结构体
5struct Student {
6 int height;
7 int gender;
8};
9
10// 自定义比较函数
11bool compare(const Student &a, const Student &b) {
12 if (a.gender != b.gender) {
13 return a.gender < b.gender; // 女生在前,男生在后
14 } else {
15 return a.height < b.height; // 同性别按身高升序排列
16 }
17}
18
19int main() {
20 // 读取输入
21 int n;
22 cin >> n;
23 Student students[1000];
24 for (int i = 0; i < n; ++i) {
25 cin >> students[i].height >> students[i].gender;
26 }
27
28 // 排序
29 sort(students, students + n, compare);
30
31 // 输出结果
32 for (int i = 0; i < n; ++i) {
33 if (i > 0) cout << " ";
34 cout << students[i].height;
35 }
36 cout << endl;
37
38 return 0;
39}L2195题解+参考代码 题目链接 生日排序:L2195
题解 我们需要对一组学生按照生日从大到小排序。如果有两个学生的生日相同,则按照输入顺序,输入靠后的学生先输出。为此,我们可以使用结构体来存储每个学生的信息,并使用自定义排序规则进行排序。
算法步骤 定义结构体:定义一个结构体 Student,包含姓名、年、月、日和输入顺序。 读取输入:读取学生的数量 n 和每个学生的姓名和生日。 排序规则:定义排序规则: 按年从小到大排序; 如果年相同,按月从小到大排序; 如果年月相同,按日从小到大排序; 如果生日相同,按照输入顺序,输入靠后的同学先输出。 排序:使用 sort 函数和自定义的比较函数对学生数组进行排序。 输出结果:输出排序后的学生姓名。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4// 定义结构体
5struct Student {
6 string name;
7 int year;
8 int month;
9 int day;
10 int index; // 用于记录输入顺序
11};
12
13// 自定义比较函数
14bool compare(const Student &a, const Student &b) {
15 if (a.year != b.year) {
16 return a.year < b.year; // 年从小到大
17 } else if (a.month != b.month) {
18 return a.month < b.month; // 月从小到大
19 } else if (a.day != b.day) {
20 return a.day < b.day; // 日从小到大
21 } else {
22 return a.index > b.index; // 输入顺序,从后到前
23 }
24}
25
26int main() {
27 // 读取输入
28 int n;
29 cin >> n;
30 Student students[100];
31 for (int i = 0; i < n; ++i) {
32 cin >> students[i].name >> students[i].year >> students[i].month >> students[i].day;
33 students[i].index = i;
34 }
35
36 // 排序
37 sort(students, students + n, compare);
38
39 // 输出结果
40 for (int i = 0; i < n; ++i) {
41 cout << students[i].name << endl;
42 }
43
44 return 0;
45}