第8章 过程 郭清溥.

Slides:



Advertisements
Similar presentations
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
Advertisements

2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
第八章 子程序和函数 8.1 子程序概述 在VB5.0/6.0中,除了系统提供的内部函数过程和事件过程外,用户可自定义过程下列四种过程:
ooxx這個遊戲程式,非常的簡單只要你小時候會玩井字遊戲即可把電腦打敗,可以說是一種考智力取勝的遊戲。
程式語言(I)- Visual Basic 6.0 第 9 章 結構化程式設計
实训十 子 过 程 一、实训目的 二、实训内容 1、通用过程 【实训要求】 1、掌握通用过程的定义和调用方法。
第7章 过 程 本章要点: Sub过程 Function过程 参数传递.
Oracle数据库 Oracle 子程序.
一、原函数与不定积分 二、不定积分的几何意义 三、基本积分公式及积分法则 四、牛顿—莱布尼兹公式 五、小结
6.4 字符串与指针 1. 用字符数组存放一个字符串.
第六章 过 程 6.1 函数过程的定义与调用 6.2 子过程的定义与调用 6.3 参数传递 6.4 递 归 6.5 综合应用.
不确定度的传递与合成 间接测量结果不确定度的评估
第三节 格林公式及其应用(2) 一、曲线积分与路径无关的定义 二、曲线积分与路径无关的条件 三、二元函数的全微分的求积 四、小结.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
程式語言Visual Basic 變數的可視範圍
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
Visual Basic 2010 程式設計16堂特訓 第七堂 VB的迴圈流程控制.
VB程序设计语言 主讲教师:王 杨.
第5章 数组 Visual Basic程序设计.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
Visual Basic程序设计 第八章 过程 -子程序和函数
过程 第 7 章.
初识Visual Basic.
第4章 程序控制结构与算法基础.
高等学校计算机基础教育教材 Visual Basic 6.0 程序设计 上海中医药大学现代教育技术中心 计算机教学部.
走进编程 程序的顺序结构(二).
辅导课程六.
3.5 用递归法解决问题 黄学鸿.
第12章 VBA模块设计.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第5章 Visual Basic控制结构 之 常用算法举例
第 8 章 过程.
VB程序设计语言 主讲教师:王 杨.
Visual Basic程序设计.
动态规划(Dynamic Programming)
VB程序设计语言 主讲教师:王 杨.
VB程序设计语言 主讲教师:王 杨.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
VB程序设计语言 主讲教师:王 杨.
程式語言(I)- Visual Basic 6.0 第 8 章 模組化程式設計I-副程式與自定函數.
第六章 过程 Visual Basic 程序设计.
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
现代信息技术 微电子技术 计算机技术 传感技术 通信技术 处理、存储信息的技术 传感、采集技术 传递信息的技术
第二章、第三章错题分析.
VB与Access数据库的连接.
姚金宇 MIT SCHEME 使用说明 姚金宇
目录 7.1 用户自定义函数的种类 7.2 函数的定义 7.3 被调函数的声明 7.4 函数的调用 7.5 函数的嵌套调用
第4章 Excel电子表格制作软件 4.4 函数(一).
iSIGHT 基本培训 使用 Excel的栅栏问题
3.16 枚举算法及其程序实现 ——数组的作用.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
1、过程概述 2、函数过程 3、子过程 4、过程的使用 5、传递参数 6、过程的嵌套
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
VB与Access数据库的连接.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
第7章 过 程 Visual Basic中过程分为两种,一种是事件过程,例如前面涉及到的按钮的Click事件过程、窗体的Load事件过程等。另一种是通用过程,它主要用来让事件过程或其他通用过程调用。本章主要介绍的就是这种过程。
程序调试与错误处理.
§4.5 最大公因式的矩阵求法( Ⅱ ).
顺序结构程序设计 ——关于“字符串”和数值.
第二次课后作业答案 函数式编程和逻辑式编程
Presentation transcript:

