实训十 子 过 程 一、实训目的 二、实训内容 1、通用过程 【实训要求】 1、掌握通用过程的定义和调用方法。 实训十 子 过 程 一、实训目的 1、掌握通用过程的定义和调用方法。 2、了解形参和实参的对应关系及参数传递的方式。 二、实训内容 1、通用过程 【实训要求】 随机产生两个数组并按由小到大的顺序排序, 然后将它们合并到第三个数组中(合并后的数组 仍然有序)。要求: sx10_1.vbp 下一页
(1)编写一个CreatArr子过程,产生有n个元素的 数组,其元素是随机产生的1 到100之间的数; (2)编写一个Sort子程序,对数组按递增次序排列; (3)编写一个Merge子程序,将两个数组进行合并; (4)编写一个PrintArr子程序,将数组显示在窗体上。 (5)编写一个按钮的Click 事件过程,分别调用上述过程。 其运行效果见图: 上一页 下一页
【实训步骤】 第1步:启动VB,打开一个新的标准工程。 第2步:在窗体上添加一个命令按钮Command1。 第3步:编写代码: (1)编写如下四个过程: Option Base 1 ‘ 数组的下标从1开始 Public Sub creatarr(a%(), n%) ‘产生数组的过程 Dim i% For i = 1 To n a(i) = Int(Rnd * 100 + 1) Next End Sub 上一页 下一页
Public Sub Sort(a%(), n%) ‘ 排序过程(选择法递增排序) Dim i%, j%, t% For i = 1 To imin = i For j = i + 1 To n If a(j) < a(imin) Then imin = j Next t = a(i) a(imin) = t End Sub 上一页 下一页
Public Sub PrintArr( a%( ) ) ‘ 输出数组过程 Dim i% For i = LBound(a) To If Then ‘ 每行输出10个数 Print a(i) Else Print a(i); End If Next Print End Sub 上一页 下一页
Public Sub Merge(a%(), b%(), c%() ) ‘ 合并数组过程 Dim ia%, ib%, ic%, ina%, inb%, inc% ina = UBound(a) ‘ 数组a 的元素个数 inb = UBound(b) ‘ 数组b 的元素个数 inc = ina + inb ‘ 合并后的数组的元素个数 ia = 1: ib = 1: ic = 1 Do While ia <= ina And ib <= inb '当两个数组没有都读完 If a(ia) < b(ib) Then c(ic) = a(ia): ia = ia + 1 Else End If Loop 上一页 下一页
Do While ia <= ina ‘ 如果数组 a 没有读完 ic = ic + 1 Loop Do While ib <= inb ‘ 如果数组 b 没有读完 End Sub 上一页 下一页
Private Sub Command1_Click( ) Cls Dim aa%(10), bb%(8), cc%(18) Call creatarr(aa(), 10) Sort aa(), 10 Print Print "打印aa数组" Call creatarr(bb(), 8) 运行程序,单击按钮即可显示如上图所示的结果 Print "打印bb数组" Merge aa(), bb(), cc() Print Print "打印cc数组" End Sub 上一页 下一页
【实训要求】编写一子过程 MoveStr( ) 2、做一做 sx10_2.vbp 【实训要求】编写一子过程 MoveStr( ) Public Sub MoveStr(a$(),m%,Tag As Boolean) 其功能是把字符数组移动m个位置,当Tag 为 True时左移,将前m个字符移到字符数组尾,例如:“abcdefghij”左移3个位置后,结果为“defghijabc”;当Tag 为 False时右移,将后m个字符移到字符数组前,例如:“abcdefghij” 右移3个位置后,结果为 “hijabcdefg”。 试编写一主调程序调用之。 上一页 下一页
【实训要求】从数组a 中删除数组 b 中已有的数后形成新的数组 x。 3、做一做 【实训要求】从数组a 中删除数组 b 中已有的数后形成新的数组 x。 要求:单击窗体自动产生数组a和数组 b(随机产生40 — 70之间的整数); 单击“删除”按钮,删除相同的元素,并将剩余元素打印出来。结果如图: sx10_3.vbp 上一页 下一页
【实训要求】编写一个子程序DeleStr(s1,s2),将字符串s1中出现的s2 子字符串删去,结果还是存放在s1中。 4、做一做 【实训要求】编写一个子程序DeleStr(s1,s2),将字符串s1中出现的s2 子字符串删去,结果还是存放在s1中。 界面如图: sx10_4.vbp 上一页 下一页
5、做一做 sx10_5.vbp 【实验要求】统计输入的文章中的单词数,并将出现的定冠词The 全部去除,同时统计删除的定冠词个数。(假定单词间以一个空格分隔) 与数组有关的函数: Array LBound UBound Split函数:从一个字符串中, 以某个指定的符号为分隔符, 分离若干个子字符串,建立一个下标从0开始的一维数组。格式:Split(<字符串表达式>[,<分隔符>]) Filter函数:去处定冠词 Filter(a, “ The ”,False) Join函数:合并字符数组 Join(字符数组) 上一页 下一页
6、用不同的参数传递方式调用过程 【实训要求】 【实训步骤】 通过调用过程,显示如图所示的结果: 第1步:启动VB,打开一个 新的标准工程。 第2步:在窗体上添加二个 命令按钮Command1 和Command1 。 第3步:编写代码: (1)编写如下二个Sub 过程: 上一页 下一页
Sub tryout1(ByVal x as integer, ByVal y as integer) x=x+100 y=y*6 print “x=“ ; x,”y=“ ; y End Sub Sub tryout2( x as integer, y as integer) 上一页 下一页
(2)编写命令按钮的事件如下: Private Sub Command1_Click() Dim a%, b% Print Print "传值调用:" a = 10: b = 20 Print "a="; a, "b="; b End Sub Private Sub Command2_Click() Dim a%, b% Print Print "传址调用:" a = 10: b = 20 Print "a="; a, "b="; b End Sub 本实验主要用来说明传值调用与传址调用的区别。传值调用只是把实参值的拷贝传递给形参,本身没有任何变化,调用前与调用后的值相同。而传址调用传送的是使参的地址,调用过程后实参的值也随之变化。 上一页