第三章 循环
目录
前言
if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作。
重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。
while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
人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语句中的循环体内要有改变条件的机会,否则容易进入死循环出不来
- 程序有时候语法是正确的可以通过编译,但逻辑是错误的
// 死循环
#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;
}



例如上面的程序验证:
| 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循环
#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(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循环

 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号