第 1章
程序设计方法学简介
,程序设计方法学,
什么是 ……
? 程序设计方法学的产生
? 程序设计方法学的基本内容
? 本课程的核心内容和目的
本章的主要内容
美国 IBM公司在 1963年至 1966年开发的 IBM360机的操作系统。这
一项目花了 5000人一年的工作量,最多时有 1000人投入开发工作,
写出了近 100万行源程序。据统计,这个操作系统每次发行的新版本
都是从前一版本中找出 1000个程序错误而修正的结果。
1995年 SEI统计,美国共取消了 810亿美元的商业软件项目,其中
31%的项目未做完就被取消,53%的软件项目进度通常要延长 50%的
时间,只有 9%的软件项目能够及时交付并且费用也控制在预算之内。
1962年 7月 22日美国一个计划飞往金星的飞船水手 1号在升空 290秒
之后坠毁。经调查发现,地面控制计算机中一段运行程序执行了类似
这样的代码,If not 雷达发现火箭 then 不调整火箭的飞行路线。
然而程序员一个不小心漏掉了 not,导致了这些事故的发生
软件危机的产生
软件危机的产生
2000年 TechRepublic公司发表了有关 IT项目的调查结果。
该调查是以北美的 1375个 IT专家为对象实施问卷调查进行的。
根据此调查,IT项目中有 40%失败,这些项目的平均成本每年
花费 100万美元。
软件危机
? 软件危机的内涵
? 软件开发成本和进度的估计常常很不准确
? 用户对, 已完成的, 软件系统不满意的现象经常发

? 软件常常是不可维护的
? 软件常常是不可管理的
? 软件在计算机系统总成本中所占的比例逐年上升
? 软件开发生产率提高的速度远远跟不上计算机应用
迅速及深入普及的速度
软件危机 ——如何解决
? 管理学和工程学角度 ——软件工程
划分阶段;加强审计;质量控制;
过程改进;结构化;
? 方法学和语言学角度 ——程序设计方法
标准的程序设计;
设计模式;设计风格;设计技巧
程序
设计
语言
一 机器语言和汇编语言
? 原始的冯,诺依曼机器( 1946年)代码
00000010101111001010
00000010111111001000
00000011001110101000
机器语言是晦涩难懂的,因此需要设计另外一
种语言来写程序,它应该是符号式的或者说助
记性的。
高级语言的优越性:可扩展性;可读性;可移
植性
二 命令式语言
? 科学计算的语言
Backus[1957]为 Fortran的成功预备了两个成分:记法和效率
APL是唯一使用带有专用符号的交互式键盘来编写程序的语言。
? 商用语言
第一个商用语言是 COBOL(面向商业的公用语言的缩写 )。它是一
种功能很强而又极为冗长的语言
BASIC设计者的最意图体现在该语言的名字上 --初学者通用的符号
指令码
? 多用途语言
Alogol60主导 20世纪 60年代程序设计语言的发展。
Pascal作为教学语言扩展了 Alogol
Dennis Ritchie1972年创建 C语言
三 函数式语言
? 1958年 MCarthy设计了 LISP用作符号演算,
具有严格的理论基础
? Standard ML,Miranda,Haskell对语言
发展的推动作用
? 1984年 CLOS是 LISP的面向对象扩展,全
名是 Common Lisp Object System
四 面向对象语言
? Simula,Kristen Nygaard和 Ole-Jodan Dahl在 1961年设
计了这个语言,目的是想同时作为一种描述语言和程
序设计语言
? Smalltalk是第一个严格意义的全面向对象的程序设计
语言,它的设计受到了 LISP的影响
? C++设计的是为了把面向对象的优点带进 C的命令式程
序设计中
? JAVA是面向对象程序设计语言的成熟标志
? 你需要知道的一些面向对象程序设计语言和相关语言
Algol Ada Smalltalk C C++ JAVA
课程的主要研究问题
? 程序设计的基本特征
结构化 模块化
对象化 ( OOP,Object Oriented Programming)
智能化 ( AOP,Agent Oriented Programming)
? 程序设计标准化问题
形式语义 代数规范
程序正确性的代数证明
程序的形式推导 程序变换技术
? 程序设计标准实施问题
设计风格 设计方法 设计工具 设计技巧
程序设计方法学的基本研究目标是通过对程序本质属
性的研究来提高程序的效率,保证程序的正确性 。
通俗地说,程序设计方法学的最基本目标是通过对程
序本质属性的研究,说明什么是, 优秀, 的程序,怎样才
能设计出, 优秀, 的程序。
程序设计方法学是讲述程序性质以及程序设计理论和
方法的一门学科。
研究内容
程序设计方法学
基本内容























































