从零开始学嵌入式技术之C语言08:循环控制语句

一:while循环

(1)基本语法

while (循环条件表达式)
{
    循环体语句;
}

         当循环条件表达式成立,就执行循环体语句,直到条件不成立停止循环

        为避免死循环,循环条件表达式不能永远成立,且随着循环次数增加,应该越来越趋向于不成立。

        实现计数循环要满足:①必须初始化循环变量 ②循环变量比较作为循环条件 ③循环变量变化。

        使用while循环实现如下需求:

        循环输出数字 7~15:

#include <stdio.h>

int main()
{
    // 循环输出数字 7~15
    int n = 7;
    while (n <= 15)
    {
        printf("%d \n", n);
        n++;
    }
    printf("循环结束后循环变量的值:%d", n);

    return 0;
}

         倒序输出数字 56 ~ 43

#include <stdio.h>

int main()
{
    // 倒叙输出数字  56 ~ 43
    int i = 56;
    while (i >= 43)
    {
        printf("%d \n", i);
        i--;
    }
    printf("循环结束后循环变量的值:%d", i);

    return 0;
}

         输出10(包括10)以内所有的偶数

#include <stdio.h>

int main()
{
    // 输出10(包括10)以内所有的偶数
    /*
    int i = 0;
    while (i <= 10)
        if (i % 2 == 0) {
            printf("%d \n", i);
        }
        i ++;
    }
    */
    int i = 0;
    while (i <= 10)
    {
        printf("%d \n", i);
        i += 2;
    }
    printf("循环结束后循环变量的值:%d", i);

    return 0;
}

        计算100以内(包括100)所有数字的和 

#include <stdio.h>

int main()
{
    // 计算100以内(包括100)所有数字的和
    int sum = 0; // 定义变量记录和
    int i = 1;   // 循环变量初始化

    while (i <= 100)
    {
        sum += i;
        i++;
    }

    printf("100以内(包括100)所有数字的和是 %d \n", sum);
    printf("循环结束后循环变量的值:%d", i);

    return 0;
}

        计算10以内所有奇数的乘积

#include <stdio.h>

int main()
{
    // 计算10以内所有奇数的乘积
    int product = 1; // 定义变量记录乘积
    int i = 1;

    while (i < 10)
    {
        product *= i;
        i += 2;
    }

    printf("10以内所有奇数的乘积是 %d \n", product);
    printf("循环结束后循环变量的值:%d", i);

    return 0;
}

         不确定循环

        不确定循环直到循环表达式不成立之前,不确定循环次数,不需要循环变量。

        实现需求:输入6位数密码,直到密码匹配成功结束循环。

#include <stdio.h>
int main()
{
    // 记录正确密码
    int pwd1 = 123456;
    // 定义变量用于获取输入的密码
    int pwd2;

    // 循环
    while (pwd1 != pwd2)
    {
        printf("请输入6位数密码:");
        scanf("%d", &pwd2);
    }

    printf("密码正确,欢迎回家!");

    return 0;
}

二:do…while循环

(1)基本语法     

do
{
    循环体语句;
} while (循环条件表达式);

说明:

  1. do…while循环是先执行再判断,但只有第一次循环语句的执行没有经过判断,以后的每一次仍然先经过判断。
  2. 注意while后面的分号不能省略。

         倒序输出数字56 ~ 43 

#include <stdio.h>

int main()
{
    // 倒叙输出数字  56 ~ 43
    int i = 56;

    do
    {
        printf("%d \n", i);
        i--;
    } while (i >= 43);

    printf("循环结束后循环变量的值:%d", i);

    return 0;
}

        计算100以内(包括100)所有数字的和

#include <stdio.h>

int main()
{
    // 计算100以内(包括100)所有数字的和
    int sum = 0; // 定义变量记录和
    int i = 1;   // 循环变量初始化

    do
    {
        sum += i;
        i++;
    } while (i <= 100);

    printf("100以内(包括100)所有数字的和是 %d \n", sum);
    printf("循环结束后循环变量的值:%d", i);

    return 0;
}

 (2)while和 do while的差异

        

#include <stdio.h>

int main()
{
    // while 循环 一次也不会执行
    int n = 10;
    while (n > 10)
    {
        printf("%d \n", n);
        n++;
    }

    // do while 陷入死循环
    n = 10;
    do
    {
        printf("%d \n", n);
        n++;
    } while (n > 10);

    return 0;
}

三:for循环

(1)基本语法

for (循环变量初始化; 循环条件表达式; 循环变量变化)
{
    循环语句;
}

说明:

  1. 循环变量初化只执行一次,且循环开始前就执行。
  2. 循环条件表达式每次循环都执行,同while循环一样,每次先判断后执行循环体语句。
  3. 循环标记变量变化每次循环都执行,在大括号中循环体语句之后执行。

        循环输出数字7~15

