
例题42:通过本实例达到以下目的: 《1)练习自定义子过程,体会白定文子过程的儿个关键要素。 (2)练习测用子过程,体会博用子过程的特点, (3)领会函数过程与子过程的异同, 运行参考界面如图413所示, 。应用千过程举钢 周回X 应用子过程产生若千个桶材字母 字母:「bk::5yb 字母个数: 重新生成 座用子过程文换两变量的值 38 交热 Y: 比较子过程和函数过程,计算肝 调用函数 720 调用子过程 120 图4.13 应用子过程举例运行参考界面 要求如下: (1)将配套素材文件夹Cpr4下的窗体文件Ep2.b,并将其设为项目的启动窗体。 (2)参考源代到,按下列要求定义过程: I)定义一个名为howLetter的子过程:用于随机产生n个小写字母并显示在名为txtLette 的文本控件中。 2)定义一个名为孙甲的子过程:用于交换n和b的值。 3)定义一个名为1的子过程:用于计算N 4)定义一个名为act2的函数过程:用于计算nl (3)通过调用已定义过程的方法,编写代码实现以下功能: I)当窗体加载时。在第一个文本框拉件(其name属性植为:txtLetter)中随机显示10 个小写字母 2》当单击重新坐家按组时,在第一个文本框控件中随机整示用个小写字,n的值由 其左边的文本框得到: 3)单击按扭 艾我 时。交换x和y的植。而x和y的植由其左边的文本框得到 4)单击按钮 调用运数 时,调用函数过程c2计算,n的值由其左边的文木粒得 到
例题 4.2:通过本实例达到以下目的: (1)练习自定义子过程,体会自定义子过程的几个关键要素。 (2)练习调用子过程,体会调用子过程的特点。 (3)领会函数过程与子过程的异同。 运行参考界面如图 4.13 所示。 图 4.13 应用子过程举例运行参考界面 要求如下: (1)将配套素材文件夹 Chapter4 下的窗体文件 Exp2.vb,并将其设为项目的启动窗体。 (2)参考源代码,按下列要求定义过程: 1)定义一个名为showLetter 的子过程:用于随机产生n个小写字母并显示在名为txtLetter 的文本控件中。 2)定义一个名为 swap 的子过程:用于交换 a 和 b 的值。 3)定义一个名为 factor1 的子过程:用于计算 n! 4)定义一个名为 factor2 的函数过程:用于计算 n! (3)通过调用已定义过程的方法,编写代码实现以下功能: 1)当窗体加载时,在第一个文本框控件(其 name 属性值为:txtLetter)中随机显示 10 个小写字母。 2)当单击 按钮时,在第一个文本框控件中随机显示 n 个小写字母,n 的值由 其左边的文本框得到。 3)单击按钮 时,交换 x 和 y 的值,而 x 和 y 的值由其左边的文本框得到。 4)单击按钮 时,调用函数过程 factor2 计算 n!,n 的值由其左边的文本框得 到