第8章 过程 郭清溥

第8章 过程 【本章要点】 子过程的建立和使用 函数过程的建立和使用 过程中参数的传递 变量和过程的作用域 过程的递归和嵌套 【课时安排】 第8章 过程 【本章要点】 子过程的建立和使用 函数过程的建立和使用 过程中参数的传递 变量和过程的作用域 过程的递归和嵌套 【课时安排】 2学时(理论),2学时(上机)

第8章 过程 Visual Basic应用程序除了设计界面外,其他大部分工作就是编写过程。 过 程:能够完成一定功能的、 可供其它程序调用的 第8章 过程 Visual Basic应用程序除了设计界面外,其他大部分工作就是编写过程。 过 程:能够完成一定功能的、 可供其它程序调用的 独立的程序段。     在程序执行过程中, 主程序与子程序之间 有时会有数据的传递。

第8章 过程 用过程编写程序的好处是: 1、可以在整个程序中消除重复的程序行:只要定义了一个子程序,可以任意次调用; 第8章 过程 用过程编写程序的好处是: 1、可以在整个程序中消除重复的程序行:只要定义了一个子程序,可以任意次调用; 2、使程序的易读性增强:将完成某项任务的程序段独立出来,使程序更容易阅读和理解; 3、使程序开发过程简单:将一个大的问题分解为多个小的问题,单独解决,便于修改和维护; 4、可以在其它程序中重用:一个具有通用性的子程序可以用在其它程序设计中。

第8章 过程 前面我们主要介绍了事件过程,它是VB应用程序的主体。还有一类过程叫“通用”过程,它可以单独建立,供事件过程或其它过程调用。 第8章 过程 前面我们主要介绍了事件过程,它是VB应用程序的主体。还有一类过程叫“通用”过程,它可以单独建立,供事件过程或其它过程调用。 在Visual Basic中,根据过程是否有返回值,把通用过程分为两类,没有返回值的叫做子程序过程 (Sub过程);有返回值的叫做函数过程(Function过程)。

8.1 过程的定义与调用 8.1.1 事件过程和通用过程 事件过程 事件过程由VB自行声明,用户不能增加或删除。当用户对某个对象发出一个动作时,Windows会通知VB产生一个事件,VB会自动地调用与该事件相关的事件过程。

8.1 过程的定义与调用 8.1.1 事件过程和通用过程 事件过程 控件事件过程的一般格式为: [Private| Public] Sub 控件名_事件名(参数表) <语句组> End Sub 窗体事件过程的一般格式为: [Private| Public] Sub Form_事件名(参数表) <语句组> End Sub

8.1 过程的定义与调用 8.1.1 事件过程和通用过程 通用过程 通用过程是独立于事件过程之外的,执行某一指定的任务。通用过程不与任何特定的事件相联系,可以被别的过程(事件过程或其它通用过程)或自己来调用,它可以存储在窗体模块或标准模块中。

8.1 过程的定义与调用 Sub过程必须以Sub开头 Sub过程必须以End Sub结束 8.1. 2 建立Sub过程 定义Sub过程 一般格式如下: [Static|Private|Public] Sub 过程名[(参数表列)] 语句块 [Exit Sub] [语句块] End Sub Sub过程必须以End Sub结束

8.1 过程的定义与调用 参数表列:含有在调用时传送给过程的简单变量名或数组名 8.1. 2 建立Sub过程 Static:指定过程中的局部变量在内存中的存储方式为静态 定义Sub过程 一般格式如下: [Static|Private|Public] Sub 过程名[(参数表列)] 语句块 [Exit Sub] [语句块] End Sub 过程名:是一个长度不超过40个字符的名称 Private:表示Sub过程是私有过程 Public:表示Sub过程是公有过程

