当前位置: 首页 > article >正文

C语言之循环结构:直到型循环

C语言

循环结构

直到型循环的实现

  • 特点:先执行,后判断,不管条件是否满足,至少执行一次。
  • 典型代表:do…while,goto(已淘汰,不推荐使用)
do…while
  • 语法:

    do
    {
        循环体;
    }
    while(循环条件)
  • 说明:

    • ①循环条件的返回值必须是逻辑值(0或者非0)
    • {}包起来的内容整体称之为循环体
    • ③我们要在循环体中控制循环条件的变化,否则会产生死循环。
  • 执行过程:

    在这里插入图片描述

  • 特点:先执行,后判断,不管条件是否满足,循环体语句至少执行一次。

  • 案例:

    • 需求:求1~100以内的偶数和

    • 分析:

      • 创建一个变量,用来存储sum
      • 创建一个循环变量 i = 2
      • 创建一个do…while循环,在循环体中,校验偶数 i % 2 == 0,如果满足,就实现偶数和计算 sum += i
      • 计算完之后,在循环体的末行,对循环条件进行更新,i++
      • 限制循环条件:i <= 100
      • 循环结束,打印输出 sum 的值
    • 代码:

      #include <stdio.h>
      
      int main()
      {
          // 创建一个变量,用来存储偶数和
          int sum = 0;
          
          // 创建一个循环变量
          int i = 2;
          
          do
          {
              if(i % 2 == 0)
              {
              	sum += i;
              }
              i++;// 更新循环变量
          } while(i <= 100);
          
          printf("1~100以内的偶数和是%d\n",sum);
          
          return 0;
      }
      
goto
  • 语法:

    goto 标签(label)
    
  • 标签:标明目标的代码的位置,是一个不加""的字符串。

  • 案例:

    • 需求:求1~100以内的偶数和

    • 代码:

      #include <stdio.h>
      
      int main()
      {
          // 创建一个变量存放偶数和
          int sum = 0;
          
          // 创建一个循环变量
          int i = 2;
          
          // 定义一个标签(标签名自定义,这是一个不带引号的字符串)我们一般给需要重复执行的代码添加标签
      loop: // 这个标签需要通过goto触发
          if(i % 2 == 0)
          {
          	sum += i;
          }
          i++;
          
          // 循环条件的校验
          if (i <= 100)
          {
              // 触发循环
              goto loop;
          }
          
          printf("1~100以内的偶数和是%d\n",sum);
          return 0;
      }
      
    • 注意事项

      • ①可读性:goto语句会破坏代码的结构和可读性,使得代码难以理解和维护。因此,应尽量避免使用。
      • ②替代方案:大多数情况下,可以使用循环、条件语句、函数等结构来替代goto语句,使代码更加清晰和易于管理。
      • ③嵌套限制:虽然goto语句可以跨函数跳转(即跳转到另一个函数中的标签),但这种用法是不合法的,并且会导致编译错误。 goto语句只能在同一函数内部跳转。
      • ④错误处理:在某些情况下,goto语句可以用于错误处理,例如从嵌套的多层循环中跳出。但即使在这种情况下,也应谨慎使用,并考虑是否有更好的替代方案。
    • 总结

    虽然 goto 语句在C语言中是合法的,并且有时可能看起来很方便,但过度使用或不当使用会导致代码质量下降。因此,建议尽量避免使用goto语句,而是采用更结构化和可维护的编程方法。

循环的嵌套

  • 3种循环(while、do…while、for)可以互相嵌套。在前一个循环结构的内容有存在一个完成的循环结构。例如:

    在这里插入图片描述

  • 案例:

    • 需求:求100~200之间的所有的素数(素数又被称为质数)

    • 分析:

      • 只能被1和自身整除的数叫做素数或质数。(做这个题,思路要反着来,过滤合数,剩余的就是素数)
    • 代码:

      #include <stdio.h>
      
      int main()
      {
          // 创建一个变量,存放100~200之间的自然数
          int num = 100;
      	// 循环变量,默认从2开始,因为自然数除以1没有意义,因为所有自然数都能被1整数,我们现在需要校验 2 ~ 自身 -1之间
          int i;
          // 定义一个标志位:用来记录1~自身之间能被当前自然数整除的次数,用来校验是否位素数
          int is_flag; // 默认就是素数
          
          // 第1层for循环:生成100~200之间的自然数
          for(; num <= 200; num++)
          {
              // 每个自然数在判别之前,需要重置标志位
              is_flag = 1;
              // 第2层循环:校验每一个自然数,检测其是否是非素数 举例:num = 4, i= 2~3 9
              // for (i = 2; i< num / 2; i++)
              // for (i = 2; i*1 <= num; i++)
              for(i = 2;i < num; i++) // 排除1和自身 9, 9 % 2==0,9 % 3==0...9%8==0 20 2 45 10
              {
                  // 被校验数是否能被校验数整除,如果能,就是非素数
                  if ( num % i == 0)
                  {
                      // 如果是和数,就跳出
                      is_flag = 0;
                      
                      break;// break就是结束循环
              	}
          	}
              // 根据标志位,判断该自然数是否是素数
              if (is_flag) // 条件判断:is_flag == 1 缩写 is_flag(推荐),is_flag == 0 缩写!is_flag(推荐)
              {
                  printf("%-4d",num);
              }
              
      	}
          printf("\n");
          return 0;
      }
      

