实习集训【阶段1】 | 第1周

Day 1【easy】

环境搭建:

1、软件安装列表

1、Source Insight 4.0: 代码编辑软件【企业常用】
2、VMware Workstation: 虚拟机【用软件模拟硬件设备】
3、FeiQ: 局域网聊天软件
4、VNC: 局域网视频共享软件

软件资源: 夸克网盘

2、软件配置

1、Source Insight 4.0
(一)、注意破解流程
(二)、打开代码行提示:View ——> Line Numbers

在这里插入图片描述

2、VMware Workstation

1、打开虚拟机
step1:
在这里插入图片描述
step2:
在这里插入图片描述

2、设置共享文件夹
step1:
在这里插入图片描述
step2:
在这里插入图片描述
step3:
在Ubuntu终端 输入

cd /mnt/hgfs/

检查是否有自己设置的文件夹

相关知识点:

1、Linux的基本相关操作

1、cd 命令【切换目录】
格式:cd	目标目录
特殊用法:
	1、	./ 		当前文件夹
	2、	../ 	上一级文件夹
	3、	~ 		工作目录
	4、	- 		上一次访问的文件夹
-----------------------------------------------------------------------------------------------------
2、rm 命令【删除功能】
格式:rm	目标文件名
特殊用法:
	1、*通配符	经常与rm一起连用:rm *
-----------------------------------------------------------------------------------------------------
3、Tab 快捷键【补齐】
-----------------------------------------------------------------------------------------------------
4、clear 命令【清屏】

练习作业:

1、练习

练习1:

完成第一个C文件从编写 ——> 编译 ——> 运行的整个过程【要求代码编写在Windows, 编译运行在Ubuntu】

练习2:

熟悉printf() 和 scanf() 的操作:输入a b;要求输出 a + b == a+b

2、作业

作业1:

求出1000以内的奇数之和【要求代码编写在Windows, 编译运行在Ubuntu】

拓展思考:

(一) #include<> 和 #include" "的区别

1、前者一般为标准头文件,后者一般为非标准头文件
2、前者先到标准函数库寻找,后者先到当前目录寻找,再到标准函数库寻找

(二) 汇编过程中的错误

1、词法错误:指非法字符或拼写错关键字、标识符等
2、语法错误:指语法结构出错,如少分号、括号不匹配等
3、语义错误:
	类型不一致、参数不匹配等		(静态)
	死循环、变量为零时作除数等		(动态)

(三) C语言从编写 ——> 编译 ——> 运行的详细过程

