C++ 信奥小课堂笔记(结构体和结构体排序)
今天关键词: 结构体、成员、结构体数组、访问成员、cmp、结构体排序
> 小提醒:结构体就像一个“档案袋”,把同一个对象的多个信息装在一起。排序时关键在 cmp 怎么写。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、为什么需要结构体?
比如一个学生有:
* 姓名
* 年龄
* 身高
* 体重
如果分开用几个数组存:
很容易出现“名字和年龄对不上”的问题。
结构体就是把同一个对象的多个信息打包在一起,像一个档案袋:
> 一个学生一个档案袋,里面装着姓名、年龄、身高、体重。
这样数据就不会乱,也不会不匹配。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、结构体的定义语法
例子:
也可以先定义结构体类型,再单独定义变量:
大白话:
* struct:我要开始做一个“档案袋模板”了。
* stu:这个模板的名字。
* { }:里面写这个档案袋要装哪些信息。
* age, height, weight, name:这些叫成员,就是档案袋里的每一栏。
* s:一个具体的档案袋变量。
* s1[1010]:一个档案袋数组,可以装 1010 个学生档案。
注意:结构体定义最后的大括号后面,必须加分号 ;。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、专业词大白话翻译
专业词 大白话 结构体 档案袋、信息卡片 成员 档案袋里的每一栏,比如姓名、年龄 结构体变量 一个具体的档案袋 结构体数组 一排档案袋,每个袋子装一个对象 访问成员 打开档案袋,看某一栏 cmp 排序时用的比较规则
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、定义结构体变量和数组
大白话:
* stu s;:准备一个 stu 类型的盒子,名字叫 s。
* stu s1[1010];:准备 1010 个 stu 类型的盒子,合起来叫 s1。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
五、访问结构体成员
访问成员用点号 .,读作“的”。
语法:
例子:
大白话:
* s.age:s 这个档案袋的年龄那一栏。
* s1[1].name:第 1 个档案袋的姓名那一栏。
访问出来的成员,就等同于一个普通变量,可以输入、输出、计算。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
六、结构体排序
结构体排序和普通数组排序很像,用 sort。
关键:写 cmp 比较规则函数。
cmp 的参数类型要和要排序的数组类型一致。
1. 按年龄升序排序
大白话:
* a 和 b 是两个学生档案袋。
* a.age < b.age:如果 a 的年龄比 b 小,a 就排在前面。
* 这样排出来就是从年龄小到大。
2. 按分数降序排序
大白话:
* a.score > b.score:如果 a 的分数比 b 高,a 就排在前面。
* 这样排出来就是从高分到低分。
3. SORT 区间小提醒
* 从 s1[1] 排到 s1[n]。
* 终点要写 s1 + n + 1,因为 sort 是左闭右开。
* 要加 #include <algorithm>。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
七、完整小例子
大白话:
1. 做一个学生档案袋模板,里面装姓名和分数。
2. 输入 n 个学生。
3. 用 cmp 按分数从高到低排序。
4. 输出排好序的学生姓名和分数。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
八、容易错的地方
1. 结构体定义最后的分号 ; 不能丢。
2. 访问成员用点号 .,不是逗号,也不是箭头。
3. 数组访问成员:s[i].name,不要写成 s.name[i]。
4. cmp 的参数类型要和结构体类型一致。
5. cmp 返回类型是 bool。
6. sort 的终点要 +1。
7. 升序用 <,降序用 >。
8. 要加 #include <algorithm>。
9. 结构体类型名和变量名不要搞混。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
九、记忆小口诀
> 结构体,像档案,
> 多个信息装一起;
> 定义最后别忘分号;
> 点号访问成员,
> 数组下标别忘记;
> 排序关键写 cmp,
> 类型一致返回 bool;
> 升序小于降序大于,
> sort 终点加个一。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
十、课后小练习
1. 定义一个学生结构体,包含姓名、年龄、分数。
2. 输入 3 个学生信息,输出他们的姓名和分数。
3. 按分数从高到低排序,输出排序后的结果。
4. 按年龄从小到大排序,输出排序后的结果。
5. 说说下面代码哪里错了:
今日一句话总结:
结构体是装多个信息的档案袋,成员用点号访问;结构体数组就是一排档案袋;结构体排序用 sort,关键在写 cmp,参数类型要和结构体一致,升序用 <,降序用 >,终点记得加 1。