循环结构
什么是循环
循环:代码重复执行
分类
- 无限循环:程序中应该避免无限循环。程序中的无限循环必须可控。
- 有限循环:循环限定循环次数或者循环条件。
循环的构成
- 循环体
- 循环条件
当型循环的实现
while
一般形式:while(表达式)循环体语句
语法:
while(循环条件)
{
循环语句;
}
说明:
- 循环条件的返回值必须是布尔类型,在C语言中,布尔类型为真使用非0来表示,布尔类型为假使用0表示。
- { }包起来的内容整体称之为循环体
- 我们要在循环体中控制循环条件的变化,否则会产生死循环
执行过程:
特点:
先判断,后执行,循环体语句有可能一次都不执行。
举例:
#include <stdio.h>
// 2+4+6+8+...+100
int main()
{
int sum = 0;
int i = 2;
while (i <= 100)
{
if (i % 2 == 0)
{
sum += i;
}
// 写if的外面,因为这样i的值是从1-100
i++;
}
printf("从1到100的偶数和为:%d\n", sum);
}
for
语法:
for(①表达式1;②表达式2;③表达式3)
{
4循环体语句;
}
说明:
- ()中可以保留两个分号,举例:(;;)
- 表达式1 是循环变量,我们需要赋初值,循环变量可以是列表,多个循环变量使用逗号分隔,举例: int i = 0,j = 0
- 表达式2 是循环条件,用来限制循环的次数,循环条件支持关系表达式,如果加入逻辑表达式,会变成复合表达式。 举例: i < 10 && j < 10
- 表达式3 改变循环条件,支持列表,这里可以使用赋值表达式,举例:i++,j++
- 执行顺序:
死循环
while(1)
循环的嵌套
3种循环(while、d....while、for)可以互相嵌套。在前一个循环结构的内部又存在一个完整的循环结构,如:
循环结构的典型应用场景
- 求累加和:举例: 1+2+3+4+...+100的和
- 求累乘:举例: 1*2*3*4*...*100的积
- 求均值:举例:(1+2+3+4+...+100) / 100的值
- 求极值:举例:12,34,55,2,66中最大值或最小值
- 元素遍历:常用于数组元素的遍历,比如:[ 1 , 2 , 3 , 4 , 5 ],获取每一个元素,数组后续说明!
- ...
基础算法模型
1. 累加和
- 定义一个变量,并赋初值为0;
- 用该变量累加( + = )每一个数据项( i )
- 当访问完每一个数据项,此时该变量的取值就是累加和的结果。
2. 累乘
- 定义一个变量,并赋初值为1;
- 用该变量累乘( *= )每一个数据项;
- 当访问完每一个数据项,此时该变量的取值就是累乘的结果。
3. 极值【知识点:数组】
- 定义一个变量,并赋初值为第一个数据项
- 从第二个数据项开始,一次性与该变量进行比较,如果大于/小于该变量,则将当前数据项的数据赋值给该变量。
- 当访问完每一个数据项,此时该变量的取值就是求极值的结果。
break和continue
- break
功能:
- 用在switch中,用来跳出switch的case语句;如果case没有break,可能会产生case穿透。
- 用在循环中(while,do while,for),提前结束循环,也就是跳出整个循环。
说明:
- break不能用于循环语句和switch语句之外的任何其它语句之中。
- break只能终止并跳出最近一层的结构。
图示:
案例:
/**
* 需求:break案例-马杰参与一阶段分段考试,如果考试及格,就跳出循环,否则就一直考
*/
#include <stdio.h>
int main()
{
printf("一阶段分段考试");
//声明一个变量,用来存放考试成绩
int score = 0;
do
{
//int score = 78; //score的作用域只能作用于{}以内
printf("马杰开始一阶段开始考试...\n");
scanf("%d",&score);
//开始合格,结束考试
if(score >= 60)
{
break;
}
}while(1);
printf("考试通过!\n");
}
案例:
/**
* break,输出1~100之间的偶数,只输出前10个
*/
#include <stdio.h>
int main()
{
for(int i = 1; i <= 100; i++)
{
if(i % 2 == 0)
{
printf("%d\t",i);
}
}
return 0;
}
- continue
功能:continue语句不会结束整个循环,而是跳过本次循环尚未执行的语句,进入下一次循环。
说明:
1.仅用于循环语句中。
2.在嵌套循环的情况下,continue语句只对包含它的最内层的循环体语句起作用。
图示:
举例
#include <stdio.h>
// 使用continue
void fun02()
{
int sum = 0;
for (int i = 1; i <= 100; i++)
{
// 判断奇数
if (i % 2 == 1)
{
continue; // 跳出所有奇数
}
sum += i;
}
printf("1~100之内所有偶数和是:%d\n", sum);
}
int main()
{
fun02();
}
- 跳出多层循环
跳出多层循环是不能使用break和continue的,因为他们只能跳出单层循环,跳多层循环,只能自己定义标志位进行跳出。
案例:
//定义一个标志位
int isFlag = 1;//默认循环成立
char fu;
while(isFlag)
{
printf("第一层循环执行的内容\n");
while(isFlag)
{
printf("第二层循环执行的内容\n");
printf("是否跳出循环? (y/n)");
scanf("%c %c",fu);
if(fu == 'Y' || fu == 'y')
{
isFlag == 0;
}
}
}
注意:如果是多层循环,进的时候是从外到内,跳出的时候是从内到外。
补充
什么是素数
素数也被称作质数,只能被1和自身整除的数就叫做素数。
直到型循环的实现
do while
do
{
循环体;
} while(循环条件);
说明:
- 循环条件的返回值必须是布尔类型,在C语言中,布尔类型为真使用非0来表示,布尔类型为假使用0表示。
- { }包起来的内容整体称之为循环体
- 我们要在循环体中控制循环条件的变化,否则会产生死循环
执行过程:
特点:
先执行,后判断,循环体语句至少要执行一次。
goto
语法:
goto 标签(label)
标签:标明目标代码的位置,是一个不加“”的字符。
案例:
int main()
{
int s = 0;
int i = 1;
loop: //自己定义标签
s + = i;
i++;
if(i <= 100)
{
goto loop; //
}
printf("1~100之内的累加和是:%d\n",sum)
return 0;
}
注意:
goto只能在同一个函数中跳转,goto会破坏代码结构,同时会降低代码可读性。
总结
- for语句使用语法规则上,降低/避免因为忘记循环条件更新操作,而引起的产生无限循环的几率。
- 应用场合:for语句往往应用于循环次数事先可以确定的场景。
死循环
for(表达式1;;表达式3);
for(;;)
循环实现的三要素
- 循环变量初始化
- 循环条件
- 循环变量更新