C++课程基础笔记

C++基础入门

阶段内容目标案例
第一阶段c++基础语法入门对c++有初步了解,能够有基础编程能力通讯录管理系统
第二阶段c++核心编程介绍c++面向对象编程,为大型项目做铺垫职工管理系统
第三阶段c++提升编程介绍c++泛型编程思想以及STL的基础使用演讲比赛系统

综合大案例:机房预约系统

1.初识C++

1.1第一个c++程序

vs中新建项目,修改好名称,保存路径,再源文件中新建项目

#include <iostream>
using namespace std;
int main() {
	cout << "hello world" << endl;
	system("pause");
	return 0;
}

1.2注释

作用:添加解释与说明,方便自己或其他程序员阅读

单行注释: // 描述信息

多行注释: /* 描述信息 */

/*
	main是一个程序的入口
	每个程序都必须有这么一个函数
	有且只有一个
*/

1.3变量

作用:给一段指定的内存空间起名,方便操作这段内存

语法:数据类型 变量名 = 初始值;

示例

#include <iostream>
using namespace std;

int main() {
	int a = 10;
	cout << "a = " << a << endl;
	system("pause");
	return 0;
}

1.4常量

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

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

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

通常在文件上方定义,表示一个常量

2.const 修饰的变量:const数据类型 常量名 = 常量值

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

