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