1、编写:产生源文件【c文件】
2、编译:
	(一)、预处理:先处理伪指令(以#开头的指令)和特殊符号
	(二)、编译【s文件】:将c文件生成s文件,并且进行词法、语法、语义分析
	(三)、汇编【目标文件】:将s文件生成目标文件(机器码【二进制】)
			目标文件内容至少有:
				1、代码段
				2、数据段
	(四)、优化(不是每个机器都会优化代码):简化目标文件,减少运行时间和空间
3、连接:
	(一)、地址和符号解释:
	(二)、重定位:
	(三)、库文件连接【可执行文件】
		1、静态链接:
		2、动态链接:	

Day 2【hard】

相关知识点:

1、数据类型的分类

基本类型【系统分配的大小是固定的】
1、整型
类型大小
短整型(short)2Byte
整型 (int)4Byte
长整型(long)【32位处理器】Byte 4 /【64位处理器】Byte 8
>(一) 整型常量
类型表达方式格式符
10进制%d(有符号) / %u(无符号)
8进制以”0“开头%o
16进制以”0X“开头%x
2、实型(浮点型)
类型大小格式符
单精度实型(float)4Byte%f
双精度实型(double)8Byte%lf
>(一) 浮点数在CPU当中的存储规则

在这里插入图片描述
注意:不是所有的小数都能存储(如0.1),只能存储其的近似值

3、字符型(本质就是一个小于255的整数)
类型大小格式符
字符型(char)1Byte%c
>(一) 常见字符(如果想查看全部的ASCII,可在Linux中输入: man ascii 指令)
1、'\n'					换行
2、'\t'					对齐
3、'\r'					回到段落开头
4、'\'					转义字符
5、'\b'					删除前一个字符
6、'\\'					\ 字符
7、'%%'					% 字符
8、'\ddd'	ddd			8进制对于的数据	
9、'\xdd' 	dd			16进制对于的数据
4、数据的取值范围计算【对于每个基本类型都适用】:
1、原码、反码、补码
>正数:
	原码、反码、补码是一致的
>负数:
	例:8 (在32位处理器中时)		
		原码:	0000 0000 0000 0000 0000 0000 0000 1000
		反码:	0111 1111 1111 1111 1111 1111 1111 0111 	【除符号位之外,其余位取反】
		补码:	0111 1111 1111 1111 1111 1111 1111 1000		【将补码 +1】
------------------------------------------------------------------------------------------------------
2、数据取值范围知识点【以short为例】
(一) 计算过程
short的范围:-128 ~ 127
负数范围:1111 1111 ~ 1000 0001 ----> 【-(2^7 - 1) ~ -1】
正数范围:0000 0001 ~ 0111 1111 ----> 【1 ~ (2^7 - 1)】
两个特殊部分:
	0000 0000	"0"
	1000 0000	"-128" ----> -2^7
所以整个部分取值范围部分就是:-128 ~ 127
同理,可推出其他数据类型的取值范围

(二)当超出范围时,则会从该数据类型的最小值开始【轮回】
构造类型【系统无法分配指定的大小,由用户决定。此内容重要】
1、数组类型
2、结构体类型
3、联合类型
4、枚举类型
指针类型【非常重要!!!】
空类型 (void)

2、常量和变量

1、常量【在代码运行时不能实时改变】
------------------------------------------------------------------------------------------------------
2、变量【内存中具有特定属性的存储单元,用于存放数据,可在运行中改变】
(一) 分配的空间由数据类型进行规定
(二) 变量名和其对应单元的首地址可以有联系
------------------------------------------------------------------------------------------------------
3、常变量(具有保护作用,防止误操作)【在初始化之后不能再次赋值】
常见的例子:const int a;		// 初始化之后不能赋值

拓展部分:
1、auto			在我们的程序中基本看不到,一般在定义局部变量时都自动省略了
2、const		也就是read only,只读,不可写,若定义时未初始化,会被编译器自动初始化为0。const 量一般在main函数外部定义,若在子函数内部定义,则main函数无法调用该变量。
3、register		定义一个寄存器变量,让该变量的访问速度达到最快。当要非常频繁的调用一个变量时,可以定义为寄存器变量
4、extern		extern用来声明在当前文件中引用的变量在是其它文件中定义的全局变量。
5、static		静态变量,静态变量存储在静态区,定义时未初始化,会被编译器自动初始化为0,且只会被初始化一次。

3、数据类型的定义

定义格式

数据类型 变量名
例如:int a;

标识符[变量名]规则与规范
1、规则
· 不能与关键字同名
· 只能由数字、字母、下划线组成
· 不能以数字开头
------------------------------------------------------------------------------------------------------
2、规范
· 驼峰命名法		int	StudentAge;
· 下划线间隔法	int	student_age;
变量操作(读/写)【其中左值和右值的概念在指针中非常重要】
1、读操作:
>	通过变量名找到对应地址内部的参数(本质是找参数),此时的变量被称作【右值】
2、写操作:
>	通过变量名找到对应的地址(本质是找地址),此时的变量被称作【左值】

注意:特别重要的写操作:初始化(变量的第一次赋值)【很重要,不可偷懒】

4、类型转换

不管是什么数据类型,数据在CPU存储、运算中总是以(二进制补码)存在【这个观点非常重要!!!】

(一)有符号与无符号
1、决定对应数据最高位是否是符号位:(其中“1”代表负数,0”代表正数)
2、【以32位寄存器为例】当变量数据小于32位时,拷贝到寄存器后分情况讨论:
(一)、有符号位时,用符号位补充高位
(二)、无符号位时,用 "0"补充高位
(二)长字节与短字节
1、长字节 ——> 短字节
	只需要按短字节空间截取低位
2、短字节 ——> 长字节
	注意数据有误符号位,可以参考上述内容进行操作

练习作业:

1、练习

练习1(关于浮点数与0的判断)【非常重要!!!】:
void test1()
{
	float a = -1;
	while (1)
	{
		printf("%f\r",a);
		a += 0.1;
		sleep(1);
		/* 
			刷新输出缓存区,将刷新缓存区的数据直接输出
				输出的情况:
				1、当存在回车'\n'时,直接输出
				2、当输出缓存区满了时,自动输出
		*/
		fflush(stdout);
		if(-ESP<=a && a<=ESP)
		{
			printf("a值近似为0\n");
			break;
		}
	}	
}

练习2(字符小练习1):
void test2()
{
	printf("\t\141 \x62 c %c\n",'d');
}
练习3(字符小练习2):
void test3()
{
	char c;
	c = getchar();//从键盘上获取一个字符存放在变量c中
	putchar(c);//把指定的字符输出到终端上 
	putchar('a');
	putchar(97);
	putchar(c+2);
	putchar('\n');
}
练习4(字符串小练习):
void test4()
{
	printf("i like %s\n","zhoujielun");
}

2、作业【非常重要!!!】

请解释下列表达式在CPU运行时的详细过程【考点:有无符号和长短字节数据的转换】

作业1:
unsigned char c = 250;
char d;
d = c + 8;
printf ("%d %u\n",d,d);
作业2:
char c = 250;
int d;
d = c + 8;
printf ("%d %u\n",d,d);
作业3:
unsigned char c = 250;
int d;
d = c + 8;
printf ("%d %u\n",d,d);

拓展思考:

(一)大端与小端

大端:高地址存低字节,低地址存高字节
小端:低地址存低字节,高地址存高字节
人类读写数据习惯是大端字节序,大数据先读,小数据后读。所以小端是反人类的方式

在这里插入图片描述

(二)数据类型强转【例如:(int) a】与格式符【例如:%d】的区别

1、数据类型强转:是将a变量的原本存储的规则进行改变【会改变存储在计算机里的数据】
2、格式符:是将存储在计算机里的a变量,以指定的形式进行输出【不会改变存储在计算机里的数据】

此处建议结合
	float a = 1;		int b = 1;
在计算机存储的形式的差异性(结合上述描述的浮点数)

(三)输入[scanf]输出[printf]缓存区

背景:由于计算机设备处理时间给有不同,所以就会有输入输出的缓存区来暂时缓存数值,最后一起输出输入
	只有以下5种情况可以输出缓存区的值【针对输出缓存区printf较多】
		1、当填满缓存区时,自动输出
		2、当缓存区遇到换行‘\n’时,自动输出
		3、程序运行结束
		4、手动输出输出缓存区:fflush(stdout);
		5、遇到scanf时,自动输出

(四)小数二进制转化

【注意:如果二进制不能正好存储小数部分,就要提前知道二进制的精度(保留后几位)】
例题1:
	求0.8124的二进制,保留后6位
求法:
	0.8125 * 2 = 1.6248 	··············	取整数部分1,将小数部分继续相同操作
	0.6248 * 2 = 1.2496 	··············	取整数部分1,将小数部分继续相同操作	
	0.2496 * 2 = 0.4992 	··············	取整数部分0,将小数部分继续相同操作	
	0.4992 * 2 = 0.9984 	··············	取整数部分0,将小数部分继续相同操作
	0.9984 * 2 = 1.9968 	··············	取整数部分1,将小数部分继续相同操作
	0.9968 * 2 = 1.9936 	··············	取整数部分1,精度达标,停止操作
	最后【从上向下排列】(这里与整数部分求二进制不同)
	结果:0.110011
例题2:
	求0.8125的二进制
求法:
	0.8124 * 2 = 1.6250 	··············	取整数部分1,将小数部分继续相同操作
	0.6250 * 2 = 1.2500 	··············	取整数部分1,将小数部分继续相同操作	
	0.2500 * 2 = 0.5000 	··············	取整数部分0,将小数部分继续相同操作	
	0.5000 * 2 = 1.0000 	··············	取整数部分1,将小数部分为0,停止操作
	最后【从上向下排列】(这里与整数部分求二进制不同)
	结果:0.1101

(五)代码存储的位置【内存分段】

请添加图片描述

【与操作系统的分段管理系统有很大的关系】
作用:
	1、简化链接和装载过程
		由于程序被划分为不同的段,链接和装载变得更为灵活。程序的不同部分可以独立地被装载和管理。
	2、保护和安全
		分段提供了内存保护机制。操作系统可以设定不同的访问权限(如只读、可写)给不同的段,从而提高程序的安全性。
	3、共享和隔离
		不同程序或进程可以共享相同的段(如代码段),同时保持数据的隔离。
	4、动态增长
		某些段(如堆栈和堆)可以动态增长,这为动态内存分配提供了便利。
--------------------------------------------------------------------------------------------------------------------------------------
常见的内存分段:【从低地址到高地址】
	(一) 代码段(文本段):这个段包含程序的【可执行代码】。它通常是【只读】的,以防止程序代码被意外修改。
	(二) 常量段:有些系统可能设置一个专门的常量段,用于存储【常量值,如字符串字面量】等。这个段通常是【只读】的。
	(三) 数据段:用于存储程序【初始化的】全局变量和静态变量。
	(四) BSS段:用于存放程序【未初始化的】全局变量和静态变量。在程序开始执行之前,这个段中的数据通常被初始化为零。
	(五) 堆段:堆段用于动态内存分配,即程序运行时请求和释放的内存。
	(六) 共享段:【允许不同的进程共享相同的内存区域】,这对于进程间通信非常有用
	(七) 栈段:栈段用于支持函数调用时的参数传递、局部变量存储以及函数调用的返回地址。通常不用释放,自动回收。

Day 3【hard】

相关知识点:

表达式(用来表示某个意识的公式,用运算符连接操作数)

例:c = a + b; 【整体被称作语句,";"之前的部分被称作表达式】

运算符

(一)算术运算符【双目运算符,结合性:左 —> 右】
+(加法)、-(减法)、*(乘法)、/(除法)、%(取余)

重点
1、"/" 部分:
	(一) 整数 / 整数 = 整数 	【如果想得从低精度到高精度结果 --> 需要高精度数据参与计算,如:(0.1)*4/3 = 1.33333】
	(二) 小数 / 整数 = 小数
2、"%" 部分:(左右皆为整数,且被除余数不可为“0”)
【常见例题】
	(一)  5%3 = 2
	(二)  2%3 = 2
	(三) -5%2 = -1
	(四)  5%-2 = 1
	(五) -5%-2 = -1
(二)关系运算符【双目运算符,结合性:左 —> 右】

由关系运算符连接操作符所形成的式子被称作【关系表达式】

>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于)