1.5关键字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DSS04C6f-1614521507359)(https://s3.ax1x.com/2021/02/08/yaE7kR.png)]

1.6标识符命名规则

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

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

2.数据类型

2.1整型

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

数据类型占用空间取值范围
short(短整型)2字节(-2^15~2^15-1)
int(整型)4字节(-2^31~2^31-1)
long (长整型)Windows4字节,Linux为4字节(32位),8字节(64位)(-2^15~2^15-1)
long long(长长整型)8字节(-2^63~2^63-1)
#include <iostream>
using namespace std;
int main() {
	short num1 = 10; //(-32,768 ~ 32,767)
	int num2 = 10; //(-2,147,483,648 ~ 2,147,483,647)
	long num3 = 10;//(-2,147,483,648 ~ 2,147,483,647)
	long long num4 = 10; //(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;
	cout << "num3 = " << num3 << endl;
	cout << "num4 = " << num4 << endl;
	system("pause");
	return 0;
}

2.2sizeof关键字

**作用:**利用sizeof求出数据类型占用内存大小

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

#include <iostream>
using namespace std;
int main() {
	//利用sizeof求出数据类型占用内存大小
	short num1 = 10;
	cout << "short占用的内存空间为: " << sizeof(short) << endl;
	cout << "num1占用的内存空间为: " << sizeof(num1) << endl;
	system("pause");
	return 0;
}

2.3实型(浮点型)

作用:用于表示小数

浮点型变量分为两种

1.单精度float

2.双精度double

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

数据类型占用空间有效数字范围
float4字节7位有效数字
double8字节15-16位有效数字
#include <iostream>
using namespace std;
int main() {
	float f1 = 3.14f;
	double d1 = 3.1415;
	//默认情况下输出一个小数,会显示出6位有效数字
	cout << "f1 = " << f1 << endl;
	cout << "d1 = " << d1 << endl;
	//利用sizeof算出占用空间
	cout << "sizeof(float) = " << sizeof(float) << endl;
	cout << "sizeof(double) = " << sizeof(double) << endl;
	//科学技术法
	float f2 = 3e2; //3 * 10 ^ 2
	cout << "f2 = " << f2 << endl;
	float f3 = 3e-2; //3 * 10 ^ 2
	cout << "f3 = " << f3 << endl;
	system("pause");
	return 0;
}

2.4字符型

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

语法char ch = 'a';

注意 :c和c++中字符型变量只占用一个字节

字符型变量并不是把字符存放在内存中存储,而是把对应的ASCII编码放入到存储单元

#include <iostream>
using namespace std;
int main() {
	//1.字符型变量创建方式
	char ch = 'a';
	//2.字符型变量所占内存大小
	cout << "sizeof(a) = " << sizeof(ch) << endl;
	//3.字符型变量常见错误
		//1.char ch2 = "b"; 创建字符型变量要用单引号
		//2.char ch2 = "abcdf"  只能是单个字符
	//4.字符型对应ASCII编码
	cout << (int)ch << endl;
	system("pause");
	return 0;
}

yaVS7d.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTkOadFU-1614521507361)(https://s3.ax1x.com/2021/02/08/yaV9AA.png)]

2.5转义字符

作用:用于表示一些不能显示出来的ASCII字符

常用转义字符:\n \\ \t

#include <iostream>
using namespace std;
int main() {
	cout << "hello world\n";
	cout << "\\" << endl;
	cout << "\tcomputer\n";
	system("pause");
	return 0;
}

2.6字符串型

作用:用于表示一串字符

两种风格

1.C风格字符串:char 变量名[] = "字符串"

2.C++风格字符串: string 变量名 = "字符串"

#include <iostream>
#include <string>
using namespace std;
int main() {
	//1.C风格字符串
	char str[] = "hello world";
	cout << str << endl;
	//2.C++风格字符串
	string str1 = "computer";
	cout << str1 << endl;
	system("pause");
	return 0;
}

2.7布尔类型

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

bool类型只有两个值

true——真(本质是1)

flase——假(本质是0)

bool类型占一个字节大小

#include <iostream>
#include <string>
using namespace std;
int main() {
	//1.创建数据类型
	bool flag = true;
	cout << flag << endl;
	flag = false;
	cout << flag << endl;
	//2.查看诗句所占空间大小
	cout << "sizeof(bool) = " << sizeof(bool) << endl;
	system("pause");
	return 0;
}

2.8 数据的输入

作用:用于键盘输入

#include <iostream>
using namespace std;
int main() {
	//1.整型
	int a = 0;
	cout << "请给整型变量a赋值:" << endl;
	cin >> a;
	cout << "整型变量a的值为:" << a  << endl;
	//2.实型
	float b = 3.14f;
	cout << "请给实型b赋值:" << endl;
	cin >> b;
	cout << "实型变量b的值为:" << b << endl;
	//3.字符型
	char c;
	cout << "请给字符c赋值:" << endl;
	cin >> c;
	cout << "字符变量c的值为:" << c << endl;
	//4.字符串型
	//5.布尔类型
	system("pause");
	return 0;
}

3.运算符

**作用:**英语执行代码的运算

运算符类型作用
算术预算符用于处理四则运算
赋值运算符用于将表达式的值赋给变量
比较运算符用于表达式的比较,并返回一个真值或假值
逻辑运算符用于根据表达式的值返回真值或假值

3.1算术运算符

作用:用于处理四则运算

运算符术语示例结果
+正号+3+3
-负号-3-3
+10 + 515
-10 - 55
*10 * 550
/10 / 52
%取模(取余)10 % 50
++前置递增a = 2; b = ++a;a = 3, b = 3;
++后置递增a = 2; b = a++;a = 3, b = 2;
前置递减a = 2; b = --a;a = 1, b = 1;
后置递减a = 2; b = a–;a = 1, b = 2;
#include <iostream>
using namespace std;
int main() {
	int a1 = 10, a2 = 2;//整数
	cout << a1 + a2 << endl;
	cout << a1 - a2 << endl;
	cout << a1 * a2 << endl;
	cout << a1 / a2 << endl;
	double a3 = 0.2, a4 = 0.45;//小数
	cout << a4 / a3 << endl;
	cout << a1 % a2 << endl;
	//cout << a4 % a3 << endl;两个小数不可以
	system("pause");
	return 0;
}

3.2赋值运算符

作用:用于将表达式的值赋值给变量

运算符术语示例结果
=赋值a = 2; b = 3;a = 2, b = 3
+=加等于a = 0, a += 2;a = 2
-=减等于a = 5; a -= 2;a = 3
*=乘等于a = 2; a *= 2;a = 4
/=除等于a = 2; a /= 2;a = 1
%=模等于a = 3; a %= 2;a = 1
#include <iostream>
using namespace std;
int main() {
	int a = 10, b = 2;
	a += b;
	cout << a << endl;
	a -= b;
	cout << a << endl;
	a *= b;
	cout << a << endl;
	a /= b;
	cout << a << endl;
	a %= b;
	cout << a << endl;
	system("pause");
	return 0;
}

3.3比较运算

作用:用于比较式的比较,并返回一个真值或假值

运算符术语示例结果
==相等于4 == 30
!=不等于4 != 31
<小于4 < 30
>大于4 > 31
<=小于等于4 <= 30
>=大于等于4 >= 31
#include <iostream>
using namespace std;
int main() {
	int a = 10, b = 2;
	cout << (a == b) << endl;
	cout << (a != b) << endl;
	cout << (a > b) << endl;
	cout << (a < b) << endl;
	cout << (a >= b) << endl;
	cout << (a <= b) << endl;
	system("pause");
	return 0;
}

3.4逻辑运算符

作用:用于根据表达式的值返回真值或假值

运算符术语示例
!a
&&a && b
||a || b
#include <iostream>
using namespace std;
int main() {
	int a = 10, b = 0;
	cout << !b << endl;
	cout << (a && b) << endl;
	cout << (a || b) << endl;
	system("pause");
	return 0;
}

4.程序流程结构

C/C++支持最基础的三种程序运行结构:顺序结构、选择结构、循环结构

顺序结构:程序按顺序执行,不发生跳转

选择结构:依据条件是否满足,执行相应功能

循环结构:依据条件是否满足,循环多次执行某段代码

4.1选择结构

1.if 语句

#include <iostream>
using namespace std;
int main() {
	int a, b;
	cin >> a >> b;
	if (a > b) {
		cout << "a > b" << endl;
	}
	else if (a < b) {
		cout << "a < b" << endl;
	} else {
		cout << "a = b" << endl;
	}
	system("pause");
	return 0;
}

2.三目运算符

int a = 10, b = 20, c = 0;
c = (a > b) ? a : b;
//在c++中三目运算符返回的是变量,可以继续赋值
((a > b) ? a : b) = 100;
cout << a << " " << b << endl;
a = 10, b = 100;

3.switch语句

switch (表达式) {
	case 结果1: 执行语句; break;
	case 结果2: 执行语句; break;
	case 结果3: 执行语句; break;
    ...
    default: 执行语句; break;
}

4.2循环结构

作用:满足循环条件,执行循环语句

语法:while( 循环条件) {}

for(; ;) {}

do {} while(循环条件);

#include <iostream>
using namespace std;
int main() {
	//1.while
	int i = 0, j = 10;
	while (i < 10) {
		cout << i << " ";
		i++;
	}
	cout << endl;
	//2.for
	for (int i = 0; i < 10; i++) {
		cout << i << " ";
	}
	cout << endl;
	//3.do - while 
	do {
		cout << j << " ";
		j++;
	} while (j < 10);
	system("pause");
	return 0;
}

4.3跳转结构

作用:用于跳转选择结构或者循环结构

break: 跳出循环

continue: 跳出此次循环

goto :

语法: goto 标记;

#include <iostream>
using namespace std;
int main() {
	cout << "1" << endl;
	goto flag;
	cout << "2" << endl;
	cout << "3" << endl;
	cout << "4" << endl;
	flag:
	cout << "5" << endl;
	system("pause");
	return 0;
}

5.数组

5.1数组概述

所谓数组,就是一个集合,里面存放了相同的类型的数据结构

特点一:数组中每个元素都是相同的数据类型

特点二:数组是由连续的内存位置组成的

5.2一维数组

定义:

1.数据类型 数组名[数组长度];

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

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

一维数名称的用途:

1.可以统计整个数组在内存中的长度

2.可以获取数组在内存中的首地址

#include <iostream>
using namespace std;
int main() {
	int arr[] = { 1, 2, 3, 4, 5 };
	//1.通过sizeof查看数组
	cout << "sizeof(arr[0]) = " << sizeof(arr[0]) << endl;
	cout << "sizeof(arr) = " << sizeof(arr) << endl;
	cout << "数组元素大小 =" << sizeof(arr) / sizeof(arr[0])<< endl;
	//2.通过数组名查看数组首地址,数组名是常量不可以赋值
	cout << "数组首地址为:" << (int)arr << "、" << arr << endl;
	cout << "数组第一个元素的地址为:" << (int)&arr[0] << "、" << &arr[0] << endl;
	cout << "数组第二个元素的地址为:" << (int)&arr[1] << "、" << &arr[1] << endl;
	system("pause");
	return 0;
}

冒泡排序

#include <iostream>
using namespace std;
int main() {
	int arr[10] = { 1, 4, 3, 5, 7, 2, 6, 8, 9, 10 };
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9 - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				swap(arr[j], arr[j + 1]);
			}
		}
	}
	for (int i = 0; i < 10; i++) {
		cout << arr[i] << " ";
	}
	system("pause");
	return 0;
 }

