4.2循环

C流程控制——循环

一、定义

重复执行

二、分类

for 循环
while 循环
do while 循环

(一)for 循环

1. 执行顺序

在这里插入图片描述

执行顺序:
先执行1;再执行2;2如果成立、标志此次循环成立,进行此次循环。
此次循环执行:先执行4; 再执行3,3执行结束标志一次循环结束。

是否进行下次循环:先执行2,2如果成立,执行下次循环……

1 只执行1次 i=1;

2 执行5次,分别为 1<=4; 2<=4; 3<=4; 4<=4; 5<=4;

4 执行了4次,分别为:sum=0+1;sun=1+2;sum=3+3;sum=6+4;

3 执行4次,分别为 i=1+1;i=2+1;i+3+1;i+4+1;

2. 循环程序举例
  1. 用循环实现1-n之间所有奇数的和

     ```C
     int main()
     {
         int n;
         int sum = 0;
         int i;
         printf("请输入N的值:\n");
         scanf("%d",&n);
         for (i=1;i<=n;i+=2)
             sum = sum +i;
         printf("%d之前所有奇数项的和为:%d\n",n,sum); 
         return 0;
     }
     ```
    
  2. 求1-100之间所有能被3整除的数字之和

    int main()
    {
        int n;
        int sum = 0;
        int i;
        printf("请输入N的值:\n");
        scanf("%d",&n);
        for (i=3;i<=n;++i)
        {
            if(i%3==0)
                sum = sum +i;
        }
            
        printf("%d之前所有奇数项的和为:%d\n",n,sum);
        system("pause");
        return 0;
    }
    
  3. 求 1 + 1/2 1/3 + 1/4 + …… + 1/99 + 1/100 的值

        double sum = 0;
        int i;
        for (i=1;i<=100;++i)
        {   
            sum = sum + (double)1/i;
            //这是第一种写法
            //也可以写成:sum = sum + 1.0/i;
            //也可以写成:sum = sum + 1/(double)i;
            //不能写成:sum = sum + (double)(1/i);
            //如果不进行类型转换,输出结果就是1.0;
        }    
        printf("sum= %lf\n", sum );
    
  4. 循环更新的部分为什么不能定义为浮点型?
    因为浮点型数据不能准确存储

  5. 多层for循环

在这里插入图片描述

```
执行顺序:  
    1. 执行外层的1,再执行2;2成立,执行内层循环。   
    2. 执行内层循环体Ⅱ:  
    3. 内层循环先执行4,再执行5,5成立执行A; 
    4. 再执行6;  
    5. 再执行5,5成立执行A;  
    6. 再执行6;
    7. 再执行5,5不成立跳出内层循环。  
    8. 执行外层循环,执行3;  
    9. 再执行3,2成立,再进入内层循环体Ⅱ(执行过程同上);  
    10. 再执行3;
    11. 再执行2,2不成立,结束两层循环
    12. 执行B 
```

```C
例子1:
for (i=0;i<3;++i)
    for(i=3;i<=5;++i)
        printf("嘿嘿");
        printf("哈哈");  
// 输出结果
嘿嘿
嘿嘿
嘿嘿
哈哈
这里的内外层i 是一个i

例子2:
int i,j;
for (i=0;i<3;++i)
    for(j=3;j<=5;++j)
        printf("嘿嘿\n");
        printf("哈哈\n");
// 输出结果
连续输出9个嘿嘿后,输出1个哈哈  

例子3:
int main()
{
    int i,j;
    for(i=0;i<3;++i)
        printf("嘿嘿!\n");
        for(j=2;j<5;++j)
            printf("哈哈!\n");
            printf("嘻嘻!\n");
    system("pause");
    return 0;
}
//输出结果:
嘿嘿!
嘿嘿!
嘿嘿!
哈哈!
哈哈!
哈哈!
嘻嘻!
Press any key to continue . . . 
```

(二)while 循环

1. 执行顺序
while(表达式)  
    语句A;  

表达式成立,执行语句A,一直成立一直执行,不成立就不执行了。
默认只能控制一条语句。

//用 while 循环实现 1-100 的和
int main()
{
    int i = 1;
    int sum = 0;
    while(i<101)
    {
        sum = sum+i;
        i+=1;
    }
    printf("%d\n",sum);  
	system("pause");
	return 0;
}
2. 与 for 的相互比较
for(1;2;3)
    A;

//等价于:
1;    
while(2)
{
    A;
    3;
}
    

可以看出,虽然两种循环方法都可以相互转化,但是for更具有逻辑性,不容易出错。

3. while 程序举例

例子1 :判断一个数字是否是回文数:正写倒写都一样,如121,1331 ……

