文章目录
- 循环结构
- 什么是循环
- 循环的分类
- 循环的构成
- 当行循环的实现
- while
- 死循环
- for
- 死循环
- 循环实现的三要素
- 直到型循环的实现
- do..while
- goto
- 循环的嵌套
- 循环结构的典型应用场景
- 基础算法模型
- break和continue
循环结构
什么是循环
代码的重复执行,就叫做循环
循环的分类
- 无线循环:其实就是死循环,程序设计中尽量避免无限循环。程序中的无限循环必须可控
- 有限循环:循环限定循环次数或者循环条件
循环的构成
- 循环条件
- 循环体
当行循环的实现
特点:先判断,后执行,如果条件不满足,一次都不执行
代表:while和for
while
语法:
while(循环条件)
{循环语句;//循环语句如果是单语句,可以省略{},如果是复合语句,不可以省略{}
}
说明:
1.循环条件的返回值必须是布尔类型(条件表达式只能是关系表达式或者逻辑表达式)。在C语言中,布尔类型为真使用非0
,布尔类型为假使用0
。如果引入#include<stdbool.h>
,也可以使用true和false来表示
2.{}
包起来的内容整体称之为循环体
3.我们要在循环体
中控制循环条件
的变化,否则会产生死循环
执行过程:
特点:先判断,后执行,循环体语句有可能一次都不执行
案例:
while求1~100数字和
#include <stdio.h>
/** 需求:while循环案例:如何编程计算1+2+3+....+100?(累加求和)
*/int main(int argc,char *argv[])
{//定义一个变量,保存累加的和int sum = 0;//定义一个循环变量int i = 1;while(i<=100)//循环条件,这里可以有关系表达式,逻辑表达式、整型常量{//累加运算sum += i;i++;}printf("1~100的累加和是:%d\n",sum);return 0;
}
案例:
while求1~100偶数和
#include <stdio.h>
/** 需求:while循环案例:计算1~100以内的偶数和,也就是
2+4+6+..+100的累加和
*/int test02()
{//创建一个变量,用来存放累加和int sum = 0;//创建一个循环变量,初始值2int i =2;while(i <= 100){//过掉奇数if(i%2 == 0){sum += i;}i++;}printf("1~100之间的偶数和是%d\n",sum);
}int main(int argc,char *argv[])
{test02();return 0;
}
死循环
while(1)
for
原则上,for循环能实现的,while循环一定可以实现,for循环可以看作是while循环的一种特殊写法
语法:
for(① 表达式1;②表达式2;③表达式3)
{④循环体语句;--如果是单语句,可以省略{};如果是复合语句,必须保留{}
}
说明:
1.()
中可以只保留两个;;
,举例:(;;)
2.①(表达式1)是循环变量,我们需要赋初值,循环变量可以是列表,多个循环变量使用逗号分隔,举例:int i=0,j=0
②(表达式2)是循环条件,用来限制循环的次数,循环条件支持表达式,如果加入逻辑表达式,会变成复合表达式,举例:i < 10 && j <= i
③(表达式3)改变循环条件,支持列表,这里可以使用赋值表达式,举例:i++,j++
3.执行顺序:①②④③->②④③->②④③->…->②
执行过程:
特点:
先判断,后执行,循环体语句可能一次都不执行
#include <stdio.h>
/** 需求:while循环案例:计算1~100以内的偶数和,也就是
2+4+6+..+100的累加和
*/int for_test()
{//创建一个变量,用来存放累加和int sum = 0;//创建一个循环变量,初始值2int i = 2;for(;i <= 100;){//过掉奇数if(i%2 == 0){sum += i;}i++;}printf("1~100之间的偶数和是%d\n",sum);
}
/**需求:for循环案例-求斐波拉契数列前20个数字*分析:1,1,2,3,5,8....**/int for_test2()
{//创建一个变量,用来存放累加和int f1 = 1;//前一个数int f2 = 1;for(int i = 2;i <= 100;i++){//过滤掉奇数if(i%2 == 0){sum += i;}}printf("1~100之间的偶数和是%d\n",sum);
}int main(int argc,char *argv[])
{for_test();for_test2();return 0;
}
总结
- for语句使用语法规则上,降低/避免因为忘记循环条件更新操作,而引起的产生无限循环的几率
- 应用场合:for语句往往应用于循环次数事先可以确定的场景
死循环
for(表达式1;;表达式3);
for(;;);
循环实现的三要素
- 循环变量的初始化
- 循环条件
- 循环变量的更新
案例:
#include <stdio.h>
/** 需求:for循环案例-求斐波拉契数列前20个数* 分析:1,1,2,3,5,8....
*/int main(int argc,char *argv[])
{int f1 = 1;//前一个数默认是1int f2 = 1;//后一个数默认时1int i = 1;//循环变量for(;i<= 10;i++){printf("%12d%12d\n",f1,f2);//一行显示两个数,每两个换行f1 += f2;//f1 = 2 = 1+1f2 += f1;//f2 = 3 = 1+2}return 0;
}
直到型循环的实现
特点:先执行,后判断,不管条件满不满足,至少执行1次
代表:do…while
do…while
语法:
do
{循环体;
}while(循环条件);
说明:
1.循环条件返回值必须是布尔类型,在C语言中,布尔类型为真使用非0
来表示,为假使用0
来表示
2.{}
包起来的内容整体称之为循环体
3.我们要在循环体
中控制循环条件
的变化,否则会产生死循环
执行过程:
goto
语法:
goto 标签(label);
标签:标明目标的代码的位置,是一个不加“”
的字符串
循环的嵌套
三种循环(while、for、do…while)可以互相嵌套。在前一个循环结构的内部又存在一个完整的循环结构。如:
#include <stdio.h>
/**需求:嵌套的for循环案例。求100~200之间的所有的素数*分析:素数又被称作质数,只能被1和自身整数的数叫做素数(思路反着来,过滤非素数)*/
int main(int argc,char *argv[])
{//创建一个变量,存放100~200之间的自然数int num = 100;//循环变量,默认从2开始,因为自然数除以1没有意义int i ;//定义标志位:用来记录1~自身之间的能整除的次数int is_flag;//第一层for循环:生成100~200之间的自然数for(;num <=200;num++){//每个自然数在判别之前,需要重置标志位is_flag = 1;//第2层for循环:验证该自认数能否被除了1~自身之间的数整除,能整除,就改变is_flag的值for(i =2;i<=num/2;i++){//校验是否能整除if(num%i==0){is_flag = 0;break;//只校验第一个能被整除的数}}//根据标志位判断,该自然数是否是素数if(is_flag)//条件判断:is_flag == 1 缩写 is_flag(推荐) is_flag == 0 缩写 !is_flag{printf("%-4d",num);}}printf("\n");return 0;
}
循环结构的典型应用场景
- 求累和:举例
1+2+3+…+100
的和 - 求累乘:举例
1*2 * 3…*100
的积 - 求均值:举例
(1+2+3+..+100)/100
的值 - 求极值:举例
12,34,56,67
中的最大值和最小值 - 元素遍历:常用于数组元素的遍历
基础算法模型
1.累加和
- 定义一个变量(sum),并赋初值为0;
- 该变量累加(+=)每一个数据项(i);
- 当访问完每一个数据项,此时该变量的取值就是累加和的结果
2.累乘
- 定义一个变量,并赋初值为1
- 用该变量累成(*=)每一数据项
- 当访问完每一个数据项,此时该变量的取值就是累乘的结果
3.极值(多用于数组)
- 定义一个变量,并赋初值为第一个数据项
- 从第二个数据项开始,依次与该变量进行比较,如果大于/小于该变量,则将当前数据项的数据赋值给该变量
- 当访问完每一个数据项,此时该变量的取值就是求极值的结果
break和continue
- break
功能:
①用在switch中,用来跳出switch的case语句;如果case没有break,可能会产生case穿透
②用在循环中(while、do…while、for),提前结束循环,也就是跳出整个循环
说明:
①break不能用于循环语句和switch之外的任何其他语句
②break只能终止并跳出最近一层的循环结构
图示:
案例:
#include <stdio.h>
/**
* 需求:break案例:高超同学参与一阶段分段考试,如果考试及格,就跳出循环,否则就一直考
*/
int break_test()
{
printf("一阶段分段考试\n");
// 创建一个变量,存储考试成绩
int score = 0;
do
{
printf("高超同学开始一阶段分段考试...\n");
scanf("%d",&score);
// 考试合格,跳出循环
if(score >= 60)
{
break;
}
}while(1);
printf("恭喜高超同学考试通过!\n");
}
int main(int argc,char *argv[])
{
break_test();
return 0;
}
- continue
功能:continue语句不会结束整个循环,而是跳过本次循环尚未执行的语句,进入下一次循环
说明:
①仅用于循环语句中
②在嵌套循环的情况下,continue语句只对包含它的最近的一层循环起作用
图示:
- 跳出多层循环
跳出多层循环不能直接使用break和continue实现,因为它们只能跳出单层循环,跳出多层循环,需要我们自定标志位进行跳出(标志位也可以配合break使用)
注意:如果是多层循环(嵌套循环),进的时候是从外到内,跳出的时候是从内到外