裘宗燕 从问题到程序(2003 年修订),第四章,基本程序设计技术
第四章 基本程序设计技术
读者在学习中应已试验了一些程序示例,做了些练习。写程序的过程中确实要处理许多
琐碎细节,但它又是很有趣的工作,是对智力的挑战。为完成一个程序,首先要分析问题、
寻找解决方案,需要聪明才智和想象力,各种相关领域的知识和技术都可能得到应用。要把
设计变成现实,变成可执行的程序,则既需要智力发挥,又需要有条有理的工作,还需要极
端细心。一个小错就可能使程序无法编译或不能正确执行。当然,高度精确性也是现代社会
的特征,写程序的过程能给读者许多有价值的体验。
学习程序设计都需要经历类似的熟悉过程,但并不是说这里的学习就是简单经验积累,
也不意味着程序做多了就一定能做好。多年实践使人认识到程序设计的许多规律性,总结出
许多模式、方法和技术,也进一步研究了许多理论问题。
学习程序设计,一开始就应该注意程序设计中的规律性。正确的好的程序不可能随随便
便写出来,也不应该是修修补补改出来的。只有注意写好小程序,弄明白最基本的道理,才
能进一步写出更大更复杂的程序。这些都是本书各章中特别强调的问题。
在进一步了解 C 语言的其他功能之前,我们应学会把已知的东西应用于实际程序设计,
这就是本章的目的。前面讨论了三种结构化流程模式和相关语言结构。顺序模式最简单,很
容易用复合语句实现。选择模式的最重要问题就是正确描述条件,考虑不同条件下应完成的
动作,用条件语句实现也不困难。学习程序设计初期的主要难点是重复执行模式,它比较复
杂,用循环实现时牵涉到的问题较多,这是本章讨论的重点。此外本章还要讨论基本输入输
出,采用递归的方式编程,并介绍 C 语言的其他控制结构和控制语句。
4.1 循环程序设计
写出写好循环首先要发现计算过程中可能需要(应该用)循环。在分析问题时,应注意
识别计算过程中需要重复执行的类似动作,这常常是重要线索,说明可能需要引进一个循环,
统一描述和处理这些重复性动作。常见如:需要一批可以按统一规律计算的数据;需要反复
从一个结果算出另一结果;需要对一系列类似数据做同样处理等等。这些情况都可看着重复
性计算,如果重复次数多,或次数无法确定,就应考虑用循环结构描述。
从发现重复性动作到建立起一个循环结构,还需考虑和解决许多具体问题。通常包括:
循环中涉及哪些变量?循环开始前应给它们什么初值?循环中这些变量应如何改变?在什
么情况下应该继续(或应该终止)循环?循环终止后如何得到所需结果?如此等等。具体问
题还包括使用语言里的哪种结构实现循环等。
本节将讨论一批程序设计实例,描述的各种典型循环程序设计问题。对于许多实例都采
用了首先分析问题,发掘完成程序的线索,最终完成能解决问题的程序的叙述方式。这样讨
论是为使读者能看到“从问题到程序”的思维过程。对许多例子给出了多个能解决问题的不
同程序,并着重说明其差异或优缺点。这样做是希望读者能理解:程序设计不是教条,即使
对一个典型问题,也没有需要背的标准解答。非极端简单的问题总有许多种解决方法,可以
写出出许多有着或多或少形式的或实质的差异程序。许多程序往往各有长短。当然,能写出
多个程序,并不说明这些程序都有同等价值。实际上,“正确的”程序也常有优劣之分。下
面讨论里也会提出一些看法。
4.1.1 基本循环方式
假设现在要求出从 13 到 315 的所有整数之和。显然的解法是写一个循环,这时需要用
1