第三章 循环

目录

前言

if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作。

重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。

while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。

do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。

人VS计算机

人VS计算机

写程序一定要明确我们写的是步骤,一步一步地执行而不是表示关系

判断几位数

#include <stdio.h>

int main()
{
    int x = 0;
    int n = 1;

    scanf("%d", &x);

    if(x > 999){
        n = 4;
    }else if(x > 99){
        n = 3;
    }else if(x > 9){
        n = 2;
    }

    printf("%d\n", n);

    return 0;
}

上面这个程序是按照步骤执行的例子,而下面这个程序则表达的是一种关系执行的方式

#include <stdio.h>

int main()
{
    int x = 0;
    int n = 1;

    scanf("%d", &x);

    if(x > 999){
        n = 4;
    }

    if(x > 99){
        n = 3;
    }

    if(x > 9){
        n = 2;
    }
    
    printf("%d\n", n);

    return 0;
}
  • 这个程序同时还存在一个问题,当x等于100时,x即大于99也大于9,所以按照计算机的一步一步执行方式,这两个if语句都要执行,那么最终n等于2,输出结果为2。
  • 这个程序是大于号,所以要从高出往低处判断;如果是小于号则是从低处往高处判断。
  • 但是这个是一个4位数的整数,如果是任意一个整数呢?

重复的例子

数数

数数
划数
优化

#include <stdio.h>

int main()
{
    int x;
    int n = 0;

    scanf("%d", &x);

    n++;
    x /= 10;

    while(x > 0){
        n++;
        x /= 10;
    }

    printf("%d\n", n);

    return 0;
}

这个程序中将x /= 10;放在n++;之前也可以。

讨论

数数这个程序最多可以数到几位数?
最多可以数到10位数。

最多数到几位数

while循环

// if是一次性的
if(x > 0){
    x /= 10;
    n++;
}
// while是重复直到不满足条件
while(x > 0){
    x /= 10;
    n++;
}

while流程图

  • while语句中的循环体内要有改变条件的机会,否则容易进入死循环出不来
  • 程序有时候语法是正确的可以通过编译,但逻辑是错误的
// 死循环
#include <stdio.h>

int main()
{
    int x;
    int n = 0;

    scanf("%d", &x);

    n++;
    x /= 10;

    while(x > 0){
        n++;
        // x /= 10;
    }

    printf("%d\n", n);

    return 0;
}
  • 如果我们把while循环翻译作“当”,那么一个while循环的意思就是:当条件满足时,不断地重复循环体内的语句。
  • 循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行;
  • 条件成立是循环继续的条件。

验证

// 去掉while之前的n++;与x /= 10;
#include <stdio.h>

int main()
{
    int x;
    int n = 0;

    scanf("%d", &x);

    // n++;
    // x /= 10;

    while(x > 0){
        n++;
        x /= 10;
    }

    printf("%d\n", n);

    return 0;
}

验证步骤1

列出表格

验证步骤2

例如上面的程序验证:

x n
0 0
0

调试

  • 在程序适当的位置插入printf来输出变量的内容,或者查看是否执行到这个地方
#include <stdio.h>

int main()
{
    int x;
    int n = 0;

    scanf("%d", &x);

    n++;
    x /= 10;

    while(x > 0){
        printf("x=%d", x);
        n++;
        x /= 10;
    }
    
    return 0;
}

do-while

不管三七二十一,先做循环体内的句子

  • 在执行完成一轮循环后再对条件进行检查,满足则继续循环,不满足则退出
do{

}while(循环条件);
// 这个分号一定要有,因为它代表while()这个语句结束,在C语言中`{}或者;`可以代表一个语句的结束
// 数数基于do-while的改进
#include <stdio.h>

int main()
{
    int x;
    int n = 0;

    scanf("%d", &x);

    do{
        x /= 10;
        n++;
    }while(x > 0);

    printf("%d\n", n);

    return 0;
}

运行结果

while与do-while的流程图

流程图

左边的是do-while, 右边的是while

for循环

阶乘例子

阶乘

// 基于while循环
#include <stdio.h>

int main()
{
    int n;
    int i = 1;
    int factor = 1;
    
    scanf("%d", &n);

    while(i <= n){
        factor *= i;
        i++;
    }

    printf("%d! = %d\n", n, factor);

    return 0;
}

for循环

// 基于for循环
#include <stdio.h>

int main()
{
    int n;
    int i;
    int factor = 1;

    scanf("%d", &n);
    // C99 for(int i=1; i<=n; i++)
    for(i=1; i<=n; i++){
        factor *= i;
    }

    printf("%d! = %d\n", n, factor);

    return 0;
}
  • 第一个条件是初始条件
  • 第二个条件是循环条件
  • 第三个条件是每轮循环要做的动作
  • for循环也可以省去一个条件,写成for(; i<=n; i++){}

for循环很怪吗?
for循环不符合人类的语言逻辑,不易理解,因此就造成了第一次接触语言的人觉得for循环很怪。而现代程序设计理念更强调与人类语言的逻辑统一性,所以在新兴的python语言中祛除掉了C中的for循环逻辑。但由于for循环抽象程度高,所以在掌握语言基础后,其表现逻辑更为简洁易于回溯反而更方便使用。 Python语言就没有for循环的另一个原因是Python里没有累加器。

for循环
for循环与while循环

for循环的计数

for循环计数

  • for(i=0; i<n; i++), 最终i=n, 一共5轮循环
  • for(i=1; i<=n; i++), 最终i=n, 一共5轮循环
#include <stdio.h>

int main()
{
    int i;
    int n = 5;

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

    printf("\ni=%d\n", i);

    return 0;
}
#include <stdio.h>

int main()
{
    int i;
    int n = 5;

    for(i=1; i<=n; i++){
        printf("i=%d ", i);
    }

    printf("\ni=%d\n", i);

    return 0;
}

运行结果

三种循环的选择与比较

三种循环

  • 左边是for循环,中间是while循环,右边是do-while循环

如何选择

posted @ 2024-02-16 11:00  ChangJianhui  阅读(37)  评论(0)    收藏  举报