循环结构
什么是循环
代码的重复执行,就叫做循环。
循环的分类
-
无限循环:程序设计中尽量避免无限循环(程序中的无限循环必须可控)。
-
有限循环:循环限定循环次数或者循环的条件。
循环的构成
-
循环体
-
循环条件
当型循环的实现
while
语法:
while(循环条件) { 循环语句; }
说明:
1.循环条件的返回值必须是布尔类型,在C语言中,布尔类型为真使用非0
来表示,布尔类型为假使用0
表示
2,{}
包起来的内容整体称之为循环体
。
3.我们要在循环体
中控制循环条件
的变化,否则会产生死循环
执行过程:
特点:
先判断,后执行,循环体语句有可能一次都不执行。
案例:
/* 需求:while循环案例:如何编程来计算1 + 2 + 3 + … + 100? */ #include <stdio.h> int main() { //定义一个变量,保存累加和 int sum = 0; //定义一个循环变量 int i = 1; while(i <= 100) //循环条件,在这里可以有关系表达式 、逻辑表达式,表达式运行结果为 { //累加计算 //sum = sum +i; sum += i; //给循环变量赋值,用来影响循环条件 i++; } printf("1~100的累加和是:%d\n",sum); return 0; } /******************************************* 1~100的累加和是:5050 ********************************************/
案例:
/* 需求:while循环案例-计算1~100之间的偶数和,也就是2+4+6+8+..+100的累加和 */ #include <stdio.h> int main() { // 创建一个变量,用来存放累加和 int sum = 0; // 创建循环变量,初始值2 int i; while(i <= 100) { // 排除奇数 if(i % 2 == 0) // 表示能被2整除,说名这个数是偶数 { sum += i; } i++; // 改变循环变量的值,此时一定要注意这句代码的位 } printf("1~100之间的偶数的累加和是:%d\n",sum); return 0; } /******************************************* 1~100之间的偶数的累加和是:2550 ********************************************/
死循环
while(1) //我们会在死循环进行必要的限制
for..
语法:
for(①表达式1;②表达式2;③表达式3) { ④循环体语句; }
说明:
-
()
中可以只保留两个分号,举例:(;;)
-
① 是循环变量,我们需要赋初值,循环变量可以是列表,多个循环变量使用逗号分隔,举例:
int i=0,j=0
-
② 是循环条件,用来限制循环的次数,循环条件支持关系表达式,如果加入逻辑表达式,会变成复合表达式,举例:
i < 10 && j < 10
-
③ 改变循环条件,支持列表,这里可以使用赋值表达式,举例:
i++,j++
-
执行顺序:①②④③ --> ②④③ --> ②④③ ... --> ②,这里①只执行1次。
执行过程:
特点:
先判断,后执行,循环体语句有可能一次都不执行。
案例:
/** * 需求:for循环案例-求1~100之间的偶数和 */ #include <stdio.h> // while实现 void while_test() { int sum = 0; int i = 1; while(i <= 100) { if(i % 2 == 0) { sum += i; } i++; } printf("while实现:1~100之间的偶数和:%d\n",sum); } // for实现 void for_test() { int sum = 0; for(int i = 1;i <= 100;i++) // 死循环表示:while(1)、for(;;) { if(i % 2 == 0) { sum += i; } } printf("for实现:1~100之间的偶数和:%d\n",sum); } int main() { while_test(); for_test(); return 0; } /*********************************************************** while实现:1~100之间的偶数和:2550 for实现:1~100之间的偶数和:2550 ***********************************************************/
/*** *需求:for循环案例,求1~100内偶数和 * for循环案例,求1~100内奇数和 * for循环案例,求1~100的和 */ #include <stdio.h> int main() { int sum = 0; for(int i = 0;i <= 100;i += 2) { sum += i; } printf("for实现:1~100内偶数和:%d\n",sum); int sum1 = 0; for(int j = 1;j <= 100;j += 2) { sum1 += j; } printf("for实现:1~100内奇数和:%d\n",sum1); int sum2 = 0; for(int s = 0;s <= 100;s++) { sum2 += s; } printf("for实现:1~100内数的和:%d\n",sum2); return 0; } /****************************************************** for实现:1~100内偶数和:2550 for实现:1~100内奇数和:2500 for实现:1~100内数的和:5050 **********************************************************/
案例:
/*** *需求:用户通过键盘录入一个整数n,用来做阶乘的最高数 */ #include <stdio.h> #include<math.h> int main() { int n;//接受控制台输入,作为阶乘最高为 int r = 1;//用来接受计算结果 printf("请输入一个整数:\n"); scanf("%d",&n); //循环实现阶乘 for(int i = 1;i <= fabs(n);i++) { r *= i; } printf("1~%d之间的阶乘结果是:%d\n",n,r); return 0; } /********************************************* 请输入一个整数: 4 1~4之间的阶乘结果是:24 ***********************************************/
总结
-
for语句使用语法规则上,降低/避免因为忘记循环条件更新操作,而引起的产生无限循环的几率。
-
应用场合:for语句往往应用于循环次数事先可以确定的场景。
死循环
for(表达式1;;表达式3); for(;;);
循环实现的三要素
-
循环变量初始化
-
循环条件
-
循环变量更新
案例:
/*** * 需求:for案例:求Fibonacci数列前40个数 */ #include <stdio.h> int main() { int f1 = 1;//前一个数,默认是1,因为第一个是1 int f2 = 1;//后一个数,默认是1,因为第二个是1 for(int i = 1;i <= 20;i++) { printf("%12d%12d",f1,f2); //一行显示两个数,每两个换一行 if(i % 2 == 0) { printf("\n"); } f1 = f1 + f2;//f1 = 2 = 1 + 1 f2 = f2 + f1;//f2 = 3 = 1 + 2 } return 0; } /****************************************************************************** 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 ********************************************************************************/
直到型循环的实现
do..while
语法:
do { 循环体; } while(循环条件);
说明:
-
循环条件的返回值必须是布尔类型,在C语言中,布尔类型为真使用 非0 来表示,布尔类型为假使
用0
表示。
-
{}
包起来的内容整体称之为为循环体
。 -
我们要在
循环体
中控制循环条件
的变化,否则会产生死循环
执行过程:
特点:
先执行,后判断,循环体语句至少执行一次。
案例:
/*** *需求:do...while案例:求1~100之间奇数的累加和 */ #include <stdio.h> int main() { //创建一个变量,用来存储累加和 int sum = 0; //创建循环变量,默认值1 int i = 1; do { //判断i是否为奇数 if(i % 2 != 0) { sum += i; } i++;//改变循环变量的值 }while(i <= 100); printf("1~100之间奇数累加和为:%d\n",sum); return 0; } /********************************************************************** 1~100之间奇数累加和为:2500 *************************************************************************/
循环的嵌套
3种循环(while、do……while、for)可以互相嵌套。在前一个循环结构的内部又存在一个完整的循环
结构,如:
案例:
/*** *需求:嵌套for循环案例-求100~200之间的所有素数 */ #include <stdio.h> int main() { int num = 100;//存放100~200间的自然数 int i = 2;//循环变量,默认从2开始,因为自然数除以1没有意义 int isPrime = 1;//用来记录1~自身之间能整除的次数 //第一层for循环:生成100~200之间的自然数 for(;num >= 100 && num <= 200;num++) { //默认是素数 isPrime = 1; //第二层循环,生成2~自身-1的自然数,用于和自身校验,是否能够整除,如果有一个能被整除,就说明不是素数 for(i = 2;i < num - 1;i++) { if(num % i == 0) { isPrime = 0;//不是素数 } } //条件判断:isPrime == 1 缩写isPrime if(isPrime) { printf("%d ",num); } } printf("\n"); return 0; } /************************************************************************************************************** 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 ***************************************************************************************************************/
循环结构的典型应用场景
-
求累和:举例
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]
获取每一个元素。数组我们后续课程讲解。
-
...
基础算法模型
-
累加和
-
定义一个变量(sum),并赋初值为0;
-
用该变量累加(+=)每一个数据项(i)
-
当访问完每一个数据项,此时该变量的取值就是累加和的结果。
-
累乘
-
定义一个变量,并赋初值为1;
-
用该变量累乘(*=)每一个数据项;
-
当访问完每一个数据项,此时该变量的取值就是累乘的结果。
-
极值【知识点:数组】
-
定义一个变量,并赋初值为第一个数据项
-
从第二个数据项开始,一次性与该变量进行比较,如果大于/小于该变量,则将当前数据项的数据赋值给该变量。
-
当访问完每一个数据项,此时该变量的取值就是求极值的结果。
补充
-
什么是素数
素数也被称作质数,只能被1和自身整除的数就叫做素数
以上就是嵌入式学习第12天的笔记,有什么问题还请指正,谢谢!