程序正确性证明技术 程序形式推导技术
程序变换技术 程序调试技术
抽象数据类型 代数规范理论
类型系统理论 复杂性分析技术
基本方法
基本理论
,程程序设计方法学, 与其他相
关学科的关系
? 软件工程(管理、软件产业)
? 数据结构与算法(编程及实现)
? 程序设计语言学(编程及实现)
? 程序设计技巧学(技术与技巧,具有特
殊性)
? 程序设计方法学(方法学,指导性理论
及基本方法,具有普遍性)
怎样设计出, 优秀, 的程序?
? 1.什么样的程序才是, 优秀, 的
?, 优秀, 程序的要素
?, 不优秀, 程序的要素
? 2.怎么才能设计出, 优秀, 的程序
? 别人的经验(技巧、技术、方法、理论)
? 工具(设计工具、调试工具、测试工具)
? 实践(练习、思考题、作业)
? 3.怎么做
? 阶段:系统分析、系统设计、设计风格、编码、调
试、测试
? 数据结构和算法
? 维护性、通用性、灵活性、性能均衡性
“优秀, 和, 不优秀, 程序的要

? 正确性;结构化;模块化;可重用
? 可维护;可变化;可管理;可测试
? 性能均衡
? 错误的;非结构化;
? 难以维护;不能适应变化;不可管理
? 性能与条件失衡
返回
程序设计的一般途径
结构化与非结构化
PROC:
? switch(state){
Case STATE_ZOOMIN:
…… ;goto ERROR;
Case STATE_DRAWRECT:
…… ;goto ERROR;
……
}
ERROR,
…… ;goto PROC;
由于使用了 GOTO,破坏了程序的结构性。
模块化
final class Singleton {
private static Singleton s = new Singleton(47);
private int i; private Singleton(int x) { i = x; }
public static Singleton getHandle() { return s; }
public int getValue() { return i; }
public void setValue(int x) { i = x; }
}
?模块化:将数据和代码封装、保护,使其他程
序只能通过接口 getHandle()调用,模块化是 OOP
技术的基础之一。
维护性
? void MyFunc(COPR_DATA InputRect,int crntQtr,EMP_DATA
EmpRec,float EstimRevenue,float YTDRevenue,int ScreenX,int
ScreenY){
? int i;
? for(i=1;i<100;i++)InputRec.revenue[i]=0;
? EstimRevenue = YTDRevenue*4/crntQtr;
? if(ExpenseType==1)for(i=1;i<12;i++)Profit[i]=Revenue[i]-
Expense.Type1[i];
? }
? MyFunc的命名不标准,函数语义或作用不清晰
? 循环长度 100和 12的含义不清楚,为什么定 100和 12?
? int ScreenX,int ScreenY定义了,但实际没有用。
性能均衡
? 指软件程序效率与实际运行环境限制之
间的均衡
? 一般来说,程序运行效率越高,对硬件
环境的要求也越高,为提高运行效率而
对硬件提出过高的要求,是不适当的。
学生应具备的素质
? 能在系统分析、系统设计、系统编码和系统调试
四个领域熟练地工作,即能够选择适当的算法语
言及数据结构和算法进行编码,并能够对软件进
行基本的测试和调试,并改进系统的性能。
? 能够有效地组织和管理不少于 3- 7人的开发团队。
? 能够与客户、经理和技术人员进行有效的沟通。
? 具有评价、选择和实现新方法、新技术的能力。
(创新能力)
返回
参考资料
?, 程序设计方法学, 胡正国等 国防工业出版社 2003
年 1月
?, 新编程序设计方法学, 陈海波等 浙江大学出版社
2004年 5月
?, 程序设计方法学, 冯树椿等 浙江大学出版社 1987
年 12月
?, 程序设计方法学, 李传湘 武汉大学出版社 1999
年 12月
?, Programming Methodology》,复旦大学影印版
联系方法
? 办公电话,87543635,87544949
? 移动电话,13971309966,61278288
? 邮件地址,jlwei@mail.hust.edu.cn
? 或,jiaolong@public.wh.hb.cn