5.3二维数组

1.数据类型 数组名[行数][列数];

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

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

二维数组的数组名称

查看二维数组所占内存空间

获取二维数组首地址

#include <iostream>
using namespace std;
int main() {
	int arr[2][3] = { {1, 2, 3}, {4, 5, 6} };
	cout << "二维数组的所占空间:" << sizeof(arr) << endl;
	cout << "二维数组行的所占空间:" << sizeof(arr[0]) << endl;
	cout << "二维数组的首地址" << arr << endl;
	system("pause");
	return 0;
}

6.函数

6.1概述

作用:将一段经常使用的代码封装起来,减少重复代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。

6.2函数的定义

函数的定义一般主要5个步骤

1.返回值类型

2.函数名

3.参数列表

4.函数体语句

5.return 表达式

6.3函数的调用

#include <iostream>
using namespace std;

int add(int a, int b) {
	int sum = a + b;
	return sum;
}

int main() {
	int a, b;
	cin >> a >> b;
	cout << add(a, b) << endl;
	system("pause");
	return 0;
}

6.4值传递

所谓值传递,就是函数调用时实参将数值传给形参

值传递时,如果形参发生改变,并不会影响实参

#include <iostream>
using namespace std;

void swap(int num1, int num2) {
	cout << "交换前:" << endl;
	cout << "num1:" << num1 << endl;
	cout << "num2:" << num2 << endl;
	int temp = num1;
	num1 = num2;
	num2 = temp;
	cout << "交换后:" << endl;
	cout << "num1:" << num1 << endl;
	cout << "num2:" << num2 << endl;
	return ;
}

