实习集训【阶段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) 隐式类型强转【细节非常重要!!!】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值