结构程序设计
出处:按学科分类—工业技术 企业管理出版社《工程师手册》第994页(2942字)
结构程序设计的概念最早由E.W.Dijkstra提出。1965年他在一次会议上指出:“可以从高级语言中取消GO TO语句”,“程序的质量与程序中所包含的GO TO语句的数量成反比””。1966年Bohm和Jacopini证明了,只用三种基本的控制结构就能实现任何单入口单出口的程序。这三种基本的控制结构是“顺序”、“选择”和“循环”,它们的流程图分别为图7.5.2-1(a),(b)和(c)。
图7.5.2-1 三种基本的控制结构
(a)顺序结构,先执行A再执行B;(b)IF-THEN-ELSE型选择(分支)结构;(c)DO-WHILE型循环结构。
实际上用顺序结构和循环结构(又称DO-WHILE结构)完全可以实现选择结构(又称IFTHEN-ELSE结构),因此,理论上最基本的控制结构只有两种。
Bohm和Jacopini的证明给结构程序设计技术奠定了理论基础。
1968年Dijkstra再次建议从一切高级语言中取消GO TO语句,只使用三种基本控制结构写程序。他的建议引起了激烈争论,经过讨论人们认识到,不是简单地去掉GOTO语句的问题,而是要创立一种新的程序设计思想、方法和风格,以显着地提高软件生产率和降低软件维护代价。
1972年IBM公司的Mills进一步提出,程序应该只有一个入口和一个出口,从而补充了结构程序设计的规则。
1971年IBM公司在纽约时报信息库管理系统的设计中成功地使用了结构程序技术,随后在美国宇航局空间实验室飞行模拟系统的设计中,结构程序设计技术再次获得圆满成功。这两个系统都相当庞大,前者包含8万3千行高级语言源程序,后者包含40万行源程序,而且在设计过程中用户需求又曾有过很多改变,然而两个系统的开发工作都按时并且高质量地完成了。这表明,软件生产率比以前提高了一倍,结构程序设计技术成功地经受了实践的检验。
那么,什么是结构程序设计呢?目前还没有一个为所有人普遍接受的定义,一个比较流行的定义是:
结构程序设计是一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。
有人认为结构程序设计的定义中还应该包括采用“主程序员组”这种人员组织形式。在纽约时报信息库管理系统和美国宇航局空间实验室飞行模拟系统的设计过程中,都采用了主程序员组的组织形式,并且获得了成功。
关于逐步求精方法Wirth曾做如下说明:
“我们对付复杂问题的最重要的办法是抽象,因此,对一个复杂的问题不应该立刻用计算机指令、数字和逻辑符号来表示,而应该用较自然的抽象语句来表示,从而得出抽象程序。抽象程序对抽象的数据进行某些特定的运算并用某些合适的记号(可能是自然语言)来表示。对抽象程序做进一步的分解。并进入下一个抽象层次,这样的精细化过程一直进行下去,直到程序能被计算机接受为止。这时的程序可能是用某种高级语言或机器指令书写的。”
在总体设计阶段采用自顶向下逐步求精的方法,可以把一个复杂问题的解法分解和细化成一个由许多模块组成的层次结构的软件系统。在详细设计或编码阶段采用自顶向下逐步求精的方法,可以把一个模块的功能逐步分解细化为一系列具体的处理步骤或某种高级语言的语句。
使用结构程序设计技术主要有下述一些好处:
1.自顶向下逐步求精的方法符合人类解决复杂问题的普遍规律,因此可以显着提高软件开发工程的成功率和生产率。
2.用先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发出的程序有清晰的层次结构,因此容易阅读和理解。
3.不使用GO TO语句,仅使用单入口单出口的控制结构,使得程序的静态结构和它的动态执行情况比较一致。因此,程序容易阅读和理解,开发时也比较容易保证程序的正确性,即使出现错误也比较容易诊断和纠正。
4.控制结构有确定的逻辑模式,编写程序代码只限于使用很少几种直接了当的方式,因此源程序清晰流畅,易读易懂而且容易测试。
5.程序清晰和模块使得在修改和重新设计一个软件时可以再用的代码量最大。
6.程序的逻辑结构清晰,有利于程序正确性的证明。
结构程序设计的缺点是,需要的存储容量和运行时间都有一些增加(估计增加10~20%),此外,现有的许多程序设计语言是非结构化的语言,并不提供上述的单入口单出口的基本控制结构。但是,由于硬件技术的飞速进步,程序需要的存储容量和运行时间稍有增加,在今天对绝大多数应用领域已经不是严重问题。如果使用非结构化语言编写程序,则可以利用GO TO语句实现上述基本控制结构,虽然形式上程序中有GO TO语,却仍然能够体现出结构程序设计的基本精神。
虽然从理论上说只用上述三种基本控制结构就可以实现任何单入口单出口的程序,但是为了实际使用方便起见,常常还允许使用DO-UNTIL和DO-CASE两种控制结构,它们的流程图分别是图7.5.2-2(a)和(b)。
图7.5.2-2 其他常用的控制结构
(a)DO-UNTIL型循环结构;(b)多分支结构。
有时需要立即从循环(甚至嵌套的循环)中转移出来,如果允许使用LEAVE(或BREAK)结构,则不仅方便而且会使效率提高很多。LEAVE或BREAK结构实质上是局限的GOTO语句,用于转移到循环结构后面的语句。
如果只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE型循环这三种基本控制结构,则称为经典的结构程序设计;如果除了上述三种基本控制结构之外,还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构,则称为扩展的结构程序设计;如果再加上允许使用LEAVE(或BREAK)结构,则称为修正的结构程序设计。