int main() {
	int a, b;
	cin >> a >> b;
	swap(a, b);
	cout << "a = " << a << " ";
	cout << "b = " << b;
	system("pause");
	return 0;
}

6.5函数的常见样式

常见的函数样式有四种:

1.有参无返

2.有参无返

3.无参有返

4.有参有返

6.6函数的声明

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

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

#include <iostream>
using namespace std;

int Max(int, int);
int Max(int a, int b);

int main() {
	int a, b;
	cin >> a >> b;
	cout << Max(a, b) << endl;
	system("pause");
	return 0;
}

int Max(int a, int b) {
	return a > b ? a : b;
}

6.7函数的分文件编写

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

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

1.创建后缀名为.h的头文件

2.创建后缀名为.cpp的源文件

3.在头文件中写函数的声明

4.在源文件中写函数的定义

//.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;
	return ;
}
//.h文件
#include <iostream>
using namespace std;
//函数声明
void swap(int, int);

//main函数文件
#include <iostream>
#include "swap.h"
using namespace std;

int main() {
	int a, b;
	cin >> a >> b;
	swap(a, b);
	system("pause");
	return 0;
}

7.指针

7.1指针的基本概念

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

内存编号是从0开始记录的,一般用16进制表示。

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

7.2指针变量的定义和使用

