VB二级辅导资料.doc_第1页
VB二级辅导资料.doc_第2页
VB二级辅导资料.doc_第3页
VB二级辅导资料.doc_第4页
VB二级辅导资料.doc_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

江苏省计算机等级考试(二级VB)复习资料洪蕾江苏省等级考试二级VB语言复习资料江苏省等级考试题型如下选择题:计算机基础题20个 VB基本知识选择题10个 阅读程序写出运行结果45题(其中字符处理一题,过程调用至少两题,数组一题) 补充代码题45题(其中数论2题左右,文件操作一题,字符处理一题) 上机考试二题,一题改错(3个错),另一题编程。补充代码题复习和解题方法关于补充代码题,是所有题型中难度较大的,学生普遍感到无从下手, 下面谈谈关于代码补充题的复习方法。1、 熟悉VB基本语法,能够阅读代码写出结果是完成代码补充题型最基本的前提。阅读程序写出结果是VB等级考试中的一种重要题型,考察的实际是正向思维,即给出程序,然后模拟程序执行,最后分析出结果。相对于补充代码这种考察逆向思维的题型,难度应该是比较小的。综合历年考题,我们可以将阅读程序写结果考察的知识侧重点不同分为四类。题型一: 分支与循环 1单击窗体后在窗体上显示的内容是 ;若将程序中的A语句与B语句位置互换,再次执行程序,单击窗体后在窗体上显示的内容是: 。Option ExplicitPrivate Sub Form_Click() Dim Sum As Integer, i As Integer For i = 7 To 4 Step -1 Select Case i Case 4, 7 Sum = Sum + i A语句 Case 3, 5 Sum = Sum + 2 B语句 Case Else Sum = Sum + 1 End Select Next i Print Sum=; SumEnd Sub2在过程中有语句:For I=N1 to N2 Step N3,在该循环体内有下列四条语句,其中 会影响循环执行的次数。 N1=N1+I N2=N2+N3 I=I+N3 N3=2*N3A. B. C. D. 3执行下面的程序,在窗体上显示的输出结果的第一行: ,第二行是: Option ExplicitPrivate Sub Form_Click() Dim M As Integer, N As Integer, K As Integer N = -3 For M = 6 To 1 Step N M = M + 1 N = N - M K = K + 1 Next M Print K Print NEnd Sub题型二: 字符串处理 1执行下面的程序,在窗体上显示的输出结果的第一行是 ,第二行是 。Option ExplicitPrivate Sub Form_Click() Dim s As String, i As Integer, flag As Boolean s = THIS IS A BOOK. s = LCase(s) Print s flag = True For i = 1 To Len(s) If Mid(s, i, 1) = Then flag = True ElseIf flag Then s = Left(s, i - 1) & UCase(Mid(s, i, 1) & Right(s, Len(s) - i) flag = False End If Next i Print sEnd SubKey: this is a book. This Is A Book.2执行下面程序,单击命令按钮Command1,则窗体上显示的第一行是: ,第二行是: ,第三行是: 。Option ExplicitPrivate Sub Command1_Click() Dim s As String, t As String Dim k As Integer, m As Integer s = BASICY k = 1: m = k For k = 1 To Len(s) Step m + 1 t = t & Chr(Asc(Mid(s, m, 1) + k) k = k + 1 If Mid(s, k, 1) = Y Then Exit For m = m + k Print t Next k Print mEnd SubKey: C CW 8题型三: 数组 1执行下面的程序,在窗体上显示的输出结果的第二行是: ,第五行是: ,第六行是: 。Option ExplicitPrivate Sub Form_Click() Dim a(3, 3) As Integer, i As Integer, j As Integer Dim k As Integer For i = 1 To 3 For j = 1 To 3 a(i, j) = (i - 1) * 3 + j Print a(i, j); Next j Print Next i Print k = (i - 1) * 3 For i = 1 To 3 For j = 1 To 3 a(i, j) = k k = k - 1 Print a(i, j); Next j Print Next iEnd SubKey: 4 5 6 9 8 7 6 5 42运行下面的程序,从键盘上输入3,程序运行结束后,A(1,1)的值是 ,A(2,2)的值是 , A(2,3)的值是 。Private Sub Form_Click() Dim I As Integer, J As Integer, K As Integer Dim A() As Integer, N As Integer N = InputBox(输入N) ReDim A(N, N) For I = 1 To N For J = 1 To N K = K + 1 A(I, J) = K + 10 Next J Next I Call Sub1(A, N) Print A(1, 1); A(2, 2); A(2, 3)End SubPrivate Sub Sub1(A() As Integer, N As Integer) Dim I As Integer, J As Integer Dim T As Integer, K As Integer K = N + 1 For I = 1 To Int(N / 2) For J = 1 To N - 1 T = A(I, J) A(I, J) = A(K - J, I) A(K - J, I) = A(K - I, K - J) A(K = I, N + 1 - J) = A(J, K - 1) A(J, K - 1) = T Next J Next IEnd SubKey: 17 15 12题型四: 过程(含嵌套调用、静态变量、参数传递及变量作用域、递归等,并经常结合循环和字符函数以及数组,是比较综合的一类考题,通常至少有两道考题。) 递归:Option Base 1Private Sub Command1_Click() Dim a a = Array(1, 1, 1, 1) Call sub1(a, 4) For i = 1 To 4 Print a(i) Next iEnd SubPrivate Sub sub1(x, n) If n 1 Then For i = 1 To n x(n) = x(n) + 1 Call sub1(x, n - 1) Next i End IfEnd SubKey:1 25135当然,以上分类只是大致归类,并没有完全的界限,但是大家复习时注意从这几个方面下手,最后,等语法知识点熟练了以后,阅读程序写结果纯粹考察的就是细心!请注意平时训练时,稿纸书写中间计算步骤的清晰!另外补充阅读程序中应注意的两个事项:一是加深对For循环程序的理解;(1)务必熟悉For循环执行流程(请查书,此处不多说) (2)循环体中循环变量的改变影响循环次数,而初值、终值和步长的改变不会影响循环次数 (3)Next语句包括两层含义,循环变量自增步长及再将其与终值作比较,以便决定循环是否继续。因此,如果循环是从next语句跳出,而不是从循环体中使用exit for跳出,则循环变量值一般将超出终值。二是掌握参数传递与过程调用规则。VB过程中使用的参数分为实参和形参,简单的讲,在过程定义中给定的参数是形参,而在过程调用语句中给定的参数是实参。当调用一个有参数的过程时,形参和实参逐一匹配传递,根据传递方式不同,可分为按值和按地址两种。对参数传递方式的正确判别是过程学习中的一个难点,也是等级考试中的一个考点。(一)按值与按地址方式的内涵按值传递参数,实质上是将实参的值复制一份给形参,因此形参获得的是实参的副本,当过程执行中对形参进行改变,并不会影响实参本身;按地址传递参数,实质上是将实参变量的地址传递给形参,因此形参与实参将指向同一内存单元,当过程执行中形参发生改变时,对应实参也将跟着改变。(二)参数传递方式判别方法判断参数传递方式,不能单纯的看过程定义中形参前的修饰限定词有无ByVal。参数传递到底采用何种方式,不仅取决于过程定义,还取决于过程调用,即与对应实参的具体形式也有很大关系。因此,应该从以下三个方面综合考虑:1. 形参是否为数组或者控件 是 传地址2. 形参前是否有ByVal修饰 是 传值3. 对应实参是否为表达式或者值 是 传值4 上述三个条件都不满足, 传地址具体判别方法,请见如下判别流程图。(三)不同传递方式对参数类型的要求若参数按地址传递,则VB要求实参的数据类型与形参的数据类型完全一致;若参数按值传递,则实参数据类型不要求与形参完全一致,但是必须能够由VB默认转化。(四)解题应用l 以江苏省计算机等级考试2001年春季的一道考题为例:在应用程序中用“Private Function Fun(X As Integer, Y As Single)”定义了函数Fun. 调用函数Fun的过程中的变量I,J均定义为 Integer型,能正确引用函数Fun的是_Fun(I,J)Call Fun(I,3.65)Fun(3.14,234)Fun(“245”, “231.5”)A.B.C.D.分析:1. 根据判别流程图,对每个引用做如下判断:对于Fun(I,J),实参I与形参X匹配,由于形参X不是数组并且无ByVal修饰,而实参I为变量,不是值或表达式,因此该参数将按照地址传递;同理,可以推断实参J与形参Y也将按照地址传递。根据VB要求,按照地址传递的实参和形参数据类型必须完全一致,而根据题意,J为Integer,Y为Single,因此不正确;对于Call Fun(I,3.65),I与X按地址传递;而实参3.65为值,与形参Y匹配时,将按值传递,因此正确;对于Fun(3.14,234),虽然实参3.14对应的形参X为Integer,实参234对应的形参Y为Single,但由于它们都是按照值传递,因此3.14将转化为3,而234可以直接赋给Y,因此正确;对于Fun(“245”, “231.5”),由于实参“245”和“231.5”均为字符串值,因此其与对应形参X、Y将按照值传递,而数字字符串是可以转化为数值类型的,因此正确。综上所述,正确答案为B。2. 对于该题,由于要求是“能正确引用函数Fun的是”,因此,虽带括号,并且无Call引导,但却可以通过诸如:Print Fun(3.14,234)加以引用。若改为:“能正确调用函数Fun的语句是”,则此时不可选,只能选。l 以江苏省计算机等级考试2002年春季的一道考题为例:调用由语句Private Sub Convent(Y As Integer)定义的Sub过程时,以下不是按值传递的语句_。A.Call Convent(X)B.Call Convent(X*1)C.Convent(X)D.Convent X分析:1. 对于A、B选项,实参分别为(X)和X*1,均为表达式,因此A、B选项中的实参将按照值传递;对于D选项,实参X未用括号引导,此时不可加Call,因此语句正确,同时,根据判别流程图,实参X与形参Y必按地址传递。分析至此,对于该题为单选题,已经可以断定答案是D。2. 现在考虑C选项语句Convent(X)带括号,但却无Call引导,因此直觉上似乎不能正确执行。但若我们在VB代码编辑器中输入该句,回车后,该语句自动调整为:Convent (X),注意此时Convent与(X)之间有一个空格,因此该句中的括号是用于X,而不是用于Convent,所以尽管无Call引导但其却能够执行,此时实参为(X),因此参数将按值传递。所以对于Call Convent(X)和Convent(X),虽然都能执行,并非是由于Convent(X)前可以省略Call,而在于它们的实参分别是X和(X),其传递参数的方式自然就不同。l 阅读程序写出运行结果:Private Sub Form_Click() Dim x As Integer, y As Integer, z As Integer x = 1: y = 2: z = 3 Call sub1(x, y, y) Print x,y,zEnd SubPrivate Sub sub1(x As Integer, y As Integer, ByVal z As Integer)Dim I As Integer x = 3 * z: y = 2 * z: z = x + y Print x, y, zEnd Sub分析:根据判别流程图知,第一、二参数按地址传递,第三参数按值传递。因此第一、二形参与对应实参指向同一内存单元,而第三形参与对应实参值相同,但却指向不同内存单元。因此,可以作出如下参数传递与过程调用示意图。虽然实参和形参均为x、y、z,但是请注意区分,它们具有不同的作用域。经分析,最后答案为:6 4 106 4 3l 关于过程嵌套调用题目的分析分析如下题目运行结果:dim A as integer private sub form_click() dim B as integer dim D as integer A=1:B=2 D=fun(A,fun(A,B) debug.print A,B,D end sub private function fun(K as integer,N as integer)as integer debug.print K,N k=N+A+K N=K+A+N fun=K+N debug.print fun End function答:首先执行:fun(A,B) A为1,B为2由于实在参数是:A,B 对应形式参数是K,N,由于是按地址传递,因此A和K指向同一内存单元,B和N指向同一内存单元。因此执行deug.print K,N 输出第一行:1 2执行k=N+A+K 即:k=2+1+1=4 注意此时A也变为4;执行N=K+A+N 即:N=4+4+2=10 注意此时B也变为10执行fun=K+N 即:fun=14执行 debug.print 输出第二行:14再执行:fun(A,fun() A为4,fun()为14同上分析,执行deug.print K,N 输出第三行:4 14执行k=N+A+K 即:k=14+4+4=22 注意此时A也变为22;执行N=K+A+N 即:N=22+22+14=58 执行fun=K+N 即:fun=80执行 debug.print 输出第四行:802、读懂题目中的程序是完成补充代码题的重点!学生最容易犯的错误是:凭感觉乱猜代码,解题中一定要冷静读懂程序,其最重要的是抓住逻辑主线,按照步骤阅读程序。具体方法:解上机改错题的一个利器三步逐过程法(一)改错题解法现状许多同学为了掌握解决改错题的技巧和方法,一方面着重熟练VB集成开发环境中调试工具的使用,另一方面归纳总结了近几年来二级考试改错题中涉及到的错误类型。这些对于提高应试能力无疑是有帮助的。但是在实际考试中,他们也发现,解答改错题的方法沦为逐一去猜测错误类型,然后按模式来套解。毫无疑问,这一解法效率慢,正确率不高,而且即便正确解答出来,也有一种侥幸的感觉。之所以如此,根本的原因在于没有抓住具体题目算法逻辑特征这一主线,因而单纯的总结错误类型的意义也就不大了。为此,可以采用一种比较完善的改错题解法“三步逐过程法”。(二)“三步逐过程法”解法说明“三步逐过程法”核心是把握题目算法逻辑特征,按照“从整体到部分,再由部分到整体”的思路排查错误,调试程序,具体步骤可分为三步:步骤一:把握题意,泛读程序,分析程序组成和各过程的功能;步骤二:从通用过程入手, 逐过程输入并逐过程调试; 步骤三:输入并调试事件过程,完成对各通用过程调用和组装。下面,我们结合一道改错题来具体说明每个步骤中的方法和技巧。(三)“三步逐过程法”解改错题举例以江苏省二级VB上机考试中的一道考题为例。已知下面程序的功能是找出2000以内这样的正整数N: 它的不同值的因子(包括1和N在内)之和是一个素数. 例如: 16: 1+2+4+8+16=31(下图为程序正确执行时的画面).含有错误的源程序如下:Option ExplicitOption Base 1Private Sub Command1_Click() Dim I As Integer, K As Integer, Sum As Integer Sum = 0 For I = 2 To 2000 Call Fctor(I, Sum) If Prime(Sum) Then K = K + 1 Text1 = Text1.Text & Str(I) & If K Mod 5 = 0 Then Text1 = Text1 & Chr(13) & Chr(10) End If Next IEnd SubPrivate Sub Fctor(N As Integer, S As Integer) Dim I As Integer, J As Integer Do While I 0.00001 i = i + 1 t = t / i e = e + t Loop Print 计算了; i; 项目和是:; e Print Exp(1) 与上句输出值进行对比以证明算法的正确性End Sub解题技巧1) 由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。设定循环变量和通项变量,注意各变量的初值;2) 分解通项表达式中各因子,并分别将各因子用循环变量表示;3) 如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;4) 根据步骤1、2、3,写出通项表达式;5) 根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。通常是用:if 通项表达式10(-N) then exit do ,注意这句话一般需放在累加或者连乘式之前。实例说明以2002年春上机试卷06编程题为例根据X值计算:n1,2,要求:n项绝对值小于等于10-6为止。1、 由于循环次数不确定,因此确定用Do循环结构并定义循环变量用n表示(初值1);用户输入的值用x表示;通项用dblCos表示;累加值用sum表示,初值为0;2、 分解通项式的组成可以分解为三部分: 可以表示为:(1)(n+1) 可以表示为:x(2*(n-1) 比较复杂,难以直接表示3、 由于步骤2中 复杂, 此时考虑使用过程。于是定义过程,输入值是n,返回值是 于是有:private Function comp(n as long)as longdim I as longdim result as longresult=1 此处注意,由于是连乘,初值为1for I=1 to 2*(n-1)result=result*Inext Icomp=resultEnd Function注意:由于是参数按地址传递,因此对于本题,实参的值不能在过程中被改变!(也是改错题常考的地方!)4、 根据步骤1、2、3,写出通项dblCos的表达式:dblCos=(1)(n+1)* x(2*(n-1)/comp(n)5、 根据精度要求知:If abs(dblCos)=10(-6) then exit do最后程序为:Private Sub Command1_Click() Dim n As Long, dblCos As Double, x As Double x = Val(Text1.Text) n = 1 Do dblCos = (-1) (n + 1) * x (2 * (n - 1) / comp(n) If Abs(dblCos) max Then max = s If s min Then min = s aver = aver + s Next i aver = aver / n Print max=; max; min=; min; aver=; averEnd Sub解题技巧最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。2、实战练习 1) 补充代码(2000春二(9)本程序的功能是在二维数组中查找鞍点元素,即该元素在所在行中为最大,且在所在列中为最小。在一个数组中可能存在,也可能不存在这样的元素。数组各元素的值从文件data.txt中读取。Private Sub Form_Click()Dim a(3,3) As Integer,i As Integer,j As IntegerDim maxvr As Integer,col As Integer, As IntegerOpen data.txt For Input As #1For i=1 To 3For j=1 To 3Input #1,a(i,j)Print a(i,j);Next jPrintNext iFor i=1 To 3maxvr= (1) col=1For j=2 To 3If maxvra(j,col) Then (3) Next jIf j3 Then Print a(;i;,;col;)=;a(i,col)=1End If If (4) Then Print 鞍点元素不存在Next iEnd Sub2) 编程题(2002秋上机试卷05)随机生成所有数组元素都是两位数的33的二维数组,找出其中不同行、不同列的三个数组元素的乘积最大的一组,并将这三个元素显示在图片框中。 (三)素数1、算法说明 素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。 判别某数m是否是素数的经典算法是: 对于m,从I2,3,4,m1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。 Private Function sushu(ByVal n As Long) As Boolean Dim i As Long For i = 2 To n - 1 If (n Mod i) = 0 Then Exit For Next I If I=n then sushu=True End Function 很显然,实际上,我们可以改进上面 For i = 2 To n 1 为: For i = 2 To int(sqr(m) 这样可以很好的提高效率。 以上判断是否为素数的代码务必识记! 应用举例 求100200之内素数。 Private Sub Command1_Click() Dim j As Integer For j = 100 To 200 If sushu(j) = True Then Print j End If Next j End Sub 解题技巧 识记判断素数的算法过程,根据题意,灵活调用! 实例说明 编程题(2002年春上机试卷04) 找出10000以内所有可以表示为两个平方数和的素数。 思路: 首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shuI均为平方数,则说明其可以表示为两个平方数之和。) 判断数I是否为平方数的方法:sqr(i)=int(sqr(i) Private Sub Command1_Click() Dim j As Integer Dim m As Long, n As Long For j = 2 To 10000 If sushu(j) = True Then If pf(j, m, n) = True Then List1.AddItem j & = & m & + & n End If End If Next j End Sub Private Function pf(ByVal shu As Long, m As Long, n As Long) As Boolean Dim i As Long For i = 1 To shu - 1 If (Sqr(i) = Int(Sqr(i) And (Sqr(shu - i) = Int(Sqr(shu - i) Then pf = True m = i n = shu - i Exit Function End If Next End Function 2、实战练习 1) 补充代码(2002春二(7) 下列程序的功能是:查找四位正整数中的超级素数。超级素数的定义为:当一个素数从低位到高位依次去掉一位数后剩下的数仍然是素数,则此数为超级素数。如数2333、233、23、2均为素数,所以2333为超级素数。 Option Explicit Private Sub Command1_Click() Dim I As Integer, flg As Boolean For I = 1001 To 9999 Step 2 Call sup_prime(I, flg) If flg Then Debug.Print I End If Next I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论