【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体


我的个人主页
欢迎各位→点赞 + 收藏⭐️ + 留言​
总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
✉️今天你做别人不想做的事,明天你就能做别人做不到的事♐


相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难(1-71)

(72-83)的笔记——通讯录管理系统实战

虽然已经有很多人写了笔记,但我为了查漏补缺,还是重新学习了一遍。我这个笔记重点记录了一些比较容易被忽略的知识点,适合有一定c语言或者c++基础的同学进行复习


C++基础知识

  • 1 C++初识
      • 1.1 注释
      • 1.2 常量
      • 1.3 标识符命名规则
  • 2 数据类型
      • 2.1 整型
      • 2.2 sizeof关键字
      • 2.3 实型(浮点型)
      • 2.4 字符型
      • 2.5 转义字符
      • 2.6 字符串型
      • 2.7 布尔类型 bool
      • 2.8 数据的输入
  • 4 switch语句
  • 5 goto语句
  • 6 数组
      • 6.1 一维数组
        • 6.1.1 一维数组定义方式
        • 6.1.2 一维数组数组名
        • 6.1.3 冒泡排序
      • 6.2 二维数组
        • 6.2.1 二维数组定义方式
        • 6.2.2 二维数组数组名
  • 7 函数
      • 7.1函数的声明
      • 7.2 函数的分文件编写
  • 8 指针
      • 8.1 指针的基本概念
      • 8.2 指针变量的定义和使用
      • 8.3 指针所占内存空间
      • 8.4 空指针和野指针
      • 8.5 const修饰指针
      • 8.6 指针和函数
      • 8.7 指针、数组、函数
  • 9 结构体
      • 9.1 结构体基本概念
      • 9.2 结构体定义和使用
      • 9.3 结构体数组
      • 9.4 结构体指针
      • 9.5 结构体嵌套结构体
      • 9.6 结构体做函数参数
      • 9.7 结构体中 const使用场景
      • 9.8 结构体案例
        • 9.8.1 案例1
        • 9.8.2 案例2

1 C++初识

1.1 注释

作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码

两种格式

  1. 单行注释// 描述信息
    • 通常放在一行代码的上方,或者一条语句的末尾,对该行代码说明
  2. 多行注释/* 描述信息 */
    • 通常放在一段代码的上方,对该段代码做整体说明

1.2 常量

作用:用于记录程序中不可更改的数据

C++定义常量两种方式:

  1. #define 宏常量: #define 常量名 常量值

    • 通常在文件上方定义,表示一个常量
  2. const修饰的变量 const 数据类型 常量名 = 常量值

    • 通常在变量定义前加关键字const,修饰该变量为常量,不可修改

示例:

//1、宏常量
#define day 7

int main() {

	cout << "一周里总共有 " << day << " 天" << endl;
	//day = 8;  //报错,宏常量不可以修改

	//2、const修饰变量
	const int month = 12;
	cout << "一年里总共有 " << month << " 个月份" << endl;
	//month = 24; //报错,常量是不可以修改的
	
	system("pause");

	return 0;
}

1.3 标识符命名规则

作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则

  • 标识符不能是关键字
  • 标识符只能由字母、数字、下划线组成
  • 第一个字符必须为字母或下划线
  • 标识符中字母区分大小写

建议:给标识符命名时,争取做到见名知意的效果,方便自己和他人的阅读


2 数据类型

C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存

2.1 整型

作用:整型变量表示的是整数类型的数据

C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同

数据类型 占用空间 取值范围
short(短整型) 2字节 (-2^15 ~ 2^15-1)
int(整型) 4字节 (-2^31 ~ 2^31-1)
long(长整形) Windows为4字节 (-2^31 ~ 2^31-1)
long long(长长整形) 8字节 (-2^63 ~ 2^63-1)

2^15-1=32767
2^31-1= 2147483646


2.2 sizeof关键字

作用: 利用sizeof关键字可以统计数据类型所占内存大小

语法: sizeof( 数据类型 / 变量)

示例:

