前言

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

while循环语句

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

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

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

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

【实例】求 $n!$。

【代码示例1】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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语句,语法格式如下:

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

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

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

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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语句是控制循环语句最广泛的一种循环控制语句。其功能是某段程序代码执行若干次,特别适合已知循环次数的情况。其语法格式如下:

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

其中:

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

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

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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,表示不对循环控制变量赋初值。语法格式如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
#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$ 外层次数。

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

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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语句的格式如下:

1
break;

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

continue语句

continue语句格式如下:

1
continue;

说明:

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

goto语句和标号

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

1
goto 语句标号;

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

1
error:语句;

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

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

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

【代码示例】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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