收藏 分享(赏)

VB第6章 复习资料.doc

上传人:HR专家 文档编号:11468559 上传时间:2020-05-09 格式:DOC 页数:15 大小:82.51KB
下载 相关 举报
VB第6章 复习资料.doc_第1页
第1页 / 共15页
VB第6章 复习资料.doc_第2页
第2页 / 共15页
VB第6章 复习资料.doc_第3页
第3页 / 共15页
VB第6章 复习资料.doc_第4页
第4页 / 共15页
VB第6章 复习资料.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、第6章 补充资料习题解答 1.简述子过程和函数过程的共同点和不同之处. 解答:子过程和函数过程的共同点:函数过程和子过程都是功能相对独立的一种子程序结构,它们有各自的过程头、变量声明和过程体。在程序中使用它们不但可以避免书写重复的程序语句,缩短代码,而且可以使程序条理清晰,容易阅读。 子过程和函数过程的不同点: (1)过程声明的关键字不同,子过程用的是Sub,函数过程用的是Function。 (2)子过程名无值就无类型声明,函数过程名有值就有类型声明。 (3)函数过程名兼作结果变量,因此在函数过程体内至少对函数过程名赋值;而子过程名在过程体内不能赋值。 (4)调用方式不同,子过程是一条独立的语

2、句,可用Call子过程名或省略Call直接以子过程 名调用;函数过程不是一条独立的语句,是一个函数值,必须参与表达式的运算。()一般来说,一个函数过程可以被一个子过程代替,代替时只要改变函数过程定义的形式,并在子过程的形参表中增加一个地址传递的形参来传递结果。什么是形参,什么是实参?什么是值引用?什么是地址引用?地址引用时,对应的实参有什么限制?解答:形参是在定义过程时的一种形式虚设的参数,只代表了该过程参数的个数、类型、位置、形参的名字并不重要,也没有任何值,只表示在过程体内进行某种运算或处理。实参是调用子过程时提供给过程形参的初始值或通过过程体处理后获得的结果。调用时用实参代替形参,实参与