易错点:
	printf("%d",(5>4>3));
结果:
	0
分析:
	先进行 5 > 4 计算 结果为 “1”
	再进行 1 > 3 计算 结果为 “0”
(三)逻辑运算符
!(逻辑非【单目】)、&&(逻辑与【双目】)、&(逻辑与【双目】)、||(逻辑或【双目】)、|(逻辑或【双目】)

易错点:
(一) 关于 && 和 || 的“惰性运算” ,而对于 & 和 | 来说就都得进行运算
	如果 [&& / ||] 之前就已经能判断是 [假 / 真] ,就无需进行后面的运算
------------------------------------------------------------------------------------------------------
(二) 关于 && 和 || 优先级结合问题
	例1:
		int a=0,b=1,c=1;
		int d=a&&(b=b-1)||(c=c-1);
		printf("%d %d %d %d",a,b,c,d);
	结果:
		0 1 0 0
	分析:
		a: a本身为0
		b: 由于 && 前的结果为0,所以不会进行b=b-1的计算,b为原值1
		c: 由于 || 前的结果为0,所以会进行c=c-1的计算,c为0
		d: 由于 0 || 0 的结果为0,所以d为0
---------------------------------------------------------------------------------
	例2:
		int a=2,b=1,c=2;
		int d=(c=c-1)||(a=a-1)&&(b=b-1);
		printf("%d %d %d %d",a,b,c,d);
	结果:
		2 1 1 1
	分析:
		由于 && 的 优先级略高于 || ,则需要看作:(c=c-1)||【(a=a-1)&&(b=b-1)】;	——> x ||【y】
		a:由于 || 前的结果为1,导致后面过程没有计算,a为2
		b:由于 || 前的结果为1,导致后面过程没有计算,b为1
		c: c=c-1 ——> c为1
		d: 由于 || 前的结果为1,所以d为1