#include <stdio.h>

int main()
{
    // 循环输出数字 7~15
    for (int i = 7; i <= 15; i++)
    {
        printf("%d \n", i);
    }

    return 0;
}

        输出10(包括10)以内所有的偶数

#include <stdio.h>

int main()
{
    // 输出10(包括10)以内所有的偶数
    /* for (int i = 0; i <= 10; i ++) {
        if (i % 2 == 0) {
            printf("%d \n", i);
        }
    }*/
    for (int i = 0; i <= 10; i += 2)
    {
        printf("%d \n", i);
    }

    return 0;
}

        实现需求:输入6位数密码,直到密码匹配成功结束循环。

#include <stdio.h>

int main()
{
    // 正确密码
    int pwd1 = 123456;
    // 定义变量用于获取输入的密码
    int pwd2;

    // 循环
    for (; pwd1 != pwd2;)
    {
        printf("请输入6位数密码:");
        scanf("%d", &pwd2);
    }

    printf("密码正确,欢迎回家!");

    return 0;
}

(2)特殊结构的for循环

#include <stdio.h>

int main()
{
    // 标准结构
    for (int i = 1; i < 10; i += 2)
    {
        printf("%d ", i);
    }
    printf("\n\n");

    // 循环变量写在外面
    int i = 1;
    for (; i < 10; i += 2)
    {
        printf("%d ", i);
        ;
    }
    printf("\n\n");

    // 循环变量写在外面 循环标记变量变化写在大括号中
    i = 1;
    for (; i < 10;)
    {
        printf("%d ", i);
        i += 2;
    }
    printf("\n\n");

    // 使用两个循环标记变量
    for (int x = 1, y = 1; x <= 15 && y <= 10; x++, y++)
    {
        printf("%d %d \n", x, y);
    }
    printf("\n\n");

    // for 后面括号中什么都不写 死循环
    for (;;)
    {
        printf("死循环 \n");
    }

    return 0;
}

四:多重循环

  1. 将一个循环放在另一个循环体内,就形成了嵌套循环, 其中,for、while、do…while均可以作为外层循环和内层循环,建议一般使用两层,最多不要超过3层,如果嵌套循环过多,会造成可读性降低。
  2. 如果外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
#include <stdio.h>

int main()
{
    // 输入列数和行数
    int rows, cols;

    printf("请输入行数:");
    scanf("%d", &rows);

    printf("请输入列数:");
    scanf("%d", &cols);

    // 循环
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            printf("[%d,%d]  ", i, j);
        }
        printf("\n");
    }

    return 0;
}

(1)打印九九乘法表

其一:

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            printf("%d*%d=%d\t", j, i, i * j);
        }
        printf("\n");
    }

    return 0;
}

其二:

#include <stdio.h>

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

    return 0;
}

其三:

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 9; i++)
    {
        for (int j = 1; j <= 9 - i; j++)
        {
            printf("\t");
        }

        for (int j = 1; j <= i; j++)
        {
            printf("%d*%d=%d\t", j, i, i * j);
        }
        printf("\n");
    }

    return 0;
}

其四:

int main()
{
    for (int i = 9; i >= 1; i--)
    {
        for (int j = 1; j <= 9 - i; j++)
        {
            printf("\t");
        }

        for (int j = 1; j <= i; j++)
        {
            printf("%d*%d=%d\t", j, i, i * j);
        }
        printf("\n");
    }

    return 0;
}

五:跳转控制语句

(1)break

        break语句用于终止某个语句块的执行,用在switch语句或者循环语句中。

#include <stdio.h>

int main()
{

    for (int i = 0; i < 10; i++)
    {
        if (i == 3)
        {
            break;
        }
        printf("%d \n", i);
    }

    return 0;
}

         编写程序,要求输入一个数字,判断该数字是否是质数。

#include <stdio.h>
#include <stdbool.h>

int main()
{
    // 获取输入的数字
    int num;
    printf("输入一个数字:");
    scanf("%2d", &num);

    // 定义变量,标记是否为质数
    // 大于1的数字先标记为真,再通过循环看是否推翻; 小于1的数字直接标记为假
    _Bool isPrime = num > 1 ? 1 : 0;

    // 循环判断
    for (int i = 2; i <= num / 2; i++)
    {
        if (num % i == 0)
        {
            isPrime = 0;
            break;
        }
    }

    // 输出结果
    if (isPrime)
    {
        printf("%d 是质数!", num);
    }
    else
    {
        printf("%d 不是质数!", num);
    }

    return 0;
}

 (2)continue

        continue语句用于结束本次循环,继续执行下一次循环。