#include <iostream>
using namespace std;

int main() {
	//1.定义指针
	int a = 10;
	int *p;
	p = &a;
	cout << "a 的地址为:" << &a << endl;
	cout << "指针p为:" << p << endl;
	//2.使用指针,取值与取址
	cout << "p指向地址的值为多少:" << *p << endl;
	cout << "p的值为多少:" << &p << endl;

	system("pause");
	return 0;
}

7.3指针所占内存空间

在32位操作系统下,指针是占用4个字节空间大小,无论什么类型。

在63位操作系统下,指针是占用8个字节空间大小,无论什么类型。

#include <iostream>
using namespace std;

int main() {
	int a = 10;
	int *p = &a;
	cout << "sizeof(p) = " << sizeof(p) << endl;
	cout << "sizeof(p) = " << sizeof(int *) << endl;
	cout << "sizeof(p) = " << sizeof(char *) << endl;
	cout << "sizeof(p) = " << sizeof(double *) << endl;
    cout << "sizeof(p) = " << sizeof(long *) << endl;
	system("pause");
	return 0;
}

7.4空指针和野指针

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

用途:初始化指针变量

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

示例一:

#include <iostream>
using namespace std;

int main() {
	int *p = NULL;
	//用于初始化
	*p = 100;
	//0-255之间的编号是系统占用内存, 不允许用户访问
	system("pause");
	return 0;
}

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

**示例二:**野指针

int main() {
	int *p = (int *)0x1100;
    cout << p << endl;
	cout << *p << endl; //访问野指针报错
}

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

7.5const修饰指针

const 修饰指针 ——常量指针, 特点:不可以修改指针的值,但可以修改指针的指向。

const 修饰常量 —— 指针常量,特点:指针的指向不可以修改,但指针指向的值可以修改。

const即修饰指针,又修饰常量,特点:指针的指向和指针指向的值都不可以修改。

#include <iostream>
using namespace std;

int main() {
	int a = 10, b = 20;
	const int *p = &a; //常量指针
	*p = b;//错误
	p = &b;//正确
	int * const p1 = &a; //指针常量
	*p1 = b; //正确
	p1 = &b; //错误
	const int * const p3 = &a;
	*p3 = b; //错误
	p3 = &b; //错误
	system("pause");
	return 0;
}

7.6指针和数组

作用:利用指针访问数组中元素

#include <iostream>
using namespace std;

int main() {
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int *p = arr; //arr就是数组的首地址
	cout << "利用指针访问第一个元素:" << *p << endl;
	p++; //让指针向后偏移四个字节
	cout << "利用指针访问第一个元素:" << *p << endl;
	int *p2 = arr;
	for (int i = 0; i < 10; i++) {
		cout << *p2 << endl;
		p2++;
	}
	system("pause");
	return 0;
}

7.7指针和函数

#include <iostream>
using namespace std;

void swap01(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}

void swap02(int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

int main() {
	//指针和函数
	//1.值传递
	int a = 10, b = 20;
	swap01(a, b);
	cout << "a = " << a << " , " << "a =  " << b << endl;
	//2.地址传递
	swap02(&a, &b);
	cout << "a = " << a << " , " << "a =  " << b << endl;
	system("pause");
	return 0;
}

7.8指针、数组、函数

#include <iostream>
using namespace std;

void bubblesort(int *p, int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (p[j] > p[j + 1]) {
				swap(p[j], p[j + 1]);
			}
		}
	}
	return ;
}

