3.6 while循环与do while循环的使用及区别

1.while循环

while循环的一般形式为:


while(表达式)

循环体;


while循环的执行流程是先计算表达式的值,如果为真,那么就执行循环体,否则退出循环。while循环流程图如图3-11所示。

下面的代码通过while循环来实现1到n之间的整数之和,n通过输入来确定。

3.6 while循环与do while循环的使用及区别 - 图1

图 3-11 while循环流程图

include<stdio.h>

void main(void)

{

int n;

printf("请输入n值:");

scanf("%d",&n);

int sum;

sum=n;

printf("1到%d之间的整数之和为:",n);

while(n—)

{

sum+=n;

}

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

return;

}


运行结果:


请输入n值:5

1到5之间的整数之和为:15


在上面的程序中,用“n—”作为while循环的表达式,当“n—”的值为0时结束循环。当while循环的表达式始终为非零时,表达式的值始终为真,这时while循环成为了死循环,可以使用前面讲过的break语句来结束循环。在while循环中使用break语句的一般形式为:


while(表达式)

{

循环体1;

break;

循环体2;

}


含有break语句的while循环的流程图如图3-12所示。

下面通过一段代码来看看break语句在while循环中的使用。以下代码的功能为求一个数n的阶乘,其中,n由键盘输入,要求n的值不大于20。

3.6 while循环与do while循环的使用及区别 - 图2

图 3-12 含有break语句的while循环流程图

include<stdio.h>

void main(void)

{

int n;

printf("请输入n值:");

scanf("%d",&n);

if(n>20||n<0)

{

printf("输入出错!\n");

return;

}

int num;

num=1;

printf("%d的阶乘为:",n);

while(1)

{

if(n<0)

break;

if(0==n)

num*=1;

else

num*=n;

n—;

}

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

return;

}


运行结果:


请输入n值:6

6的阶乘为:720


在上面的代码中,在while循环的表达式中使用了一个非零常量1,所以这个while循环是一个死循环,但是在while循环体内通过一个if语句来判断当前的n值,进而决定是否执行break语句来退出循环体。当n的值为负时,执行break语句,退出while循环。

在while循环中也可以使用continue语句来结束循环,其相应的流程图如图3-13所示。

3.6 while循环与do while循环的使用及区别 - 图3

图 3-13 含有continue语句的while循环流程图

continue语句在while循环中的作用是结束本次循环体的执行,不再执行其后的循环体,跳转到表达式处开始新一轮的循环判断。下面通过一段代码来了解continue语句在while循环体中的使用。此段代码的功能为打印出1到30之间所有3的倍数的整数。


include<stdio.h>

void main(void)

{

int n;

int num;

n=1;

num=0;

while(n<31)

{

if(0!=n%3)

{

n++;

continue;

}

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

num++;

if(0==num%5)

printf("\n");

n++;

}

return;

}


运行结果:


3 6 9 12 15

18 21 24 27 30


在上面的代码中,通过if语句来判断当前的n是否是3的倍数来决定是否执行continue语句,如果不是3的倍数,那么就执行continue语句结束本次循环的执行,其后的循环体不会被执行,转而执行表达式看是否满足本循环体的执行条件,否则就执行接下来的循环体,打印出当前的数据n。

2.do-while循环

do-while循环的一般形式为:


do{


循环体;


}while(表达式);


do-while循环流程图如图3-14所示。

从图3-14可以看出,do-while循环的执行流程与while循环的最大区别是:do-while循环先执行循环体,再判断表达式的值是否为真,如果为真,那么继续执行循环体,否则退出循环,无论在什么情况下,do while循环体都至少执行一次;而对于while循环,如果起始条件不满足,那么循环体一次都不执行。接下来通过下面的代码来看do-while循环的使用。代码的功能为求1到n之间所有正整数的平方和,n由输入确定。

3.6 while循环与do while循环的使用及区别 - 图4

图 3-14 do-while循环流程图

include<stdio.h>

void main(void)

{

int n;

int sum;

printf("请输入n:");

scanf("%d",&n);

printf("1到%d之间所有正整数的平方和为:",n);

sum=0;

do{

sum+=n*n;

}while(—n);

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

return;

}


运行结果:


请输入n:8

1到8之间所有正整数的平方和为:204


像while循环一样,也可以使用break语句来退出do-while循环,其使用的一般形式为:


do{

循环体1;

break;

循环体2;

}while(表达式);


其相应的流程图如图3-15所示。

3.6 while循环与do while循环的使用及区别 - 图5

图 3-15 含有break语句的do-while循环流程图

如果在循环体中执行了break语句,那么就直接退出do-while循环。接下来看看break在do-while循环中的使用,以下代码的功能为查找100以内能同时被2、5、9整除的最大正整数。


include<stdio.h>

void main(void)

{

int n;

n=100;

do{

if(0==n%2&&0==n%5&&0==n%9)

break;

}while(n—);

printf("100以内能同时被2、5、9整数的最大正整数为:%d\n",n);

return;

}


运行结果:


100以内能同时被2、5、9整数的最大正整数为:90


看完break语句在do-while循环中的使用,接下来看continue语句在do-while循环中的使用,其一般形式为:


do{

循环体1;

continue;

循环体2;

}while(表达式);


相应的流程图如图3-16所示。

3.6 while循环与do while循环的使用及区别 - 图6

图 3-16 含有continue语句的do-while循环流程图

从流程图中可以看出,如果在do-while循环体中执行了continue语句,那么接下来就跳转到表达式执行,不少人不能够正确地画出do-while循环使用continue语句的流程图,认为执行continue语句之后跟前面讲解的while循环一样跳转到了循环上面的开始处,这种理解是错误的。下面的代码说明执行了continue语句之后跳转到表达式处,而不是直接重新开始执行循环体。


include<stdio.h>

void main(void)

{

int n;

n=0;

do{

printf("执行continue语句之前的打印语句!\n");

if(!n)

continue;

printf("如果执行continue那么该语句不被打印\n");

}while(n);

printf("测试成功,跳转到表达式处执行!\n");

return;

}


运行结果:


执行continue语句之前的打印语句!

测试成功,跳转到表达式处执行!


分析这里的代码,这里给定n的初始值为0,如果执行了continue语句之后跳转到循环体的开始处,那么每次都不会执行表达式,这个do-while循环会变成死循环。但是测试结果表明这个假设不成立,因为打印语句成功地说明了执行完continue语句之后,跳转到表达式处执行。接下来看看continue语句在do-while循环中的使用。下面这段代码的功能为查找50以内能同时被2、5整除的正整数。


include<stdio.h>

void main(void)

{

int n;

n=50;

do{

if(0!=n%2)

continue;

if(0!=n%5)

continue;

printf("能同时被2和5整除的正整数:%d\n",n);

}while(—n);

return;

}


运行结果:


能同时被2和5整除的正整数:50

能同时被2和5整除的正整数:40

能同时被2和5整除的正整数:30

能同时被2和5整除的正整数:20

能同时被2和5整除的正整数:10


通过if语句来判断数n是否能同时被2和5整除,如果不能被其中一个整除,那么就结束本次循环,跳转到表达式,判断是否满足进入下一次循环的条件。如果能同时被2和5整除,那么就打印输出该数。