8.1 过程的定义与调用 8.1. 2 建立Sub过程 (1)利用“工具”菜单中的“添加过程”命令: (2)直接在代码窗口定义 打开模块代码窗口,然后直接键入过程的名字即可。 例:键入 Private Sub Swap(X As Integer, Y As Integer) 按回车键后就会自动显示: End Sub

8.1 过程的定义与调用 8.1. 2 建立Sub过程 例:编一个交换两个整型变量值的子过程。 Private Sub Swap( X As Integer, Y As Integer) Dim Temp As Integer Temp=X : X=Y : Y=Temp End Sub

8.1 过程的定义与调用 参数不带括号! 8.1. 3 调用Sub过程 过程只有在调用时才被执行。 格式: Call 过程名 [(实际参数)] 或 过程名 [实际参数] 用Call语句调用一个过程时,如果过程本身没有参数,则“实际参数”和括号可以省略;否则应给出相应的实际参数。“实际参数”是传送给Sub过程的变量或常数。 参数不带括号!

8.1 过程的定义与调用 8.1. 3 调用Sub过程 例 编写程序,将3个数据按升序排列。 分析: 我们用 子过程 处理两个数据的交换。 我们用 子过程 处理两个数据的交换。 子过程: Private Sub Swap( X As Integer, Y As Integer) Dim Temp As Integer Temp=X : X=Y : Y=Temp End Sub

8.1 过程的定义与调用 8.1. 3 调用Sub过程 Private Sub cmdOK_Click() 主程序: Dim A%, B%, C% A = Val(InputBox("输入一个整数")) B = Val(InputBox("输入一个整数")) C = Val(InputBox("输入一个整数")) Print "排序前:"; A; B; C If A > B Then Call Swap(A, B) If A > C Then Swap A, C If B > C Then Call Swap(B, C) Print "排序后:"; A; B; C End Sub 主程序:

8.2 函数过程与参数传递 函数过程是 Fnuction 8.2.1 建立Function过程 一般格式如下: [Static|Private|Public] Function 函数名[(参数表列)] [As 类型] 语句块 [Exit Function ] [语句块] 函数名=表达式 End Function 必须给函数赋值,否则,该函数就没有返回值

8.2 函数过程与参数传递 说明: (1) < 函数名>代表函数的值,所以它具有类型的属 性。 (2) <函数名>代表函数的值,调用函数后得到的函 数值通过函数名返回调用程序,因此,在函数 语句体中,<函数名>至少应被赋值一次。 (3)主程序在调用函数时,只需写出函数名和相应 的参数即可。

8.2 函数过程与参数传递 8.2.1 建立Function过程 利用“工具”菜单中的“添加过程”命令,然后选择对话框中的“函数”; 在代码窗口,直接按照格式要求书写函数过程。

8.2 函数过程与参数传递 8.2.2 调用Function过程 Function过程就是一个函数,因此我们可以像使用Visual Basic内部函数一样来调用Function过程。

8.2 函数过程与参数传递 例 编写一个求两个数最大公约数的函数过程。 我们采用辗转相除法求最大公约数。 分析 函数过程 Private Function Gcd(M As Integer, N As Integer) As Integer Dim R As Integer Do R = M Mod N If R = 0 Then Exit Do M = N N = R Loop Gcd = N End Function 函数过程

8.2 函数过程与参数传递 例 编写一个求两个数最大公约数的函数过程。 我们采用辗转相除法求最大公约数。 分析 Private Sub cmdOK_Click() Dim A%, B%, T$ A = Val(InputBox("输入一个数值")) B = Val(InputBox("输入一个数值")) MsgBox A & " 和 " & B & " 的最大公约数是:" & Gcd(A, B) End Sub

8.2 函数过程与参数传递 8.2.3 形式参数和实际参数 主调过程中的参数叫实际参数,被调过程中的参数叫形式参数。 主调过程的实际参数通过调用过程将其传递给被调过程的形式参数,完成形参与实参的结合,然后执行被调的过程。 出现在主程序中 Call MySub (实参表) …… Private Sub MySub (形参表) 出现在子程序中