个人决定注意的点:判断条件的值,是取决于表达式的运算结果,不取决于你是否存储该值
(四)位运算符
~(按位取反【单目】)、&(按位与【双目】)、|(按位或【双目】)、^(异或【双目】)、<<(左移【双目】)、>>(右移【双目】)

(一) 各符号的运用场所
& 	【将指定位清零,设0】
| 	【将指定位置位,设1】
^ 	【将指定位取反(和1异或)】
<< 	【低位补0】:其本质就是数据 * 2^移动位数 
>>	【高位补零(逻辑右移) / 高位补符号位(算数右移)】

> 笔试题【很重要!!!】
例题1:有一个int变量a[31:0],写一个表达式,把a的第10位置位(置1),其他位不变
例题2:有一个int变量a[31:0],写一个表达式,把a的第10位复位(置0),其他位不变
例题3:有一个int变量a[31:0],写一个表达式,把a的第10位取反,其他位不变
例题4:有一个int变量a[31:0],写一个表达式,判断a的第10位是否为"1"
例题5:有一个int变量a[31:0],写一个表达式,将a[9:6]设置为“1100”
(五)赋值运算符【双目运算符,结合性:右 —> 左(特殊),优先级倒数第二】
1、常见赋值运算符:“ = ” 【左边必须是“可写的地址”】
2、常见赋值运算符:“ = ” 左右两边的数据类型必须一致【存在隐性强转】
3、符合赋值运算符:算术运算符/位运算符 + 常见赋值运算符

