Bootstrap

嵌入式学习第12天——C语言循环结构

循环结构

什么是循环

代码的重复执行,就叫做循环。

循环的分类

  • 无限循环:程序设计中尽量避免无限循环(程序中的无限循环必须可控)。

  • 有限循环:循环限定循环次数或者循环的条件。

循环的构成

  • 循环体

  • 循环条件

当型循环的实现

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)
 {
 ④循环体语句;
 }

说明:

  1. () 中可以只保留两个分号,举例: (;;)

  2. ① 是循环变量,我们需要赋初值,循环变量可以是列表,多个循环变量使用逗号分隔,举例: int i=0,j=0

  1. ② 是循环条件,用来限制循环的次数,循环条件支持关系表达式,如果加入逻辑表达式,会变成复合表达式,举例: i < 10 && j < 10

  1. ③ 改变循环条件,支持列表,这里可以使用赋值表达式,举例: i++,j++

  2. 执行顺序:①②④③ --> ②④③ --> ②④③ ... --> ②,这里①只执行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(循环条件);

说明:

  1. 循环条件的返回值必须是布尔类型,在C语言中,布尔类型为真使用 非0 来表示,布尔类型为假使

0表示。

  1. {}包起来的内容整体称之为为循环体

  2. 我们要在循环体中控制循环条件的变化,否则会产生死循环

执行过程:

特点:

先执行,后判断,循环体语句至少执行一次。

案例:

 /***
  *需求: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] 获取每一个元素。数组我们后续课程讲解。

  • ...

基础算法模型

  1. 累加和

  • 定义一个变量(sum),并赋初值为0;

  • 用该变量累加(+=)每一个数据项(i)

  • 当访问完每一个数据项,此时该变量的取值就是累加和的结果。

  1. 累乘

  • 定义一个变量,并赋初值为1;

  • 用该变量累乘(*=)每一个数据项;

  • 当访问完每一个数据项,此时该变量的取值就是累乘的结果。

  1. 极值【知识点:数组】

  • 定义一个变量,并赋初值为第一个数据项

  • 从第二个数据项开始,一次性与该变量进行比较,如果大于/小于该变量,则将当前数据项的数据赋值给该变量。

  • 当访问完每一个数据项,此时该变量的取值就是求极值的结果。

补充

  • 什么是素数

素数也被称作质数,只能被1和自身整除的数就叫做素数

以上就是嵌入式学习第12天的笔记,有什么问题还请指正,谢谢!

;