8.2 函数过程与参数传递 8.2.3 形式参数和实际参数 说明: 1、<形参表>、<实参表>中对应的变量名不必相同,但变量个数必须相等,对应的变量类型必须相同。 2、<形参表>、<实参表>中的各个参数之间用逗号分隔; 3、<形参表>由变量组成,可以是任何类型的变量,但不能用定长字符串作为形式参数 4、<实参表>可以由常量、表达式、有效变量名、数组名(后跟左右括号)组成

8.2 函数过程与参数传递 8.2.4 传值调用与传址调用 传值调用:当主调程序中的实际参数是常量或表达式 时,就是传值调用。 特点: 传值调用是单向的,只能由实参传递到形参,不能 由形参传递到实参; 在过程中,无论形式参数如何改变,主程序中的实 际参数不会受到影响; 当要求变量按值传送时,要先把变量变成一个表达 式,如(A),或在过程中用ByVal定义形参变量。

8.2 函数过程与参数传递 说明: 先计算表达式的值,然后分别传递给形参A , B , C …… CALL Cal(3+5,(X),Y) Private SUB Cal( A, B, ByVal C) 说明: 先计算表达式的值,然后分别传递给形参A , B , C 因为实参的值是固定的,形参值的改变并不影响实 参的值

8.2 函数过程与参数传递 8.2.4 传值调用与传址调用 传址调用:当CALL语句中的实际参数为变量 时就是传址调用 特点:· 形式参数与实际参数使用相同的内存地 址单元,当形式参数发生变化时,实际 参数也随着改变; · 传址调用会把过程的执行结果带回到调 用的程序。

8.2 函数过程与参数传递 m a n b 返回后主调程序中的结果: m n 返回时 调用时 …… m = 5 : n=8 6 5 CALL SM( m , n ) Print m,n Private SUB SM( a , b ) a=a+1:b=b+2 End Sub 6 5 m a 10 8 返回时 n b 调用时 返回后主调程序中的结果: m n 6 10

8.2 函数过程与参数传递 …… m = 5 : n=8 说明: 1. 调用子程序时,m和a共占一个内存单元,n和b共占一个内存单元; CALL SM( m , n ) Print m,n Private SUB SM( a , b ) a=a+1:b=b+2 End Sub 说明: 1. 调用子程序时,m和a共占一个内存单元,n和b共占一个内存单元; 2. a 和 b 的值改变时,m 和 n 的值也随之改变。 即:如果实参是变量,则可以通过子程序相应变量的值的改变使实参的变量的值发生改变!

8.2 函数过程与参数传递 8.2.5 数组参数的传递 在使用通用过程时,可以将数组或数组元素作为参数进行传递。在传送数组时,除遵守参数传送的一般规则外,还应注意以下两点: 1.传递整个数组时,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省。 2.如果不需要把整个数组传送给过程,而是传递数组中的某一元素,则需要在数组名后面的括号中写上指定元素的下标。

8.2 函数过程与参数传递 8.2.5 数组参数的传递 在使用数组元素作为参数进行传递时,可能会使用到如下两个函数: LBound(<数组名>,[<维数>]) : 取数组指定维数的下界值 UBound(<数组名>,[<维数>]) : 取数组指定维数的上界值

8.2 函数过程与参数传递 过程的作用域随所定义的位置和语句的不同而不同。按过程的作用范围来划分,过程可分为: 一个对象可被访问或识别的范围称为其作用域。 8.2.6 过程的作用域 过程的作用域随所定义的位置和语句的不同而不同。按过程的作用范围来划分,过程可分为: 模块级过程 全局级过程

8.2 函数过程与参数传递 8.2.6 过程的作用域 模块级:在窗体模块或标准模块中用Private关键字定义的过程,只能被定义的窗体模块或标准模块中的过程调用。 全局级:在窗体模块或标准模块中用Public关键字(或缺省)定义的过程,可被该应用程序的所有窗体模块和标准模块中的过程调用。

