3.6 while循环与do while循环的使用及区别
1.while循环
while循环的一般形式为:
while(表达式)
循环体;
while循环的执行流程是先计算表达式的值,如果为真,那么就执行循环体,否则退出循环。while循环流程图如图3-11所示。
下面的代码通过while循环来实现1到n之间的整数之和,n通过输入来确定。
图 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-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-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-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-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-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整除,那么就打印输出该数。