循环结构
什么是循环结构
代码在满足某种条件的前提下,重复执行,就叫做循环结构。
循环的分类
- **无限循环:**其实就是死循环,程序设计中药谨慎使用。
- **有限循环:**循环限定循环次数(for)或者终止循环条件(while,do…while)。=
循环的构成
- **循环条件:**如 循环次数或者循环的出口
- **循环体:**需要重复执行的代码。
当型循环的实现
特点:先判断,后执行,如果条件不满足,一次都不执行
**代表:**while、for
while
语法:
while (循环条件)
{
循环语句;
}
//注意:如果循环语句是单个语句,可以省略花括号{}
while (循环条件) 循环单语句 ;
while (循环条件)
循环单语句;
//注意;有些特殊场景下,循环语句糅合到了循环条件中,所有省略了循环体
while (循环条件);
说明:
1.循环条件的返回值必须是逻辑值(使用非0
表示真,使用0
表示假,C语句底层使用1
表示真)C99版本引入了一个stbool.c
,可以使用true或者false来表示真假,这里的true和false实际上就是定义的 两个符号常量,true的值是1,false的值是0.
2.{}
包起来的内容整体称之为循环体。
3.我们要在循环体控制条件的变化,也可以在循环体条件中控制循环条件的变化否则产生死循环。
执行过程:
**特点:**先判断,后执行,循环体有可能一次都不执行。
案例:
- 需求:求1~100的累加和
- 分析:
- 创建一个变量sum = 0,用来接受累加和
- 创建一个变量i,用来表示计算数,我们会每次给i一个初始值i = 1,每次循环的时候i++
- 在循环中,使用sum += i,完成累加和
- 在循环中,使用sum +=1,完成累加和运算
- 同时我们要限制循环的条件,也就是i的范围:i <= 100
- 第1次:sum += i = 0 + 1 = 1
- 第2次:sum += i = 1 + 2 = 3
- 第3次:sum += i = 3 + 3 = 6
- …
- 代码:
/*************************************************************************
> File Name: demo01.c
> Author: 小刘
> Description:
> Created Time: 2025年05月09日 星期五 09时55分24秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
// 创建一个变量sum,用来接收累加和
int sum = 0;// 这里一定要初始化, 因为sum要参与计算
int i = 0;
// 创建一个循环变量i,i循环初始值,因为i要参与计算
// 循环求累加和
while(i <= 100)// 循环变量
{
// 实现加法运算
sum += i;// 等价于 sum = sum + i;
// 改变循环条件,让其逼近循环的出口
i++;
}
//输出sum
printf("1~100的累加和为%d\n",sum);
return 0;
}
- 运行结果
案例
需求:求1~100以内的偶数和
分析:
- 创建两个变量,sum=0用来存储累加的偶数和,i=2用做循环变量,存储自然数
- 创建一个循环,设置循环条件i<=100
- 在循环体内,需要一个if来校验i是否是偶数(if(i%2==0)),如果满足,就在if中求偶数和:sum+
- 在循环体的最后一行,需要改变循环变量的值,用来逼近循环出口
- 循环结束后,才能输出sum
代码
/************************************************************************* > File Name: demo01.c > Author: 刘孟丹 > Description: > Created Time: 2025年05月09日 星期五 09时55分24秒 ************************************************************************/ #include <stdio.h> int main(int argc,char *argv[]) { int sum = 0; int i = 2; while(i <= 100) { if(i % 2 == 0) sum += i; i++; } printf("1~100的累加和为%d\n",sum); return 0; }
运行结果
while的特殊写法:
while(1) //死循环
while(i=5)也是正确的死循环
for
原则上;for循环能实现的while循环也可以实现,for循环可以看做while循环的一种特殊写法,for循环胜在结构清晰。
语法:
for (表达式1 ;表达式2;表达式3)
{
循环体语句;
}
//如果循环体语句是单语句,也是可以省略{}
for (表达式1 ;表达式2;表达式3) 循环体语句;
for (表达式1 ;表达式2;表达式3)
循环体语句;
说明:
①()
中可以仅保留两个;;
,举例:for(;;)
,此时就是for循环中死循环的体现。
②表达式1
是循环变量
,我们需要赋值初值,循环变量可以单个,也可以是列表,多个循环体变量之间使用逗号分隔;
//循环变量是单个
for (int i = 0;..;...){...}
//循环变量是列表
for (int i = 0, j = len -1;..;..) {..}
③表达式2
是循环条件
,用来限制循环次数,循环条件支持关系表达式,逻辑表达式等,举例:
for (..; i < 10 && j >= 0;..){..}
④表达式3
是改变循环变量
,支持列表,列表使用逗号分隔, 这里可以使用赋值表达式,举例:
for (..; ..; i++,j--) {..}
⑤执行顺序:①②④③→②④③④③→…→②
执行过程:
**特点:**先判断,后执行,循环体语句有可能一次都不执行。
案例
- 需求:计算1~100以内的偶数和
- 代码:
运行结果:
案例:
需求:
/************************************************************************* > File Name: demo03.c > Author: 刘孟丹 > Description: > Created Time: 2025年05月09日 星期五 11时18分59秒 ************************************************************************/ #include <stdio.h> int main(int argc,char *argv[]) { unsigned long num = 1; int a = 0; int i; printf("请输入你要求得的累积数:"); scanf("%u",&a); for(i = 1;i <= a;i++) { num *= i; } printf("%d的累积数值为%lu\n",a,num); return 0; }
注意:阶乘计算,如果乘积超过存储的范围,会溢出,结果计算可能不准确。
for实现死循环
for (① 表达式1; ② 表达式2; ③ 表达式3)
{
④ 循环体语句;
}
// 如果循环体语句是单语句,也是可以省略{}的
for (① 表达式1; ② 表达式2; ③ 表达式3) ④ 循环体语句;
for (① 表达式1; ② 表达式2; ③ 表达式3)
④ 循环体语句;
循环实现的三要素:
- 循环变量的初始化,举例:int i = 2;
- 循环条件,举例:i <=100
- 循环变量的更新,举例:i++
案例
需求:求斐波拉契数列前20个
分析:
代码:
/************************************************************************* > File Name: demo04.c > Author: 刘孟丹 > Description: > Created Time: 2025年05月09日 星期五 11时42分23秒 ************************************************************************/ #include <stdio.h> int main(int argc,char *argv[]) { int f1 = 1,f2 = 1; int i = 1; for(i = 1;i <= 10;i ++) { printf("%-7d%-7d\n",f1,f2); f1 = f1 + f2; f2 = f1 + f2; } return 0; }
运行结果