8.2 函数过程与参数传递 8.2.6 过程的作用域 注意: 1.其它模块调用在窗体模块中定义的全局级过程时,必须在该过程名前加上该过程所处的窗体名。 例如:在窗体Form1中调用窗体模块Form2中的名为Mysub的全局过程,使用如下形式: Call Form2.Mysub[(实参表)] 或 Form2.Mysub[实参表]

8.2 函数过程与参数传递 8.2.6 过程的作用域 注意: 2.在标准模块中定义的全局级过程,外部过程均可调用,但过程名必须惟一。即在工程的多个标准模块中全局过程名不相同,否则调用时就必须要加上标准模块名。

8.2 函数过程与参数传递 8.2.6 过程的作用域 注意: 3.对于一个只包含一个窗体的简单应用程序,可直接在本窗体模块中用Private或Public定义过程。 4.若是包含多个窗体的应用程序,一般把子程序过程和函数过程放在标准模块中,并用Public关键字定义,这样定义的过程可被本应用程序的所有过程直接访问。

8.2 函数过程与参数传递 8.2.7 变量的作用域 变量的作用域是指变量被某一过程识别的范围。在VB中,可以在过程或模块中声明变量,根据变量定义的位置和定义语句的不同,Visual Basic中的变量可以分为: 局部变量 模块变量 全局变量

8.2 函数过程与参数传递 8.2.7 变量的作用域 局部变量 在一个过程内部使用Private或Dim关键字声明的变量(或过程中中未作说明而直接使用某个变量 )叫做局部变量。局部变量只在过程内部有效。

8.2 函数过程与参数传递 8.2.7 变量的作用域 模块级变量 在模块的“通用”中用Private或Dim关键字声明的变量属于模块变量。该变量在整个模块的所有过程中都能使用 。

8.2 函数过程与参数传递 8.2.7 变量的作用域 全局变量 在某个模块的“通用”中用Public关键字声明的变量属于全局变量。它的作用范围是整个应用程序 。 由于在任何过程中全局变量都有效(可以随意修改),因此为安全起见,应用程序中应尽量避免使用全局变量。

8.2 函数过程与参数传递 8.2.7 变量的作用域 在整个过程中允许变量重名,但局部变量的优先级最高,全局变量的优先级最低。

8.2 函数过程与参数传递 8.2.8 静态变量 变量只在其作用的范围中保持有效,而一旦变量脱离了它的作用域,变量所代表的值就将失去,它所占用的内存空间将被释放。 为了使局部变量在脱离其作用域以后仍然有效,我们可以将其定义成静态变量。 静态变量在过程结束后仍保留变量的值,其占用的内存单元未释放。在过程内部用Static关键字声明的变量叫做静态变量。

8.2 函数过程与参数传递 8.2.8 静态变量 用变量 n 记录单击窗体的次数。 Private Sub Form_Click() Dim n As Integer n = n + 1 Print "已单击的次数:"; n & "次" End Sub 8.2.8 静态变量 用变量 n 记录单击窗体的次数。 Private Sub Form_Click() Static n As Integer n = n + 1 Print "已单击的次数:"; n & "次" End Sub

8.2 函数过程与参数传递 注意: 1.对与其他过程或模块无关的变量来讲,可在“过程内”用Dim关键字将其声明为局部变量。 2.当同一模块的不同过程间需要共享变量时,可用Private或Dim关键字在“通用”中将其声明为模块级变量。 3.当同一应用程序的不同模块间需要共享变量时,可用Public关键字在“通用”中将其声明为公有变量。

8.4 过程的嵌套和递归 8.4.1 过程的嵌套 概念:在程序的执行过程中一个过程调用了另外一个过程,这种结构称为嵌套。 Sub过程 8.4.1 过程的嵌套 概念:在程序的执行过程中一个过程调用了另外一个过程,这种结构称为嵌套。 Sub过程 Subp1子过程 Subp2子过程 调用Subp1 调用Subp2 结束 调用Subp2 返回 返回

