5.2 do-while语句

5.2.1 语法要素

关键字:while、do

语法:do语句while(表达式);

执行过程:

(1)执行语句

(2)求表达式的值

(3)如果表达式的值不为0,转至(0)执行语句;如果表达式的值为0,do-while语句结束。

do-while语句的流程图如图5-2所示。

5.2 do-while语句 - 图1

图5-2 do-while语句的流程图

在外在形式上,do-while语句和if-else语句有一个类似的特点,那就是在这个语句中很可能有两个“;”。初学者容易忘记其中一个“;”,造成不必要的错误和麻烦。因此本书使用等价的形式:

5.2 do-while语句 - 图2

经验表明,这样的写法可以让初学者避免许多由于对C语法不熟悉而造成的错误。同时这也是一个值得推荐的良好的编程习惯。

在语句的执行方面,do-while语句和while语句最大的区别在于循环体内的语句首先被执行一次,然后再求()内的表达式的值,再后的执行情况视表达式的值而定。

和while语句一样,do-while语句同样常常用于次数预先不确定,尽管这不是绝对的。C语言所有的循环语句都可以用其他的循环语句来表达,选择哪种语句的主要原则要看哪种描述解决问题的方法最直接、最简洁、最有效。

5.2.2 例题

题目:输入一个不多于九位的十进制整数,要求(1)按逆序输出,(2)求它是几位数。

程序功能定义:在开始编程之前,甚至在准备开始编程之前,全面正确地理解程序的要求,即在各种情况下程序应该有什么样的行为。这是比编程中任何一个步骤都重要的。

然而,遗憾的是不少人对此相当的轻视,结果是,程序往往在我们觉得最不可能出错的地方发生问题。经验表明,常识最容易被忽视。以此题为例,有多少人想到了整数有正整数、负整数和0呢?如果没有想到这些,程序的错误就几乎是必然的。

此外,即使想到了这些,还可能有另外一些问题,比如对-123按逆序输出究竟应该是-3-2-1、-321还是321-呢?再如,100按逆序输出究竟是001还是1呢?这些都需要在编程之前明确,不能等程序编出来再说,那样就如同把枪打到哪儿之后再把靶子放在哪儿。

这实质上也是对测试数据的设计,本程序的功能由下面输入输出样例定义。

5.2 do-while语句 - 图3

算法分析:核心内容就是取出各位数字。一个正整数zs的个位是zs%10,十位是zs/10%10……

程序代码5-5

5.2 do-while语句 - 图4

5.2 do-while语句 - 图5

可以验证,程序的输出结果与测试数据所要求的一致。

练习

输入一个不多于九位的十进制非负整数,示其各位数字之和。