当前位置:
文档之家› raptor程序设计案例教程-ch4
raptor程序设计案例教程-ch4
RAPTOR的设计者在权衡利弊之后,放弃了 全局变量的设置,而是使用存取子程序来 代替全局数据,用全局数据能作的一切
矩阵乘法
矩阵乘法是线性代数的基本算法之一 熟悉和编制矩阵乘法对深入了解线性代数
和计算方法有重要意义
案例问题
矩阵乘法要求第一个矩阵的列数(column)和 第二个矩阵的行数(row)相同,若A为m×n 矩阵,B为n×p矩阵,则他们的乘积AB会是 一个m×p矩阵。其乘积矩阵的元素可由下 式得出:
同样,由于子图具有名称,可以作为一种功能的 抽象,分级实现的子图,可以将较大的 定义和传递任何参数
例4-2中的output子图
子图和子程序的命名
与变量不同的是,变量是一种被操作的对象,保 存一种具体的计算结果或中间量,所以变量名称 以名词(或代号)为多见;
英文单词统计(续)
例4-2 请设计一个程序,在例4-1的问题 求解基础上,统计使用了“a~z”所有 字母开头的单词的次数,并输出统计结 果
分析:
解这个问题程序似乎只要把例4-1的部分程序 再复制、粘贴25次,做一点修改就可以解决 问题。但是,可以将例4-1中的程序改造成一 个子程序,或者是一种抽象,以便“复用”
为了解决复杂的问题,必须能够研究问题 的“主要方面(big issues)”
模块化的主要作用
程序设计中,通过组合一系列相关指令, 组成分立和离散的过程,就可以抽象所有 的细节
模块化的主要作用包括:
降低复杂性 避免代码段重复 改进性能
英文单词统计
例4-1:请设 计一个程序, 计算一个英文 文章中,使用 了“a”开头 的单词的次数
2.模块化:模块化是把程序要解决的总目标 分解为分目标,再进一步分解为具体的小 目标,把每个小目标称为一个模块;
3.逐步求精:对复杂问题,应该设计一些子 目标做过渡,逐步细化
子图与子程序的相互关系
在编制RAPTOR程序时,子图和子程序是两种 不同的模块形式
一般情况下,main子图与所有的子图共享 变量;而子程序的变量在子程序结束时, 除去out的参数传给调用它的模块之外,其 他变量将全部释放
可以声明
子图与变量
子图其实可以看做在一头一尾有一个 turn_to语句的代码块
调用子图时“turn to”到子图,子图执行完 成后再“return”到原来的位置
如果是main子图调用了这个子图,它所使 用的变量就是main子图的
如果是子程序调用了它,它的变量就是这 个子程序的,变量的生命周期随子程序结 束而结束
第4章 子图与子程序的应用
《RAPTOR程序设计案例教程》
学习目标
程序设计中为什么要模块化? 子图与子程序有何不同? 子图与子程序如何应用? 子程序与递归
问题与抽象
在计算机科学中,将实际问题抽象化是解 决问题的关键要素之一。2008发表在美国 Proceedings of the National Academy of Sciences杂志上的一项研究成果表明,人类 的大脑平均只能同时积极关注约4件事情, 大大少于以往研究所得的7件事情的结论
矩阵乘法的原理
根据矩阵相乘公式可以推出
(AB)11=a11b11+a12b21+a13b31+a14b41 (i=1,j=1) (AB)12=a11b12+a12b22+a13b32+a14b42 (i=1,j=2) (AB)21=a21b11+a22b21+a23b31+a24b41 (i=2,j=1) (AB)22=a21b12+a22b22+a23b32+a24b42 (i=2,j=2) (AB)31=a31b11+a32b21+a33b31+a34b41 (i=3,j=1) (AB)32=a31b12+a32b22+a33b32+a34b42 (i=3,j=2)
但是,如果子程序调用子图,它们之间的 变量生命周期又该如何处理呢?
子图与子程序之间的相互调用与 变量关系
子程序与变量
Main子图其实也可以看成一个子程序。 子程序是相互独立的,级别平等的,所以
调用关系并不会在程序上构成级别关系 每个子程序有各自的变量:
main函数的变量是在程序体中声明的, 子程序中的函数变量在程序头和子程序体中都
而子程序承担某种功能或动作,所以需要使用一 些动词或动词与名词的搭配来命名
在RAPTOR中,一般无需在一个子程序中设计过多 的功能,所以命名以简单、具体为要。例如,例 4-2中,使用count_for()作为统计子程序的名字、 output作为子图的名称就比较容易理解
模块化程序设计的设计过程
1.自顶向下:即先考虑总体,后考虑细节; 先考虑全局目标,后考虑局部目标。这种 程序结构按功能划分为若干个基本模块, 这些模块形成一个树状结构。
子程序调用
调用count_for() 子程序的main 子图
重要计算过程 通过子程序 count_for的调 用并赋予实际 参数(实参) 来完成
有关RAPTOR子图
RAPTOR的子图是将main子图进行扩展或折叠的一 种方法,所有子图与main子图共享所有变量
在main子图中可以反复调用某个子图,以节省相 同功能语句段的重复出现
数单词子程序
start符号中的( in:a,in:char,out:co unt)被称为子程 序接口参数,也 被称为子程序形 式参数(形参)
子程序接口定义
RAPTOR任何参数都 可以是单个的变量 或数组,都可以定 义为(in)、(in,out) 、(out)三种形式中 的任何一种输入、 输出属性
子程序特点
子程序运行中的所有变量都“自成系统” ,与调用它的程序没有关系。调用它的程 序,只是通过调用子程序接口参数与它交 接“原材料(初始数据)”(定义为Input 的变量)和“产成品(计算结果)”(定 义为Output的变量)
子程序的所有变量在子程序运行过程中存 在,运行结束后,除了传递回调用程序的 参数,所有其它变量立即删除
RAPTOR为何不设全局变量
全局变量会带来的问题
对全局数据的疏忽改变 伴随全局变量的奇怪的别名问题。 全局数据妨碍重新使用的代码。 全局变量会损害模块性和可管理性
RAPTOR为何不设全局变量
全局变量的好处
保存全局数值,有时候需要在整个程序中都要 用到某些数据。
代替命名常量。 方便常用数据的使用。 消除“穿梭”数据