我是靠谱客的博主 火星上白昼,这篇文章主要介绍c++ 知识点 基础篇1 C++初识2 数据类型3 运算符4 程序流程结构5 数组6 函数7 指针8 结构体9 通讯录管理系统,现在分享给大家,希望可以做个参考。

配套视频:
https://www.bilibili.com/video/BV1et411b73Z
为方便个人学习,在此发布C++基础入门部分配套讲义(以下均为个人总结),原作者为黑马程序
如存在问题,请大家在评论区留言,谢谢。欢迎大家共同学习,一起进步。

1 C++初识

1.4 常量

//常量:用于记录程序中不可更改的数据
//1、#define 宏常量:#define 常量名 常量值
//通常定义在文件上方,表示一个常量
//2、const修饰的变量 :const 数据类型 常量名 = 常量值
//通常在变量定义前加关键字const,修饰改变量为常量,不可修改

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream> using namespace std; //1、#define 宏常量: #define Day 7 int main() { //Day = 14; //错误:Day是常量,不可修改 cout << "一周有 " << Day <<"天" << endl; //2、const修饰的变量 const int month = 12; //month = 24; //错误:const修饰的变量也是不可修改 cout << "一年总共有" << month << "月" << endl; system("pause"); return 0; }

1.5 关键字

关键字:在c++中预先保留的单词,给变量或常量起名时,再次使用会有歧义
创建变量:数据类型 变量名称 = 变量初始值
不要用关键字给变量或者常量起名字
int int = 10; //错误:第二个int 是关键字 ,不可以作为变量名称

1.6 标识符命名规则

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

2 数据类型

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

2.1 整型

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

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

2.2 sizeof关键字

sizeof关键字:统计数据类型所占内存大小
语法:sizeof(数据类型/变量)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream> using namespace std; int main() { short num1 = 10; cout << "short所占内存大小:" << sizeof(num1) << endl; cout << "short所占内存大小:" << sizeof(short) << endl; int a = 10; cout << "int所占内存大小:" << sizeof(int) << endl; cout << "a 所占内存大小:" << sizeof( a ) << endl; cout << "long所占内存大小:" << sizeof(long) << endl; cout << "long long 所占内存大小:" << sizeof(long long) << endl; system("pause"); return 0; }

2.3 实型(浮点型)

//实型(浮点型):用于表示小数
//1、单精度 float 4个字节 7位有效数字
//2、双精度 double 8个字节 15~16位有效数字
//两者表示有效数字范围不同