3、形参在个数、类型、位置一一对应,实参与形参名相同与否 无关。实参与形参的结合有两种方法,即传地址(ByRef)和传值(ByVal),或称地址引用和值引用,缺省为地址引用。 值引用时,系统将实参的值传递给对应的形参,实参与形参断开了联系。如果在过程体中改变形参的值,不会影响到实参。 地址引用时,实参与形参变量共用同一个存储单元,如果在过程中改变了形参的值,对应的实参也将发生改变。 地址引用时,实参只能是变量,不能是常量或表达式。 3.指出下面过程语句说明中的错误: (1)Sub f1(n%)As Integer (2)Function f1 % (f1%) (3)Sub f1(ByVal n%(

4、) (4)Sub f1(x(i)as Integer) 解答: (1)错误为Sub子过程名无返回值,也就没有类型。 (2)函数名与形参名相同。 (3)形参n为数组,不允许声明为ByVal值传递。 (4)形参x(i)不允许为数组元素。 4.已知有如下求两个平方数和的fsum子过程: Public Sub fsum(sum%,ByVal m%,ByVal n%) sum = a * a + b * b End Sub在事件过程中若有如下变量声明: Private Sub Command1_Click() Dim a%,b%,c! a = 10:b = 20则指出如下过程调用语句的错误所在: (1)

5、fsum 3,4,5 (2)fsum c,a,b (3)fusm a + b,a,b (4)Call fsum(Sqr(c),Sqr(a),Sqr(b) (5)Call fsum c,a,b 解答: (1)fsum子过程的第一个形参是地址传递,因此对应的实参3不应该是常量。 (2)fsum子过程的第一个形参是整形而且是地址传递,对应的实参c是单精度,类型不匹配。 (3)fsum子过程的第一个形参是地址传递,因此对应的实参a+b不应该是表达式。 (4)fsum子过程的第一个形参是地址传递,因此对应的实参Sqr(c)不应该是表达式。 (5)用Call语句调用fsum子过程,必须加圆括号括起实参。

6、5.利用迭代法求方程 x2 - a = 0的近似根,要求精度为10-5,迭代公式为Xi+1 = 1/2(Xi + a/Xi)。编制三个过程:迭代函数过程、迭代子过程和递归法函数过程。 解答:假定a为10,三种过程的执行效果如图6.6所示,程序代码如下: Private Sub Command1_Click() Print函数过程;f1(10) Call s1(x!,10) Print子过程;x! Print递柜调用;dgf(x,10) End Sub Public Function f1!(a!) 函数过程 Dim X!,X1! x1 = a Do x = (x + a/x)/2 If Abs

7、(x - x1) 0.00001 Then Exit Do x1 = x Loop End Sub Public Function dgf!(x,a!) 递归调用 x1 = (x + a/x)/2 If Abs(x - x1) 0.00001 Then dgf = x Else dgf = dgf(x1,a) End If End Function 6.要使变量在某事件过程中保留值,有哪几种变量声明的方法? 解答:声明变量为全局(Public)、通用声明段或标准模块声明的模块级变量、局部过程声明的静态变量(Static)。 7.为了使某变量在所有的窗体中都能使用,应在何处声明该变量? 解答:在

8、标准模块声明为全局变量。 8.在同一模块、不同过程中声明的相同变量名,两者是否表示同一个变量?两者间有没有联系? 解答:表示不同的变量,没有任何关系。常见错误和难点分析.程序设计算法的问题该章程序编写难度较大,主要是算法的构思有困难,这也是程序设计中最难学习的阶段。但是对每一位程序设计的初学者,没有捷径可走,一定要多看、多练、知难而进。上机前一定要先编写好程序,仔细分析、检查,才能提高上机调试的效率。.确定自定义的过程是子过程还是函数过程实际上过程是一个具有某种功能的独立程序单位,可供多次调用。子过程与函数过程的区别是前者子过程名无值;后者函数过程名有值。若过程有一个返回值,则习惯使用函数过程

9、;若过程无返回值,则使用子过程;若过程返回多个值,一般使用子过程,通过实参与形参的结合返回结果,当然也可通过函数过程名返回一个,其余结果通过实参与形参的结合返回。.过程中确定形参的个数和传递方式对初学者,在定义过程时较难确定形参的个数和传递方式。过程中参数的作用是实现过程与调用者的数据传递。一方面,调用者为子过程或函数过程提供初值,这是通过实参传递给形参实现的;另一方面,子过程或函数过程将结果传递给调用者,这是通过地址传递方式实现的。因此,决定形参的个数就是由上述两方面决定的。对初学者,往往喜欢把过程体中用到的所有变量全作为形参,这样就增加了调拥者的负担和出错概率;也有的初学者全部省略了形参,

10、因此无法实现数据的传递,既不能从调用者得到初值,也无法将计算结果传递给调用者。VB中形参与实参的结合有传值和传地址两种方式。区别如下: (1)在定义形式上前者在形参前加ByVal关键字,后者在形参前加ByRef关键字或缺省。 (2)在作用上值传递只能从外界向过程传入初值,但不能将结果传出;而地址传递既可传入又可传出。 (3)如果实参是数组、自定义类型、对象变量等,形参只能是地址传递。 4.实参与形参类型对应的问题 在地址传递方式时,调用过程实参与形参类型要一致。例如: 函数过程定义如下: Public Function f!(x!) f = x + x End Function 主调程序如下:

11、 Private Sub Command1_Click() Dim y% y = 3 Print f(y) End Sub 上例形参x是单精度型、实参y是整形,程序运行时会显示ByRef参数类型不符的编译提示信息。 在值传递时,若是数值型,则实参按形参的类型将值传递给形参,例如: 函数过程定义如下: Public Function f!(x!) f = x + x End Function 主调程序如下: Private Sub Command1_Click() Dim y% y = 3.4 Print f(y) End Sub 程序运行后显示的结果是6。 5.变量的作用域问题 局部变量,在对

12、该过程调用时,分配该变量的存储空间,当过程调用结束时,回收分配的存储空间,也就是调用一次,初始化一次,变量值不保留;窗体级变量,当窗体装入时,分配该变量的存储空间,直到该窗体从内存卸掉,才回收该变量分配的存储空间。 例如,要通过文本框输入若干个值,每输入一个按Enter键,直到输入的值为9999,输入结束,求输入数的平均值。 Private Sub Text1_KeyPress(KeyAscii As Integer) Dim sum!,n% If KeyAscii = 13 Then If Val(Text1) = 9999 Then sum = sum / n Print sum Else

13、 sum = sum + Val(Text1) n = n + 1 Text1 = End If End If End Sub 该过程没有语法错,运行程序可输入若干个数,但当输入9999时,程序显示“溢出”的错误。因为sum和n是局部变量,每按一个键,局部变量初始化为0,所以会有上述错误产生。 改进方法:将要保值的局部变量声明为Static静态变量,也可将要保值的变量在通用声明段进行声明为窗体级变量。 6.递归调用出现“栈溢出” 如下求阶乘的递归函数过程: Public Function fac(n As Integer)As Integer If n = 1 Then fac = 1 Els

14、e fac = n * fac(n - 1) End If End Function Private Sub Command1_Click() 调用递归函数,显示出fac(5)=120 Print fac(5)=;fac(5) End Sub 当主调程序调用时,n的值为5时,显示结果为120;当n的值为-5时,显示“溢出堆栈空间”的提示信息。 实际上每递归调用一次,系统将当前状态信息(形参、局部变量、调用结束时的返回地址)压栈,直到到达递归结束条件。上例中当 n = 5 时,每递归调用一次,参数n - 1,直到n = 1 时递归调用结束,然后不断从栈中弹出当前参数,直到栈空。而当 n = -5

15、 时,参数 n - 1 为-6,压栈,再递归调用 n - 1 永远到不了 n = 1 的终止条件,直到栈满,产生栈溢出的提示信息。 所以设计递归过程时,一定要考虑过程中有终止的条件和终止时的值或某种操作,而且每递归调用一次,其中的参数就要向终止方向收敛,否则就会产生栈溢出。测试题一、选择题1.设有如下程序段: Public Sub F1(n%) . n = 3 * n + 4 . End Sub PrivateSub Command1_Click() Dim n% , m% n = 3 m = 4 . 调用F1语句 . End Sub则在Command1_Click事件中有效的调用语句是_。(

16、A)Call F1(n + m) (B)Call F1(m) (C)Call F1(5) (D)Call F1(m + 5)2.下面子过程语句说明合法的是_。(A)Sub f1(ByVal n%() (B)Sub f1(n%)As Integer(C)Function f1%(f1%) (D)Funtion f1(ByVal n%)3.要想从子过程调用后返回两个结果,下面子过程语句说明合法的是_。(A)Sub f2(ByVal n%,ByVal m%)(B)Sub f1(n%,ByVal m%)(C)Sub f1(n%,m%)(D)Sub f1(ByVal n%,m%)4.在过程中定义的变量,

17、若希望在离开该过程后,还能保存过程中局部变量的值,则应使用_关键字在过程中定义局部变量。(A)Dim (B)Private (C)Public (D)Static5.下面过程运行后显示的结果是_。 Public Sub F1(n%,ByVal m%) Private Sub Command1_Click() n = n Mod 10 Dim x%,y% m = m 10 x = 12:y = 34 End Sub Call F1(x,y) Print x,y End Sub (A)2 34 (B)12 34 (C)2 3 (D)12 36.如下程序,运行的结果是_。 Dim a%,b%,c%

18、Public Sub p1(x%,y%) Dim c% x = 2 * x:y = y + 2:c = x + y End Sub Public Sub p2(x%,ByVal y%) Dim c% x = 2 * x:y = y + 2:c = x + y End Sub Private Sub Command1_Click() a = 2:b = 4:c = 6 Call p1(a,b) Print a=;a;b=;b;c=;c Call p2(a,b) Print a=;a;b=;b;c=;c End Sub (A)a=2 b=4 c=6 (B)a=4 b=6 c=10 a=4 b=6

19、c=10 a=8 b=8 c=6 (C)a=4 b=6 c=6 (D)a=4 b=6 c=14 a=8 b=6 c=6 a=8 b=8 c=67.如下程序的运行结果是_。 Public Sub Proc(a%() Static i% Do a(i)=a(i)+a(i + 1) i=i + 1 Loop While i n:m = m - n:Loop Do While n m:n = n - m:Loop Loop f = m End Function Private Sub Command1_Click() Print f(24,18) End Sub7.将100150之间的偶数,拆分成两个

20、素数之和(只要一对即可),最后输出格式如图6.7 所示。其中,prime函数判断参数x是否为质数。 Private Function prime(ByVal x As Integer)As Boolean prime = _(10)_ For i = 2 To Sqr(x) If _(11)_ Then prime = False Exit Function End If Next i End Function Private Sub Form_Click() i = 1 For n = _(12)_ For k = 3 To n/2 If prime(k) _(13)_ Then Print

21、 i;:;n;=;k;+;n - k Exit For End If Next k _(14)_ Next n End Sub 8.子过程MoveStr()是把字符数组移动m个位置,当Tag为True时左移,则前m个字符 移到字符数组尾,例如,abcdefghij左移3个位置后,结果为defghijabc;当Tag为False 时右移,则后m个字符移到字符数组前,如abcdefghij右移3个位置后,结果为hi- jabcdefg。 子过程如下: Public Sub MoveStr(a $(),m%,Tag As Boolean) Dim i%,j%,t$ If_(15)_Then 左移 F

22、or i = 1 To m _(16)_ For j = 0 To _(17)_ a(j) = a(j + 1) Next j _(18)_ Next i Else For i = 1 To m 右移 _(19)_ For j = Ubound(A)_(20)_ a(j) = a(j - 1) Next j _(21)_ Next i End If End Sub9.子过程CountN用来统计字符串中各数字字符(09)出现的个数;主调程序对在 TextBox1框输入的文本,每次单击统计按钮,调用该子过程,在Label1框显示结果,如 图6.8所示。 Private Sub Command1_C

23、lick() Dim n(9) As Integer,i% Call CountN(n(),Text1.Text) List1.Clear For i = 0 To 9 If n(i) Then_(22)_字符&i&出现的次数为&n(i) Next End Sub Sub CountN(_(23)_) Dim c As String * 1,i%,m%,j% For i = 0 To 9 num(i) = 0 Next i m = Len(s) For i = 1 To m c = _(24)_ If c =0And c 0 m = _(27)_ 求得n的逆序 i = _(28)_ Loop

24、If m MOd n = 0 And m n 1 Then 是否是倍数 tag = _ End If End Sub11.下列程序中的子过程MySplit(s,sAarray(),n)用于实现Split函数的功能(字符分离到 数组),即将数字字符串s按分隔符“,”分离到sArray数组中,分离的个数为n。主调程 序将文本框中输入的数字字符串按回车键后进行分离,结果在List1控件显示,如图6.10 所示。 Private Sub Text1_KeyPress(KeyAscii As Integer) Dim str1 As String,num(100) As Integer,n%,i% If

25、_(30)_Then str1 = Trim(Text1.Text) Call MySplit(_(31)_) List1.Text = For i = 0 To n List1.AddItem num(i) Next End If End Sub Sub MySplit(ByVal str1 As String,ByRef sn() As Integer,ByRef n As Integer) Dim i%,j%,ch$ i = 0 j = InStr(str1,) Do While j 0 sn(i) = Val(_(32)_) str1 = Mid(str1,j + 1) i = i +

26、 1 j = _(33)_ Loop sn(i) = Val(str10 n = _(34)_ End Sub12.以下过程将一个有序数组中重复出现的数进行压缩,删除后只剩一个.主调程序运行 后结果如图6.11所示。 Sub p(a() Dim n%,m%,k% n = UBound(a) m = n Do While (_(35)_) 从右往左比较、压缩 If a(m) = a(m - 1) Then For k = _(36)_ a(k - 1) = a(k) Next k _(37)_ End If _(38)_ Loop ReDim Preserve a(n) End Sub Priv

27、ate Sub Command1_Click() 主调程序调用P压缩过程 Dim b(),i% b = Array(23,45,45,60,70,70,70,90) Call p(_(39)_) For i = 0 To UBound(b) Print b(i); Next i End Sub13.在主教材中介绍的选择法、冒泡法排序都是在欲排序的数组元素全输入后,再进行排 序。而插入排序是每输入一个数,马上插入到 数组中,数组在输入过程中总是有序的,界面 如图6.12所示。在插入排序中,涉及查找、数 组内数的移动和元素插入等算法。 提示 此例关键在于编一个插入排序过程,插入排序 法的思路是:

28、对数组中已有n个有序数,当输入某数x时: (1)找x应在数组中的位置j。 (2)从n - j个数依次往后移,使位置为j的数让出。 (3)将数x放入数组中应有的位置j,一个数插入完成。 对于若干个数输入,只要调用插入排序过程即可。 Dim n As Integer Private Sub Text1_keypress(keyascii As Integer) Static bb! (1 To 20) Dim i% If n = 20 Then MsgBox数据太多!,1,警告 EndEnd IfIf keyascii = 13 Then n = n + 2 insert_(40)_ Pictur

29、e2.Print Text1 打印刚输入的数 For i = 1 To n 打印插入后的有序数 Picture1.Print bb(i) Next i Picture1.Print Text1 = End IfEnd SubSub insert(a() As Single,ByVal x!) Dim i%,j% j = 1 Do While_(41)_ 查找x应插入的位置j j = j + 1 Loop For i = n - 1 To j Step - 1 n - j个元素往右移 _(42)_ Next i a(j) = x x插入数组中的第j个位置End Sub参考答案一、选择题1.B F

30、1子过程中的形参n是地址传递,可以从实参中获得初值,也可以把结果返回给主 调程序,此时要求实参是变量,才能获得效果。而A、C、D调用时实参是表达式或常 量,在VB中语法没有错(有的程序设计语言不允许),但得不到子过程中操作的 结果。2.D A形参是数组,不允许为值传递;B子过程名无值也无类型,F1不能声明为整形;C函 数名与形参名同名。 注意:在VB中允许子过程名与形参名同名,例如,C改为: Sub f1(f1%) 认为是正确的,因为子过程名无值,不会产生二义性,但尽量不要这样写,因为在有的 程序设计语言中不允许。3.C 原因同第1题。4.D Static具有保值的特点;不能在过程体内声明Pu

31、blic、Private变量。5.A 原因同第1题。6.C P1子过程的形参都是地址传递,P2子过程x是地址传递,y是值传递。7.B 形参是数组,是地址传递,实参可得到过程中操作的结果。二、填空题(1)存储单元(2)MyF(a%,b%()As Boolean(3)LBound()(4)UBound()(5)局部变量(6)通用声明(7)所有过程(8)6(9)用辗转相减法求m、n的最大公约数 求最大公约数通常是用辗转相除法。(10)True 初值假定为素数。(11)m Mod i = 0 只要被i整除,x就不是质数。(12)100 To 150(13)And prime(n - k) 拆分成两个素数。(14)i = i + 1 统计满足的个数。(15)Tag Tag为True左移。(16)c = a(0) 将最左边的元素移出。(17)Ubound(a) - 1 数组上界减一个,循环完成,所有元素左 移一次,最右边空出位置,留给最左边的 刚移出元素a(0)(18)a(Ubound(a)=c 最左边的刚移出元素移到最右边(19)c = a(Ubound(a) 将最右边的元素移出(20)To 1 Step-1 意义同11,仅是右移。右移从右边开始逐

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 计算机原理

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报