C语言的循环嵌套结构,使用while,d-while,for,break,continue设计循环累加、正负交替累加、累乘、九九乘法表等

1. 使用do-while循环实现从1到100的累加

#include <stdio.h>

int main()
{
    int i=1,sum=0;
    do{
        sum = sum + i;
        i++;
    }while(i<=100);
    printf("sum = %d\n",sum);

    return 0;
}

在这里插入图片描述
这种累加方法效率比较低,一般可以直接用高斯公式采用乘法解决,那样用不到循环

2. 使用while循环实现从1到10的累乘

#include <stdio.h>

int main()
{
    int i = 1;
    long product = 1;
    while(i <= 10)
    {
        product *= i;
        i++;
    }
    printf("product = %ld",product);

    return 0;
}

在这里插入图片描述
这里的用于存储累乘的变量product定义成长整型,数据较大,防止溢出正确显示

3. 使用for循环实现计算1+1/2-1/3+1/4-1/5+…-1/41的值,并输出

#include <stdio.h>

int main()
{
    int i , flag = 1;
    double s = 1;
    for(i = 2 ; i <=41 ; i++)
    {
        s += flag * 1.0/i;
        /*s是double型,flag是int型,乘1.0可以隐含类型转换*/
        flag = -1 * flag;
        /*交替正负*/
    }
    printf("1+1/2-1/3+1/4-1/5+...-1/41 = %lf",s);

    return 0;
}

在这里插入图片描述
这道题是固定的累加长度,可以改善成由用户输入的n值,进行正负交替累加,只需要加一个scanf语句即可

4. 嵌入break语句的循环实现: 检查输入的密码是否正确,正确则直接退出,错误则提示还有两次机会,直到机会用完或者输入正确密码则结束。

#include <stdio.h>

int main()
{
    int i = 1 , password1 = 4567 , password2;
    /*初始正确密码password1,以及用户输入的密码password2*/
    do
    {
        printf("\n请输入密码:");
        scanf("%d",&password2);
        if(password1 == password2)
        {
            printf("\n口令正确!");
            break;
            /*正确输入,循环结束*/
        }
        else
        {
            printf("\n口令错误!还有%d次机会\n",3-i);
            i++;
            /*错误输入,重新输入密码,动态改变输入机会数*/
        }
    }while(i<=3);
    /*i<=3,当i累加到4时,机会用完,循环结束*/

    return 0;
}

在这里插入图片描述

5. 嵌入continue语句的循环实现: 输出所有从100到1000之间其中十位等于个位加百位的三位数。

#include <stdio.h>

int main()
{
    int i = 100,a,b,c,num=0;
    while(i++ < 1000)//判断结束后i自增1
    {
        a = i/100;//接收百位数字,小数自动保留整数部分
        b = i/10 % 10;//接收十位数字,先除以10,在对10取余
        c = i%10;//接收个位数字,直接对10取余
        if(b != a+c)
            continue;
            /*不满足要求不进行下面语句,直接下一次循环*/
        printf("%5d\t",i);
        num++;
        if(num%10 == 0)
            printf("\n");
    }
    printf("\n这样的数一共有:%d个",num);

    return 0;
}

在这里插入图片描述
continue语句一般都用在遍历判断是否符合某种条件,如果不满足直接跳过,满足才进行操作

6. 使用多重for循环语句的循环实现: 输出5行的由*号构成的等腰三角形。

#include <stdio.h>

int main()
{
    int i,j;
    for(i=1 ; i<=5 ; i++)//外层for循环对每一层进行遍历
    {
        for(j=1 ; j<=(5-i) ; j++)
            printf(" ");
        /*输入*号前面的空格调整*位于正中输出*/
        for(j=1 ; j<2*i ; j++)
            printf("*");//第一层一个,第二层三个,第三层五个。。。
        printf("\n");
    }

    return 0;
}

在这里插入图片描述

7. 编程序,输入10个整数,找出最大数。

#include <stdio.h>

int main( )
{
    int  k,x,max;
    scanf("%d", &x);
    max=x;
    //对于第一个输入的数字暂时定为最大数
    for(k=2;k<=10;k++)
    {
        scanf("%d", &x);
        if (x >= max)
            max=x;
        //对按序输入的下一个数字进行比较,对max更新
    }
    printf("Max=%d\n", max);

    return 0;
}