//默认情况下 输出一个小数,会显示6位有效数字

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream> using namespace std; int main() { float f1 = 3.1415926f; //否则默认双精度 double d1 = 3.14; double d2 = 3.141592653; double d3 = 3.14159265354579; cout << "f1= " << f1 << endl; cout << "d1= " << d1 << endl; cout << "d2= " << d2 << endl; cout << "d3= " << d3 << endl; //统计float 和double占用内存空间 cout << "float 占用内存空间:" << sizeof(float) << endl; //4字节 cout << "double占用内存空间:" << sizeof(double) << endl; //8字节 //科学计数法 float f2 = 3e2; //3* 10 ^2 float f3 = 3e-2; //3* 0.1 ^2 cout << "f2=" << f2 << endl; cout << "f3=" << f3 << endl; system("pause"); return 0; }

2.4 字符型

字符型:显示单个字符
语法:char ch = 'a‘;
注意: 1)在显示字符型变量时,用单引号将字符括起来,不要用双引号
2)单引号内只能有一个字符,不可以是字符串
字符型变量只占用一个字节

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream> using namespace std; int main() { //1、字符型变量创建方式 char ch = 'a'; cout << "ch= " << ch << endl; //2、字符型变量所占内存大小 cout << "char所占内存大小为:" << sizeof(char) << endl; //3、字符型变量常见错误 //char ch2 = "b"; //注意用单引号 //char ch3 = 'abc' //注意单个字符 //4、字符型变量对应ASCII编码 cout <<(int) ch << endl; //a 对应的ASCII是 97 字符型强转为整型 char ch1 = 'A'; cout << (int)ch1 << endl; //A 对应的ASCII是 65 system("pause"); return 0; }

2.5 转义字符

转义字符含义ASCII(十进制)
a警报007
n换行010
t水平制表009
092
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream> using namespace std; int main() { // 换行 n cout << "hello world n"; // 反斜杠 \ cout << "\" << endl; // 水平制表符 t cout << "aaaaaahelloworld n" ; cout << "aaa t helloworld n" ;//一共8个宽度,作用:对齐输出 cout << "aaaaaaaahelloworld n" ; system("pause"); return 0; }

2.6 字符串型

字符串:表示一串字符
c++风格 string

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream> using namespace std; #include<string> int main() { //1、c风格字符串 //注意事项 char 字符串名[] //注意事项2 等号后面 要用双引号 包含起来字符串 char str1[] = "hello world"; cout << str1 << endl; //2、c++风格字符串 --注意 包含头文件 string str2 = "hello World"; cout << str2<<endl ; system("pause"); return 0; }

2.7 布尔类型

布尔类型bool–布尔类型代表真或假的值
true–真(本质是1)
false–假(本质是0)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream> using namespace std; int main() { //1、创建bool数据类型 bool flag = true; cout << flag << endl; //1 flag = false; cout << flag << endl; //0 //2、查看bool cout << "bool类型所占内存空间" << sizeof(bool) << endl; //1 system("pause"); return 0; }

2.8 数据的输入

数据的输入:用于从键盘获取数据
关键字:cin
语法:cin >> 变量

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream> using namespace std; int main() { //1、整型输入 int a = 0; cout << "请给整型变量a赋值:" << endl; cin >> a; cout << "整型变量a = " << a << "n"; //2、浮点型输入 float f = 3.14f; cout << "请给浮点型变量f赋值:" << endl; cin >> f; cout << "浮点型变量f=" << f << endl; //3、字符型输入 char ch = 'a'; cout << "请给字符型变量ch赋值:" << endl; cin >> ch; cout << "字符型变量ch=" << ch << endl; //4、字符串型输入 string str = "abc"; cout << "请给字符串型变量str赋值:n"; cin >> str; cout << "字符串变量str=" << str << endl; //5、bool型输入(bool类型除了非0的值都代表真) bool flag = true; cout << "请给bool类型赋值:n"; cin >> flag; cout << "bool型flag=" << flag << endl; system("pause"); return 0; }

3 运算符

作用:执行代码运算

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

3.1 算术运算符

3.1.1 加减乘除

运算符术语实例结果
+正号或加号+3
-负号或减号-3
*
/10/33
%取模(取余)10%31
++前置递增a=2;b=++aa=3;b=3
++后置递增a=2;b=a++a=3;b=2
前置递减a=2;b=–aa=1;b=1
后置递减a=2;b=a–a=1;b=2
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream> using namespace std; int main() { //加减乘除 int a1 = 10; int b1 = 3; cout << a1 + b1 << endl; cout << a1 - b1 << endl; cout << a1 * b1 << endl; cout << a1 / b1 << endl; //两个数整除,结果依然是整数,将小数部分去除 int a2 = 10; int b2 = 20; cout << a2 / b2 << endl; //int a3 = 10; //int b3 = 0; //cout << a3 / b3 << endl; //0不可以是被除数 system("pause"); return 0; }

3.1.2 取模

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream> using namespace std; int main() { //取模运算的本质是取余数 int a1 = 10; int b1 = 3; cout << a1 % b1 << endl; int a2 = 10; int b2 = 20; cout << a2 % b2 << endl; //两个小数不可以做取模运算 system("pause"); return 0; }

3.1.3 递增递减

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream> using namespace std; int main() { //1、前置递增 int a = 10; ++a; cout << "a=" << a << endl; //2、后置递增 int b = 10; b++; cout << "b=" << b << endl; //3、前值和后置区别 //前置递增 先让变量+1 然后进行表达式运算 int a2 = 10; int b2 = ++a2 * 2; cout << "b2=" << b2 << endl; //后置递增 先让进行表达式运算 然后在+1 int a3 = 10; int b3 = a3++ * 2; cout << "a3=" << a3 << endl; cout << "b3=" << b3 << endl; int a4 = 10; int c3 = a4++ * 2; int c4 = a4++ * 2; int c2 = ++a4 * 2; cout << "c2=" << c2 << endl; cout << "a4=" << a4 << endl; cout << "c3=" << c3 << endl; cout << "c4=" << c4 << endl; cout << "a4=" << a4 << endl; system("pause"); return 0; }

3.2 赋值运算符

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream> using namespace std; int main() { //赋值运算 // = int a = 10; a = 100; cout << "a=" << a << endl; // += a = 10; a += 2 ; cout << "a=" << a << endl; // -= a = 10; a -= 2; cout << "a=" << a << endl; // *= a = 10; a *= 2; cout << "a=" << a << endl; // /= a = 10; a /= 2; cout << "a=" << a << endl; // %= a = 10; a %= 2; cout << "a=" << a << endl; system("pause"); return 0; }

3.3 比较运算符

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream> using namespace std; int main() { int a = 10; int b = 20; cout << (a == b) << endl; // 0 cout << (a != b) << endl; // 1 cout << (a > b) << endl; // 0 cout << (a < b) << endl; // 1 cout << (a >= b) << endl; // 0 cout << (a <= b) << endl; // 1 system("pause"); return 0; }

3.4 逻辑运算符

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

运算符术语示例结果
!a假为真,真为假
&&a&&b全真为真,一假则假

3.4.1 非

复制代码
1
2
3
4
5
6
7
8
int main() { int a = 10; cout << !a << endl; // 0 cout << !!a << endl; // 1 system("pause") return 0; }

3.4.2 与

同真为真,其余为假

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//逻辑运算符 --- 与 #include<iostream> using namespace std; int main() { int a = 10; int b = 10; cout << (a && b) << endl;// 1 a = 10; b = 0; cout << (a && b) << endl;// 0 a = 0; b = 0; cout << (a && b) << endl;// 0 system("pause"); return 0; }

3.4.3 或

全假为假,其余为真

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//逻辑运算符 --- 或 #include <iostream> using namespace std; int main() { int a = 10; int b = 10; cout << (a || b) << endl;// 1 a = 10; b = 0; cout << (a || b) << endl;// 1 a = 0; b = 0; cout << (a || b) << endl;// 0 system("pause"); return 0; }

4 程序流程结构

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

  • 顺序结构:程序按顺序执行,不发生跳转
  • 选择结构:一句条件是否满足,有选择地执行相应功能
  • 循环结构:一句条件是否满足,循环多次执行某段的代码

4.1 选择结构

4.1.1 if语句

作用:执行满足条件的语句
三种形式:

  • 单行格式
  • 多行格式
  • 多条件

4.1.1.1 单行格式if语句

if条件后面不要加分号

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream> using namespace std; int main() { //用户输入分数,如果分数大于600,是为考上一本,在屏幕上输出 //1、用户输入分数 int score = 0; cout << "请输入一个分数:" << endl; cin >> score; //2、打印用户输入信息 cout << "您输入的分数是:" << score << endl; //3、判断分数是否大于600,如果大于,输出恭喜 if (score > 600) { cout << "恭喜您考上一本大学" << endl; } system("pause"); return 0; }

4.1.1.2 多行格式if语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream> using namespace std; int main() { int score = 0; cout << "请输入考试分数:" << endl; cin >> score; if (score > 600) { cout << "我考上了一本大学" << endl; } else { cout << "我未考上一本大学" << endl; } system("pause"); return 0; }

4.1.1.3 多条件if语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream> using namespace std; int main() { //选择结构 多条件语句 //输入一个考试分数,如果大于600,视为考上一本,在屏幕上输出 //大于500,视为考上二本大学,屏幕输出 //大于400,视为考上三本大学,屏幕输出 //小于等于400视为未考上本科,屏幕输出 //1、用户输入分数 int score = 0; cout << "请输入您的分数:" << endl; cin >> score; //2、提示用户输入的分数 cout << "您输入的分数是:" << score << endl; //3、判断用户输入的分数 if (score > 600) { cout << "恭喜您考上一本大学" << endl; } else if (score > 500) { cout << "您考上了二本大学" << endl; } else if (score > 400) { cout << "您考上了三本大学" << endl; } else { cout << "您未考上本科,再接再厉" << endl; } system("pause"); return 0; }

4.1.1.4 if嵌套

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//案例需求: //提示用户输入一个高考考试分数,根据分数做如下判断 //分数如果大于600分视为考上一本,大于500分考上二本,大于400考上三本,其余视为未考上本科; //在一本分数中,如果大于700分,考入北大,大于650分,考入清华,大于600考入人大。 #include<iostream> using namespace std; int main() { //1、提示输入高考分数 int score = 0; cout << "请输入您的分数:" << endl; cin >> score; //2、显示输入高考分数 cout << "你输入的分数是:" << score << endl; //3、判断 //如果大于600,一本 //大于700,清华 //大于650,北大 //其余人大 //如果大于500,二本 //如果大于400,三本 // 其余情况,未考上本科 if (score > 600) { cout << "恭喜您考上一本" << endl; if (score > 700) { cout << "恭喜您考上清华大学" << endl; } else if (score > 650) { cout << "恭喜您考上北大" << endl; } else { cout << "恭喜您考上人大" << endl; } } else if (score > 500) { cout << "恭喜您考上一本大学" << endl; } else if(score > 400) { cout << "恭喜您考上二本大学" << endl; } else { cout << "您未考上本科,再接再厉" << endl; } system("pause"); return 0; }

4.1.1.5 案例:三只小猪

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//练习案例: 三只小猪称体重 //有三只小猪ABC,请分别输入三只小猪的体重,并且判断哪只小猪最重? #include<iostream> using namespace std; int main() { //1、提示 int A = 0; int B = 0; int C = 0; //2、让用户输入三只小猪的重量 cout << "请输入小猪A的重量" << endl; cin >> A; cout << "请输入小猪B的重量" << endl; cin >> B; cout << "请输入小猪C的重量" << endl; cin >> C; //3、判断哪只最重 if (A > B) { if (A > C) { cout << "A小猪最重" << endl; } else { cout << "C小猪最重" << endl; } } else { if (B > C) { cout << "B小猪最重" << endl; } else { cout << "C小猪最重" << endl; } } system("pause"); return 0; }

4.1.2 三目运算符

作用:通过三目运算符实现简单的判断
语法:表达式1?表达式2:表达式3
解释:
如果表达式1的值为真,执行表达式2,并返回表达式2的结果
如果表达式1的值为假,执行表达式3,并返回表达式3的结果

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream> using namespace std; int main() { //创建三个变量a b c //将a 和b作比较,将变量大的值赋值给变量c int a = 10; int b = 20; int c = 0; c = (a > b ? a : b); cout << "c=" << c << endl; //在c++中三目运算符返回的是变量,可以继续赋值 (a < b ? a : b) = 100; cout << "a=" << a<< endl; cout << "b=" << b << endl; system("pause"); return 0; }

4.1.3 switch语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream> using namespace std; //if 和switch 区别: //switch 缺点:判断的时候只能是整型或者字符型,不可以是一个区间 // 优点:结构清晰,执行效率高 //case里面如果没有break会一直向下执行 int main() { //请给电影评分 //10 ~ 9 经典 // 8 ~ 7 非常好 // 6 ~ 5 一般 // 5分以下 烂片 int score = 0; cout << "请给电影打分" << endl; cin >> score; cout << "您打的分数为:" << score << endl; switch (score) { case 10: case 9: cout << "经典" << endl; break;//退出当前分支 case 8: cout << "非常好" << endl; break; case 7: cout << "非常好" << endl; break; case 6: cout << "一般" << endl; break; case 5: cout << "一般" << endl; break; default: //其他情况 cout << "烂片" << endl; break; } system("pause"); return 0; }

4.2 循环结构

4.2.1 while循环语句

作用: 满足循环条件,执行循环语句
语法:while(循环条件) { 循环语句 }
解释:只要循环条件的结果为真,就执行循环语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream> using namespace std; int main() { //while循环 //打印0~9 10个数字 int num = 0; while (num < 10) { cout << num << endl; num++; } system("pause"); return 0; }

4.2.1.1 案例:猜数字

//添加随机种子 作用利用当前系统时间生成随机数,防止每次随机数都一样
#include
srand((unsigned int)time(NULL));

int num = rand() % 100 + 1 ; //随机生成 1~100随机数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream> using namespace std; //time系统时间头文件包含 #include <ctime> int main() { //添加随机种子 作用利用当前系统时间生成随机数,防止每次随机数都一样 srand((unsigned int)time(NULL)); //1、系统生成随机数 int num = rand() % 100 + 1 ; //随机生成 1~100随机数 //cout << num << endl; //2、玩家进行猜测 int val = 0; //玩家输入数据 while (1) //一直循环 { cin >> val; //3、判断玩家的猜测 //猜错 提示猜的结果 过大或过小 重新返回第二步 if (val > num) { cout << "数字过大" << endl; } else if (val < num) { cout << "数字过小" << endl; } else { cout << "恭喜您猜对了" << endl; break;//猜对了 退出 游戏 } } system("pause"); return 0; }

4.2.2 do…while循环语句

分开比较

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream> using namespace std; int main() { //do...while //在屏幕上输出10个数 int num = 0; //do { // cout << num << endl; // num++; //} //while (num < 10); //do while 和while区别:前者先执行一次循环,在判断循环条件 //比较1 和 2的区别 1 //while (num ) //{ // cout << num << endl; // num++; //} // 此时 num = 0 条件为假 输出为空 1.1 //while (++num ) //{ // cout << num << endl; // //} // 此时一开始 num = 1 条件为真 一直输出 2 //do { // cout << num << endl; // num++; //} //while (num ); //此时 num = 1 条件为真 一直循环下去 2.1 //do { // cout << num << endl; // //} while (++num); //此时num =1 条件为真 一直循环下去 2.2 //do { // cout << num << endl; //} while (num++); //此时num =0 条件为假 system("pause"); return 0; }

4.2.2.1 案例:水仙花数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream> using namespace std; //水仙花数 int main() { //1、先打印所有三位数字 int num = 100; do { //2、从所有三位数中找到水仙花数 int a = 0; //各位 int b = 0; //十位 int c = 0; //百位 a = num % 10; //获取个位 b = num / 10 % 10; //获取十位 c = num / 100; //获取百位 if (num == a * a * a + b * b * b + c * c * c) { cout << num << endl; } num++; } while (num < 1000); system("pause"); return 0; }

4.2.3 for循环语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//for循环:满足循环条件,执行循环语句 //语法:for(起始表达式;条件表达式;末未循环体){循环语句} #include<iostream> using namespace std; int main() { //从0打印到9 for (int i = 0; i < 10; i++) //分号分割 { cout << i << endl; } system("pause"); return 0; }

4.2.3.1 案例:敲桌子

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream> using namespace std; int main() { for (int i = 1; i <= 100; i++) { if (i % 10==7 || i/10==7 || i%7==0) { cout << "敲桌子" << endl; } else { cout << i << endl; } } system("pause"); return 0; }

4.2.4 嵌套循环

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream> using namespace std; int main() { //利用循环嵌套实现星图 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { cout << "*"; } cout << endl; } system("pause"); return 0; }

4.2.3.1 案例:乘法表

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//练习案例:九九乘法口诀表 //案例描述:利用嵌套循环,实现九九乘法表 #include<iostream> using namespace std; int main() { for (int i = 1; i < 10; i++) { for (int j = 1; j <= i; j++) { cout << j << "*" << i << " = " << i * j <<" " ; } cout << endl; } system("pause"); return 0; }

4.3 跳转语句

4.3.1 break语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//break作用:用于跳出选择结构 或 循环结构 //出现时机:1)出现在switch语句中,作用是终止case并跳出switch // 2)出现在循环语句中,作用是跳出当前循环 // 3)出现在嵌套循环中,跳出最近的循环语句 #include<iostream> using namespace std; int main() { //1、在switch 语句中使用 //cout << "请选择您挑战副本的难度:" << endl; //cout << "1、普通" << endl; //cout << "2、中等" << endl; //cout << "3、困难" << endl; //int num = 0; //创建一个选择结果 //cin >> num; //等待用户输入 //switch (num) //{ //case 1: // cout << "您选择的是普通难度" << endl; // break; //case 2: // cout << "您选择的是一般难度" << endl; // break; //case 3: // cout << "您选择的是困难难度" << endl; // break; //default: // break; //} //2、出现循环语句 for (int i = 0; i < 10; i++) { if (i == 5) { break; //退出当前循环 } cout << i << endl; //0 1 2 3 4 } //3、出现在嵌套循环语句中 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 5) { break; } cout << "*" ; } cout << endl; } system("pause"); return 0; }

4.3.2 continue语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//**作用:continue在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环 // break退出循环,结束 #include<iostream> using namespace std; int main() { for (int i =1; i < 100; i++) { if (i % 2 == 0) //打印奇数 { continue; //跳过下面循环,重头开始执行 } cout << i << endl; //1 3 5 7 ... } system("pause"); return 0; }

4.3.3 goto语句

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//goto语句:无条件跳转语句 //goto语法;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 概述

所谓的数组就是一个集合,里面存放了想同类型的数据元素

特点1:数组中的每个数据元素都是相同的数据类型
特点2:数组是由连续的内存位置组成的

5.2 一维数组

5.2.1 一维数组定义方式

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream> using namespace std; int main() { 定义方式1 数据类型 数组名[元素个数]; //int score[10]; 利用下标赋值 //score[0] = 100; //score[1] = 99; //score[2] = 85; 利用下标输出 //cout << score[0] << endl; //cout << score[1] << endl; //cout << score[2] << endl; 第二种定义方式 数据类型 数组名[元素个数] = {值1,值2 ,值3 ...}; 如果{}内不足10个数据,剩余数据用0补全 //int score2[10] = { 100, 90,80,70,60,50,40,30,20,10 }; 逐个输出 cout << score2[0] << endl; cout << score2[1] << endl; 一个一个输出太麻烦,因此可以利用循环进行输出 //for (int i = 0; i < 10; i++) // // cout << score2[i] << endl; //} //定义方式3 //数据类型 数组名[] = {值1,值2 ,值3 ...}; int score3[] = { 100,90,80,70,60,50,40,30,20,10 }; for (int i = 0; i < 10; i++) { cout << score3[i] << endl; } system("pause"); return 0; }

5.2.2 一维数组数组名

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//一维数组名称的用途: //1)可以统计整个数组在内存中的长度 //2)可以获取数组在内存中的首地址 #include<iostream> using namespace std; int main() { //1、通过数组名统计整个数组占用内存大小 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << "整个数组占用内存空间为:" << sizeof(arr) << endl; //40 cout << "每个数组占用内存空间为:" << sizeof(arr[0]) << endl; //4 cout << "整组中共有元素个数:" << sizeof(arr) / sizeof(arr[0]) << endl; //10 //2、可以通过数组名查看数组首地址 cout << "数组首地址为:" << arr << endl; //结果为16进制 cout << "数组首地址为:" << (int)arr << endl; //强转为10进制 cout << "数组中第一个元素地址为:" << (int)&arr[0] << endl; cout << "数组中第一个元素地址为:" << (int)&arr[1] << endl; //数组名是常量,不可以进行赋值操作 //arr = 100; system("pause"); return 0; }

5.2.2.1 案例:五只小猪称体重

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream> using namespace std; int main() { int arr[] = { 100,200,350,300,201 }; int max = 0; for (int i = 0; i < 5; i++) { if (arr[i] > max) { max = arr[i]; } } cout << "最重小猪体重:"<< max << endl; system("pause"); return 0; }

5.2.2.2 案例:元素逆置

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//元素逆置--声明一个5个元素的数组,并且将元素逆置 //如:原数组元素为:1,3,2,5,4 逆置后输出结果为4,5,2,3,1 #include<iostream> using namespace std; int main() { int arr[] = { 1,3,2,5,4 }; cout << "数组逆置前" << endl; for (int i = 0; i < 5; i++) { cout << arr[i] << endl; } //2、实现逆置 //2.1记录起始下标位置 //2.2记录结束下标位置 //2.3起始下标与结束下标的元素互换 //2.4起始位置++,结束位置-- //2.5循环执行2.1操作,直到起始位置>=结束位置 int start = 0; int end = sizeof(arr) / sizeof(arr[0]) - 1; while (start < end) { int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; //下标更新 start++; end--; } //3、打印逆置后数组 cout << "逆置后数组" << endl; for (int i = 0; i < 5; i++) { cout << arr[i] << endl; } system("pause"); return 0; }

5.2.3 冒泡排序

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//冒泡排序 //作用: 最常用的排序算法,对数组内元素进行排序 //比较相邻的元素。如果第一个比第二个大,就交换他们两个。 ///对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。 //重复以上的步骤,每次比较次数 - 1,直到不需要比较 #include<iostream> using namespace std; int main() { int arr[9] = { 2,4,0,5,7,1,3,8,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; }

5.3 二维数组

5.3.1 二维数组定义方式

第二种效率最高

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//二维数组定义的四种方式: //数据类型 数组名[行数][列数]; //数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } }; //数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 }; //数据类型 数组名[ ][列数] = { 数据1,数据2,数据3,数据4 }; #include<iostream> using namespace std; int main() { //1、数据类型 数组名[行数][列数]; int arr[2][3]; arr[0][0] = 1; arr[0][1] = 2; arr[0][2] = 3; arr[1][0] = 4; arr[1][1] = 5; arr[1][2] = 6; //cout << arr[0][0] << endl; //cout << arr[0][1] << endl; //cout << arr[0][2] << endl; //外层循环打印行数,内层循环打印列数 for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { cout << arr[i][j] << endl; } } //2、数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } }; int arr2[2][3] = { {1,2,3}, {4,5,6} }; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { cout << arr2[i][j] <<" "; } cout << endl; } //3、数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 }; int arr3[2][3] = { 1,2,3,4,5,6 }; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { cout << arr3[i][j] << " "; } cout << endl; } //3、数据类型 数组名[ ][列数] = { 数据1,数据2,数据3,数据4 }; system("pause"); return 0; }

5.3.2 二维数组数组名

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream> using namespace std; int main() { //二维数组名称用途 //1、可以查看占用内存空间大小 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; //2、可以查看二维数组的首地址 cout << "二维数组首地址:" << arr << endl; cout << "二维数组第一行地址:" << arr[0] << endl; cout << "二维数组第二行地址:" << arr[1] << endl; cout << "二维数组第一个元素的地址:" << &arr[0][0] << endl; cout << "二维数组第二个元素地址为:" << &arr[0][1] << endl; system("pause"); return 0; }

5.3.3 案例:考试成绩

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream> using namespace std; #include<string> int main() { //二维数组案例-考试成绩统计 //1、创建二维数组 int scores[3][3] = { {100,100,100}, {90,50,100}, {60,70,80} }; string names[3] = { "张三","李四","王五" }; //2、统计每个人的总和分数 for (int i = 0; i < 3; i++) { int sum = 0; for (int j = 0; j < 3; j++) { sum += scores[i][j]; } cout << names[i]<< "的总分为:" << sum << endl; } system("pause"); return 0; }

6 函数

6.1 概述

**作用:**将一段经常使用的代码封装起来,减少重复代码
一个较大的程序一般分为若干个程序块,每个模块实现特定的功能

6.2 函数的定义

  • 返回值类型:一个函数可以返回一个值,在函数定义中
  • 函数名:给函数起个名称
  • 参数列表:使用该函数时,传入的数据
  • 函数体语句:花括号内的代码,函数内需要执行的语句
  • return表达式:和返回值类型挂钩,函数执行完后,返回相应的数据
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream> using namespace std; //函数的定义 //语法: //返回值类型 函数名 (参数列表) {函数体语句 return表达式} //加法函数 实现两个两个整型相加,并且将相加的结果进行返回 int add(int num1, int num2) { int sum = num1 + num2; return sum; } int main() { //main 是入口函数 system("pause");//按任意键继续 return 0; //返回退出 }

6.3 函数的调用

语法:函数名(参数)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream> using namespace std; //加法函数 实现两个两个整型相加,并且将相加的结果进行返回 int add(int num1, int num2) //num1 num2是形参 { int sum = num1 + num2; return sum; } int main() { //main函数中调用add函数 int a = 10; int b = 20; //函数调用语法:函数名称(参数) //a b是实际参数 //当调用函数的时候,实参的值会传递给形参 int c = add(a, b); cout <<"c=" << c << endl; //30 a = 100; b = 200; c = add(a, b); cout << "c=" << c << endl; //300 system("pause"); return 0; }

6.4 值传递

  • 函数调用时实参将数值传入给形参
  • 值传递时,如果形参发生改变,不会影响实参

return;//返回值不需要的时候可以不写return

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream> using namespace std; //定义函数 实现两个数字进行交换函数 //如果函数不需要返回值,声明的时候可以写void 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;//返回值不需要的时候可以不写return } int main() { int a = 10; int b = 20; cout << "a=" << a << endl; //10 cout << "b=" << b << endl; //20 //当我们做值传递的时候,函数的形参发生改变,并不会影响实参 swap(a, b); cout << "a=" << a << endl; //10 cout << "b=" << b << endl; //20 system("pause"); return 0; }

6.5 函数的常见样式

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream> using namespace std; //函数常见样式 //1、无参无返 void test01() { cout << "this is test01" << endl; //this is test01 } //2、有参无返 void test02(int a) { cout << "this is test02 a= " << a << endl; //this is test02 a= 100 } //3、无参有返 int test03() { cout << "this is test03" << endl; //this is test03 return 10; } //4、有参有返 int test04(int b) { cout << "this is test04 b=" <<b<< endl; //this is test04 b=10000 return b; } int main() { //无参无返函数调用 test01(); //有参无返函数调用 test02(100); //无参有返函数调用 int c = test03(); cout << "c=" << c << endl; //c=10 //有参有返函数调用 int num2 = test04(10000); cout << "num2=" << num2 << endl; //num2=10000 system("pause"); return 0; }

6.6 函数的声明

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream> using namespace std; //函数的声明 //比较函数,实现两个整型数字进行比较,返回比较大的值 //提前告诉编译器函数的存在,可以利用函数的声明 //函数的声明 //声明可以写多次 定义只能写一次 int max(int a, int b); int main() { int a = 10; int b = 20; cout << max(a, b) << endl; system("pause"); return 0; } //定义 int max(int a, int b) { return a > b ? a : b; }

6.7 函数的分文件编写

作用:让代码结构更清晰
分文件编写4步骤:

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

swap.h头文件

复制代码
1
2
3
4
5
#include<iostream> using namespace std; //函数的声明 void swap(int a, int b);
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream> using namespace std; #include "swap.h" 函数的声明 //void swap(int a, int b); // 函数的定义 //void swap(int a, int b) //{ // int temp = a; // a = b; // b = temp; // // cout << "a= " << a << endl; // cout << "b=" << b << endl; //} int main() { int a = 10; int b = 20; swap(a, b); system("pause"); return 0; }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
#include"swap.h" //双引号代表自定义头文件 //函数的定义 void swap(int a, int b) { int temp = a; a = b; b = temp; cout << "a= " << a << endl; cout << "b=" << b << endl; }

7 指针

7.1 指针的基本概念

指针的作用:可以通过指针简介访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址

7.2 指针变量的定义和使用

指针定义语法:数据类型 * 指针变量名 int*p;
p = &a; //& 取址符号
通过p可以找到a所在的内存 并且通过*p修改这个内存

*p指向数据对应的地址
p代表这个数据,可以修改

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream> using namespace std; int main() { //1、定义指针 int a = 10; //指针定义语法:数据类型 * 指针变量名 int*p; //让指针记录变量a的地址 p = &a; //& 取址符号 cout << "a的地址为:" << &a << endl; //十六进制 cout << "a的地址为:" << (int)&a << endl; //强转为十进制 cout << "指针p为:" << (int)p << endl; //和上面结果相同,所以指针就是地址 //2、使用指针 //可以通过解引用的方式来找到指针指向的内存 //指针前加 * 代表解引用,找到指针指向的内存中的数据 *p = 1000; //p前面加个*代表找到了p指向的内存中的数据 cout << "a=" << a << endl; //1000 通过p可以找到a所在的内存 并且通过*p修改这个内存 cout << "*p=" << *p << endl; //1000 system("pause"); return 0; }

7.3 指针所占内存空间

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream> using namespace std; int main() { //指针所占内存空间 int a = 10; //int * p; //p = &a; int* p = &a; //在32位操作系统下,指针是占4个字节空间大小,不管是什么数据类型 //64位操作系统下,8个字节 cout << "sizeof(int *)=" << sizeof(int*) << endl; //整型指针 cout << "sizeof(int *)=" << sizeof(p) << endl; //同上 cout << "sizeof(int *)=" << sizeof(float *) << endl; cout << "sizeof(int *)=" << sizeof(double *) << endl; cout << "sizeof(int *)=" << sizeof(char *) << endl; system("pause"); return 0; }

7.4 空指针和野指针

**空指针:**指针变量指向内存中编号为0的空间
**用途:**初始化指针变量
**注意:**空指针指向的内存是不可以访问的

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream> using namespace std; int main() { //1、空指针用于给指针变量进行初始化 int* p = NULL; //2、空指针是不可以进行指针访问的 //0~255之间的内存编号是系统占用的,不允许用户访问 *p = 100//报错,可以指向,但不可以访问 cout << *p << endl; //会出错 system("pause"); return 0; }

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream> using namespace std; int main() { //在程序中,尽量避免出现野指针 int* p = (int*)0x1100; //0x1100是十六进制的数,前面加上(int*)变为指针类型,没有权限操作那块内存 cout << *p << endl; //报错 system("pause"); return 0; }

7.5 const修饰指针

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream> using namespace std; int main() { //1、const修饰指针 常量指针 int a = 10; int b = 20; const int* p = &a; //指针指向的值不可以改,指针的指向可以改 //*p = 20;错误 p = &b; //正确 //2、const修饰常量 指针常量 //指针的指向不可以改,指针指向的值可以改 int* const p2 = &a; *p2 = 100;//正确 //p2 = &b;//错误,指针的指向是不可以改的 //3、const修饰指针和常量 const int* const p3 = &a; //指针的指向 和指向的值 都不可以改 //*p3 = 100; //错误 //p3 = &b; //错误 system("pause"); return 0; }

7.6 指针和数组

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream> using namespace std; int main() { //指针和数组 //利用指针访问数组中的元素 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << "第一个元素为:" << arr[0] << endl; int* p = arr; //arr就是数组首地址 cout << "利用指针访问第一个元素:" << *p << endl; p++; cout << "利用指针访问第二个元素:" << *p << endl;//让指针向后偏移4个字节 cout << "利用指针遍历数组" << endl; int* p2 = arr; for (int i = 0; i < 12; i++) { //cout << arr[i] << endl; cout << *p2 << endl; p2++; } system("pause"); return 0; }

7.7 指针和函数

作用:利用指针做函数参数,可以修改实参的值
**值传递:**可以修改实参
**地址传递:**不可以修改实参

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream> using namespace std; //实现两个数字进行转换 void swap01(int a, int b) { int temp = a; a = b; b = temp; cout << "swap01 a= " << a << endl; //形参改变了 cout << "swap01 b= " << b << endl; } void swap02(int *p1, int *p2) { int temp = *p1; *p1 = *p2; *p2 = temp; //cout << "swap01 *p1= " << *p1 << endl; //形参改变了 //cout << "swap01 *p2= " << *p2 << endl; } int main() { //指针和函数 //1、值传递 int a = 10; int b = 20; //swap01(a, b); //2、地址传递 //如果是地址传递,可以修改实参 swap02(&a, &b); cout << "a= " << a << endl; //实参未改变 cout << "b= " << b << endl; system("pause"); return 0; }

7.8 指针、数组、函数

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream> using namespace std; //冒泡排序函数 参数1 数组的首地址 参数2 数组的长度 void bubbleSort(int * arr,int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1 - i; j++) { //如果j>j+1的值 交换数字 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() { //1、先创建数组 int arr[] = { 4,3,6,9,1,2,10,8,7,5 }; //数组长度 int len = sizeof(arr) / sizeof(arr[0]); //2、创建函数,实现冒泡排序 bubbleSort(arr, len); //3、打印排序后的数组 printArray(arr, len); system("pause"); return 0; }

8 结构体

8.1结构体基本概念

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

8.2 结构体定义和使用

**语法:**struct 结构体名{结构体成员列表};
通过结构体创建变量的三种表达方式:

  • struct 结构体名 变量名 (常用)
  • struct 结构体名 变量名 = {成员1值,成员2值。。} (常用)
  • 定义结构体时顺便创建变量
    结构体创建时struct可以省略,但定义结构体时不可以
    结构体变量利用操作符“.”访问成员
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream> using namespace std; #include<string> // 1、创建学生数据类型:学生包括(姓名,年龄,分数) //自定义数据类型,一些类型集合组成的一个类型 //语法:struct 结构体名{结构体成员列表}; struct Student { //成员列表 //姓名 string name; //年龄 int age; //分数 int score; }s3;//顺便创建结构体变量 //2、通过学生类型创建具体学生 int main() { //2.1 struct Student s1 //struct是可以省略(创建时可以省略,定义时不可以) struct Student s1; //给s1属性赋值,通过.访问结构体变量中的属性 s1.name = "张三"; s1.age = 19; s1.score = 100; cout << "姓名是:" << s1.name << "年龄是" << s1.age << "分数是:" << s1.score << endl; //2.2 struct Student s2= {...} struct Student s2 = { "张三",18,99 }; cout << "姓名是:" << s2.name << "年龄是" << s2.age << "分数是:" << s2.score << endl; //2.3 在定义结构体时顺便创建结构体变量 s3.name = "张三"; s3.age = 19; s3.score = 100; cout << "姓名是:" << s3.name << "年龄是" << s3.age << "分数是:" << s3.score << endl; system("pause"); return 0; }

8.3 结构体数组

**作用:**将定义的结构体放入到数组中方便维护
**语法:**struct 结构体名 数组名 [元素个数] = { {} ,{},{} ,{} }
定义结构体中的成员顺序和创建结构体中的成员顺序不能颠倒

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream> using namespace std; #include<string> //结构体定义 //1、定义结构体 struct Student { string name; int age; int score; }; int main() { //2、创建数组结构体 struct Student StuArray[3] = { {"张三",18,100}, {"李四",19,101}, {"王五",20,102} }; //3、给结构体数组中的元素赋值 StuArray[2].name = "李二"; StuArray[2].age = 21; StuArray[2].score = 104; //4、遍历结构体数组 for (int i = 0; i < 3; i++) { cout << "姓名 " << StuArray[i].name << "年龄 " << StuArray[i].age << "分数" << StuArray[i].score << endl; } system("pause"); return 0; }

8.4 结构体指针

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream> using namespace std; //结构体定义 struct student { string name; int age; int score; }; int main() { //1、创建学生结构体变量 struct student s = { "张三",18 ,200 }; //2、通过指针指向结构体变量 student* p = &s; //struct省略 //3、通过指针访问结构体变量中的数据 //通过结构体指针 访问结构体中的属性 需要利用‘ -> ’ cout << "姓名:" << p->name << " 年龄" << p->age << " 分数" << p->score << endl; system("pause"); return 0; }

8.5 结构体嵌套结构体

**作用:**结构体中的成员可以是另一个结构体
定义的时候 先有学生 后有老师

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream> using namespace std; #include<string> //定义学生结构体 struct student { string name; int age; int score; }; //定义老师结构体 struct teacher { int id; string name; int age; struct student stu; }; int main() { //结构体嵌套结构体 //创建老师 teacher t; t.id = 100; t. name = "老王"; t.age = 50; t.stu.name = "小李"; t.stu.age = 19; t.stu.score = 99; cout << " 老师工号:" << t.id << " 老师姓名:" << t.name << " 老师年龄:" << t.age << " 学生姓名:" << t.stu.name << " 学生年龄:" << t.stu.age << " 学生分数: " << t.stu.score << endl; system("pause"); return 0; }

8.6 结构体做函数参数

**作用:**将结构体作为参数向函数中传递
两种方式:

  • 值传递 (主函数中数据不修改)
  • 地址传递 (修改主函数中的数据)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream> using namespace std; //定义学生结构体 struct student { string name; int age; int score; }; //打印学生信息函数 //1、值传递 void printStudent1(struct student s) { s.age = 100; cout << "子函数 1 中 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl; } //2、地址传递 void printStudent2(struct student * p) { p->age = 200; cout << "子函数 2 中 姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl; } int main() { struct student s; s.name = "小王"; s.age = 18; s.score = 400; printStudent2(&s); printStudent1(s); cout << "main函数中 姓名:" << s.name << " 年龄:" << s.age << " 分数:" << s.score << endl; system("pause"); return 0; }
  • 值传递 数组 是用 “.” 访问结构体成员
  • 地址传递 (即指针) 是用“->”访问结构体成员

8.7 结构体中const使用场景

作用:用 const 防止误操作

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream> using namespace std; //定义学生结构体 struct student { string name; int age; int score; }; //创建打印函数 //将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来 void printStudents(const student *s) //原来是值传递,但是占用内存空间,用指针的地址传递,但修改子函数中的参数,主函数也会发生改变,故加入const防止误操作 { //s->age = 100; //加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作 cout<< "姓名:" << s->name << " 年龄:" << s->age << " 分数:" << s->score << endl; } int main() { //创建结构体变量 struct student s = { "张三", 18 , 400 }; //通过函数打印结构体变量信息 printStudents(&s); cout <<" main中年龄:" << s.age << endl; system("pause"); return 0; }

8.8 结构体案例1

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//案例1--3名老师带 5名学生做毕设 //学生--姓名、考试分数、 #include<iostream> using namespace std; #include<string> #include<ctime> //学生结构体 struct student { string sname; int score; }; struct teacher { string tname; struct student sArray[5]; }; void allocateSpace(struct teacher tArray[], int len) { string nameSeed = "ABCDE"; //开始给老师赋值 for (int i = 0; i < len; i++) { tArray[i].tname = "Teacher_"; tArray[i].tname += nameSeed[i]; //通过循环给每名老师所带的学生赋值 for (int j = 0; j < 5; j++) { tArray[i].sArray[j].sname = "Student_"; tArray[i].sArray[j].sname += nameSeed[j]; int random = rand() % 61 + 40; // 40~100 tArray[i].sArray[j].score = random; } } } //打印所有信息 void printInfo(struct teacher tArray[], int len) { for (int i = 0; i < len; i++) { cout << "老师姓名:" << tArray[i].tname << endl; for (int j = 0; j < 5; j++) { cout << "t学生姓名:" << tArray[i].sArray[j].sname << " 考试分数:" << tArray[i].sArray[j].score << endl; } } } int main() { //随机种子 srand((unsigned int)time(NULL)); //1、创建3名老师数组 struct teacher tArray[3]; //2、通过函数给3名老师的信息赋值,并给老师带的学生信息赋值 int len = sizeof(tArray) / sizeof(tArray[0]); allocateSpace(tArray, len); //3、打印所有老师及所带的学生信息 printInfo(tArray, len); system("pause"); return 0; }

8.9 结构体案例2

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream> using namespace std; #include<string> //1、设计英雄结构体 struct Hero { string name; int age; string sex; }; //冒泡排序 实现年龄升序排列 void bubbleSort(struct Hero heroArray[], int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { //如果j 下标元素年龄 大于 j+1 下标的元素的年龄 ,交换两个元素 if (heroArray[j].age > heroArray[j + 1].age) { struct Hero temp = heroArray[j]; heroArray[j] = heroArray[j + 1]; heroArray[j + 1] = temp; } } } } //打印排序后数组中的信息 void printHero(struct Hero heroArray[],int len ) { for (int i = 0; i < len; i++) { cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << "性别:" << heroArray[i].sex << endl; } } int main() { //2、创建数组存放5名英雄 struct Hero heroArray[5] = { {"刘备",23,"男"}, {"关羽",22,"男"}, {"张飞",20,"男"}, {"赵云",21,"男"}, {"貂蝉",19,"女"}, }; int len = sizeof(heroArray) / sizeof(heroArray[0]); cout << "排序后打印:" << endl; for (int i = 0; i < len; i++) { cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << "性别:" << heroArray[i].sex << endl; } //3、对数组进行排序,按照年龄进行升序排序 bubbleSort(heroArray, len); cout << "排序后打印:" << endl; //4、将排序后结果打印输出 printHero(heroArray, len); system("pause"); return 0; }

9 通讯录管理系统

9.1 系统需求

实现功能如下:

  • 1、添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多纪录1000
  • 2、显示联系人:显示通讯录中所有联系人的信息
  • 3、删除联系人:按照姓名进行删除指定联系人
  • 4、查找联系人:按照姓名查看指定联系人信息
  • 5、修改联系人:按照姓名重新修改指定联系人
  • 6、清空联系人:清空通讯录中所有信息
  • 0、退出通讯录:退出当前使用的通讯录

9.2 创建项目

9.3 菜单功能

功能描述:用户选择功能的界面
实现步骤:

  • 封装函数显示该界面 如 void showMenu()
  • 在main函数中调用封装好的函数

9.4 退出功能

功能描述:退出通讯录系统
思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建
当用户选择0的时候,执行退出,选择其他先不做操作,也不会退出程序

9.5 添加联系人

功能描述:
实现添加联系人功能,联系人上限位1000人,联系人信息包括(姓名,性别,年龄,联系电话,家庭住址)
实现步骤:

  • 设计联系人结构体
  • 设计通讯录结构体
  • main函数中创建通讯录
  • 封装添加联系人函数
  • 测试添加联系人功能

9.6 显示联系人

功能描述:
显示通讯录中已有联系人信息
显示联系人实现步骤:

  • 封装显示联系人函数(思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中的信息)
  • 测试显示联系人函数

9.7 删除联系人

功能描述:按照姓名进行删除指定联系人
实现步骤:

  • 封装检测联系人是否存在(设计思路:删除联系人前,我们需要先判断用户输入的联系人是否存在,如果删除,不存在提示用户没有要删除的联系人,一次我们可以把要检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1)
  • 封装删除联系人函数
  • 测试删除联系人功能

9.8 查找联系人

9.9 修改联系人

功能描述:按照姓名重新修改指定联系人
实现步骤

  • 封装函数
  • 测试功能
    实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人

9.10 清空联系人

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
#include<iostream> using namespace std; #include<string> #define MAX 1000 //宏常量 //设计联系人结构体 struct Person { string m_Name; int m_Sex; int m_Age; string m_Phone; string m_Addr; }; //设计通讯录结构体 struct Addressbooks { //通讯录中保存的联系人数组 struct Person personArray[MAX]; //嵌套 //通讯录中当前记录联系人个数 int m_Size; }; //菜单界面 void showMenu() { cout << "****************************" << endl; cout << "****** 1、添加联系人 *****" << endl; cout << "****** 2、显示联系人 *****" << endl; cout << "****** 3、删除联系人 *****" << endl; cout << "****** 4、查找联系人 *****" << endl; cout << "****** 5、修改联系人 *****" << endl; cout << "****** 6、清空联系人 *****" << endl; cout << "****** 0、退出通讯录 *****" << endl; cout << "****************************" << endl; } //1、添加联系人 void addPerson(Addressbooks* abs) { //判断通讯库是否已满,如果满了就不在添加 if (abs->m_Size == MAX) { cout << "通讯录已满,无法添加!" << endl; return; } else { //添加联系人 string name; cout << "请输入姓名:" << endl; cin >> name; abs->personArray[abs->m_Size].m_Name = name; //性别 cout << "请输入性别:" << endl; cout << "1---男" << endl; cout << "2---女" << endl; int sex = 0; while (true) { //如果输入的是1 或者 2 可以退出循环,因为输入的是正确值 //如果输入有误,重新输入 cin >> sex; if (sex == 1 || sex == 2) { abs->personArray[abs->m_Size].m_Sex = sex; break; } cout << "输入有误,请重新输入" << endl; } //年龄 cout << "请输入年龄:" << endl; int age = 0; cin >> age; abs->personArray[abs->m_Size].m_Age = age; //电话 cout << "请输入联系电话:" << endl; string phone; cin >> phone; abs->personArray[abs->m_Size].m_Phone = phone; //地址 cout << "请输入家庭住址:" << endl; string address; cin >> address; abs->personArray[abs->m_Size].m_Addr = address; //更新通讯录人数 abs->m_Size++; cout << "添加成功" << endl; system("pause"); //按任意键继续 system("cls"); //清屏操作 } } //2、显示联系人 void showPerson(Addressbooks* abs) { //判断通讯录中人数是否为0,如果是0,提示记录为空 //如果不是0,显示记录的联系人信息 if (abs->m_Size == 0) { cout << "当前记录为空" << endl; } else { for (int i = 0; i < abs->m_Size; i++) { cout << "姓名: " << abs->personArray[i].m_Name << "t"; cout << "性别: " << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "t"; cout << "年龄: " << abs->personArray[i].m_Age << "t"; cout << "电话: " << abs->personArray[i].m_Phone << "t"; cout << "住址: " << abs->personArray[i].m_Addr << endl; } } system("pause"); system("cls"); //清屏 } //检测联系人是否存在, 如果存在,返回联系人所在数组中的具体位置,不存在返回-1 //参数1 通讯录 参数2 对比姓名 int isExist(Addressbooks* abs, string name) { for (int i = 0; i < abs->m_Size; i++) { //找到用户输入的姓名 if (abs->personArray[i].m_Name == name) { return i; //找到啦,返回这个人在数组中的下标编号 } } return -1;//如果遍历结束没有找到,返回-1 } //3、删除联系人 void deletePerson(Addressbooks* abs) { cout << "请输入您要删除的联系人" << endl; string name; cin >> name; //ret == -1 未查到 //ret != -1 查到了 int ret = isExist(abs, name); if (ret != -1) { //查找到人,要进行删除操作 for (int i = ret; i < abs->m_Size; i++) { //数据前移 abs->personArray[i] = abs->personArray[i + 1]; } abs->m_Size--; //更新通讯录中人员数 cout << "删除成功" << endl; } else { cout << "查无此人" << endl; } system("pause"); system("cls"); } //4、查找联系人 void findPerson(Addressbooks* abs) { cout << "请输入您要查找的联系人" << endl; string name; cin >> name; //判断指定的联系人是否在通讯录中 int ret = isExist(abs, name); if (ret != -1) { cout << "姓名: " << abs->personArray[ret].m_Name << "t"; cout << "性别: " << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "t"; cout << "年龄: " << abs->personArray[ret].m_Age << "t"; cout << "电话: " << abs->personArray[ret].m_Phone << "t"; cout << "住址: " << abs->personArray[ret].m_Addr << endl; } else //未找到联系人 { cout << "查无此人" << endl; } system("pause"); system("cls"); } //5、修改联系人 void modifyPerson(Addressbooks* abs) { cout << "请输入您要修改的联系人" << endl; string name; cin >> name; int ret = isExist(abs, name); if (ret != -1) //找到指定联系人 { //姓名 string name; cout << "请输入姓名:" << endl; cin >> name; abs->personArray[ret].m_Name = name; //性别 cout << "请输入性别:" << endl; cout << "1---男" << endl; cout << "2---女" << endl; int sex = 0; while (true) { cin >> sex; if (sex == 1 || sex == 2) { //输入正确 退出循环输入 abs->personArray[ret].m_Sex = sex; break; } cout << "输入有误,请重新输入" << endl; } //年龄 cout << "请输入年龄:" << endl; int age = 0; cin >> age; abs->personArray[ret].m_Age = age; //电话 cout << "请输入联系电话:" << endl; string phone; cin >> phone; abs->personArray[ret].m_Phone = phone; //地址 cout << "请输入家庭住址:" << endl; string address; cin >> address; abs->personArray[ret].m_Addr = address; cout << "修改成功" << endl; } else //为找到联系人 { cout << "查无此人" << endl; } system("pause"); //按任意键继续 system("cls"); //清屏操作 } //6、清空联系人 void cleanPerson(Addressbooks* abs) { abs->m_Size = 0; //将当期记录联系人数量置为0,做逻辑清空操作 cout << "通讯录已清空" << endl; system("pause"); system("cls"); } int main() { //创建通讯录结构体变量 Addressbooks abs; //初始化通讯录中当前人员个数 abs.m_Size = 0; int select = 0; //创建用户选择输入的变量 while (true) { //菜单调用 showMenu(); cin >> select; switch (select) { case 1: //1、添加联系人 addPerson(&abs); //利用地址传递,可以修饰实参 break; case 2: //2、显示联系人 showPerson(&abs); break; case 3: //3、删除联系人 //一大段代码,加大括号变成代码段 /*{ cout << "请输入删除联系人姓名:" << endl; string name; cin >> name; if (isExist(&abs, name) == -1) { cout << "查无此人" << endl; } else { cout << "找到此人" << endl; } }*/ deletePerson(&abs); break; case 4: //4、查找联系人 findPerson(&abs); break; case 5: //5、修改联系人 modifyPerson(&abs); break; case 6: //6、清空联系人 cleanPerson(&abs); break; case 0: //0、退出通讯录 cout << "欢迎下次使用" << endl; system("pause"); return 0; break; default: break; } } system("pause"); return 0; }

最后

以上就是火星上白昼最近收集整理的关于c++ 知识点 基础篇1 C++初识2 数据类型3 运算符4 程序流程结构5 数组6 函数7 指针8 结构体9 通讯录管理系统的全部内容,更多相关c++内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部