C语言基础:循环结构

循环结构

什么是循环

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

循环的分类

  • 无限循环:其实就是死循环,程序设计中尽量避免无限循环。程序中的无限循环必须是可控的

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

循环的构成

  • 循环条件

  • 循环体

当型循环的实现

特点:先判断,后执行,如果条件不满足,一次都不在线

代表:while和for

while

语法:

 while (循环条件)  a > b && b > c
 {
     循环语句; //循环语句如果是单语句,可以省略{},如果是复合语句,不可以省略{}
 }

说明:

1.循环条件的返回值必须是布尔类型(条件表达式只能是关系表达式或者逻辑表达式,还可以是具体的值(0,非0,ture,false))。在C语言中,布尔类型为真使用非0,布尔类型为键使用0。如果引入#include <stdibool.h>,也可以用true和false来表示。

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

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

特点:先判断,后执行,循环语句有可能一次都不执行。

案例:

 #include <stdio.h>
 //需求:计算1+2+3+...+100
 int main ()
 {
     int sum = 0;
     int i = 1;
     whlie(i <= 100)
     {
         //累加运算
         //sum = sum + i;
         sum += i;
         //给循环变量赋值,用来影响循环判断
         i++;
     }
     printf("1~100的累加和是:%d\n",sum);
         return 0;
 }

案例:

 
#include <stdio.h>
 //需求:计算1~100的偶数和
 int main ()
 {
     int sum = 0;
     int i = 2;
     whlie(i <= 100)
     {
         //累加运算
         //sum = sum + i;
         sum += i;
         //给循环变量赋值,用来影响循环判断
         i+=2;
     }
     printf("1~100的累加和是:%d\n",sum);
         return 0;
 }
死循环
 while(1) //我们会在死循环进行必要的限制

for

原则上,for循环能实现的,while循环 一定可以实现,for可以看做是while循环的一种特殊写法。

语法:

 
for (① 表达式1;② 表达式2;③ 表达式3)
 {
     ① 循环语句  -- 如果是单语句,可以省略{};如果是复合语句,必须保留{}
 }

说明:

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

  2. ①(表达式1)是循环变量,我们需要赋初值,循环变量可以是列表,多个循环变量使用逗号分隔,

    举例:int i = 0,j = 0

  3. ②(表达式2)是循环条件,用来限制循环次数,循环次数支持关系表达式,如果假如逻辑表达式,会变成复合表达式,举例:i < 10 && j <= i

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

  5. 执行顺序:①②④③ → ②④③ → ②④③ → ... →②

特点:

先判断,后执行,循环体语句有可能一次都不执行。

 
#include <stdio.h>
 //需求:计算1~100的偶数和
 int main ()
 {
     int sum = 0;
     int i = 2;
     for(i=2;i <= 100;i++)
     {
         //累加运算
         //sum = sum + i;
         sum += i;
     }
     printf("1~100的累加和是:%d\n",sum);
         return 0;
 }
总结
  • for语句使用语法规则上,降低/避免因为忘记循环条件更新操作,而引起的产生无限驯悍的几率。

  • 应用场合:for语句往往应用于循环次数事先可以确定的场景。

死循环

 for(表达式1;;表达式3);
 for(;;);

循环考虑的三要素
  • 循环变量的初始化

  • 循环条件

  • 循环变量的更新

直到型循环的实现

特点:先执行,后判断,不管条件满不满足,至少执行一次。

代表:do..while,goto

do..while

语法:

 do
 {
     循环体;
 }while(循环条件);

说明:

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

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

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

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

goto(不推荐)

语法:

 goto 标签(label);

标签:标明目标的代码的位置,是一个不加“”的字符串。

循环的嵌套

3种循环(while、do..while、for)可以互相嵌套。在前一个循环结构的内部又存在一个完整的循环结构。