在这里插入图片描述
还可以用一维数组实现,先将数字全部放进数组保存,再对数组遍历比较,这种方法代码偏多,上面的方法,先全部输入10个数字,每进入一次for循环体,取出按序输入的下一个数字

8. 编程序,按上三角,下三角不同格式打印九九表。

下三角:
在这里插入图片描述
算法分析:

  1. 主要用到嵌套的for循环
  2. 用 i 表示行上的变量,j 表示列上的变量,外层循环控制行,内层循环控制列,再输出当前九九表的值,最后输出一个换行
#include <stdio.h>

int main()
{
    int i,j;
    for(i=1;i<10;i++)
    {
        for(j=1;j<=i;j++) //j只循环到i,保证以三角形形式输出
            printf("%d*%d=%d\t",i,j,i*j);
        printf("\n");//换行输出下一行,\t制表符规整输出
    }
    return 0;
}

运行:
在这里插入图片描述
上三角:
在这里插入图片描述
算法分析:

  1. 仍然是用到嵌套的for循环
  2. 用 i 表示行上的变量,j 表示列上的变量,外层循环控制行,内层循环控制列,与上面的主要是外层循环起点的改变
#include <stdio.h>

int main()
{
    int i,j;
    for(i=9;i>=1;i--) //第一行最长,从较大数乘以较小数
    {
        for(j=1;j<=i;j++)
            printf("%d*%d=%d\t",i,j,i*j);
        printf("\n");
    }
    return 0;
}

运行:
在这里插入图片描述
上三角输出类似九九表:
在这里插入图片描述
分析:
这个外层 i 仍然是从9开始自减至1,内层 j 从 i 开始自减至1

#include <stdio.h>

int main()
{
    int i,j;
    for(i=9;i>=1;i--)
    {
        for(j=i;j>=1;j--)
            printf("%d*%d=%d\t",i,j,i*j);
        printf("\n");
    }
    return 0;
}

运行:
在这里插入图片描述

9. 编写一个程序,求出1到1000之内能被7或11整除的数。

分析:

  1. 能被7或11整除也就是逻辑判断式 i % 7== 0 || i %11 ==0 满足。
  2. 加上一个从1到1000的for循环遍历即可
#include <stdio.h>

int main()
{
    int i,k=0;

    for(i=1;i<=1000;i++) //外层循环遍历
        if(i%7==0||i%11==0) //内层逻辑判断是否可被整除
        {
            printf("%d\t",i);
            k++;
            if(k%10 == 0)
                printf("\n"); //满10个数换行输出
        }
    printf("这样的数字一共有%d个",k);

    return 0;
}

运行:
在这里插入图片描述

10. 程序设计

有50头牛,运输50筐货物,大牛一次能运3筐,中牛一次能运2筐,两头小牛一次运1筐,编程计算共有多少种运输方案。
提示:
可用试凑法或穷举法:设大牛数量为dn,中牛数量为zn,小牛数量为xn;
则当 dn + zn + xn = 50 且 3dn+2zn+xn/2 = 50 时,就是一种运输法。
想想看dn、zn和xn的取值范围,用三重循环去试凑就可以得出全部结果

参考结果:
在这里插入图片描述

#include <stdio.h>

int main()
{
    int dn,zn,xn,i=0; //大牛数量dn,中牛数量zn,小牛数量xn,方案数量i
    for(dn=0;dn<=16;dn++) //dn最多不超过50/3 ≈ 16
    {
        for(zn=0;zn<=25;zn++) //zn最多不超过50/2 ≈ 25
        {
            for(xn=0;xn<=50;xn++) //dn最多不超过50/1 ≈ 50
            {
                if(dn+zn+xn==50&&3*dn+2*zn+xn/2==50) //循环到某种组合符合要求
                    printf("方案%d: %d头大牛,%d头中牛,%d头小牛\n",++i,dn,zn,xn/2*2);
            }
        }
    }
    return 0;
}

运行:
在这里插入图片描述

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值