由while语句构成的当型循环结构,其一般形式为:
说明:
(1) while后的()是半角括号,不能省略。
(2) while的表达式可以是任意类型的表达式,不仅仅是条件表达式或逻辑表达式。表达式的值作为循环条件。
(3)语句部分称为循环体,当需要执行多条语句时,应使用复合语句(用{}括起来)。while语句构成的循环执行过程如下:
首先判断表达式的值是否为真(非0),如果表达式的值为真,则执行循环体内的语句;然后再判断表达式的值是否为真,如果表达式的值为真,则再次执行循环体内的语句,如此循环往复,直到表达式的值为假(0)时结束。其流程图如图5-1所示。
图5-1 while型循环流程图
例5.1 用while语句实现求1 +2+…+100的和。
解题思路:
要实现累加求和,需要设置两个变量:一个为累加数,一个为和。先判断累加数是否超出最大的加数,如果判断结果为真,则做累加运算,依此重复执行,直到累加数超出最大的累加数结束。这里设i为累加数,sum为和。其流程图如图5-2所示。
图5-2 例5.1的算法流程图
编写程序:
创建一个名为“eg5_1.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
程序中的循环体是复合语句,它含有“sum = sum + i ;”和“i++;”两条语句。循环条件是i <= 100,每执行一次循环体,i的值就会增加1(i++),使得i的值逐渐递增。当i <= 100这个条件不成立时,就不再执行循环体而结束循环。
i也能起到计数器的作用,通过i的值控制循环体被执行的次数,“i++;”与“++ i;”或“=i+1;”或“i+=1;”等价,程序的执行效果也完全相同。
循环条件i <= 100也可以用i<101表示,程序执行效果也完全相同。
注意:循环条件可以灵活设置,理解其等价关系,使得编程方法更加灵活。
例5.2 利用while语句实现输出小于5的正整数。
创建一个名为“eg5_2.c”的新文件,在编辑窗口中输入下面的程序代码。
(www.daowen.com)
运行结果:
程序说明:
本程序的功能是依次输出i的值,i <5是循环条件,当i的值为5时结束循环,循环体共执行4次。
在上例中,如果去掉循环体开始及结束的{},其具体代码如下所示。
程序说明:
程序运行后满屏飞快地输出1,永不停止!
这是因为系统认为“printf (" % d" , i) ;”是循环体语句,在条件i <5成立时被反复执行。表面上看“i++;”语句必须在上述重复过程执行完毕才轮到执行且只有一次,实际上在重复执行“printf(" % d" , i) ”语句的过程中,“ i ++ ;”永远也轮不到执行,使得i <5永远成立,“printf("%d" ,i) ;”语句会一直重复执行,永不停止,这就是所谓的死循环(亦称为无限循环)。
如果将上例中的循环体改为:
printf("%d",i++);与原程序运行效果相同,不是死循环。这是因为变量i每次加1的功能已经融入printf()函数中,使得i的值每次都可以改变。
注意:如果循环条件设计得不合理,可能会造成死循环。因此,在应用循环结构进行编程时应谨慎设置循环条件,循环体有限次被执行后,应使循环条件不成立,这样循环才能结束。
例5.3 空语句作为循环体。
创建一个名为“eg5_3.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
程序中的循环体是“;”(空语句),而不是“printf ("a= % d \ n" , a) ; ” 。 while循环部分的执行过程是先计算表达式a--的值为2,执行空语句,然后将a的值减1,值为1;再计算表达式a--的值为1,执行空语句,然后将a的值减1,值为0;再次计算a--的值为0,由于循环条件为假,不执行空语句并退出while循环,但a的值仍然要减1,值为-1。
上例中如果将while (a--)后的“;”去掉,则运行结果为:
a=2
a=1
为了便于理解,给出其等价的程序段如下:
这里循环体是“printf( "a=%d\n" ,a--);”,只要a--表达式的值不为0,就执行该循环体,并再判断a--的值。共执行了两次循环体,输出两行内容。
注意:空语句(;)及复合语句的执行过程比较特殊,应该引起重视。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。