5)单击按缸 请用子过显射, 调用子过程fo1计算n!,n的值由其左边的文本框得 到. 解思步理 (1)如载指定素材,将其设为白动度体 (2)按要求定义过程。应注意定义一个子过程时要考虑的几个方面,即, 明确子过程名, 子过程后的形参列表,即各个参数名、数据类型以及是否返回结果。 实现相关功能的子过程体。 I)定义一个名为howLetter的子过程:用于随机产生n个小写字母并暴示在名为 l的文本控件中。该子过程需带一个形参以从主调程序中得到学得个数,即形参n 的值,具体编码时还需考虑以下几点: 该过程是实现一个输出的操作,无雷迈回结果。 随机产生小写字母,利用字母“a”,“z”的ASC川码和系饶函数域),即生成 一个介于A)和A'x之间的随机参数,表示为对下列表达式: md(y(Asc("z")-Asc("a"))+Asc("a") 的取整。然后利用系统函数框得到一个整数对应的字符。 其参考代码载图如图4.14所示, "功能:定义一个名为owLetter的子过程,用于随机U产生n个小写字母并显示 Private Sub showLetter(ByVal n As Integer) Dim i As Integer Dim助Asc As Inter意er For i 1 To n mAsc =(Asc("z")-Asc("a"))*Rnd(Asc("a") txtLetter.Text txtLetter.Text &""Chr(myAsc) Next End Sub 图4.14子过程showL.etter的参考代码截图 2)定义一个名为“即的子过程:用于交换a和b的值。考虑到过程是实现交换两个变 量植的操作,即调用开始时,从主调程序中得到雷要交换的两个变量的值。调用结束时,须 返回交换后的结果给相应实参变量,所以该子过程带两个形参且用保留字)R。其参考代 码截图如图4.15所示。 功能,定义一不名为即的子过程,用于交换和6的固 ·说明,用带保留字ByR的形参返回最新结来给对应位置的实参变量 Private Sub swap(ByRef a As Double,ByRef b As Double) Din tnp As Double t即日a a b b tnp End Sub 图4.15子过程w单的参考代码截图 3)定义一个名为o1的子过程:用于计算n。考虑到根据n需返目n,所以在形参 列表中设置一个带保留字ByR的参数用于返日n。其参考代码截图如图4.I6所示
5)单击按钮 时,调用子过程 factor1 计算 n!,n 的值由其左边的文本框得 到。 解题步骤: (1)加载指定素材,将其设为启动窗体。 (2)按要求定义过程。应注意定义一个子过程时要考虑的几个方面,即: ✓ 明确子过程名。 ✓ 子过程后的形参列表,即各个参数名、数据类型以及是否返回结果。 ✓ 实现相关功能的子过程体。 1)定义一个名为 showLetter 的子过程:用于随机产生 n 个小写字母并显示在名为 txtLetter 的文本控件中。该子过程需带一个形参以从主调程序中得到字母个数,即形参 n 的值,具体编码时还需考虑以下几点: ✓ 该过程是实现一个输出的操作,无需返回结果。 ✓ 随机产生小写字母,利用字母“a”、“z”的 ASCII 码和系统函数 rnd(),即生成 一个介于 Asc("a")和 Asc("z"之间的随机整数,表示为对下列表达式: rnd()*(Asc("z")- Asc("a"))+ Asc("a") 的取整。然后利用系统函数 Chr 得到一个整数对应的字符。 其参考代码截图如图 4.14 所示。 图 4.14 子过程 showLetter 的参考代码截图 2)定义一个名为 swap 的子过程:用于交换 a 和 b 的值。考虑到过程是实现交换两个变 量值的操作,即调用开始时,从主调程序中得到需要交换的两个变量的值,调用结束时,须 返回交换后的结果给相应实参变量,所以该子过程带两个形参且用保留字 ByRef。其参考代 码截图如图 4.15 所示。 图 4.15 子过程 swap 的参考代码截图 3)定义一个名为 factor1 的子过程:用于计算 n!。考虑到根据 n 需返回 n!,所以在形参 列表中设置一个带保留字 ByRef 的参数用于返回 n!。其参考代码截图如图 4.16 所示

