
2.3 结构化程序设计方法
2.3.1 自顶向下的程序设计
程序设计初学者常常会面临一个问题:对于要解决的问题,不知如何入手,也就是没有一个清晰的思路去处理问题。用计算机语言解决问题,特别是比较复杂的问题,很难一步到位,一般要将大问题分解为很多个小问题,每一个小问题比较简单,能够很快、很容易地将它解决。自顶向下的程序设计思想就是将复杂的问题分解为多个小问题,明确问题的关键之处,将小问题逐层、逐个解决,由浅入深,直到解决原始问题。
自顶向下的程序设计方法具有两个特征:第一,对问题有深入的理解,在清晰地理解问题的前提下,才能知道怎样对问题进行拆分是最有利的;第二,上层问题不必细化,最底层问题必须足够细化,并且通过编程可以解决。
【例2-5】在屏幕上输出以下结果,用自顶向下的程序设计思想将问题进行分解并解决。

首先,不要急于写代码,要充分理解需要解决的问题是什么,找出图形规律,将问题分解为可以直接解决的小问题,先解决每个小问题,最后叠加出原始问题的解决方案。可以看到,运行结果中有8行星号,第i行有2*i-1个星号。那么,第一步,先输出8行,伪代码如算法2-2所示。
算法2-2 输出8行

然后,解决每行输出2*i-1个星号的问题,也用一个循环体完成,伪代码如算法2-3所示。
算法2-3 每行输出2*i-1个星号

将算法2-2里的“输出第i行”替换为算法2-3,就得到了解决整个问题的算法,算法结构十分清晰,如算法2-4所示。
算法2-4 输出8行星号


用自顶向下的程序设计方法设计好完整的算法,写程序也就水到渠成了,输出8行星号的程序如代码清单2-2所示。
代码清单2-2 输出8行星号

2.3.2 结构化编程
为了解决复杂的问题,同时提高编程效率,计算机科学家们提出了结构化编程方法。在实现复杂算法的时候,用结构化思想写的程序可读性和可扩展性更强。首先,要了解一下如何开发一个程序。
一个简单的程序设计可以划分为图2-13所示的几个步骤,这些步骤构成一个开发周期。其程序设计步骤的详细含义见表2-5。
表2-5 程序设计步骤详解

其中设计程序逻辑是核心步骤,即设计出满足要求的算法。算法设计的好坏会影响算法的实现,一个好的程序不但可以正确地解决问题,而且效率高、易理解、可扩展,使用结构化编程思想更有利于设计出好的算法,写出好的程序。
结构化编程包括以下两个原则:
(1)尽量使用三种基本控制结构。研究表明,任何程序都可以用顺序结构、选择结构和循环结构这三种基本控制结构来实现。因此在开发程序时,尽量使用这三种基本结构搭建整个程序。如本章列出的例题,都仅使用了这三种基本结构。
(2)使用单入口和单出口的块结构。举个简单的例子:a=abs(-10),这是一条单入口和单出口的语句,输入为“-10”,输出为“a”,即-10的绝对值。许多条这样的语句按顺序执行可以看作一个顺序控制结构。对于选择结构和循环结构,虽然内部有很多语句块,但是从外部来看,同样是只有一个入口和一个出口。单入口和单出口的块结构组合性强,可以很容易地把几个块结构组合在一起形成一个大的块结构。图2-14说明了单入口和单出口的块结构的串联过程,多个块结构还可以进行嵌套。

图2-13 程序设计步骤

图2-14 控制结构的串联