第一章 绪论
本章主要内容 计算机程序设计语言的发展 面向对象的方法 面向对象的软件开发 信息的表示与存储 程序的开发过程
计算机程序 (Computer Program) 计算机的工作是用程序来控制的 程序(program)是指令(Instruction)的集合。 指令是计算机可以识别的命令。 软件 代码行数 Windows Vista 5000万 Windows XP 3500万 Linux >1000万 WPS 150万 Quake3 22.9万
计算机语言的发展 机器语言 汇编语言 高级语言 计算机硬件系统可以识别的二进制指令组成的语言 将机器指令映射为一些可以被人读懂的助记符,如ADD、SUB等 高级语言 采用具有一定含义的数据命名和容易理解的执行语句 101110000000000000000000 mov ax, 0 mov ax, 0 mov bx, 1 add ax, bx a=0+1
高级语言之面向过程的程序设计方法 设计思路 程序结构 例:五子棋 面向过程的设计思路就是首先分析问题的步骤: 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之 程序结构 按功能划分为若干个基本模块,形成一个树状结构。 各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。 其模块化实现的具体方法是使用子程序。 例:五子棋 面向过程的设计思路就是首先分析问题的步骤: 1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。 然后把上面每个步骤用分别的函数来实现
高级语言之面向过程的程序设计方法 优点 有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。 缺点 可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件 把数据和处理数据的过程分离为相互独立的实体。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 每一种相对于老问题的新方法都要带来额外的开销。 图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。
面向对象(Object Oriented)的程序设计方法 为什么使用对象?
回到五子棋的例子…… 面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。 面向对象是以功能来划分问题,而不是步骤。 同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。功能上的统一保证了面向对象设计的可扩展性。
回到五子棋的例子 比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。 再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
面向说明语言(Haskell, ML, Prolog) 为了更高级的抽象 ? 面向说明语言(Haskell, ML, Prolog) 面向对象语言(C++, Java, Python) 结构化语言(C,Fortran, COBOL) 汇编语言 机器语言
面向对象的方法 将数据(data)及对数据的操作方法(data manipulation)封装(encapsulation)在一起,作为一个相互依存、不可分离的整体——对象(object) 对同类型(type)对象抽象(abstract)出其共性,形成类(class) 类通过一个简单的外部接口(Interface),与外界发生关系 对象与对象之间通过消息(message)进行通信(communication) 优点 - 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 - 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。
面向对象的基本概念——对象(Object) 一般意义上的对象 是现实世界中一个实际存在的事物。 可以是有形的(比如一辆汽车),也可以是无形的(比如一项计划) 是构成世界的一个独立单位,具有 静态特征:可以用某种数据来描述 动态特征:对象所表现的行为或具有的功能 面向对象方法中的对象 是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。 属性:用来描述对象静态特征的数据项。 行为:用来描述对象动态特征的操作序列。
面向对象的基本概念——类(class) 分类——人类通常的思维方法 分类所依据的原则——抽象 面向对象方法中的"类" 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。 面向对象方法中的"类" 具有相同属性和服务的一组对象的集合 为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。 类与对象的关系: 犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例(instance)。
面向对象的基本概念——封装、继承与多态性 封装(encapsulation) 把对象的属性和服务结合成一个独立的系统单元。 尽可能隐蔽对象的内部细节。对外形成一个边界(或者说一道屏障),只保留有限的对外接口使之与外部发生联系。 继承(inheritance) 继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。 定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。 例如:将汽车作为一个一般类,客车便是一个特殊类。 多态性(Polymorphism) 多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。 例如:数的加法 ->实数的加法和复数的加法
面向对象的软件工程 What to do? How to do? Do! Find and correct error! 面向对象的软件工程是面向对象方法在软件工程领域的全面应用。它包括: 面向对象的分析(OOA) 系统分析阶段应该扼要精确地抽象出系统必须做什么,但是不关心如何去实现。 What to do? 面向对象的系统分析,直接用问题域中客观存在的事物建立模型中的对象,对单个事物及事物之间的关系,都保留他们的原貌,不做转换,也不打破原有界限而重新组合,因此能够很好地映射客观事物。 针对系统的一个具体实现运用面向对象的方法。其中包括两方面的工作: -把OOA模型直接搬到OOD,作为OOD的一部分 -针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。 How to do? 面向对象的设计(OOD) OOP工作就是用一种面向对象的编程语言把OOD模型中的每个成分书写出来,是面向对象的软件开发最终落实的重要阶段。 Do! 测试的任务是发现软件中的错误。 在面向对象的软件测试中继续运用面向对象的概念与原则来组织测试,以对象的类作为基本测试单位,可以更准确地发现程序错误并提高测试效率。 Find and correct error! 面向对象的编程(OOP) 面向对象的测试(OOT) 将软件交付使用后,工作并没有完结,还要根据软件的运行情况和用户的需求,不断改进系统。 使用面向对象的方法开发的软件,其程序与问题域是一致的,因此,在维护阶段运用面向对象的方法可以大大提高软件维护的效率。 面向对象的软件维护(OOSM)
信息的表示和存储 信息的分类 计算机的数字系统 程序设计中常用的数制 不同进位计数制间的转换 非数值信息的表示
信息的分类 指令 控制信息 控制字 信息 定点数 数值信息 数据信息 浮点数 字符数据 非数值信息 逻辑数据
计算机的数字系统 计算机采用的是二进制数字系统。 基本符号:0、1 进位原则:逢二进一 优点: 缺点:对人来说可读性差 易于物理实现 二进制数运算简单 机器可靠性高 通用性强 缺点:对人来说可读性差
程序设计中常用的数制 进制 基 数 进位原则 基本符号 二进制 2 逢2进1 0,1 八进制 8 逢8进1 0,1,2,3,4,5,6,7 十进制 10 逢10进1 0,1,2,3,4,5,6,7,8,9 十六进制 16 逢16进1 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
不同进位记数制间的转换 R 进制→十进制 各位数字与它的权相乘,其积相加。 例如: (11111111.11)2=1×27+1×26+1×25+1×24 +1×23+1×22+1×21+1×20+1×2-1+1×2-2 =(255.75)10 (3506.2)8=3×83+5×82+0×81+6×80+2×8-1 =(1862.25)10 (0.2A)16=2×16-1+10×16-2=(0.1640625)10
不同进位记数制间的转换 21 十进制整数转换成R进制的整数 十进制小数转换成R进制小数 “除R取余”法,例如: 2 68 余 数 2 68 余 数 2 34 ┄┄┄┄┄┄┄ 0 低位 2 17 ┄┄┄┄┄┄┄ 0 2 8 ┄┄┄┄┄┄┄ 1 2 4 ┄┄┄┄┄┄ 0 2 2 ┄┄┄┄┄┄ 0 2 1 ┄┄┄┄┄ 0 0 ┄┄┄┄┄ 1 高位 所以 6810=10001002 十进制小数转换成R进制小数 “乘 R 取整”法,例如: 高位 0.3125 ×2 = 0 .625 0.625 ×2 = 1 .25 0.25 ×2 = 0 .5 0.5 ×2 = 1 .0 所以 0.312510 = 0.01012 21
每位八进制数相当于三位二进制数 每位十六进制数相当于四位二进制数 二、八、十六进制的相互转换 (1011010.10)2=(001 011 010 .100)2 =(132.4)8 (1011010.10)2=(0101 1010 .1000)2 =(5A.8)16 (F7)16=(1111 0111)2=(11110111)2
非数值信息的表示 西文字符: 汉字: ASCII码:用7位二进制数表示一个字符,最多可以表示27=128个字符 EBCDIC码:用8位二进制数表示一个字符,最多可以表示28=256个字符 汉字: 应用较为广泛的是"国家标准信息交换用汉字编码"(GB2312-80标准),简称国标码。是二字节码,用二个七位二进制数编码表示一个汉字。
程序开发的基本概念 源程序: 目标程序: 翻译程序: 三种不同类型的翻译程序 用源语言写的,有待翻译的程序 也称为"结果程序",是源程序通过翻译程序加工以后所生成的程序。 翻译程序: 是指一个把源程序翻译成等价的目标程序的程序。 三种不同类型的翻译程序 汇编程序:其任务是把用汇编语言写成的源程序,翻译成机器语言形式的目标程序 编译程序:若源程序是用高级程序设计语言所写,经翻译程序加工生成目标程序,那么,该翻译程序就称为"编译程序"。 解释程序:这也是一种翻译程序,同样是将高级语言源程序翻译成机器指令。它与编译程序不同点就在于:它是边翻译边执行的,即输入一句、翻译一句、 执行一句,直至将整个源程序翻译并执行完毕。
程序的开发过程 编辑 编译 连接 运行调试 将源程序输入到计算机中,生成后缀为cpp的磁盘文件。 将程序的源代码转换为机器语言代码。 将多个源程序文件以及库中的某些文件连在一起,生成一个后缀为exe的可执行文件。 运行调试 Bug:程序中的错误,语法错误与逻辑错误 有一天,Hopper正在哈佛大学教授Howard H. Aiken的指导下操作Harvard Mark I计算机。突然,有一只倒霉的蛾子导致继电器失灵。Hopper等人将这只死掉的蛾子粘到工作日志上并加了一行批注:“First actual case of bug being found.”