一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
1.1 结构体嵌套结构体
作用: 结构体中的成员可以是另一个结构体
例如: 每个同学可以拥有很多个偶像,一个同学的结构体中,记录很多个偶像的结构体
示例:
//学生结构体定义
#include<iostream>
#include<string>
using namespace std;
struct likes_idol
{
//成员列表
string name; //姓名
string country;
int age; //年龄
double height; //身高(米)
};
//教师结构体定义
struct student
{
//成员列表
int id; //学生学号
string name; //学生姓名
int age; //学生年龄
struct likes_idol b; //子结构体偶像
};
int main() {
struct student s1;
s1.id = 20428;
s1.name = "小侯";
s1.age = 18;
s1.b.age = 19;
s1.b.country = "Japan";
s1.b.height = 1.79;
s1.b.name = "道枝骏佑" ;
cout <<s1.id << " " << s1.name << " " << s1.age << endl;
cout << s1.b.name << " " << s1.b.age << " "
<< s1.b.country<< " " <<s1.b.height << endl;
system("pause");
return 0;
}
总结: 在结构体中可以定义另一个结构体作为成员,用来解决实际问题
1.2 结构体做函数参数
作用: 将结构体作为参数向函数中传递
传递方式有两种:
- 值传递
- 地址传递
示例:
//学生结构体定义
struct likes_idol
{
//成员列表
string name; //姓名
string country;//国家
int age; //年龄
double height; //身高
};
//值传递
void print_idol(likes_idol idol1 )
{
idol1.age = 18;
cout << "子函数中 姓名:" << idol1.name << " 年龄: " << idol1.age << " 国籍:" << idol1.counrty<<"身高:"<<idol1.height << endl;
}
//地址传递
void print_idol(likes_idol *idol2)
{
idol2->age = 28;
cout << "子函数中 姓名:" << idol2->name << " 年龄: " << idol2->age << " 国籍:" << idol2->counrty<<"身高:"<<idol2->height << endl;
}
int main() {
likes_idol idol = {"道枝骏佑","Japan",19,1.79};
//值传递
printStudent(idol);
cout << "主函数中 姓名:" << idol.name << " 年龄: " << idol.age << " 国籍:" << idol.counrty<<"身高:"<<idol.height << endl;
cout << endl;
//地址传递
printStudent2(&idol);
cout << "主函数中 姓名:" << idol.name << " 年龄: " << idol.age << " 国籍:" << idol.counrty<<"身高:"<<idol.height << endl;
system("pause");
return 0;
}
总结:如果不想修改主函数中的数据,用值传递,反之用地址传递,和普通变量一样。
1.3结构体中 const使用场景
const的作用:用于记录程序中不可更改的数据
C++定义常量两种方式
-
#define 宏常量:
#define 常量名 常量值- ==通常在文件上方定义==,表示一个常量
-
const修饰的变量
const 数据类型 常量名 = 常量值- ==通常在变量定义前加关键字const==,修饰该变量为常量,不可修改 **作用:**用const来防止误操作
示例:
//偶像结构体定义
struct likes_idol
{
//成员列表
string name; //姓名
string country;//国家
int age; //年龄
double height; //身高
};
//const使用场景
void print_idol(const likes_idol idol1) //加const防止函数体中的误操作
{
idol1.age = 18;//操作失败因为加了const修饰
cout << "子函数中 姓名:" << idol1.name
<< " 年龄: " << idol1.age << " 国籍:"
<< idol1.counrty<<"身高:"<<idol1.height << endl;
}
int main() {
likes_idol idol = {"道枝骏佑","Japan",19,1.79};
print_idol(&idol);
system("pause");
return 0;
}
1.4结构体数组嵌套结构体数组
要求: 有五个学生,每个学生最喜欢的两本书。打印出学生的姓名以及对应喜欢书名和作者。 示例:
#include<iostream>
#include<string>
using namespace std;
typedef string str;
struct book
{
str b_name;
str b_author;
};
struct friends
{
str fr_name;
book likes[2];
};
void allocateSpace(friends fr_Array[] , int len)
{
str fr_Name = "h_";
str b_Name = "三体_";
str b_Author = "s_";
str fr_Seed = "ABCDE";
str b_Seed = "12";
str b_a_Seed = "12";
for (int i = 0; i < len; i++)
{
fr_Array[i].fr_name = fr_Name + fr_Seed[i];
for (int j = 0; j < 2; j++)
{
//字符串连接符
fr_Array[i].likes[j].b_name = b_Name + b_Seed[j];
fr_Array[i].likes[j].b_author =b_Author+b_a_Seed[j];
}
}
}
void printfriends(friends fr_Array[], int len)
{
for (int i = 0; i < len; i++)
{
cout <<fr_Array[i].fr_name << endl;
for (int j = 0; j < 2; j++)
{
cout << " " << fr_Array[i].likes[j].b_name
<< " " << fr_Array[i].likes[j].b_author << endl;
}
}
}
int main() {
friends fr_Array[5]; //老师数组
int len = sizeof(fr_Array) / sizeof(friends);
allocateSpace(fr_Array, len); //创建数据
printfriends(fr_Array, len); //打印数据
system("pause");
return 0;
}
输出:
h_A
三体_1 s_1
三体_2 s_2
h_B
三体_1 s_1
三体_2 s_2
h_C
三体_1 s_1
三体_2 s_2
h_D
三体_1 s_1
三体_2 s_2
h_E
三体_1 s_1
三体_2 s_2
请按任意键继续. . .
注意: 如果出现这样的错误提示:
25 E:\C++程序1\h_struct\Makefile.win recipe for target 'h_struct.exe' failed
原因:有可能是上一次运行的窗口控制台没有关闭。
1.5结构体数组的冒泡排序
要求: 设计一个小侯偶像的结构体,包括成员姓名,年龄,性别,身高,体重,国籍;创建结构体数组,数组中存放3名小侯的偶像。 通过冒泡排序的算法,将数组中的偶像按照身高进行升序排序,最终打印排序后的结果。
#include<iostream>
#include<string>
using namespace std;
struct idol
{
string name;
int age;
string sex;
float height;
string nation;
};
//冒泡排序
void bubbleSort(idol arr[] , int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j].height > arr[j + 1].height)
{
//创建中间的结构体变量,用于传递数据
idol temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//打印数组
void print_idols(idol arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << " " << arr[i].name << " " << arr[i].sex << " " << arr[i].age << " " <<arr[i].height<<" " <<arr[i].nation<<endl;
}
}
int main() {
struct idol arr[3] =
{
{"白敬亭",28,"男",1.83,"China"},
{"赵丽颖",32,"女",1.65,"China"},
{"道枝骏佑",19,"男",1.79,"Japan"}
};
int len = sizeof(arr) / sizeof(idol); //获取数组元素个数
bubbleSort(arr, len); //排序
print_idols(arr, len); //打印
system("pause");
return 0;
}
输出:
赵丽颖 女 32 1.65 China
道枝骏佑 男 19 1.79 Japan
白敬亭 男 28 1.83 China
请按任意键继续. . .
1.6转义字符
**作用:**用于表示一些==不能显示出来的ASCII字符==
现阶段我们常用的转义字符有: \n \\ \t
| 转义字符 | 含义 | ASCII码值(十进制) |
|---|---|---|
| \a | 警报 | 007 |
| \b | 退格(BS) ,将当前位置移到前一列 | 008 |
| \f | 换页(FF),将当前位置移到下页开头 | 012 |
| \n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
| \r | 回车(CR) ,将当前位置移到本行开头 | 013 |
| \t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
| \v | 垂直制表(VT) | 011 |
| \\ | 代表一个反斜线字符"" | 092 |
| ' | 代表一个单引号(撇号)字符 | 039 |
| " | 代表一个双引号字符 | 034 |
| ? | 代表一个问号 | 063 |
| \0 | 数字0 | 000 |
| \ddd | 8进制转义字符,d范围0~7 | 3位8进制 |
| \xhh | 16进制转义字符,h范围0 | 3位16进制 |