950 likes | 1.12k Views
计算机概论. 第 5 章 算法及程序设计. 教师:郭小林 2014年9月1日星期一. 第 5 章 算法及程序设计. 要点 算法+数据结构=程序设计 算术逻辑运算 非数值计算 面向过程和面向对象的程序设计 。. 5.1 算法的描述与实现. 利用计算机解题的步骤是,实际的问题→抽象为数学问题→找到解决数学问题的方法→转化为计算机算法→用计算机程序设计语言编程→调试程序→运算得到结果。. 5.1.1 计算机算法. 1. 计算机算法的特点 (1) 对于任何一组确定的输入,都在有限的处理步骤后得到一组明确的输出。 (2) 计算机输出的结果是明确的。
E N D
计算机概论 第5章 算法及程序设计 教师:郭小林 2014年9月1日星期一
第5章 算法及程序设计 • 要点 • 算法+数据结构=程序设计 • 算术逻辑运算 • 非数值计算 • 面向过程和面向对象的程序设计。
5.1 算法的描述与实现 • 利用计算机解题的步骤是,实际的问题→抽象为数学问题→找到解决数学问题的方法→转化为计算机算法→用计算机程序设计语言编程→调试程序→运算得到结果。
5.1.1 计算机算法 • 1. 计算机算法的特点 • (1) 对于任何一组确定的输入,都在有限的处理步骤后得到一组明确的输出。 • (2) 计算机输出的结果是明确的。 • (3) 计算机只能做有限步骤运算(处理)。 • 可以手工用π=4(1-1/3+1/5-1/7+1/9- …)的公式,无限精确地计算圆周率,但没有一种计算机算法能实现无限精确地计算圆周率。
1. 算法表示方法 • (1)流程图表示法 • 利用基本流程图符号的组合,可以表示较复杂的设计思想。它主要由下面一些符号及流程指向线组成。 • 主要包括:开始、结束、输入、输出、过程、判断、循环等。
例如,输入一个数,如果它为0,输出“=0”,否则输出“<>0”例如,输入一个数,如果它为0,输出“=0”,否则输出“<>0”
(2) 问题分析图表PAD法 • PAD(Problem Analysis Diagram )是一种二维树形结构的软件设计表现方法。它强调“自顶向下,逐步求精”的设计思想。
(3) 表达式 • 在高级程序设计语言中,表达式类似数学中的计算公式,但与数学公式有较大区别。 • 表达式是由变量名及运算符组成的式子。 • 1) 特殊运算符号 程序设计语言中,只能以ASCII符号组成表达式,因此运算符号与数学中使用的符号有一些不相同。例如算数运算符号在C语言中:“*”表示乘法,“/”表示除法。C语言中还包括许多数学中没有的运算符号,例如“&变量名”表示取变量的地址运算,“*变量名”表示间接访问变量运算。
2)变量名是符号化的内存地址,不是代数中的“未知数”的概念。2)变量名是符号化的内存地址,不是代数中的“未知数”的概念。 • 在使用变量运算之前,它一定已被赋值。 • C语言表达式举例: • Z=12*(A+3.7)/B • CP=&C
5.1.2 数学计算 • 1 利用表达式作计算 • (1)算术表达式 • 例:输入圆半径,计算圆面积 • #include “stdio.h” /*标准 io头文件*/ • main() /*主函数 */ • {float r,s; /*定义变量类型*/ • scanf (“%f”,&r); /*输入半径值 */ • s=3.14*r*r; /*计算面积 */ • printf(“s=%f”,s);} /*输出 */
(2)关系表达式 • 关系表达式的值是逻辑值“真/伪”,“1 / 0”。 • 例如x>y,a+b>9.8都是合法表达式。 • 当x=10,y=9时,c=x>y表示c被赋值为1(c语言中真用1表示)。
(3) 逻辑表达式 • 用逻辑运算符将关系表达式或逻辑量联系起来的式子为逻辑表达式。 • 例如:&&为逻辑与运算符号。 • e=(a<=b)&&(c<=d),如果a=1,b=2,c=3,d=3则e被赋值为1。
2. 算法设计 • (1) 尽量节约内存、减少计算次数 • 设计算法时,要综合考虑:计算机的内存储器大小是有限的,因而数字的范围、精度是有限的;计算机的计算速度是有限的,因而等待程序执行的时间是有限的。因此在设计算法时要尽量节约内存、减少指令执行次数。 • 9*9比9^2运算快
(2)尽量使用编译,不使用解释语言。 编译后回形成可执行文件(*.exe),可以脱离编译器运行。例如:C语言 解释语言只能在解释器中执行,解释器本身还要占用内存。例如:BASIC语言
(3)使用内存覆盖技术。 当内存不够的时候,把内存中最久未使用的数据调出到硬盘,借用硬盘空间存储内存数据。称为虚拟内存技术。 操作系统一般提供虚拟内存技术。
3. 算法误差 • (1) 二进制小数转换误差 • 十进制转换为二进制方法:用2乘,小数部分积为0时,正向取进位值。 • 十进制0.1转换为二进制为0.001100110011001100110011… … • 计算浮点数可能产生积累误差。
3. 算法误差 • (2) 截断误差 • 计算 • 由于误差r>3/(n+1),当误差r=0. 005时, 取n=5。
(3)有效数字误差 • 有效数字的最后一位与真值在此位相差正负1。 • 数学上规定,有效数字的最后一位与真值在此位相差正负1。 • 例如:3位有效数字1.23的真值在1.220与1.229999999… 之间。在第4位作四舍五入。
(4)精度转换误差 • 实际上高精度与低精度数运算结果应以低精度为准,但在计算机程序设计语言中,多数是把低精度自动转换为高精度。
5.1.3 常用算法 • 1. 枚举法 • 判断集合中,所有元素为真,则命题为真。 • 例如,若公鸡每只3元,母鸡每只5元,小鸡每只1元,求100元买100只鸡有多少种方案。 • x+y+z=100 • 3*x+5*y+3*z=100 • 两个方程式不可能解出3个未知数,但可以用x、y、z的各种组合来试验。 • 当试验次数超过1010次方时,实用性不大。
2. 递归算法 • 定义算法的过程中使用了被定义的算法本身。 • (1) 直接递归 • 重复一组或一个操作,例如累加,累减,累乘,累除等。 • a=a+1 ,把a加1后的值赋给a。
(2) 间接递归 • 程序用到它自身的前一步或前几步。 • 例1 计算阶乘。 • 2!=1*2 • 3!=1*2*3=2!*3 • (N+1)!=N!*(N+1) • 例2 有若干球,若每次拿走1个再拿走剩下的一半,当第10次要拿球时,仅剩下1个球,问原来有多少球?
3 迭代算法 • 每一次计算都在前一次计算的基础上进行,解决已知有解,但难用表达式表示的问题。 (1)对分法(二分之一法) 1)假设区间中点是F(x)=0的根x*; 2)如果不是根F(x*)≠0 ,判断在左边区间还是右边区间; 3)在取新区间的中点x*; 4)如果区间长度大于指定的精度,返回步骤2); 5)如果区间长度小于指定的精度, x*就是解,结束。
3 迭代算法 • 每一次计算都在前一次计算的基础上进行,解决已知有解,但难用表达式表示的问题。 (1)对分法(二分之一法) 1)假设区间中点是F(x)=0的根x*; 2)如果不是根F(x*)≠0 ,判断在左边区间还是右边区间; 3)在取新区间的中点x*; 4)如果区间长度大于指定的精度,返回步骤2); 5)如果区间长度小于指定的精度, x*就是解,结束。
3 迭代算法 (2)逐次逼近法 • 1)将f(x)=0改写成x=g(x); • 2)取x*; • 3)计算g(x*); • 4)当| x*- g(x*)|>ε,x*=g(x*),返回步骤3); • 当| x*- g(x*)|<ε,x*就是解,结束;
4 回朔法 • 枚举和试探的结合。将要解决的问题过程分为若干结点,每个结点有若干可供选择的后续结点。若不满足条件,返回到上一层结点,恢复刚才的参数,再试探其他分支。
5 排序 • 将杂乱无章的数据按升序或降序排列。 • 常用冒泡法、插入排序、希尔排序、快速排序等
6 插值 • 一些函数表无法用f(x)表示,在表中插入一些中间值,构成新的表,用p(x),近似代替f(x)。要求p(xi)=f(xi),xi为已知点。
7 数据压缩与解压缩 • 科学家在研究中发现,大多数信息的表达都存在着一定的冗余度,通过采用一定的模型和编码方法,可以降低这种冗余度。 • 计算机中用二进制表示的数据文件(包括数字或符号)中有许多是同一个或同一组数据的多次重复。重复的数据使得文件的总长度变长,不利于存储和传输。 • 设计算法,尽量去除文件中的重复数据,形成等效的新文件是数据压缩要解决的问题。
反之,把已经压缩了的文件恢复成原来未压缩的文件是解压缩要解决的问题。反之,把已经压缩了的文件恢复成原来未压缩的文件是解压缩要解决的问题。 • 为了提高压缩比例,压缩可分无损压缩和有损压缩两大类。无损压缩比例较小,一般在一倍以下,有损压缩比例可达几倍,十几倍,甚至几十倍! • 前者用于对文档、程序、重要数据的压缩,后者多用于对声音、图像、影像等文件的压缩。
常用压缩/解压缩软件 • 在Windows 操作系统支持下的压缩/解压缩软件很多,以WinRAR和WinZIP最常用,压缩比例较高,可支持的压缩文件类型较多。
5.2 程序设计方法 • 程序设计方法已有很大发展: • 个人集体协作 • 利用程序设计语言软件开发平台 • 面向过程面向对象 • 手工生产软件工程
5.2.1 面向过程的程序设计 • 这种程序设计方法是先把计算机要处理的事务分解成若干个独立的过程( procedures ),自顶向下不断的把复杂的处理分解为子处理,一层一层地分解下去,直到仅剩下若干个容易处理的子处理为止。再用面向过程的开发语言(汇编、C语言等)编制源程序,然后经过编译形成计算机可执行程序,通过反复修改最后完成设计工作。 • 这种方法的理论基础是数据结构和算法,流程图能较好反映整个设计和执行过程。
1 结构化程序设计方法 • 主要特点是:把过程分为顺序、条件转移(循环)、分支、子过程等标准程序功能模块,每块都只能有唯一的入口和出口,模块之间通过入口、出口连接。由于块内的程序结构是封闭的,因此便于设计和检验程序的正确性。适合开发小型应用软件。
2 支持面向过程设计的高级程序设计语言 • 常用的有: • (1)C语言(包括Microsoft C、Turbo C等多种版本) 它是于20世纪60年代在ALGOL语言基础上研制的。 其显著特点是代码及数据分隔,即程序的各个部分除了必要的信息交流外彼此独立。C语言提供给用户各种函数,这些函数可方便的调用,并具有多种循环、条件语句用来控制程序流向,从而使程序完全结构化。C语言还提供许多汇编一级的指令,可直接指挥硬件工作,因此也有人称它为中间级语言。
(2) Pascal 语言 它是于20世纪70年代在ALGOL语言基础上研制的。PASCAL语言最初是为系统地教授程序设计而设计的,它具有丰富的数据类型,其控制结构体现了结构化程序设计原则。适合教学,科学计算与系统软件的研制。 • (3) Basic语言
3 软件测试 • (1)白箱法:设计多组输入数据,使得程序中的每一个分支都得到测试,要求测试中使用合理的输入数据能得到合理的输出结果;程序能对不合理的输入作出适当的反应。由于这种测试涉及程序的具体结构,有时实际操作有困难。 • (2)黑箱法:设计多组输入数据,要求程序能在输入合理的数据后得到合理的输出结果;对不合理的输入作出适当的反应。
5.2.2 面向对象的程序设计 • 1. 基本概念 • (1) 对象 • 对象是包括自己的数据和一组对这些数据的操作的独立实体。对象=数据+作用于这些数据上的操作。在面向对象的程序设计方法中,对象是基本单位。
(2) 类 • 具有相同属性和操作对象的集合称为类。 • 编译系统为程序员预先设置了上万个类供选用。每个类可以派生(继承)出子类、孙类。实际上类是用来定义对象的抽象数据类型,它把整数、实数、符号等具体的数据类型和过程操作都已经隐藏起来了。
(3) 封装 • 把对象的属性和操作结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。 • (4) 继承 • 特殊类的对象拥有其一般类的全部属性与操作,称作特殊类对一般类的继承。
2 面向对象程序设计方法 • 要在应用程序的统筹规划和设计之后作以下步骤: • (1)创建对象或选用合适的对象; • (2)设置对象的属性; • (3)选择并设计适当的对象事件及操作; • (4)在过程代码中调用对象以实现对象之间的通信; • (5)将对象的方法程序和属性代码包装在一起。
面向过程程序设计方法与面向对象程序设计方法的区别:面向过程程序设计方法与面向对象程序设计方法的区别: • ① 前者在程序设计时将数据和算法完全的分开,后者将数据和算法看作是不可分割的实体,称为对象; • ② 前者在程序设计过程中以算法为中心,围绕着实现系统功能的过程来构造系统,后者以数据为中心,所有的操作都围绕着数据而展开; • ③ 前者是一句接一句地编写程序,后者主要是适当地创建对象、修改对象属性和编写对象的方法程序。
3 面向对象设计的高级程序设计语言 • (1)VB (Visual Basic),它是1991年微软公司推出的第一个可视化的编程软件,从VB 4.0版开始,VB也引入了面向对象的程序设计思想。VB功能强大,学习简单。而且,VB还引入了“控件的概念,使得大量已经编好的VB程序可以被直接使用,现在VB已经发布6.0版。
(2)C++(包括Microsoft Visual C++,Borland C++,Turbo C++等) • 这些程序设计工具软件的共同点是: • 1)在Windows平台上运行; • 2)可视化编程,一般用鼠标拖动工作窗口上的元件:表格(Form)视窗、元件盒(Component palette)等元件,设置、修改属性参数即可创建一个适合的对象。