8.4 过程的嵌套和递归 接或直接地调用 了自己,这种结构称 8.4.2 过程的递归 概念: 如果在程序的执行过 程中一个子过程间 为递归。 递归调用是无终止的自身调用,不符合结构化的程序的要求,在递归调用中可以用条件来控制递归是否继续进行。

8.4 过程的嵌套和递归 分析:用函数 TZ 表示每天的桃子数 TZ(1) = 2*(TZ(2)+1) 用递归法解猴子吃桃问题 关键问题:找出规律 TZ(n)=2*(TZ(n+1)+1) n=1,2,3,4 TZ(5)=1

8.4 过程的嵌套和递归 主程序 Label1.Caption = "猴子第一天共摘了" & TZ(1) & "个桃子" 递归 调用函数 Private Function TZ(N As Integer) If N = 5 Then TZ = 1 Else TZ = 2 * (TZ(N + 1) + 1) End If End Function 递归 调用函数 Form1_Load() TZ(1) N=1 TZ(2) N=2 TZ(3) N=3 TZ(4) N=4 TZ(5) N=5 TZ(N) TZ(N) TZ(N) TZ(N) TZ(N) 主程序 N=1 TZ(1)=46 N=2 TZ(2)=22 N=3 TZ(3)=10 N=4 TZ(4)=4 N=5 TZ(5)=1

强调:递归比递推的步骤要多一倍,因此,能用递推方法 解决的问题,尽量不要用递归来解决。 8.4 过程的嵌套和递归 未知 TZ(1) = 2*(TZ(2)+1) TZ(2) = 2*(TZ(3)+1) TZ(3) = 2*(TZ(4)+1) TZ(4) = 2*(TZ(5)+1) TZ(5)=1 未知 递归与递推比较: 递归 递推 已知 已知 强调:递归比递推的步骤要多一倍,因此,能用递推方法 解决的问题,尽量不要用递归来解决。

8.5 应用 传说印度教的主神梵天创造世界时,在印度北部佛教胜地贝拿勒斯圣庙里,安放了一块黄铜板,板上插着3根针,在其中一根针上自下而上放着由大到小的64个金盘。这就是所谓的梵塔(Hanoi)。梵天要僧侣们坚持不渝地按下面规则把64个盘子移到另一根针上: 1. 一次只能移一个盘子; 2. 盘子只许在3根针上存放; 3.永远不许大盘压小盘。 梵天称,当把他创造世界时所安放的64个盘子全部移到另一根针上之时,就是世界的毁灭之日。

8.5 应用 分析:假设三根针分别为: 1,2,3(分别用A,B,C表示)。 我们现在要将 N 个盘子从 1 号针移到 3 号针上, 在移动的过程中可以借助 2 号针。定义过程: HANOI( N , A , C , B ) 1. 我们将 N 个盘子分成两部分: 最下面的一个 和上面的 N-1 个; 2. 将 N-1 个盘子从 1 号针移到 2 号针上,将最下面 的一个盘子从 1 号针移到 3 号针上,再将N-1 个 盘子从 2 号针移到 3 号针上。 3. 当 N > 0 时重复上面的步骤, 即: HANOI( N-1 , A , B , C ) A -- C HANOI( N-1 , B , C , A )

8.5 应用 Dim A%, B%, C%, N% N = Val(InputBox("输入汉诺塔的高度", "输入")) Call Hanoi(N, A, C, B) Private Sub Hanoi(N, A, C, B) If N > 0 Then Call Hanoi(N - 1, A, B, C) Print A; "--"; C Call Hanoi(N - 1, B, C, A) End If End Sub

第8章 作业 P213 习题:一、二 P217 三、 2~10 (任选3道题提交)