易错点:
	a *= 3 + 5;
结果:
	a = a * 8;
分析:
	赋值运算符 *= 优先级小于 算数运算符 +
	1、a *= 8;
	2、a = a * 8;
(六)条件运算符【三目运算符,结合性:右 —> 左(特殊)】

格式:表达式1?表达式2:表达式3
求值顺序:左 ——> 右

1、如果表达式1为真,取表达式2的结果
2、如果表达式1为假,取表达式3的结果

易错点:
	(一) 条件运算符也存在惰性运算情况
	(二) 条件运算符结合性
(七)逗号运算符

格式:表达式1,表达式2,...,表达式n
求值顺序:左 ——> 右
最后取值是取【表达式n】的结果

(八)指针运算符
*(取值)、&(取地址)
(九)分量运算符
.(非指针结构体)、->(非指针结构体)
(十)下标运算符
[](数组下标)
(十一)强制类型转换运算符
(需要强转的类型)		例如:(int)
(十二)求字节运算符
sizeof()		【这个是运算符,而不是函数】

易错点:
	例题1:
		short s;
		printf("%ld\n",sizeof(s+1));
	结果:
		4
	分析:
		由于 short + int ——> int【隐性类型转换】所以结果为	sizeof(int) ——> 4
------------------------------------------------------------------------------------------
	例题2:
		printf("%ld",sizeof('a'));
	结果:
		4
	分析:
		由于'a'没有固定的大小,所以系统默认将其视作对于的ASCII整型int
		所以结果为 sizeof(int) ——> 4
(十三)自增运算符
i++、++i、i--、--i

易错点:
(一) 不可以有i=i++的表达公式【存在二义性】
(二) 在printf()中
	例如:
		int a = 1
		printf("%d %d %d %d",++a,a++,++a,a++);
	结果:
		7	5	7	3
	分析:(入栈问题)
	【顺序:从右向左进行运算】
		++a:	a值加1后,先不急着输出
		a++:	先输出,之后再加1
运算符的优先级和结合性总结
运算符优先级结合性类型
( )【括号】、[ ]【下标】、. 【结构体(非指针变量)】、->【结构体(指针变量)】、(需强转的类型)【强转】1从左到右单目运算符
!【逻辑取反】、~【按位取反】、++、- -【自加自减】、+ / -【正负号】2算术运算符
*【乘】、/【除】、%【取余】3算术运算符
+【加】、-【减】4算术运算符
<【小于】、<=【小于等于】、>【大于】、>=【大于等于】、==【等于】、!=【不等于】5关系运算符
&【按位与】、^【按位异或】、|【按位或】、<<【左移】、>>【右移】6位运算符
&&【逻辑与】7
||【逻辑或】8
条件运算符9从右到左
赋值运算符10从右到左
逗号运算符11

运算过程:(1)先考虑优先级 (2)再考虑结合性 (3)最后注意惰性运算
大致优先级排序:括号>单目>算术>关系>位运算>&&>||>赋值

练习作业:

1、作业

