C语言基础(08)【循环结构】
循环结构
什么是循环条件
代码在满足某种条件的情况下,重复执行,就叫做循环结构。
循环的分类:
- 无限循环:其实就是死循环,程序设计中避免无限循环,如果非要使用,那么这个循环一定要在可控的范围内。
- 有限循环:循环限定循环次数或者终止循环的条件。
循环的构成
- 循环条件
- 循环体
当型循环的实现
特点:先判断,后执行。如果条件不满足,一次都不执行。
典型代表:while循环和for循环
while
语法:
//写法:省略{}
while(循环条件)循环语句;//单语句
//写法2:保留{}
while(循环条件)
{循环语句;//可以是单语句,可以是符合语句
}
说明:
1.循环条件的返回值必须是逻辑值(布尔类型,表达式只能是关系表达式或者逻辑表达式,也也可以是具体的值(0,非0)).在C语言中,使用0和非0来表示逻辑表达式的值。如果引入<stdbool.h>也可以用true和false来表示
2{}
包起来的内容整体称之为:循环体
3.我们要在循环体中控制循环条件的变化,否则产生死循环
执行过程:
特点:先判断 ,后执行,循环体可能一次都不执行
案例:
-
需求:求1~100的累加和
-
分析:
- 创建一个变量sum=0,用来接收累加和
- 创建一个变量i;来表示计算数,我们给i给个初始值 i= 1,每次循环的时候,i++
- 在循环中,使用sum+=i完成累加和
- 同时限定i的范围 i <=100
- 第一次:sum += i = 0 + 1 = 1 0+1
- 第二次:sum += i = 1 + 2 = 3 1+2
- 第三次:sum += i = 3 + 3 = 6 1+2+3
- …
-
代码:
#include <stdio.h>
int main(int argc,char *argv[])
{// 定义两个变量,sum存储累加和,i用来存储计算数(循环变量,是一个可变变量)int sum = 0,i = 1;// 写一个循环,实现累加和计算while(i <= 100){// 累加和计算sum += i; // sum = sum + i;// 给循环变量赋值,用来影响循环条件i++;}printf("1~100的累加和是%d\n",sum);return 0;
}
案例:
- 需求:求1~100以内的偶数和,也就是2+4+6+…+100的累加和
- 分析: 创建两个变量,一个变量sum = 0用来存储偶数和,一个变量i = 2用作循环变量
- 创建一个循环,设置循环条件:i <= 100
- 在循环体中,需要使用一个if语句判断i是否为偶数 if(i % 2 == 0),如果满足,就求偶数 和:sum += i
- 在循环体的最后一行,写代码改变循环变量的值:i++
- 循环结束,打印输出sum
- 代码:
#include <stdio.h>
int main(int argc,char *argv[])
{// 创建两个变量,一个变量sum用来存偶数和,一个变量i用来存循环变量int sum = 0, i = 2;// 循环求偶数和while (i <= 100){// 过滤掉奇数if (i % 2 == 0){sum += i;}i++;// 改变循环变量的值}pri0ntf("1~100以内的偶数和是%d\n",sum);return 0;
}
死循环:
while(1)//要在死循环中进行必要的限制
for
原则上:for循环能实现的while循环一定能实现
语法:
for(表达式1;表达式2;表达式3)
{循环体语句;//如果单语句,可以省略{},如果是复合语句必须保留{}}
说明:
①()
中可以保留两个;;
举例:for(;;)
此时for循环是死循环
②表0达式1
是循环变量
,我们需要赋初始值,循环变量可以是单个,也可以是多个,0多个循环变量要用逗号隔开
③表达式2
是循环条件
用来限制循环的次数,循环条件支持表达式,举例
④表达式3
是改变循环变量(条件)
支持列表,这里可以使用赋值表达式,举例:i++,i–
⑤执行顺序:①②④③→②④③…→②
特点:先判断,后执行,循环体语句有可能一次都不执行。
案例:
#include <stdio.h>
#include <math.h>
/*** 需求:while循环案例:计算1~100以内的偶数和
0 */
int while_test()
{// 创建一个变量用来存储sumint sum = 0;// 创建一个循环变量,并初始化(表达式1)int i = 2;// 循环while(i <= 100) // 循环条件(表达式2){// 过滤调奇数 循环体语句if (i % 2 == 0){sum += i; }// 改变循环条件(表达式3)i++;}printf("1~100以内的偶数和是%d\n",sum);
}
/*** 需求:for循环案例:计算1~100以内的偶数和*/
int for_test()
{// 创建一个变量用来存储sumint sum = 0;// 创建一个循环变量,并初始化(表达式1)int i = 2;// 循环for(;i <= 100;) // 循环条件(表达式2){// 过滤调奇数 循环体语句if (i % 2 == 0){sum += i; }// 改变循环条件(表达式3)i++;}printf("1~100以内的偶数和是%d\n",sum);
}
/*** 需求:for循环案例:计算1~100以内的偶数和*/
int for_test2()
{// 创建一个变量用来存储sumint sum = 0;// 循环for(int i = 2; i <= 100; i++) // 循环条件(表达式2){// 过滤调奇数 循环体语句if (i % 2 == 0){sum += i; }}printf("1~100以内的偶数和是%d\n",sum);
}
/*** for循环案例* 需求:用户可以通过键盘录入一个整数n,用来作为阶乘的最高位,比如n = 5,那么阶乘表示:1 * 2 * 3 * 4
* 5*/
int for_test3()
{// 创建一个变量,接收控制台输入的整数nint n;// 创建一个变量,用来接收阶乘的结果int r = 1;printf("请输入一个整数:\n");scanf("%d",&n);// 使用for循环实现阶乘 fabs()求绝对值,需要引入 math.hfor (int i = 1; i <= fabs(n); i++){r *= i;}printf("1~%d之间的阶乘的将结果是%d\n",(int)fabs(n),r);
}
int main(int argc,char *argv[])
{while_test();for_test();for_test2();for_test3();return 0;
}
死循环的写法:
for(表达式1;;表达式3)
for(;;)
循环实现的三要素:
- 循环变量的初始化,举例:int i = 2;
- 循环变量的条件,举例:i <= 100
- 循环变量的更新,举例:i++
案例:
-
需求:求斐波拉契数列的前20个
-
分析:
- 斐波拉契数列指的是符合一定规则的数列,举例:1,1,2,3,5,8
- 斐波拉契数列的特点是,第3个就等于前2个数之和,最开始的第1,2个数是固定的,都是1
-
代码:
-
#include <stdio.h> int main(int argc,char *argv[]) {int f1 = 1; // 前一个数,默认是1,因为第一个就是1int f2 = 1; // 后一个数,默认是1,因为第二个就是1int i = 1; // 循环变量,控制循环次数,我们需求是输出20个,只需要10次for(;i <= 10; i++){printf("%12d%12d\n",f1,f2);// 第1次:1 1 2 3 5 8f1 += f2; // f1 = f1 + f2f2 += f1; // f2 = f2 + f1}return 0; }
直到型循环
特点:先执行,后判断。不管条件是否满足,至少执行一次。
代表:do…while,goto(已淘汰,不推荐)
do …whlie
语法:
do
{循环体;
}while(循环条件);
说明:
①循环条件的返回值必须是逻辑值(0或非0)
②{}
包起来的内容整体称之为循环体
③我们要在循环体
中控制循环条件
的变化,否则产生死循环
执行过程:
案例:
goto
语法:
loop:标签内容 //定义一个标签,(标签名自定义,这是一个不带引号的字符串)我们一般需要重复执行代码添加标签goto 标签(lable)
标签:标明
循环的嵌套
3种循环(while,do…while、for)可以互相嵌套。在前一个循环内容又存放一个未完成循环。
案例:
-
求100~200之间的所有素数(又称为质数)
-
分析:
- 只能被1和自身整除的数叫做素数或者质数。(思路反推,过滤和合数)
-
代码:
//创建一个变量,存放100~200之间的自然数 int num = 100; //循环变量,默认从2,开始,因为自然数除以1没有意义。现在需要校验2~自身减1的数,排除(1~自身)(2~100) int a; //第一层for循环:生成100~200之间的自然数 for(;num <= 200;num++) {//第二层循环:校验一个自然数,检测是否是非素数for(i = 2;i < num;i++){//被校验数能否被校验数整除} }
循环结构的典型应用场景
-
求累和:举例::1+2+3+…100的和,sum = 0;
break与continue
break
功能:
①用在switch中,用来跳出switch的case语句:如果case没有break,可能会产生case穿透。
②用在循环中(while、do…while…、for),提前结束循环,也就是跳出整个循环。