前言

循环是程序的一种基本结构,它可以解决很多有用的问题,特别是那些重复性有规律的事情。

while循环语句

while循环语句的语法格式如下:

while(表达式){
    语句系列;	//循环体
}

while语句的执行过程是:根据表达式判断,如果为真,则执行循环体,一直执行循环体,直到break;才会跳出循环

需要注意的是,while是在循环前,先判断

【实例】求 $n!$。

【代码示例1】

#include <stdio.h>
int main(){

    int n;
    long int sum;
    printf("请输入要求的阶乘:");
    scanf("%d", &n);
    sum = n;
    if (n>=0)
    {
        if (n>0)
        {
            while (n>1)
            {
                sum *= (n-1);
                n = n - 1;
            }
            printf("阶乘的结果为: %ld",sum);
        }else{
            printf("阶乘的结果为:1");
        }
    }else{
        printf("输入的数值非法");
    }
    
    return 0;
}

【示例代码2】

#include <stdio.h>
int main(){
    int i, n;
    long int s;
    s = 1;
    i = 1;
    printf("请输入要求的阶乘:");
    scanf("%d", &n);
    while (i<=n)
    {
        s *= i;
        i++;
    }
    printf("%d的阶乘结果为:%ld", n, s);

    return 0;
}

【输出1】

image-20220112000315699 image-20220112000419537

【输出2】

image-20220112000533569 image-20220112000419537

do-while循环语句

while语句中,是在执行循环体之前进行循环条件判断的。因此,在有的时候,需要在循环体执行后进行判断,也就是说循环体的语句无论什么条件下都至少要执行一次。为了方便这种情况,C语言提供了do-while语句,语法格式如下:

do
{
    //循环体
} while (表达式);
image-20220112141915117

该语句的执行过程为:执行循环体结束,判断表达式,如果为真,则继续执行循环体,反之则跳出循环体。

【实例】求$1+2+3+4+······+100$,即$\sum\limits_^{100}i$。

【代码示例】

#include <stdio.h>
int main(){

    int k=1;
    int sum=0;
    do
    {
        sum += k;
        k++;
    } while (k<=100);
    printf("和为:%d",sum);

    return 0;
}

【输出】image-20220112142526030

for循环语句

对循环状态的初始化和对循环控制变量的修改,是循环语句中不可缺少的两个组成部分。为了便于描述,阅读和检查,C语言提供了与while语句和do-while语句功能相似的for语句。for语句是控制循环语句最广泛的一种循环控制语句。其功能是某段程序代码执行若干次,特别适合已知循环次数的情况。其语法格式如下:

for (表达式1; 表达式2; 表达式3)
{
    //循环体
}

其中:

  • 表达式1常为赋值表达式,用来确定循环结构中的控制循环次数的变量的初始值,实现循环控制变量的初始化。
  • 表达式2常为关系表达式或者逻辑表达式,用来判断循环是否继续执行,通常将循环控制变量与某一值进行比较来判断是否继续执行循环体。
  • 表达式3为表达式语句,用来描述控制变量的变化,常为自增或者自减表达式。

【实例】输入10个整数,求这10个整数的和。

【代码示例】

#include <stdio.h>
int main(){

    int sum = 0;
    int n;
    printf("请输入10个整数:");
    for (int i = 0; i<10; i++)
    {
        scanf("%d", &n);
        sum += n;
    }
    printf("和为:%d", sum);
    return 0;
}

注意:

  1. for循环中的表达式1,表达式2,表达式3都是选择项,即可以缺省,但分号;不可以缺省。

  2. 省略表达式1,表示不对循环控制变量赋初值。语法格式如下:

    for(;表达式1;表达式2)
    

    实际上表达式1可以写在for语句结构的外面。例如:

    n=20;for(;表达式1;表达式2)
    

    一般使用这种格式的原因是:循环控制变量的初值不是已知常量值,而是需要通过前面的语句执行计算得到。

  3. 省略表达式2,表示不用判断循环条件是否成立,循环条件总是满足的。此时如果不做其他处理时,则为死循环,类似于while(1)的效果。

  4. 省略表达式3,可以在循环体中进行控制。

  5. 省略三个表达式,可以使用break;来控制跳出循环。

  6. for语句的循环体可以是空语句,表示当循环满足时空操作。一般用于延时处理,例如:

    for(int i =0;i<10000;i++);
    

    表示循环空循环了10000次,占用一定的时间,起到了延时效果。

  7. for语句中,表达式1和表达式3都可以是一项或者多项。相当于多一项,各项之间用,隔开。

for结构不是狭义上的计数式循环,是广义上的循环结构。

【实例】猴子吃桃问题,猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃了一半,又多吃了一个。以后每天早上都这么吃,直到第10天早上只剩下1个桃子,求第一天共摘了多少桃子?

【代码示例】

#include <stdio.h>
int main(){

    int sum = 1;
    for (int i = 0; i<9; i++)
    {
        sum++;
        sum *= 2;
    }
    printf("和为:%d", sum);
    return 0;
}

【输出】

image-20220112152758146

循环嵌套

**一个循环语句中包含另一个完整的循环结构,称为循环的嵌套。**嵌套在内的称为内循环,嵌套内循环的循环称为外循环。理论上循环的嵌套是无限的。

对于双重循环来说,内层循环的执行次数为:内层次数 $\times$ 外层次数。

【实例】输出十行星号(*)半金字塔形

【代码示例】

#include <stdio.h>
int main(){

    for (int j = 0; j < 10; j++)
    {
        for (int i = 0; i < j; i++)
        {
            printf("#");
        }
        printf("\n");
    }
    
    return 0;
}

【输出】

image-20220112162331985

break语句和continue语句

在循环结构的循环体中,可以使用break语句和continue语句来控制循环的流程。其中break语句的功能是从循环体中退出,提前结束循环;continue语句的功能则是终止本次循环,跳出本次循环体中剩余未执行的语句,转向下一次循环是否执行的循环条件判断

break语句

break语句的格式如下:

break;

break语句只能出现在switch语句或者循环语句的循环体中

continue语句

continue语句格式如下:

continue;

说明:

  1. continue语句只能出现在whiledo-whilefor循环语句的循环体中。

goto语句和标号

goto语句是无条件转移语句。其功能是改变程序控制的流程,无条件地将控制转移到语句标号所在处。语法格式如下:

goto 语句标号;

其中:语句标号用标识符来命名,当它放在某个语句行前面做该语句行的标识时,它的后面需要有冒号:。例如:

error:语句;

在C语言中,语句标号通常与goto语句配合使用,表示无条件跳转到语句标号指定的语句位置。在程序中,标号必须与goto语句处于同一个函数中,但可以不在同一个循环层中

goto语句不常用,主要是因为大量使用它会破坏程序的结构化,使程序的流程混乱,可读性降低。

【实例】求$1+2+3+4+······+100$,即$\sum\limits_^{100}i$。

【代码示例】

#include <stdio.h>
int main(){

    int i = 1;
    int sum = 0;
    loop:if (i<=100)
    {
        sum += i;
        i++;
        goto loop;
    }
    printf("和为:%d", sum);

    return 0;
}

【输出】image-20220112142526030

Q.E.D.


赤脚踩在明媚的沙滩上,我看见了你闪耀的双眼,柔软的头发,我便心有所属