作业1:
输入不超过5位数的整数,判断是几位数
作业2:
输入对于整数的反数,如"123" <——> "321"
作业3:
1、若有定义:int a=11; float x=2.8,y=5.7;则表在式x+a%3*(int)(x+y)%2/4的值是:
	解:
		step1:	x+a%3*8%2/4
		step2:	x+0
		step3:	2.8	(answer)
*************************************************************************************************
2、若有定义: int a=8,b=5,c; 执行语句:c=a/b+0.4;后,c的值是:
	解:
		step1:	1+0.4
		step2:	1	(answer)
*************************************************************************************************
3、已有定义:int x=3; 则表达式:x=x+1.78的值是 
	解:
		step1:	3+1.78
		step2:	4	(answer)
*************************************************************************************************
4、已有定义:float f=13.8;,则表达式:(int)f/3的值是 
	解:
		step1:	13/3
		step2:	4	(answer)
*************************************************************************************************
5、已有定义:double x=3.5; 则表达式:x=(int)x+1的值是
	解:
		step1:	3+1
		step2:	4.0	(answer)
*************************************************************************************************
6、已有定义:int x=10, y=3,z; ,则表达式:z=(x%y, x/y)的值是
	解:
		step1:	10/3
		step2:	3	(answer)
*************************************************************************************************
7、已有定义:int x=0,y=0;,则计算表达式:(x=x+2,y=x+3/2,y+5)后,表达式的值是:____,变量x的值是:____
	解:
		step1:	x=x+2 ————> x=2	(answer2)
		step2:	y+5 ————> 8	(answer1)
*************************************************************************************************
8、若x,i,j和k都是int型变量,则执行表达式x=(i=4,j=16,k=32)后,x 的值为:____
	解:
		step1:	32	(answer)
*************************************************************************************************
9、设变量a是int型,f是float型,i是double型,则表达式10+'a'+i*f 值的数据类型为:
	解:
		step1:	最高精度数据类型为double类型	(answer)
*************************************************************************************************
10、若有语句:
	int x=12,y=8,z;
	z=0.8+x/y;
则执行语句后,z的值为:
	解:
		step1:	12.8/8=1.6
		step2:	1	(answer)
*************************************************************************************************
11、若“int a; float b=12.2;”,则执行“a=(int)b%3;”后,a的值是:
	解:
		step1:	12%3
		step2:	0	(answer)
*************************************************************************************************
12、假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值是 
	解:
		step1:	b++	————> b=6
		step2:	a+b = 8	(answer)
*************************************************************************************************
13、若有定义句语:int s=6; 则表达式s%2+(s+1)%2的值为  
	解:
		step1:	s+1 ————> 7
		step2:	s%2 ————> 0
		step3:	7%2 ————> 1
		step4:	0+1 ————> 1	(answer)
*************************************************************************************************
14、设a,b均为double型,且a=5.5;b=25;则表达式(int)a+b/b的值是:
	解:
		step1:	b/b —————> 1.0
		step2:	a+1.0 —————> 6.0	(answer)
*************************************************************************************************

Day 4 + Day 5【easy】

相关知识点:

三大结构:顺序、选择(分支)、循环

(一) 顺序:

C语言代码运行时的基本运行顺序

(二) 选择(分支):
1、if						
	格式:
		if(表达式)
		{
			语句;
		}
	作用:
		表达式为真(非0),就执行语句
	易错点:
		if和else的配对规则:else总是和上面最近未配对的if的进行配对
--------------------------------------------------------------------------------	
2、if - else
	格式:
		if(表达式)
		{
			语句1;
		}
		else
		{
			语句2;		
		}
	作用:
		表达式为真(非0),就执行语句1,反之执行语句2	
--------------------------------------------------------------------------------	
3、if - elseif
	格式:
		if(表达式1)
		{
			语句1;
		}
		elseif(表达式2)
		{
			语句2;		
		}
		...
		elseif(表达式n)
		{
			语句n;		
		}
		else
		{
			表达式(n+1)
		}
	作用:
		如果哪个表达式符合条件,就执行对应代码块内部的语句
		
	/* 前3者分别是if的基本类型 */