'功能:定义一个名为factor1的子过程,用于计算n '说明:用带保留字ye的形参返回结果 Private Sub factor1(ByVal n As Integer,ByRef s As Long) Dim i As Integer 分=1 For i 1 To n 日8卡i Next End Sub 图4.16子过程tor1的参考代码裁图 4)定义一个名为2的函数过程:用于计算nl。其参考代码截图如图4.17所示。 ·功能,定义一个名为factor2的函数过程,用于计算nl Private Function factor2(ByVal n As Integer)As Long Din i As Integer Din s As Long 3=1 For i 1 To n =雪米i Next factor2 =s End Function 图4.17函数过程02的参考代码截图 (3)编写代码实现“当密体如载时,在第一个文本框控件中随机显示0个小写字母 给窗体的1d事作编写代码。其参考代列截图如图4.18所示。 功能,窗体加载时,显示10个字母 Private Sub Exp2_Load(ByVal sender As System.Object,ByVal e '调用子过程 Call showLetter(10) End Sub 图4.18窗体L00d事件的参考代码截图 (4)给按钮重新生成编写代码并运行测试,实现随机显示用个小写学华,其参考代码 截图如图4.19所示。 '功能:显示个字母,字母个数由界面得到。 Private Sub btnAgain_Click(ByVal sender As Systen.Object, Dim n As Integer txtLetter.Text n Convert.ToInt32(txtNum Text) ”调用子过程 showLetter(n】 End Sub 图4.19 显示■个小写字母的参考代码檬图 (5)给按钥 交换 编写代码并运行调试:实现交换x和y的值。其参考代码截图如 图420所示
图 4.16 子过程 factor1 的参考代码截图 4)定义一个名为 factor2 的函数过程:用于计算 n!。其参考代码截图如图 4.17 所示。 图 4.17 函数过程 factor2 的参考代码截图 (3)编写代码实现“当窗体加载时,在第一个文本框控件中随机显示 10 个小写字母”。 给窗体的 Load 事件编写代码,其参考代码截图如图 4.18 所示。 图 4.18 窗体 Load 事件的参考代码截图 (4)给按钮 编写代码并运行调试:实现随机显示 n 个小写字母。其参考代码 截图如图 4.19 所示。 图 4.19 显示 n 个小写字母的参考代码截图 (5)给按钮 编写代码并运行调试:实现交换 x 和 y 的值。其参考代码截图如 图 4.20 所示

'功能:调用子过程wap,交携x和y的值。 Private Sub btnSwap_Click(ByVal sender As System Object,ByVal e Din x,y As Double x Convert.ToDouble(txtX.Text) 7荷群量ouic.e txtXX.Text x txtYY.Text =y End Sub 图420显示。个小写字母的参考代码极图 【注意】由于定义子过程swp时,采用保留字ByR说明形参a和b,即: Private Sub swap(ByRef a As Double,ByRef b As Double),表明形参与对 应实参共享同一个存储单元,因此若在过程体中形参的值发生改变,对应实参变量的值也 会发生改变。对于本按钮事件,当程序执行到调用子过程s即时。先虚实结合。即: x一a,y一>b:然后执行过程体完成变量a和b值的互换,直到“End Sub”:返目按钮 事件中的调用开始处,同时将最新形参a和b的值返日给对应的实参,:一>%,b一y: 最后输出最新的x和y值, (6)给按钮 调用函数编写代码并运行调试:调用函数过程c02计算n.其参考代 码截图如图4.21所示。 '功能,调用函数过程factor2,用于计算nl Private Sub btnFunction_Click(ByVal sender As System.Object, Dim n As Integer,s As Long n Convert.Tolnt32(txtN.Text) ·调用函数过程factor2 s factor2(n) 输出g lblFunction.Text =s End Sub 图421 显示■个小写字得的参考代码截图 (7)给按 评用子过程订 编写代码并运行调试:调用子过程ftor1计算!,其参考代 码截图如图421所示。 ”功能:调用子过程factorl,,用于计算nl Private Sub btnSub_Click(ByVal sender As System.Object,ByVal e Din n As Integer,s As Long n Convert.ToInt32(txtN.Text) '调用子过程factorl,实买参g得到相应形参的最新结果 factor1(n.s) ”输出= 1blSub.Text s End Sub 图4.22 显示个小可字母的参考代码假图
图 4.20 显示 n 个小写字母的参考代码截图 【注意】由于定义子过程 swap 时,采用保留字 ByRef 说明形参 a 和 b,即: ,表明形参与对 应实参共享同一个存储单元,因此若在过程体中形参的值发生改变,对应实参变量的值也 会发生改变。对于本按钮事件,当程序执行到调用子过程 swap 时,先虚实结合,即: x—>a,y—>b;然后执行过程体完成变量 a 和 b 值的互换,直到“End Sub”;返回按钮 事件中的调用开始处,同时将最新形参 a 和 b 的值返回给对应的实参,即:a—>x,b—>y。 最后输出最新的 x 和 y 值。 (6)给按钮 编写代码并运行调试:调用函数过程 factor2 计算 n!。其参考代 码截图如图 4.21 所示。 图 4.21 显示 n 个小写字母的参考代码截图 (7)给按钮 编写代码并运行调试:调用子过程 factor1 计算 n!。其参考代 码截图如图 4.21 所示。 图 4.22 显示 n 个小写字母的参考代码截图

为了便于对比,将实现月一个功能(如计算)而采用函数过程和子过程的编写战在 一起以供比较,如图423所示,留意图中面圈的部分。 Hwe5过Nl五0Is,时a inis1四 s:1 ee!±1Ton 8里8米i ,尾义一个名刀的型,用干计: Dim i As Integer 0iagu年球 For i1 To n 家日男求i Nex fa1ct2"量 Bof Functim (a)子过程 (b)函数过程 图4.23 定义实现的子过程和函数过程的对比 在程序中的调用相应过程的语句对比如图424所示,留意图中西圈部分。 院:用子过程f:t,用于行算n: Private Sub btnSb_Click(Byal sender As Din n As Integer,s As Long octer1(n8D lblSb.Tert ss End Sub 对就:用act2,用计 Private Sub btrFuction.Click(ByYal sender Dia n As Inteper,s As Long n=Corvert.ToInt32(trtN.Text) ”调用函数过程!1时2,利用函数名返回结果 sfactor2(n) 输出。 IblFunction.Tert ss End Sub (a)调用子过程 (b》调用函数过程 图4.24 调用实现的子过程和函数过程的对比 【注意】把某个功能定义成函数过程还是子过程,并没有硬性的规定,如本例中“实 现计算”,既可以采用定义子过程也可采用定义函数过程的方式。若过程贝有一个返日 值,则使用函数过程直观,如本例中“实现计算”建议使用函数过程02!若过程 不清要返日值或者需要多个返回值时,常采用子过程,如本例中的子过程owe和 卸。 本节训练对应填空题(5)、(8)和操作题1
为了便于对比,将实现同一个功能(如计算 n!)而采用函数过程和子过程的编写放在 一起以供比较,如图 4.23 所示,留意图中画圈的部分。 (a)子过程 (b) 函数过程 图 4.23 定义实现 n!的子过程和函数过程的对比 在程序中的调用相应过程的语句对比如图 4.24 所示,留意图中画圈部分。 (a)调用子过程 (b) 调用函数过程 图 4.24 调用实现 n!的子过程和函数过程的对比 【注意】 把某个功能定义成函数过程还是子过程,并没有硬性的规定,如本例中“实 现计算 n!”,既可以采用定义子过程也可采用定义函数过程的方式。若过程只有一个返回 值,则使用函数过程直观,如本例中“实现计算 n!”建议使用函数过程 factor2;若过程 不需要返回值或者需要多个返回值时,常采用子过程,如本例中的子过程 showLetter 和 swap。 本节训练对应填空题(5)~(8)和操作题 1