int main() {

	cout << "int 类型所占内存空间为: " << sizeof(int) << endl;

	system("pause");

	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第1张图片

2.3 实型(浮点型)

作用:用于表示小数

浮点型变量分为两种:单精度float、双精度double

两者的区别在于表示的有效数字范围不同。

数据类型 占用空间 有效数字范围
float 4字节 7位有效数字
double 8字节 15~16位有效数字

注意:1、无论在小数点前还是小数点后的数字,均算作有效数字。如6.12 有三位有效数字。
    2、默认情况下,无论是float还是double,均只显示六位有效数字,如果想显示更多的有效数字需要作别的配置。


2.4 字符型

作用: 字符型变量用于显示单个字符

语法:char ch = 'a';

注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号。
注意2:单引号内只能有一个字符,不可以是字符串。

  • C和C++中字符型变量只占用1个字节
  • 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

2.5 转义字符

作用: 用于表示一些不能显示出来的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范围09,af,A~F 3位16进制

以 \t 为例,它的作用是可以整齐地输出数据

#include
using namespace std;
int main() {
	cout << "aa\thelloworld" << endl;
	cout << "aaa\thelloworld" << endl;
	cout << "aaaa\thelloworld" << endl;
	system("pause");
	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第2张图片

2.6 字符串型

作用:用于表示一串字符

语法: string 变量名 = "字符串值"

这里是引用注意:C++风格字符串,需要加入头文件 #include


2.7 布尔类型 bool

作用: 布尔数据类型代表真或假的值

bool类型只有两个值:

  • true — 真(本质是1)
  • false — 假(本质是0)

bool类型占1个字节大小


2.8 数据的输入

作用:用于从键盘获取数据

关键字: cin

语法: cin >> 变量

示例:

int main(){
	//字符串型输入
	string str;
	cout << "请输入字符串型变量:" << endl;
	cin >> str;
	cout << str << endl;

	system("pause");
	return EXIT_SUCCESS;
}

4 switch语句

作用: 执行多条件分支语句

语法:

switch(表达式)

{
	case 结果1:执行语句;break;

	case 结果2:执行语句;break;

	...

	default:执行语句;break;
}

注意1:switch语句中表达式类型只能是整型或者字符型


注意2:case里如果没有break,那么程序会一直向下执行


总结:与if语句比,对于多条件判断时,switch的结构清晰,执行效率高,缺点是switch不可以判断区间


5 goto语句

作用: 可以无条件跳转语句

语法: goto 标记;

解释: 如果标记的名称存在,执行到goto语句时,会跳转到标记的位置

示例:

int main() {

	cout << "1" << endl;
	goto FLAG;
	cout << "2" << endl;
	FLAG:
	cout << "5" << endl;
	system("pause");
	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第3张图片

注意:在程序中不建议使用goto语句,以免造成程序流程混乱

6 数组

6.1 一维数组

6.1.1 一维数组定义方式

一维数组定义的三种方式:

  1. 数据类型 数组名[ 数组长度 ];
  2. 数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
  3. 数据类型 数组名[ ] = { 值1,值2 ...};

6.1.2 一维数组数组名

一维数组名称的用途

  1. 可以统计整个数组在内存中的长度
  2. 可以获取数组在内存中的首地址

示例:

int main() {

	//数组名用途
	//1、可以获取整个数组占用内存空间大小
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	cout << "整个数组所占内存空间为: " << sizeof(arr) << endl;
	cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl;
	cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl;

	//2、可以通过数组名获取到数组首地址
	cout << "数组首地址为: " << (int)arr << endl;
	cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl;
	cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl;

	//arr = 100; 错误,数组名是常量,因此不可以赋值

	system("pause");

	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第4张图片

注意:数组名是常量,不可以赋值
总结1:直接打印数组名,可以查看数组所占内存的首地址
总结2:对数组名进行sizeof,可以获取整个数组占内存空间的大小


6.1.3 冒泡排序

作用: 最常用的排序算法,对数组内元素进行排序

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
  3. 重复以上的步骤,每次比较次数-1,直到不需要比较
    在这里插入图片描述
    示例: 将数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序
int main() {

	int arr[9] = { 4,2,8,0,5,7,1,3,9 };

	for (int i = 0; i < 9 - 1; i++)   //基本冒泡排序法就是固定的模式
	{
		for (int j = 0; j < 9 - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

	for (int i = 0; i < 9; i++)
	{
		cout << arr[i] << endl;
	}
    
	system("pause");
	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第5张图片

6.2 二维数组

6.2.1 二维数组定义方式

二维数组定义的四种方式:

  1. 数据类型 数组名[ 行数 ][ 列数 ];
  2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
  3. 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
  4. 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};

6.2.2 二维数组数组名

  • 查看二维数组所占内存空间
  • 获取二维数组首地址

示例:

int main() {

	//二维数组数组名
	int arr[2][3] =
	{
		{1,2,3},
		{4,5,6}
	};

	cout << "二维数组占用的内存空间大小: " << sizeof(arr) << endl;
	cout << "二维数组一行占用的内存空间大小: " << sizeof(arr[0]) << endl;
	cout << "二维数组元素占用的内存空间大小: " << sizeof(arr[0][0]) << endl;

	cout << "二维数组行数: " << sizeof(arr) / sizeof(arr[0]) << endl;
	cout << "二维数组列数: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;

	//地址
	cout << "二维数组首地址:" << arr << endl;
	cout << "二维数组第一行地址:" << arr[0] << endl;
	cout << "二维数组第二行地址:" << arr[1] << endl;

	cout << "二维数组第一个元素地址:" << &arr[0][0] << endl;

	system("pause");
	return 0;
}

总结1:二维数组名就是这个数组的首地址
总结2:对二维数组名进行sizeof时,可以获取整个二维数组占用的内存空间大小

7 函数

7.1函数的声明

作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

  • 函数的声明可以多次,但是函数的定义只能有一次

示例:

#include
using namespace std;
int max(int a, int b);
int max(int a, int b);
//定义

int main() {

	int a = 100;
	int b = 200;
	
	cout << max(a, b) << endl;
	
	system("pause");
	
	return 0;
}
int max(int a, int b)
{
	return a > b ? a : b;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第6张图片

7.2 函数的分文件编写

作用: 让代码结构更加清晰

函数分文件编写一般有4个步骤

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在前面创建的后缀名为.h的头文件中写函数的声明
  4. 在前面创建的后缀名为.cpp的源文件中写函数的定义

示例:

//swap.h文件
#include
using namespace std;

//函数声明
void swap(int a, int b);
//swap.cpp文件
#include "swap.h"        //""表示是自定义的函数

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}
//main函数文件
#include "swap.h"
int main() {

	int a = 100;
	int b = 200;
	swap(a, b);

	system("pause");

	return 0;
}

8 指针

8.1 指针的基本概念

指针的作用: 可以通过指针间接访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示

  • 可以利用指针变量保存地址

8.2 指针变量的定义和使用

指针变量定义语法: 数据类型 * 变量名;

示例:

int main() {

	//1、指针的定义
	int a = 10; //定义整型变量a
	
	//指针定义语法: 数据类型 * 变量名 ;
	int * p;

	//指针变量赋值
	p = &a; //指针指向变量a的地址
	cout << &a << endl; //打印数据a的地址
	cout << p << endl;  //打印指针变量p

	//2、指针的使用
	//通过*操作指针变量指向的内存
	cout << "*p = " << *p << endl;

	system("pause");

	return 0;
}

指针变量和普通变量的区别

  • 普通变量存放的是数据,指针变量存放的是地址
  • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用

8.3 指针所占内存空间

所有指针类型在32位操作系统下所占的内存空间都是4个字节

8.4 空指针和野指针

空指针:指针变量指向内存中编号为0的空间

**用途:**初始化指针变量

**注意:**空指针指向的内存是不可以访问的

示例1:空指针

int main() {

	//指针变量p指向内存地址编号为0的空间
	int * p = NULL;

	//访问空指针报错 
	//内存编号0 ~255为系统占用内存,不允许用户访问
	cout << *p << endl;

	system("pause");

	return 0;
}

野指针:指针变量指向非法的内存空间

示例2:野指针

int main() {

	//指针变量p指向内存地址编号为0x1100的空间
	int * p = (int *)0x1100;

	//访问野指针报错 
	cout << *p << endl;

	system("pause");

	return 0;
}

总结:空指针和野指针都不是我们申请的空间,因此不要访问。

8.5 const修饰指针

const修饰指针有三种情况

  1. const修饰指针 — 常量指针
  2. const修饰常量 — 指针常量
  3. const即修饰指针,又修饰常量

示例:

int main() {

	int a = 10;
	int b = 10;

	//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
	const int * p1 = &a; 
	p1 = &b; //正确
	//*p1 = 100;  报错
	

	//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
	int * const p2 = &a;
	//p2 = &b; //错误
	*p2 = 100; //正确

    //const既修饰指针又修饰常量
	const int * const p3 = &a;
	//p3 = &b; //错误
	//*p3 = 100; //错误

	system("pause");

	return 0;
}

技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量

8.6 指针和函数

**作用:**利用指针作函数参数,可以修改实参的值

示例:

//值传递
void swap1(int a ,int b)
{
	int temp = a;
	a = b; 
	b = temp;
}
//地址传递
void swap2(int * p1, int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main() {

	int a = 10;
	int b = 20;
	swap1(a, b); // 值传递不会改变实参

	swap2(&a, &b); //地址传递会改变实参

	cout << "a = " << a << endl;

	cout << "b = " << b << endl;

	system("pause");

	return 0;
}

8.7 指针、数组、函数

**案例描述:**封装一个函数,利用冒泡排序,实现对整型数组的升序排序

例如数组:int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };

示例:

#include 
#include
using namespace std;

//冒泡排序函数
void bubbleSort(int * arr, int len)  //int * arr 也可以写为int arr[]
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

//打印数组函数
void printArray(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << endl;
	}
}

int main() {

	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	int len = sizeof(arr) / sizeof(int);

	bubbleSort(arr, len);

	printArray(arr, len);

	system("pause");

	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第7张图片

总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针


9 结构体

9.1 结构体基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

9.2 结构体定义和使用

语法:struct 结构体名 { 结构体成员列表 };

通过结构体创建变量的方式有三种:

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = { 成员1值 , 成员2值…}
  • 定义结构体时顺便创建变量

示例:

//结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
}stu3; //结构体变量创建方式3 


int main() {

	//结构体变量创建方式1
	//注意:在c++中结构体创建对象时,struct关键字可以省略,也就是可以写成student stu1。但在定义结构体时struct关键字不可以省略
	struct student stu1; //struct 关键字可以省略

	stu1.name = "张三";
	stu1.age = 18;
	
	cout << "姓名:" << stu1.name << " 年龄:" << stu1.age  << endl;

	//结构体变量创建方式2
	struct student stu2 = { "李四",19 };

	cout << "姓名:" << stu2.name << " 年龄:" << stu2.age  << endl;

	stu3.name = "王五";
	stu3.age = 18;
	
	cout << "姓名:" << stu3.name << " 年龄:" << stu3.age  << endl;

	system("pause");

	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第8张图片

9.3 结构体数组

作用: 将自定义的结构体放入到数组中方便维护

语法: struct 结构体名 数组名[元素个数] = { {} , {} , ... {} }

示例:

//结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
}

int main() {
	
	//结构体数组
	struct student arr[3]=
	{
		{"张三",18,80 },
		{"李四",19,60 },
		{"王五",20,70 }
	};

	for (int i = 0; i < 3; i++)
	{
		cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 分数:" << arr[i].score << endl;
	}

	system("pause");

	return 0;
}

9.4 结构体指针

作用: 通过指针访问结构体中的成员

  • 利用操作符 -> 可以通过结构体指针访问结构体属性

示例:

//结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};


int main() {
	
	struct student stu = { "张三",18,100, };
	
	struct student * p = &stu;
	
	p->score = 80; //指针通过 -> 操作符可以访问成员

	cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
	
	system("pause");

	return 0;
}

总结:结构体指针可以通过 -> 操作符 来访问结构体中的成员

9.5 结构体嵌套结构体

作用: 结构体中的成员可以是另一个结构体

例如: 每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

示例:

//学生结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//教师结构体定义
struct teacher
{
    //成员列表
	int id; //职工编号
	string name;  //教师姓名
	int age;   //教师年龄
	struct student stu; //子结构体 学生
};


int main() {

	struct teacher t1;
	t1.id = 10000;
	t1.name = "老王";
	t1.age = 40;

	t1.stu.name = "张三";
	t1.stu.age = 18;
	t1.stu.score = 100;

	cout << "教师 职工编号: " << t1.id << " 姓名: " << t1.name << " 年龄: " << t1.age << endl;
	
	cout << "辅导学员 姓名: " << t1.stu.name << " 年龄:" << t1.stu.age << " 考试分数: " << t1.stu.score << endl;

	system("pause");

	return 0;
}

总结: 在结构体中可以定义另一个结构体作为成员,用来解决实际问题

9.6 结构体做函数参数

作用: 将结构体作为参数向函数中传递

传递方式有两种:

  • 值传递
  • 地址传递

示例:

//学生结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//值传递
void printStudent(student stu )
{
	stu.age = 28;
	cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;
}

//地址传递
void printStudent2(student *stu)
{
	stu->age = 28;
	cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age  << " 分数:" << stu->score << endl;
}

int main() {

	student stu = { "张三",18,100};
	//值传递
	printStudent(stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;

	cout << endl;

	//地址传递
	printStudent2(&stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;

	system("pause");

	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第9张图片

9.7 结构体中 const使用场景

作用: 用const来防止误操作

示例:

//学生结构体定义
struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//const使用场景
void printStudent(const student *stu) //加const防止函数体中的误操作
{
	//stu->age = 100; //操作失败,因为加了const修饰
	cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl;

}

int main() {

	student stu = { "张三",18,100 };

	printStudent(&stu);

	system("pause");

	return 0;
}

9.8 结构体案例

9.8.1 案例1

案例描述:

学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下

设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员

学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值

最终打印出老师数据以及老师所带的学生数据。

示例:

struct Student
{
	string name;
	int score;
};
struct Teacher
{
	string name;
	Student sArray[5];
};

void allocateSpace(Teacher tArray[] , int len)
{
	string tName = "教师";
	string sName = "学生";
	string nameSeed = "ABCDE";
	for (int i = 0; i < len; i++)
	{
		tArray[i].name = tName + nameSeed[i];
		
		for (int j = 0; j < 5; j++)
		{
			tArray[i].sArray[j].name = sName + nameSeed[j];
			tArray[i].sArray[j].score = rand() % 61 + 40;
		}
	}
}

void printTeachers(Teacher tArray[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << tArray[i].name << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "\t姓名:" << tArray[i].sArray[j].name << " 分数:" << tArray[i].sArray[j].score << endl;
		}
	}
}

int main() {

	srand((unsigned int)time(NULL)); //随机数种子 头文件 #include 

	Teacher tArray[3]; //老师数组

	int len = sizeof(tArray) / sizeof(Teacher);

	allocateSpace(tArray, len); //创建数据

	printTeachers(tArray, len); //打印数据
	
	system("pause");

	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第10张图片

9.8.2 案例2

案例描述:

设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。

通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。

五名英雄信息如下:

{“刘备”,23,“男”},
{“关羽”,22,“男”},
{“张飞”,20,“男”},
{“赵云”,21,“男”},
{“貂蝉”,19,“女”},

#include 
#include
#include
#include
using namespace std;

struct hero {
	string name;
	int age;
	string sex;
};

void p(hero h[], int len) {
	for (int i = 0; i < len-1; i++) {
		for (int j = 0; j < len - i - 1; j++) {
			if (h[j].age > h[j + 1].age) {
				hero temp = h[j];             //这个地方要注意,要交换的不仅是年龄,而是整个结构体
				h[j] = h[j + 1];
				h[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < len; i++) {
		cout << "姓名: " << h[i].name << " 性别: " << h[i].sex << " 年龄: " << h[i].age << endl;
	}

}

int main() {
	hero h[5] = {
		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},
	};
	int len = sizeof(h) / sizeof(h[1]);
	p(h, len);
	
	return 0;
}

【黑马程序员】从0到1入门学C++ -数据类型-Switch语句-数组-函数-指针-结构体_第11张图片

你可能感兴趣的:(我的c++学习之路,c++,开发语言)