int main() {
	int arr[10] = { 3, 5, 2, 8, 9, 10, 1, 4, 7, 6 };
	int n = sizeof(arr) / sizeof(arr[0]);
	bubblesort(arr, n);
	for (int i = 0; i < 10; i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

8.结构体

8.1结构体基本概念

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

8.2结构体定义和使用

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

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

1.struct 结构体名 变量名

2.struct 结构体名 变量名 = { 成员值1, 成员值2…}

3.定义结构体是顺便创建变量

#include <iostream>
using namespace std;

//1.创建学生数据类型:学生包括(姓名, 年龄,分数)
//struct 结构体名 { 结构体成员列表 }
struct Student
{
	string name;
	int age;
	int score;
} s3;
//2.通过学生类型创建具体学生
// 2.1 struct Student s1;
// 2.2 struct Student s2 = {...};
// 2.3 在定义结构体是顺便创建结构体变量
int main() {
	
	struct Student s1;
	s1.name = "李四"; s1.age = 17; s1.score = 99;
	
	struct Student s2 = {"张三", 18, 90};

	s3.name = "王五"; s3.age = 23; s3.score = 100;
	
	system("pause");
	return 0;
}

总结1: 定义结构体是关键字是struct, 不可以省略

总结2:创建结构体变量时,关键字struct可以省略

总结3:结构体变量利用操作符“ . ”访问成员

8.3结构体数组

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

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

#include <iostream>
#include <string>
using namespace std;

struct Student
{
	string name;
	int age;
	int score;
} ;

int main() {

	struct Student stu[3] = {
		{"李四", 18, 20},
		{"张三", 19, 30},
		{"王五", 20, 40}
	};
	
	for (int i = 0; i < 3; i++) {
		cout << stu[i].age << " " << stu[i].score << " " << stu[i].name << endl;
	}
	system("pause");
	return 0;
}

8.4结构体指针

#include <iostream>
#include <string>
using namespace std;

struct Student
{
	string name;
	int age;
	int score;
};

int main() {
	//1.创建学生结构体变量
	struct Student s = { "张三", 18, 100 };
	//2.通过指针指向结构体变量
	Student *p = &s;
	//3.通过指针访问结构体变量中的数据
	cout << p->age << " " << p->name << " " << p->score << endl;
	system("pause");
	return 0;
}

8.5结构体嵌套结构体

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

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

#include <iostream>
#include <string>
using namespace std;

struct student
{
	string name;
	int age;
	int score;
};

struct teacher
{
	string name;
	int age;
	int id;
	struct student stu;
};

int main() {
	teacher t;
	t.id = 1000;
	t.age = 50;
	t.stu.age = 20;
	t.stu.score = 100;
	system("pause");
	return 0;
}

8.6结构体做函数参数

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

传递方式:值传递、地址传递

#include <iostream>
#include <string>
using namespace std;

struct student
{
	string name;
	int age;
	int score;
};
//值传递
void printfstu(student s) {
	cout << s.age << " " << s.name << " " << s.score << endl;
}
//地址传递
void printfstu2(student *s) {
	s->age = 100; s->score = 200;
	cout << s->age << " " << s->name << " " << s->score << endl;
}

int main() {
	student t;
	t.name = "张三";
	t.age = 50;
	t.score = 100;
	printfstu(t);
	printfstu2(&t);
	cout << t.name << " " << t.age << " " << t.score << endl;
	system("pause");
	return 0;
}

8.7结构体中const做函数参数

作用:用const来防止误操作

示例:

#include <iostream>
#include <string>
using namespace std;

struct student
{
	string name;
	int age;
	int score;
};
//值传递
void printfstu(student s) {
	cout << s.age << " " << s.name << " " << s.score << endl;
}
//将函数中的形参改为指针,可以减少内存空间
void printfstu2(const student *s) {
	//s->age = 100; s->score = 200; 不可以修改
	cout <<"① " <<  s->age << " " << s->name << " " << s->score << endl;
}

void printfstu3(student * const s) {
	s->age = 100; s->score = 200; //可以修改
	cout << "② " << s->age << " " << s->name << " " << s->score << endl;
}

int main() {
	student t;
	t.name = "张三";
	t.age = 50;
	t.score = 100;
	printfstu(t);
	printfstu2(&t);
	printfstu3(&t);
	cout << t.name << " " << t.age << " " << t.score << endl;
	system("pause");
	return 0;
}

8.8结构体案例

案例描述:

学校正在做毕业设计,每名老师带领五名学生,总共有3名老师,需求如下

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

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

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

#include <iostream>
#include <string>
#include <ctime>
using namespace std;

struct student
{
	string name;
	int score;
};

struct teacher
{
	string name;
	struct student stu[5];
} tea[3];

void scanftea(teacher *t, int len) {
	string nameseed = "ABCDE";
	for (int i = 0; i < len; i++) {
		t[i].name = "teacher_";
		t[i].name += nameseed[i];
		for (int j = 0; j < 5; j++) {
			t[i].stu[j].name = "student_";
			t[i].stu[j].name += nameseed[i];
			
			int score = rand() % 100 + 1;
			t[i].stu[j].score = score;
		}
	}
}

void printtea(teacher *t, int len) {
	for (int i = 0; i < len; i++) {
		cout << "老师姓名:" << t[i].name << endl;
		cout << t[i].name  <<" 老师的学生:" << endl;
		for (int j = 0; j < 5; j++) {
			cout << "姓名: " << t[i].stu[j].name << " , 分数:" << t[i].stu[j].score << endl;
		}
	}
}

int main() {
	//随机数种子
	srand((unsigned int)time(NULL));
	srand(time(0));
	int len = sizeof(tea) / sizeof(tea[0]);
	scanftea(tea, len);
	printtea(tea, len);
	system("pause");
	return 0;
}

案例描述:

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

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

#include <iostream>
#include <string>
#include <ctime>
using namespace std;

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

void mansort(Man *p, int len) {
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - i - 1; j++) {
			if (p[j].age > p[j + 1].age) {
				Man temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	}
}

void printfman(Man *man, int len) {
	for (int i = 0; i < len; i++) {
		cout << "姓名: " << man[i].name << ", 年龄: " << man[i].age << ", 性别: " << man[i].sex << endl;
	}
}

int main() {
	Man man[5] = {  { "刘备", 23, "男" },
					{ "关羽", 22, "男" },
					{ "张飞", 20, "男" },
					{ "赵云", 21, "男" },
					{ "貂蝉", 19, "女"} };

	int len = sizeof(man) / sizeof(man[0]);
	mansort(man, len);
	printfman(man, len);
	system("pause");
	return 0;
}
	}
}

}