案例:

 #include <stdio.h>
 //嵌套for循环案例-求100~200之间的所有素数
 //分析:素数被称为作质数,只能被1和自身整除的数叫做素数。(做这个题,思路反着来,过滤非素数)
 int main ()
 {
     // 创建一个变量,存放100~200之间的自然数
     int num = 100;
     // 循环遍历,默认从2开始,因为自然数除以1没有意义
     int i ;
     // 定义标志位:用来记录1~自身之间的能整除的次数,用来校验该自然数是否为素数
     int is_flag = 1;
     //第一层for循环:生成100~200之间的自然数
     for(;num <= 200;num++)
     {
         //每个自然数在判别之前,需要重置标志位
         is_flag = 1;
         //第二层循环:验证该自然数能否被除了1~自身之间的数整除,能整除,就改变is_flag的值
         for(i = 2;i < num - 1;i++)
         {
             //校验是否能整除
             if(num % i == 0)
             {
                 is_flag = 0;
                 break;//只校验第一个能整除的数
             }
         }
         //根据标志位,判断该自然数是否是素数
         if(is_flag)//条件判断:is_flag == 1缩写 is_flag(推荐) is_flag == 0 缩写 !is_flag
         {
             printf("%-4d",num);
         }
     }
     printf("\n");
     return 0;
 }

循环结构的典型应用场景

  • 求累和:举例1+2+3+4+.....+100的和

  • 求累乘:举例1* 2 * 3*... * 100的积

  • 求均值:举例(1+2+3+4+.....+100)/100的值

  • 求极值:举例12,34,56,67的最大值或者最小值

  • 元素遍历:常用于数组元素的遍历。

  • ....

基础算法模型

  1. 累加和:

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

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

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

  2. 累乘

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

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

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

  3. 极值(多应用于数组)

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

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

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

break和continue

  • break

功能:

① 用在switch中,用来跳出switch的case语句:如果case没有break,可能会产生case穿透。

② 用在循环中(while、do..while、for),提前结束循环,也就是跳出整个循环。

说明:

① break不能用于循环语句和switch语句之外的任何其他语句中。

② break只能终止并跳出最近一层的循环结构。

 
#include <stdio.h>
 int main ()
 {
     printf("一阶段分段考试");
     //创建一个变量,存储考试成绩
     int score = 0;
     do
     {
         printf("一阶段考试");
         scanf("%d",&score);
        //考试合格,跳出循环
         if(score >= 60)
         {
             break;
         }
     }while(1);
     printf("考试通过!");
     return 0;
 }

案例:

 
#include <stdio.h>
 int main ()
 {
    for (int i = 1,count = 1;i <= 100;i++)
    {
        if(i % 2 == 0)
        {
           if(count > 10)
           {
               break;
           }
            count ++;
            printf("%d\t",i);
        }
    }
     printf("\n");
     return 0;
 }

  • continue

功能:continue语句不会结束整个循环,而是跳过本次循环尚未执行的语句,进入下一次循环。

说明:

① 仅用于循环语句中。

② 在我们嵌套循环的情况下,continue语句支队包含它的最近的一层循环起作用。

案例:

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

  • 跳出多层循环

跳出多层循环是不能直接使用break和continue实现的,因为它们只能跳出单层循环,跳出多层循环,需要我们自定一定标志位进行跳出(标志位也可以配合break使用)。

案例1:

 #include <stdio.h>
 int main()
 {
     //定义一个标志位
     int is_flag = 1;// 默认循环成立
     //定义一个变量,用来接收控制台输入
     char fu;
     while(is_flag)
     {
         printf("外层循环执行的内容..\n");
         while(is_flag)
         {
             printf("内层循环执行的内容..\n");
             scanf ("%c",&fu);
             if(fu == 'Y' || fu =='y')
             {
                 is_flag == 0;
             }
         }
     }
       return 0;
 }

案例2:

 #include <stdio.h>
 int main()
 {
     //定义一个标志位
     int is_flag = 1;// 默认循环成立
     //定义一个变量,用来接收控制台输入
     char fu;
     while(is_flag)
     {
         printf("外层循环执行的内容..\n");
         while(1)
         {
             printf("内层循环执行的内容..\n");
             scanf ("%c",&fu);
             if(fu == 'Y' || fu =='y')
             {
                 is_flag == 0;
                 break;
             }
         }
     }
        return 0;
 }

注意:如果是多层循环(嵌套循环),进的时候是从外到内,跳出的时候是从内到外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值