--------------------------------------------------------------------------------	
4、switch
	格式:
		switch(表达式)
		{
			case 常量表达式1:
				语句1
			break;
			case 常量表达式2:
				语句2
			break;
			···
			case 常量表达式n:
				语句n
			break;
			default:
				语句(n+1)
			break;
		}
	作用:
		可以类比if-elseif的作用		
	易错点:
		1、表达式的值必须是:整型、字符型、枚举型(整数)
		2、常量表达式的值不能有2个相同的值
		3、如果表达式与其中一个表达式匹配,就运行此case以下的所有语句, 当遇到break时自动跳出
	个人感受:
		1、但相比if-elseif结构,个人认为switch结构更简洁,很适合写一些偏简单的条件判断
		2、如菜单功能板块,非常推荐能使用switch的时候就用switch(跟函数一起打组合拳)!!!
(三) 循环:
1、while
	格式:
		whlie(表达式)
		{
			语句;
		}
	作用:
		如果表达式结果真,就会进行一次语句
-------------------------------------------------------------------------------	
2、do-while
	格式:
		do
		{
			语句;
		}while(表达式);
	作用:
		如果表达式(合法即可)结果真,就会进行一次语句
	注意:
		与while不同,此结构都要先进行一次语句【无论表达式是否为真】				
-------------------------------------------------------------------------------	
3、for
	格式:
		for(表达式1; 表达式2; 表达式3)
		{
			语句;
		}
	作用:
		如果符合条件判断结果为真就会进行一次语句
	注意:
		1、此结构的运行顺序:
			(一) 无条件先执行表达式1
			(二) 再判断表达式2的值,若为真,再执行循环体语句,再执行表达式3,无限循环
			(三) 若为假,则直接结束for循环
		2、表达式1合法即合理,表达式2有多个条件时使用 || 和 &&
-------------------------------------------------------------------------------	
4、goto
	格式:
		goto 语句标号
	注意:
		"语句标号":在C语言中,把一个符号与某一行的地址相关联。格式为在某一行的开始处定义某个符号,然后再加一个冒号即可
		eg:
			loop:
				n++;
				goto loop;
	作用:
		(1)与if语句向上跳转构成循环结构,但是我们尽量不要使用goto去实现循环
		(2)向后跳转可以跳出多重循环结构(当陷入多重循环, 想要直接跳出循环,但是又很麻烦, 可以直接使用goto),还有linux内核驱动源码用goto跳转 到硬件的初始化是很常用的用法.
	注意:
		goto是无条件跳转,导致程序的可读性变差,要慎重使用goto!!并不是不能使用goto

两种结束语句:break【跳出循环】continue【提前结束本循环,开始下一个循环】

练习作业:

1、作业

作业1
输入一个正整数n,打印这个正整数的前n行
	eg:
		输入:
			4
		输出:
			0
			0 1
			0 1 2
			0 1 2 3
			0 1 2 3 4
作业2
输入一个正整数,打印所有的它能够分解成连续数的形式
	eg:
		输入:
			15
		输出:
			15=1+2+3+4+5
			15=4+5+6
			15=7+8
作业3
输入2个正整数,求两个正整数的最小公倍数和最大公约数

拓展思考:

(一) 考试错题总结

(1) 符号常量 #define【要知道符号常量就是 ☞ #define】

格式: #define 标识符 数值

经常用#define,但是不知道它叫符号常量,就很尴尬😓

(2) 表达式的判断【最后一次属于什么表达式,整个表达式则为对应表达式】
例题:
	请判断下列两项表达式的类型:
	1、a=(c+b,d-e)
	2、a=c+b,d-e
结果:
	表达式1为赋值表达式
	表达式2为逗号表达式
分析:
	表达式1中,先是()运算【内部的逗号运算符】,再进行赋值运算					————>	赋值表达式
	表达式2中,将a=c+b和d-e分别看作整体,所以整体形式就是【表达式1,表达式2】	————>	赋值表达式
(3) 数据类型的常量表达方式总结

1、注意特定的格式 2、注意不要超出数据类型范围

整型
类型表达方式
短整型32 (注意范围)
整型32
长整型32L
8进制07(以0开头,8进制没有8)
16进制0x11(以0x开头,16进制没有16)
实型
类型表达方式
双精度4.7
单精度4.7f
字符型
类型表达方式
字符a
(4) 运算符的优先级【非常重要!!!】

Day3的运算符的优先级和结合性总结部分要重点记忆!!!

(5) 隐式类型强转【细节非常重要!!!】
  • 45
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值