void printtea(teacher *t, int len) {
for (int i = 0; i < len; i++) {
cout << “老师姓名:” << t[i].name << endl;
cout << t[i].name <<" 老师的学生:" << endl;
for (int j = 0; j < 5; j++) {
cout << “姓名: " << t[i].stu[j].name << " , 分数:” << t[i].stu[j].score << endl;
}
}
}

int main() {
//随机数种子
srand((unsigned int)time(NULL));
srand(time(0));
int len = sizeof(tea) / sizeof(tea[0]);
scanftea(tea, len);
printtea(tea, len);
system(“pause”);
return 0;
}


**案例描述:**

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

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

```c++
#include <iostream>
#include <string>
#include <ctime>
using namespace std;

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

void mansort(Man *p, int len) {
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - i - 1; j++) {
			if (p[j].age > p[j + 1].age) {
				Man temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	}
}

void printfman(Man *man, int len) {
	for (int i = 0; i < len; i++) {
		cout << "姓名: " << man[i].name << ", 年龄: " << man[i].age << ", 性别: " << man[i].sex << endl;
	}
}

int main() {
	Man man[5] = {  { "刘备", 23, "男" },
					{ "关羽", 22, "男" },
					{ "张飞", 20, "男" },
					{ "赵云", 21, "男" },
					{ "貂蝉", 19, "女"} };

	int len = sizeof(man) / sizeof(man[0]);
	mansort(man, len);
	printfman(man, len);
	system("pause");
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值