int m ,val;
int sum = 0;
printf("请输入要判断的整数,按空格结束\n");
scanf("%d",&val)
m=val;
while(m)
{
    sum = sum*10+m%10;
    m/=10;
}
if(sum==val)
    printf("Yes!\n");
else
    printf("No!\n")

//第二种

int a;
printf("请输入一个整数:");
scanf("%d", &a);

int s = 0;
for(int i = 1; i <= a; i *= 10)
{
    s = a%(10*i)/i + 10*s;
}
if(a == s)
    printf("这个数是回文数\n");
else
    printf("这个数不是回文数\n");
return 0;

例子2 :斐波拉契数列: 从第三项开始,后一项是前两项的和。1、 2 、 3 、 5、 8 、 13……

int main()
{
    int n ;
    int i;
    int f1,f2,f3;
    f1=1;
    f2=2;
    f3=3;
    printf("请输入所要求的斐波那契数列的第N项,按空格结束\n");
    scanf("%d",&n);
    if(n<3)
        printf("%d\n",n);
    else 
    {
        for (i = 3; i <= n; i++)
        {
            f3=f1+f2;
            f1=f2;
            f2=f3;
        } 
        printf("%d\n",f3);          
    }   
   
	system("pause");
	return 0;
}
4. for 与 while 的适宜情况

以后补充吧

(三)do …… while 循环

  1. 主要适用于人机交互

  2. 格式

    do
    {
        语句;
    } while(表达式);
    
    
  3. do …… while 和 while 不可以相互转换
    因为 while 先判断表达式是否成立,再执行语句
    do …… while 先执行语句,再进行判断,也就是说至少执行一次。
    而while 可能一次都不执行。

  4. 案例: 一元二次方程

    #include <math.h>
    #include <stdio.h>
    
    int main()
    {
        double a, b, c;
        double delta;
        double x1, x2;
        char ch;    
        do
        {
            printf("请输入一元二次方程的三个系数a,b,c\n");
            printf("a=");
            scanf("%lf", &a);
            printf("\nb=");
            scanf("%lf", &b);
            printf("\nc=");
            scanf("%lf", &c);
            delta = b * b - 4 * a * c;
            if (delta > 0)
            {
                x1 = ((-b) + sqrt(delta)) / (2 * a);
                x2 = ((-b) - sqrt(delta)) / (2 * a);
                printf("\n该方程有两个不相同的实数解,分别是%lf,%lf\n", x1, x2);
            }
            else if (0 == delta)
            {
                x1 = ((-b) + sqrt(delta)) / (2 * a);
                printf("\n该方程有两个相同的实数解,x1=x2=%lf\n", x1);
            }
            else if (delta < 0)
            {
                printf("\n该方程有无解\n");
            }
            else
            {
                printf("\nERROR");
            }
            printf("请问您是否要继续[Y|N]\n");
            scanf(" %c",&ch);//注意这里%c前必须有一个空格,否则就会出错!
        } while ('y' == ch || 'Y' == ch);
            
        return 0;
    }
    

三、break & continue

break

  1. break 如果用于循环时用来终止循环的
  2. break 如果用于switch,则是用于终止switch
    switch(2)
    {
    case 2:
        printf("哈哈\n");
        break;
    }
  1. break不能直接用于if,除非if属于循环内部的一个子句。
for(i=0;i<3;++i)
    if(3>2)
        break;
    printf("heihie\n");
    //break 虽然是if 的子句,但是用来终止的确实外部的for 循环
  1. break 用于多个for 循环
    for(i=0;i<4;++i)
    {
        for(j=1;j<4;++j)
            break;
        printf("哈哈!\n")
    }
    //输出3个哈哈
    //break 终止的是内重循环  
    //在多层循环中,break只能终止距离它最近的循环

在多层switch嵌套中,break只能终止距离它最近的一层switch

int main()
{
    int x=1;
    int y=1;
    int a=0;
    int b=0;

    switch (x)
    {
    case 1:
        switch (y)
        {
        case 1:
            a++;
            break; //终止的是内层的switch
        
        case 2:
            a*=3;
            break;
        }
        b=100;
        
        break; //终止的是外层的switch
    case 2:
        break;
    default:
        break;
    }
    printf("a=%d  b=%d\n",a,b);
    system("pause");
    return 0;
}

    //输出
    a=1   b=100 

continue

1. 作用

用于跳过本次循环余下的语句,转去判断是否需要执行下一次循环

2. 例子
for(1;2;3)
    A;
    B;
    continue;
    C;
    D;
int i,j;
scanf("%d",&i)
while((ch = getchar()!='\n')
    continue;
scanf("%d",&j)
//可以用来清除用户输入的非法字符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值