#include <stdio.h>

int main()
{
    for (int i = 0; i < 10; i++)
    {
        if (i == 3)
        {
            continue;
        }
        printf("%d \n", i);
    }

    return 0;
}

        输出100以内(包括100)的数字,跳过那些7的倍数或包含7的数字。

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 100; i++)
    {   
        // i % 7 判断 7 的倍数
        // i % 10 判断个位上带7的数字
        // i / 10 判断十位上带7的数字
        if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7)
        {
            continue; // 跳过
        }
        printf("%d\n", i);
    }

    return 0;
}

 (3)goto 语句

  1. 介绍

        goto语句是一种跳转语句,它允许程序控制流程在代码中跳转到带有标签(label)的语句处,标签(label)的名称可以自行设置,需要满足标识符规范。

        注意,我们在开发中不建议使用goto语句,但我们需要掌握 goto 语句的执行流程,以能够看懂其他开发者的代码中可能出现的 goto 语句。

        基本语法:

goto 标签名  // 跳转到指定的标签(label)处
...
标签名:      // 定义一个标签(label)
语句;

        注意:goto 后面如果引用了没有定义的标签,编译器会报错!

#include <stdio.h>

int main()
{
    printf("start \n");
    goto label1; // label1是标签名

    printf("ok1 \n");
    printf("ok2 \n");
label1:
    printf("ok3 \n");
    printf("ok4 \n");

    return 0;
}

        使用goto语句实现循环输出数字1 ~ 5。

int main()
{
    int i = 1;

start:
    if (i <= 5)
    {
        printf("%d ", i);
        i++;
        goto start; // 跳转到标签start处继续执行
    }

    return 0;
}

六:本章习题

(1)第一题

        请使用for、while、do—while 三种形式打印1000——9999年内所有的闰年。

#include <stdio.h>
//请使用for、while、do—while 三种形式打印1000——9999年内所有的闰年。
int main()
{ // 方法一:for循环
    // for (int year = 1000; year < 10000; year++)
    // {
    //     if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    //     {
    //         printf("%d\n", year);
    //     }
    // }
    // 方法二:while循环
    // int year = 1000;
    // while (year<10000)
    // {
    //     if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
    //         printf("%d\n", year);
    //     }
    //     year++;
    // }
    // 方法三:do-while循环
    int year = 1000;
    do
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        {
            printf("%d\n", year);
            
        }
        year++;
    } while (year < 10000);

    return 0;
}

 (2)第二题

        输出小写的a-z以及大写的Z—A。

#include <stdio.h>
//输出小写的a-z以及大写的Z—A。
int main()
{
    for (int i = 97; i <= 122; i++)
    {
        printf("%c", i);
    }
    printf("\n");
    for (int j = 90; j >= 65; j--)
    {
        printf("%c", j);
    }

    return 0;
}

(3)第三题

        求出1-1/2+1/3-1/4…..1/100的和。

#include <stdio.h>
//(8)求出1-1/2+1/3-1/4…..1/100的和。
int main()
{
    double sum = 1.0;
    for (int i = 2; i <= 100; i++)
    {
        if (i % 2 == 0)
        {
            sum -= 1.0/ i;
        }
        else
        {
            sum += 1.0 / i;
        }
    }
    printf("%lf", sum);

    

    return 0;
}

 (4)第四题

        输出星星 

#include <stdio.h>
//输出星星
int main()
{   printf("请输入你想要几行星星");
int num;
scanf("%d",&num);
for (int i = 0; i < num; i++)
{
    for (int j = 0; j < 2*i -1; j++)
    {
        printf("*");
    }
    printf("\n");
    
}

    return 0;
}

(5)第五题

        请写出下面程序的运行结果

int i;
for (i = 0; i < 5; i++)
{
   printf("%d ", i);
   i++;
}
printf("\n%d", i);

        【答案】

                0 2 4

                6

        【解析】

  1. 在这个程序中,使用了一个for循环来迭代i的值,然后在循环体内打印i的值,接着将i递增,同时,在循环体内部手动将i再次递增了一次。
  2. 在for循环内部,i从0开始,每次递增2(i++和循环自身的i++)。因此,for循环将执行3次(i=0, 2, 4),分别打印0,2和4。
  3. 在循环外部,printf("\n%d", i);语句将打印循环结束后的i的值,i最终的值为6。

 (6)第六题

         请写出下面程序的运行结果

int sum = 0;
for (int i = 1; i < 5; i++)
{
   if (i == 3)
  {
       continue;
  }
   sum += i;
}
printf("%d", sum);

答案:7

(7)第七题

        使用 while 循环实现一个死循环

答案:

while (1)
{
}

        本章的内容就到这里。

        关注我一起成为嵌入式大佬。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值