循环结构的典型应用场景

  • 求累和:举例:1+2+3+...+100的和,sum = 0
  • 求累积:举例:1*2*3*...*100的积,result = 1
  • 求均值:举例: (1+2+3...+100)/100的值
  • 求极值:举例: 12,34,56,67中的最大值、最小值
  • 元素遍历:常用于数组元素的遍历。

基础算法模型

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

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

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

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

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

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

  1. 极值(多应用于数组)
  • 定义一个变量,并赋初值为第一个数据项;

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

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

break与continue

break
  • 功能:

    • ①用在switch中,用来跳出switch的case语句;如果case没有break,可能会产生case穿透。
    • ②用在循环中(while、do…while、for),提前结束循环,也就是跳出整个循环。
  • 说明:

    • ①break不能用于循环语句和switch语句之外的任何其他语句之中。
    • ②break只能终止并跳出最近一层的循环结构。
  • 图例:

    在这里插入图片描述

  • 案例:

    • 需求:四海同学参与运算符考试,如果考试及格,就跳出循环,否则就一直考。

    • 代码:

      #include <stdio.h>
      
      int main()
      {
          printf("运算符考试\n");
          // 创建一个变量,用来存放小明兄弟的考试成绩
          int score;
          do
          {
              printf("小明兄弟开始运算符考试...\n");
              scanf("%d",&score);
              
              // 考试合格,跳出循环
              if (score >= 60)
              {
              	// printf("恭喜小明兄弟通过考试!\n");
              	break;
              }
              else
              {
              	printf("很遗憾,小明兄弟你需要重新考试!\n");
              }
              
          } while(1);
          
          printf("恭喜小明兄弟通过考试!\n");
          
          return 0;
      }
      
continue
  • 功能:continue语句不会结束整个循环,而是跳过本次循环尚未执行的语句,进入下一次循环。

  • 说明:

    • ①仅用于循环语句中。
    • ② 在嵌套循环的情况下,continue语句只对包含它的最近一层的循环起作用。
  • 图例:

    在这里插入图片描述

  • 案例:

    • 需求:求1~100以内的偶数和

    • 代码:

      #include <stdio.h>
      
      /**
      * continue案例:求1~100以内的偶数和,(不使用continue)
      */
      int continue_test1()
      {
          int sum = 0;
          for(int i = 1; i <= 100; i++)
          {
              // 查找偶数
              if ( i % 2 == 0)
              {
              	sum += i;
              }
          }
          printf("1~100以内的偶数和是%d\n",sum);
      }
      
      /**
      * continue案例:求1~100以内的偶数和,(使用continue)
      */
      int continue_test2()
      {
          int sum = 0;
          for(int i = 1; i <= 100; i++)
          {
              // 查找计数
              if ( i % 2 != 0)
              {
              	continue;
              }
              sum += i;
          }
          printf("1~100以内的偶数和是%d\n",sum);
      }
      int main()
      {
          continue_test1();
          continue_test2();
      }
      


http://www.kler.cn/a/544470.html

相关文章:

  • 【算法学习】DFS与BFS
  • 【prompt示例】智能客服+智能质检业务模版
  • 机试题——快乐校园跑
  • android 自定义文件名和日期——android 打包技巧——不覆盖历史成功文件和版本-默认打包缺陷
  • 广度优先搜索_钥匙和房间
  • 【Pandas】pandas Series drop
  • [Java] Redis基础
  • LabVIEW与小众设备集成
  • #渗透测试#批量漏洞挖掘#致远互联AnalyticsCloud 分析云 任意文件读取
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之获取省市区列表名称及收货地址列表展示
  • 细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性
  • 从设计到生产,3D技术如何改变鞋业生态
  • 基于Java SpringBoot以及vue前后端分离的旅游景区网站系统设计与实现
  • AI+智能中台企业架构设计_重新定义制造(46页PPT)
  • Javaweb中,使用Servlet编写简单的接口
  • 如何利用Spring的@Value注解实现配置信息的动态注入与管理?
  • flutter本地推送 flutter_local_notifications的使用记录
  • 十八、vben框架前端编码风格及标准
  • 2024年博客之星年度评选—主题文章创作评审文章得分公布
  • 苹果放弃DeepSeek选择阿里通义,近屿智能助您入局黄金AI领域