流程、循环、函数、数组
文章目录
一、流程控制语句
1. 顺序循环
1.程序默认的执行流程; 2.顺序为从上至下
2. 分支结构
程序执行过程中存在岔路。
Ⅰ. if语句;
Ⅱ. switch语句;
(1)计算结果只能是整数/字符;
(2)case后面只能是字面量,不能是变量;
(3)对于代码书写来说,如果情况比较多,case不容易书写,但是在处理结果时,switch不会顺序进行情况对应,而是直接找到对应的情况,效率更高;
(4)case穿透:不遇到break就不会停止,但是只会找到对应的情况后向下穿透。
Ⅲ. for循环
初始化语句、条件判断语句和条件控制语句都写在for()的括号里面。
Ⅳ. while循环
条件判断语句写在while()的括号里面,初始化语句写在循环体之前,条件控制语句写在循环体内。
for循环与while循环的不同:
因为定义在循环体内,控制for循环的变量在循环体外面就不能再使用;
因为定义在循环体外,控制while循环的变量在循环体外仍可以使用。
* 知道循环的次数或循环的范围 -> 用for循环(格式会更清晰);
不知道知道循环的次数或循环的范围,只知道循环结束的条件 -> 用while循环
Ⅴ. do…while循环
补充1. 无限循环
无限循环一般用while(1)循环,且下面不能再写其他代码,因为不会被执行。
补充2. 循环嵌套
要先确定内循环做了什么,外循环就是将内循环重复执行N次。
##思考(重点)
-
在需要使用循环处理问题的时候,首先要找到循环结束的条件,然后看使用哪种循环合适。
知道循环的次数,使用for循环;不知道次数,只知道结束的条件,用while循环
-
处理问题时,要先对问题进行拆解,再去具体思考怎么写,之后想到多少写多少。
如回文数问题: 首先我们要得到每一位的数字,然后再倒序排列:于是思考如何得到每一位的数字,写出对应的代码; 其次思考如何把得到的数字进行排布。
二、跳转控制语句
Ⅰ. break;
跳转到单层循环的外部;
不能单独书写,写在switch或者循环中。
Ⅱ. continue;
结束本次循环,进行下次循环;
只能写在循环中。
Ⅲ. goto;
可以跳转到任意标号位置;一般用于跳出循环嵌套。
三、函数
一个独立的功能,提高了代码的复用性、可维护性。
复用性:当我们需要实现一个功能时,调用函数即可。
可维护性:当我们代码出现问题时,在函数内部排查问题即可。因为当我们书写函数、使用函数时,就已经将问题范围缩小在了函数内部。
------定义函数时三个思考:
- 做什么事情? 函数体
- 需要什么? 形参
- 调用处需不需要返回值? 返回值类型
四、数组
容器,存储同种数据类型的多个值。
1. 数组内是连续的空间
2. 一旦定义,长度不可变(可以在定义时不确定数组长度,但赋值后,数据值的个数就是数组的长度,不能再进行添加)
//定义
int arr[5] = {1, 2, 3, 4, 5};
int arr[5] = {1, 2, 3, 4}; //元素不够,自动填充默认值
int arr[] = {1, 2, 3, 4, 5}; //定义时不规定长度,赋值后长度不再变化
//修改元素
arr[4] = 10;
1. 内存地址
存储数据的位置的编号。
作用:快速管理内存空间,快速获取数据。
arr[0]:其中arr代表数组的首地址,[0]为索引,对于内存地址来说就是偏移量。
获取变量地址:&变量名
1. 通过变量的首地址,可以确定变量中存储的数据(一个变量不止占用一个地址)。
同时数据类型也是重要的,比如int类型占4个字节,short类型占2个字节,那一个变量占用的地址数量就不一样。
2. 索引代表的就是偏移量,所以数组的索引是从0开始,表示偏移0个单位。
2. 注意事项
(1)定义数组时,arr为完整的数组;
函数中使用时,arr只是一个记录数组首地址的变量,即数组作为函数的参数,**传递的是数组的首地址。**因此,使用长度之前,要在主函数中先测量出再传递给函数。
in arr[] = {1, 2, 3, 4, 5}
printf("%zu\n", sizeof(arr)); //结果为 4*5=20
getlength(arr); //结果为 8
void getLength(int arr[])
{
printf("%zu\n", sizeof(arr));
}
(2)不要索引越界。最小索引:0;最大索引:长度 - 1。
(3)用到数组随手写出长度,常会使用:
int len = sizeof(arr) / sizeof(arr[0]);
3. 数组常见算法(待学习)