资源简介 专题四 自定义函数及VB访问数据库【考纲标准】考试内容考试要求1.过程与自定义函数c2.递归算法a3.VB 访问 Access 数据库①通过 ADO 对象连接数据库②通过 RecordSet 对象获取数据表中的数据a1.(2017·4月浙江选考)小王编写了一个依据成绩计算名次的VB程序,成绩为0到100之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数(该分数的个数不为0)对应的名次,分数相同时名次并列。最高分为第1名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组A存放每个分数对应的个数,数组B存放每个分数对应的名次。例如,下表中最高分100有2个,并列第1名,则分数96的名次为分数100的名次加上分数100的个数,即第3名。分数100999897969594…0个数(A数组)2000103…0名次(B数组)134…程序运行时,学生数据显示在列表框List1中,单击“计算”按钮Command1,计算结果显示在列表框List2中,程序运行界面如图所示。实现上述功能的VB程序如下,请回答下列问题:(1)如表所示,若分数93的个数为2,则该分数对应的名次为________。(2)请在划线处填入合适的代码。Dim sName(1 To 50) As String ′存放学生姓名Dim sScore(1 To 50) As Integer ′存放学生分数Dim recCount As Integer ′存放学生人数Private Sub Form_Load()′本过程从数据库中读取学生数据,存储在相应的变量中,并在List1中显示′代码略End Sub′整数转换成长度固定的字符串Function ads(x As Integer, n As Integer) As String Dim sx As String, nx As Integer, i As Integer sx = Str(x): nx = Len(sx) For i = 1 To n - nxsx =" " + sx Next i ____①____End FunctionPrivate Sub Command1_Click() Dim A(0 To 100) As Integer ′存放每个分数的个数 Dim B(0 To 100) As Integer ′存放每个分数的名次 Dim mc As Integer, score As Integer, i As Integer For i = 0 To 100A(i) = 0 Next i For i = 1 To recCount ′计算每个分数的个数____②____ Next i mc = 1 For i = 100 To 0 Step -1 ′计算每个分数的名次If A(i) <> 0 Then B(i) = mc ____③____End If Next i List2.Clear List2.AddItem “ 姓名 分数 名次 ” List2.AddItem “ --------- ” For i = 1 To recCountscore = sScore(i)mc = B(sScore(i))List2.AddItem sName(i) + ads(score, 5) +“第” + ads(mc, 3) +“名” Next iEnd Sub解析 (1)本题考查学生对题干描述的计算名次算法的理解。表中有3个并列第4名(94分),93分应为第7名。(2)① 该程序段为自定义函数,功能是将整数转化为固定长度的字符串,Function函数通过函数名返回一个值,这个值是在过程的语句中赋给函数名的,即ads=sx。②注意观察注释语句,数组sScore存放学生分数,数组A存放每个分数的个数,该循环为计算每个分数的个数,即A(sScore(i))= A(sScore(i))+1。③该循环计算每个分数的名次,从最高分100分每次递减1分计算。数组B(i)存放每个分数的名次,考虑每个分数的个数A(i),每个分数的名次为mc=mc+ A(i)或mc=B(i)+ A(i)。答案 (1)7(2)①ads=sx②A(sScore(i))=A(sScore(i))+1③mc=mc+A(i)或mc=B(i)+A(i)2.(2016·10月浙江选考)小王与小李合作编写一个成绩统计的VB程序:小王编写一个过程,该过程从数据库读取某一指定科目的相关数据,存储在数组a中:小李编写一个过程,该过程依据数组a中的相关数据统计各班级平均分。小王与小李约定的数组a各元素含义如表所示。程序功能如下:在文本框Text1中输入科目名称,单击“读数据库”按钮Command1,程序从数据库读取数据;单击“开始统计”按钮Command2,程序进行统计处理,结果输出在列表框List1中。程序运行界面如图所示。数组元素数组元素的含义a(1)存储班级数na(2)从a(2)到a(n+1)依次存储第1,第2,…,第n个班级的人数…a(n+1)a(n+2)从a(n+2)开始依次存储第1班每个学生的单科成绩,第2班每个学生的单科成绩,…第n班每个学生的单科成绩……实现上述功能的VB程序如下,请回答下列问题:(1)根据程序运行界面中的数据及数组a各元素的含义进行分析,数组元素a(5)的值为____________(填写数值)。(2)分析程序,可知数据库的文件名为________。(3)请在划线处填入合适的代码。Dim a(1 To 600) As Integer ′数组大小满足处理要求Private Sub Command1-Click() ′本过程由小王完成,从数据库读取指定科目的各相关数据,存储在数组a中 Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset conn.ConnectionString=”provider=Microsoft.ACE.OLEDB.12.0;data source=”+”Score.accdb” conn.Open Set rs.ActiveConnection=conn ′本过程的其他语句略End SubPrivate Sub Command2-Click() ′本过程由小李完成,依据数组a中的相关数据统计各班级平均分 Dim i As Integer,j As Integer,n As Integer Dim p As integer,sum As Integer,aver As Single ____①____ p=n+2 For i=1 To n sum=0 For j=1 To a(i+1) ____②____ p=p+1 Next j aver=sum/a(i+1) List1.AddItem Str(i)+” ”+Str(a(i+1))+” ”+Str(aver) Next iEnd Sub解析 (1)根据题中表格中数组a各元素的含义,a(2)到a(n-1)分别存储从1班到(n-1)班的各班人数,所以数组元素a(5)存储的是4班的人数,从图中可以看到4班人数为“33”。(2)考查VB中的ADO访问数据库,从程序中:”data soure=”+ ”Score.accdb”可判断数据库文件名为”Score.accdb”。(3)分析本过程程序功能为“统计各班级平均分”,程序结构为双重循环,外层循环控制选择第i班,待内层循环求得本班成绩和之后求平均分(aver=sum/a(i+1)),内层循环累加本班成绩和。从变量p初值为p=n+2和循环中”p=p+1”,结合题目表格中给出的从a(n+2)开始依次存储每个班学生的成绩,可以判断程序中变量n是班级数,a(p)可以依次读取每个学生的成绩。所以①处为”n=a(1)”(表格中说明a(1)存储班级数),②处为累加各班每个学生的成绩到变量sum中, 即“sum=sum+a(p)”。答案 (1)33 (2)Score.accdb (3)①n=a(1) ②sum=sum+a(p)一、过程与自定义函数1.依据结构化程序设计的思想,当需要解决的问题规模较大、复杂时,可以按功能细分成一个个小的功能模块,这样的小程序段,在VB中被称为过程; 过程是一段能完成一个或多个特定功能的独立的程序段,并可以被其他过程调用。程序中多处重复出现处理相同功能的程序段可以通过过程简化。2.在VB中,过程有两种,一种是Sub子过程,一种是Function函数。两者的区别在于:Sub子过程只执行程序而不返回值,而Function函数执行程序后会返回值。3.事件处理过程基本结构Sub事件处理过程名(参数表)语句块End Sub其中,事件处理过程名必须符合下面的规则:对象名_事件的标准名。VB的一些常用对象上的常见事件的标准名有:窗体Form: Form_Load、Form_Unload文本框Text:Text1_Click、Text1_KeyPress 命令按钮Command:Command1_Click、Command1_DblClick4.自定义函数基本结构Function函数名(参数表)As 类型名语句块(至少有一个语句是: 函数名=表达式)End Function函数:函数是类似于过程的另一个程序模块,不同之处是函数执行完成后,函数的计算结果被送到函数的调用点上,供程序的后继部分继续进行处理。【例1】 某日期加密授权码生成方法描述如下:(1)授权码由10位字符组成,前8位为日期的密文,后2位为验证码;(2)取日期的第1位字符,若该字符第一次出现,则直接取其对应加密字符,否则取下一个不重复的加密字符。按此操作,依次取出该日期余下各位对应的加密字符;(3)求出所有日期字符数值的和,将和除16取余得到一位验证码字符;若和不小于16,则将和除16取整加1得到另一位验证码字符,否则另一位验证码字符为“X”。取出验证码重复时,处理规则与(2)相同。加密(验证码)字符对应表如下:值(十进制)0123456789101112131415加密(验证码)字符KnGjLtWb0aPHZqYc小明设计了一个生成8位日期(YYYYMMDD格式)授权码的VB程序。程序功能如下:在文本框Text1中输入一个8位有效日期,单击“生成授权码”按钮Command1,在标签Label2中显示出该日期的授权码。运行效果如图所示。(1)若输入的日期是“20181213”,则该授权码的验证码字符是______________________。(2)请在划线处填入合适代码。Dim f(0 To 15) As IntegerConst Code = ”KnGjLtWb0aPHZqYc”Private Sub Command1_Click()Dim rq As String, sq As String, c As Integer, i As Integer, d As IntegerFor i = 0 To 15f(i) = 0Next irq = Text1.Textsq = ” ”: d = 0If Len(rq) <> 8 ThenLabe12.Caption = ”请输入8位日期!”ElseFor i = 1 To 8c = Val(Mid(rq, i, 1))d = d + csq = ____①____Next iIf d >= 16 Thenyz = GetChar(d Mod 16) + GetChar(d '16 + 1)Elseyz = ____②____End IfLabel2.Caption = sq + yzEnd IfEnd SubFunction GetChar(x As Integer) As String ′获取不重复的加密字符Dim flag As Booleanflag = FalseDo While flag = Falsef(x) = f(x) + 1If f(x) = 1 Then ____③____f(x) = f(x) + 1flag = TrueElsex = (x + 1) Mod 10 End IfLoopEnd Function解析 若输入的日期是“20181213”,前4位互不重复,分别取出各自位置上的字符,后4位与前3位重复,对应的第4、5、6、7上的字符。自定义函数GetChar是获取数x在Code中获取不重复的加密字符,数组f是表示数字0-15出现的次数,初始值为0,下标为x的数组先加1再判断是否等于1,若等于1,表示该数字没有出现过,找到对应的加密字符。变量sp表示对日期的加密,每一位上的数字取出不重复的加密字符,并进行正向连接。当和d小于16时,有d Mod 16取出加密字符和“X”两位验证码。答案 (1)GKn0jLtWba (2)①GetChar(c) + sq②GetChar(d Mod 16) + ”X” ③GetChar = Mid(Code, x + 1, 1)【变式训练1】 质数又称素数,是指除了1和本身之外不再有其他因数的数。如果两个质数的差为2,则这两个质数称为孪生质数对;编写VB程序,功能:单击“显示孪生质数对”按钮Command1,在列表框List1中显示100 以内的所有孪生质数对(运行效果如图所示)。实现上述功能的VB代码如下。请在划线处填入合适代码。Dim a(1 To 50) As IntegerPrivate Sub Command1_Click()Dim i As Integerk = 0: i = 3Do While i <= 100If ____①____Then k = k + 1:a(k) = ii = i + 2LoopFor i = 2 To kIf____②____Then List1.AddItem Str(a(i - 1)) + ”和” + Str(a(i))End IfNext iEnd SubFunction prime(x As Integer) As Boolean ′判断是否是质数 prime = TrueFor i = 2 To Int(Sqr(x)) If x Mod i = 0 Then ______③____Exit For End IfNext iEnd Function解析 自定义prime的功能是判断数x是否是质数,如果是返回True,否则返回False,且函数值必须通过函数名返回,因此当条件x Mod i = 0成立时,函数值为False。程序的功能先找出100以内的质数,把他们分别存储在a再找出相邻两个差为2的质数对。答案 ①prime(i) ②a(i)-a(i - 1))=2 ③prime = False二、递归算法绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言中习惯用递归来实现循环。【例2】 以下VB程序段:Private Sub Command1_Click()Dim n As Integer, f As Integern = Val(Text1.Text)f = fac(n)Label2.Caption = Str(f)End SubFunction fac(n As Integer) As IntegerIf n = 1 Then fac = 1 Else fac = n * fac(n - 1)End Function程序运行时,若在文本框Text1中输入8,下列说法正确的是( )A.程序运行出错 B.控件Label2中显示 1C.控件Label2中显示 8D.控件Label2中显示40320解析 本题考核的知识点递归的算法思想。在文本框Text1中输入8,将返回8*f(7),f(7)=7*f(6),f(6)=6*f(5),f(5)=5*f(4),f(4)=4*f(3),f(3)=3*f(2),f(2)=2*1,将f(2)的结果代回,f(8)=8!=40320,但函数返回值为整数,超出了整数的范围,将出现溢出的报错。答案 A【变式训练2】 有如下程序:Private Function f(x As Single, n As Integer) As SingleIf n = 0 Thenf = 1Else If n Mod 2 = 1 Then f = x * f(x, n 2) Else f = f(x, n 2) x End IfEnd IfEnd FunctionPrivate Sub Command1_Click()Label1.Caption = Str(f(4, 6))End Sub程序运行时,单击按钮Command1,标签Label1显示的内容是( )A.1 B.4 C.27 D.64解析 在自定义函数中,4和6作为参数,分别传送赋值给自定义函数中的x和n。f(4, 6)= f(x, n 2) x=f(4,3) 4, f(4,3)[BT= x * f(x, n 2) 4=4*f(4,1) 4,f(4,1)= x * f(x, n 2)=4*f(4,0), 4*f(4,0)=4。答案 B三、VB 访问 Access 数据库1.通过ADO对象中的Connection对象连接数据库,步骤如下(右边是对应的代码):2.通过ADO对象中的Recordset对象读取数据库表中记录,步骤如下(右边是对应的代码): 【例3】 有一Access数据库“school.accdb”存放在f:2015Imt[JP]vb文件夹中,其中的“student”数据表用来存储学生的基本情况信息,包括学号(num)、姓名(name)、性别(sex)、分数(score),括号内的为对应字段名。下列VB程序用来实现根据学号查询并显示学生信息,运行界面如下图所示。在文本框Text1中输入学生的学号,单击“查询”,在文本框Text2、Text3、Text4中分别显示学生姓名、性别、分数。为了实现上述目标,在划线处填入合适的语句或表达式:Private Sub Command1_Click()Dim adocn As New adodb.ConnectionDim adors As New adodb.RecordsetDim str2 As String,str1 As Stringstr1=”Provider-Microsoft.ACE.OLEDB,12.0;data source=f:2015Imtvb ____①____”adocn.Open str1str2=”select * from students where num=”+Text1.Textadors.Open str2,adocn,adOpenDynamic,adLockOptimisticIf adors,EOF=Ture Then MsgBox”你输入的学号不存在”Else Text2.Text=adors.Fields(”name”).Value Text3.Text=adors.Fields(”sex”).Value ____②____End Ifadors:Closeadocn.CloseEnd Sub解析 本题主要考查数据库的访问方法。划线①处代码设置连接数据库的字符串,“data source”是指被连接的数据库文件。划线②处代码是在文本框Text4中输出分数。答案 ①school.accdb②Text4.Text=adors.Fields(“score”).Value【例4】 小王编写了一个VB程序,用于读取某数据库中的数据,部分代码如下:Dim conn As New ADODB.ConnectionDim rs As New ADODB.Recordsetconn.ConnectionString = ”Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & ”[ML)]ydata.accdb”Set rs.ActiveConnection = connrs.Open ”select * from keti”n=0Do While Not rs.EOF n=n+1 rs.MoveNextLoop下列对于以上代码的理解正确的有( )①连接的数据库文件名是“mydata”②“ConnectionString”是conn对象的属性值③查询的数据表名称是“keti”④程序运行后,变量n的值表示该数据表中记录的总数⑤省略语句“rs.MoveNext”,程序也可以正常运行A.①②③④ B.②③④C.③④⑤ D.③④解析 conn和rs是数据常见的两个对象,ConnectionString是conn的属性,在该属性中包含连接的数据库名称mydata.accdb的信息。语句rs.Open ”select * from keti”中,open是rs的方法,在该语句中,包含了查询的数据表名称keti信息。变量n表示记录条数,每读一条,n增加1,同理rs.MoveNext语句不可以少,表示读取一条后,指针向下移动,否则会形成死循环。答案 D【变式训练3】 用 VB 程序读取数据库中数据的部分代码如下:Dim conn As New ADODB.ConnectionDim rs As New ADODB.RecordsetDim cnt As IntegerPrivate Sub Form_Load()conn.ConnectionString=”Provider=Microsoft.ACE.OLEDB.12.0;DataSource=” &App.Path& ”[99]est.accdb”conn.OpenSet rs.ActiveConnection = conn rs.Open ”select * from 学生信息”cnt = 0Do While Not rs.EOFcnt = cnt + 1List1.AddItem rs.Fields(”姓名”)rs.MoveNextLoopEnd Sub下列描述中正确的是( )A.从表中读取的总记录数为:cntB.连接的数据库文件名:testC.程序中读取记录的表名是:test.accdbD.List1 中显示的内容是所有记录中“学生信息”字段的值解析 读取的数据库名称为test.accdb,数据表名称为学生信息,每读取一条记录,cnt的值增加一条,因此cnt为记录总数。语句List1.AddItem rs.Fields(“姓名”)表示,只显示姓名字段的值。答案 A一、选择题1.有如下VB程序:Private Sub Command1_Click() Dim a As Integer, b As Integer, s As Integera = Val(Text1.Text): b = Val(text2.Text)Text3.text=f(a,b)End SubFunction f(x As Integer, y As Integer) As String Dim s As Integer, t As Integer, str As Stringstr = ”0123456789”s = 1: t = 1If x > 0 Then s = s + 1If x > y Then t = s + tElseIf x = y Then t = 6Else t = 5End Iff = Mid(str,s+1,1)+Mid(str,t+1,1)End Function为使运行程序Text3显示的内容是15,则文本框Text1和Text2中依次输入的数字分别为( )A.6和5 B.5和6C.-6和5 D.-3和-4解析 将4个选项分别作为参数代入到自定义函数。在调用自定义函数f(6,5)中,s=2,t=3,函数的返回值为“23”,自定义函数f(5,6)中,s=2,t=5,函数的返回值为“25”。 自定义函数f(-6,5)中,s=1,t=5,函数的返回值为“15”。自定义函数f(-3,-4)中,s=1,t=1,函数的返回值为“12”。答案 C2.有如下VB程序段:Private Sub Command1_Click() Text1.Text = ”2012 Hero” Text2.Text = f(Text1.Text)End SubFunction f(s As String) As String Dim i As Integer, c As String, s As String For i = 1 To Len(s)c = Mid(s, i, 1)If c >= ”a” And c <= ”z” Then f = f + c Next iEnd Function该程序段运行后,文本框Text2中显示的内容是( )A.2012 B.Hero C.ero D.2012 H解析 自定义函数的功能是只将字符串s中的小写连接起来。答案 C3.有如下VB程序:Private Sub Command1_Click()Dim n As Integer, x As Stringn = Val(Text1.Text)x = f(n)Label1.Caption = xEnd SubFunction f(n As Integer) As StringDim r As IntegerIf n <> 0 Thenr = n Mod 2n = n 2If r = 0 Thenf = f(n) + ”0”Elsef = f(n) + ”1”End IfElsef = ”0”End IfEnd FunctionEnd Function程序运行后,在Text1文本框中输入35,则在Label1上显示的内容是( )A.0100111 B.0100011C.1100010 D.1110010解析 这是一个递归算法,自定义函数的功能是将整数n转换成二进制数,当n=0时不再重复计算,因此第1个字符是0。答案 B4.有如下 VB 程序段:Dim a(1 To 10) As IntegerSub swap(a As Integer, b As Integer)t = a: a = b: b = tEnd SubPrivate Sub Command1_Click()Dim min As Integer, n As Integer, i As Integer, j As Integern = 10For i = 1 To n - 1If i Mod 2 = 1 Then min = (i + 1) / 2If i Mod 2 = 0 Then min = n + 1 - i / 2For j = (3 + i) '2 To n - i '2If a(j) < a(min) Then min = jNext jIf i Mod 2 = 1 Then Call swap(a((i + 1) / 2), a(min))If i Mod 2 = 0 Then Call swap(a(n + 1 - i / 2), a(min))Next iEnd Sub数组元素 a(1)~a(10)的初始值依次为 26、88、60、10、31、51、64、52、74、43,执行该程序,单击命令按钮 Command1 后,a(1)~a(10)的值变为( )A.10、31、51、60、74、88、64、52、43、26B.88、64、52、43、26、10、31、51、60、74C.10、74、60、52、31、51、88、64、43、26D.26、31、60、51、88、52、64、43、74、10解析 这个题目考核过程的概念及应用。过程swap的作用是交换a和b的值。主程序中,当i是奇数时,最小值在前面,并通过选择排序的思想,找出最小值,换到前面。当是偶数时,最小值在后面的对称数,并通过选择排序的思想,找出最小值,换到后面,因此实现左右交替上升排序。答案 A5.通过 ADO 的Recordset Recordset对象实例rs打开的记录,如下图所示。序号书名书号作者售价1解忧杂货店ISBN9787544270878东野圭吾39.52摆渡人ISBN9787550013247克莱儿·麦克福尔363白夜行ISBN9787544258609东野圭吾39.54追风筝的人ISBN9787208061644卡勒德·胡赛尼295这就是二十四节气ISBN9787511026118高春香,邵敏100当前是第4条记录,要用 Fields集合返回第2个字段的值,以下代码正确的是( )A.a(4)=rs.Fields(2)B.a(4)=rs.Fields(1)C.a(4)=rs.Fields(书名)D.a(4)=rs.Fields(”书号”)解析 第1个字段的下标为0,第2个字段的下标就为1,选项C,对书名要加引号。答案 B6.某个VB应用程序中使用如下代码读取数据库中的信息: Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim n as Integer Private Sub Form_Load( ) conn.ConnectionString =”Provider=Microsoft.Ace.OLEDB.12.0;data source =”+App.Path+”[DS)]ata[DS)]ata.accdb”conn.Open sql=”select * from student” Set rs.ActiveConnection=conn rs.Open sql n=0 Do while Not rs.EOF List1.AddItem rs(”name”) n=n+1 rs.MoveNext Loop End Sub 运行上述程序,以下说法不正确的是( )A.当前读取的数据库文件是Data文件夹中的data.accdb文件 B.数据库中存在一个名为student的数据表 C.List1列表框中将显示指定的数据表中所有记录name字段的值 D.窗体加载完成后,读取的数据表中总记录数为n-1 解析 从conn对象的ConnectionString属于值来看,连接的数据库名称是data.accdb,查询的数据表名称为student。列表框中只显示name字段的值。n表示记录的数量,初值为0,每读取一条,记录增加一条,因此总数为n。答案 D二、非选择题7.如果一个整数是另一个整数的平方,则称该数是“完全平方数”。下列VB自定义函数用于判断一个数是否是完全平方数。Function ok(t As Integer) As BooleanDim k As Integerok=False ____①____ If k*k=t Then ____②____End Function请在程序划线处填入合适的代码。解析 该自定义函数是判断t是否是完全平方数,如果是,通过函数名ok返回函数的值True,否则返回False。答案 ①k=Int(Sqr(t)) ②ok=True8.下列VB程序用于求2个正整数(均小于10000)的最大公约数:Private Sub Command1_Click() Dim x As Integer, y As Integer, z As Integer x=Val(Text1.Text): y=Val(Text2.Text) ____①____ Text3.Text=Str(z)End SubFunction gcd(a As Integer, b As Integer) As Integer Do While a<>b If a>b Then a=a-b Else b=b-a Loop ____②____End Function请在程序划线处填入合适的代码。解析 自定义函数gcd的功能是计算a、b的最大公约数,并通过函数名gcd返回函数的值。主程序是调用自定义函数,把x和y分别赋值给a和b,计算的结果赋值给z。答案 ①z=gcd(x,y) ②gcd=a 或gcd=b9.在VB中,判断一个整数的各位上的数字是否重复的自定义函数:Private Function judge(t As Long) As BooleanDim s As String,s1 As String, i As Integer,j As Integer s=Str(t): judge = False For i = 1 To Len(s)-1s1 = Mid(s, i, 1)For j = i + 1 To Len(s) If ____①______ Then Exit FunctionNext j Next i____②____End Function请在程序划线处填入合适的代码。解析 自定义函数judge的功能是判断数字t各位上的数字是否重复,并通过函数judge名返回函数的值。判断的条件是第i个数与他后面的所有数进行比较,如果相同则跳出自定义函数,返回函数的值为False,否则执行②语句。答案 ①s1=Mid(s,j,1) ②judge = True10.在VB中,将一个二进制数转化成十六进制的自定义函数代码如下:Function btoh(s As String) As String Dim i As Integer, s1 As String, t As IntegerDim str As String, j As Integerstr = ”0123456789ABCDEF”i = Len(s)Do While i >= 1If ____①____ Thens1 = Mid(s, i - 3, 4)Elses1 = Mid(s, 1, i)End Ift = 0For j = 1 To Len(s1)t = ____②____Next jbtoh = Mid(str, t + 1, 1) + btohi = i - 4LoopEnd Function请在程序划线处填入合适的代码。解析 自定义函数btoh的功能是将二进制数s转换成十六进制数。转换的方法是从低位开始,每4位二进制转换成十进制数(不足4位,取剩下的所有字符),并根据十进制数的值在字符str中查找相应的十六进制值。答案 ①i>=4 ②t=t*2+Val(Mid(s1,j,1)) 11.有VB自定义函数的功能是求两个数之间被3除多2,被5除多3的所有整数个数Function f(x1 As Integer, x2 As Integer) As Integer Dim t As Integer, i As IntegerIf x1 < x2 Then t = x1: x1 = x2: x2 = tFor i =____①____ If i Mod 3 = 2 And i Mod 5 = 3 Then ____②____Next iEnd Function请在程序划线处填入合适的代码。解析 自定义函数f的功能是求x2和x1两个数之间被3除多2、被5除多3的所有整数个数。并通过函数名f返回函数的值。答案 ①x2 To x1 或 x1 To x2 Step -1 ②f=f+112.编写一个将十进制数转换为二进制的VB自定义函数,完成划线处应填的语句。Function dTOb(x As Integer) As String Dim s As StringDo While x > 0 If x Mod 2=0 Then s=”0” Else s=”1” ______①____ x = x 2LoopEnd Function请在程序划线处填入合适的代码。解析 自定义函数dTOb的功能是将x转换成二进制数,并通过函数名返回函数的值。答案 ①dTob=s+dTob13.小明编写了一个寻找奇妙整数的 VB 程序。此整数的平方与立方正好用了 0~9 的 10 个数且每个数只用一次,例如 69 的平方为 4761,69 的立方为 328509,4761 和 328509 刚好用了0~9的10数,并且没有重复使用。现需从1至1000寻找这样的奇妙整数并在列表框List1 中显示。实现上述功能的 VB 程序段如下:Private Sub Command1_Click()Dim n As Integer, k As Integer, f As Boolean ′判断字符 k 是否重复出现Dim s1 As String, s2 As String, i As Integer, j As IntegerFor n = 1 To 1000For i = 0 To 9a(i) = TrueNext if = Trues1 = CStr(n ^ 2)s2 = CStr(n ^ 3) ′Cstr()函数的作用是将数字型变量改变成字符型变量For j = 1 To Len(s1) ____①____ If a(k) = True Thena(k) = False Elsef = FalseExit For End IfNext jIf ____②____Thenj = 0Do While j <= 9 If a(j) = True Then f = False: Exit Do j = j + 1LoopIf f = True Then List1.AddItem Str(n)End IfNext nEnd SubFunction Judge(s As String) As BooleanDim i As Integer, k As Integeri = 1: Judge = TrueDo While ____③______k = Val(Mid(s, i, 1))If a(k) = True Thena(k) = FalseElseJudge = FalseExit DoEnd Ifi = i + 1LoopEnd Function请在程序划线处填入合适的代码。解析 自定义函数judge的功能是判断数字t各位上的数字是否重复,并通过函数judge名返回函数的值。主程序中,先判断n的平方s1是否有重复,取出每个数字k,判断下标为k的f数组元素值是否是True。在调用自定义函数判断s2不重复的基础上,接着判断s1和s2中各个数字均不重复。答案 ①k=Val(Mid(s1,j,1)) ②Judge(s2)③Judge = True14.编程找出100到1000之间满足以下条件的整数:该数和该数平方合并后的数字串中不存在重复的数字。例如209,其平方数为43681,209和43681合并后的数字串 “20943681”中无重复数字,209就是符合条件的数。实现上述功能的VB代码如下,但加框处代码有错,请改正。Private Sub Command1_Click()Dim x As Integer, y As Long, st As StringFor x = 100 To 1000y = x ^ 2st = Str(x) & Str(y)If Then ′(1)List1.AddItem ”x:” & Str(x) & ” x^2: ” & Str(y) & ”x&y: ” & Str(st)End IfNext xEnd SubPrivate Function judge(s As String) As BooleanDim a(1 To 100) As StringFor i = 1 To Len(s)a(i) = Mid(s, i, 1)Next iFor i = 1 To Len(s) - 1For j = i + 1 To Len(s) If Then Exit Function ′(2)Next jNext ijudge = TrueEnd Function解析 自定义函数judge的功能是判断数字s各位上的数字是否重复,并通过函数judge名返回函数的值。判断的条件是第i个数与他后面的所有数进行比较,如果相同则跳出自定义函数,返回函数的值为False,否则执行judge = True语句。主程序中为调用自定义函数。答案 (1)judge(st) (2)a(j) = a(i)15.用26个互不重复的ASCII字符作为密码本,根据英文字母在字母表中位置,替换为密码本该位置的字符。现编写将英文字母加密的VB程序,在文本框Text1中输入明文,单击“加密”按钮Command1,在文本框Text2、Text3中输出产生的密码本和密文。程序运行界面如下图所示。实现上述功能的VB代码如下,但加框处代码有错,请改正。Private Sub Command1_Click()Dim i As Integer, mw As String, jm As Stringmw = Text1.Text:Text2.Text = my(26)For i = 1 To Len(mw)c = Mid(mw, i, 1)If c >= ”A” And c <= ”Z” Or c >= ”a” And c <= ”z” Then ′(1) jm = jm + Mid(Text2.Text, t, 1) Else jm = jm + cEnd IfNext iText3.Text = jmEnd SubFunction my(n As Integer) As StringDim s As String, i As Integer, x As Integers = ”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789”i = 1Do While i <= nt = 63 - ix = Int(Rnd() * t + 1) ′(2)s = Mid(s, 1, x - 1) + Mid(s, x + 1, t - x)i = i + 1LoopEnd Function解析 自定义函数的功能是产生不重复的字符串,t表示在s中长度,x是[1,x]之间的随机位置,把该位置上的字符连接到密钥中,同时把该字符在s中去除。主程序中,找到字符c在字母表中位置t,并在密钥中取出对应的加密字符。答案 (1) t = Asc(c) Mod 32 (2)my = my+ Mid(s, x, 1)16.如果一个数从左往右读和从右往左读都一祥,那么这个数就叫做“回文数”。如果一个数的十进制和二进制表示都是回文数,则把这个数叫做“双重回文数”。例如,十制数33是回文数,将其转化为二进制表示(10001 )也是回文数,所以33是双重回文数。编写程序用于查找1000以内的双重回文数。(1)根据题目描述,十进制数99是否是“双重回文数” __________(填:是/不是)。(2)实现上述功能的VB程序如下,请在划线处填入合适代码。 Private Sub Command1_Click()Dim n As Integer, d As String, b As StringFor i = 1 To 999 n = i d = CStr(n) ′CStr函数的功能是数值转换为字符串 ____①____b = dtob(n) If ishws(d) And ishws(b) ThenList1.AddItem Str(i) + ” ” + b End IfNext iEnd SubFunction dtob(k As Integer) As String ′进制转换Do While k > 0dtob = CStr(k Mod 2) + dtobk = k 2LoopEnd FunctionFunction ishws(x As String) As Booleanishws = TrueFor j = 1 To Len(x) 2If ____②____Mid(x, j, 1) <> Mid(x, Len(x) - j + 1, 1) Thenishws = FalseExit ForEnd IfNext jEnd Function解析 自定义函数dtob的功能是将k转换成二进制数。自定义函数ishws的功能是判断字符x是否是回文数。主程序中先调用自定义函数dtob将i转换二进制数,若i及他对应的二进制数均为回文数,则他是双重回文数。答案 (1)是 (2)①b = dtob(n)②Mid(x, j, 1) <> Mid(x, Len(x) - j + 1, 1)17.学校把各同学选考组合放在一个数据库中,小明编写了一个VB程序,用于查询每个同学的选考组合,程序界面如图所示,在文本框Text1中输入学号,单击“开始查询”按钮(Command1),就开始查找该学号的信息,如果找到对应的信息,就显示所属学生的姓名和选考组合;如果没有找到,则显示“找不到”。 学校共有n名学生,数组a、b分别保存了本次考试所有学生的学号和姓名信息。数据库数据按学号从小到大排列,第i个学生的学号保存在a(i),对应的姓名保存在b(i),c(i)保存该学生的选考组合。程序如下,在程序划线处填入适当的代码,把程序补充完整。Dim n As Integer ,a(1000) As String,Dim b(1000) As String, c(1000) As String Private Sub Command1_Click() Dim x As String, pos As Integer Dim conn As New ADODB.Connection, rs As New ADODB.Recordset conn.ConnectionString = ”provider=Microsoft.ACE.OLEDB.12.0;data source=” & App.Path & ” tudents.accdb” conn.Open Set rs.ActiveConnection = conn rs.Open ”学生信息” n = 0 ′考生数初始化Do While Not rs.EOF n = n + 1 a(n) = rs.Fields(0)b(n) = rs.Fields(1)c(n) = rs.Fields(2) ____①____Loop x = Text1.Text ____②____If pos > 0 Then Text2.Text=b(pos)Text3.Text=c(pos) Else Text2.Text=”找不到”End If End Sub Function Search(Key As String) As Integer Dim i As Integer, j As Integer,m As Integer i = 1: j = n : Search = 0Do While i <= j m = Fix((i + j) / 2) If Key = a(m) Then ____③____ Exit Function ElseIf a(m) > Key Then j = m - 1 Else i = m + 1 End If Loop End Function 解析 在数据表进行查询时,记录指针往下移,才能达到记录的尾部。调用自定义函数去进行查找Text1中内容。在自定义函数中,通过函数名返回函数的值。答案 ①rs.MoveNext ②pos=Search(x) ③Search=m课件56张PPT。专题四 自定义函数及VB访问数据库【考纲标准】1.(2017·4月浙江选考)小王编写了一个依据成绩计算名次的VB程序,成绩为0到100之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数(该分数的个数不为0)对应的名次,分数相同时名次并列。最高分为第1名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组A存放每个分数对应的个数,数组B存放每个分数对应的名次。例如,下表中最高分100有2个,并列第1名,则分数96的名次为分数100的名次加上分数100的个数,即第3名。程序运行时,学生数据显示在列表框List1中,单击“计算”按钮Command1,计算结果显示在列表框List2中,程序运行界面如图所示。实现上述功能的VB程序如下,请回答下列问题:(1)如表所示,若分数93的个数为2,则该分数对应的名次为________。(2)请在划线处填入合适的代码。Dim sName(1 To 50) As String ′存放学生姓名Dim sScore(1 To 50) As Integer ′存放学生分数Dim recCount As Integer ′存放学生人数Private Sub Form_Load()′本过程从数据库中读取学生数据,存储在相应的变量中,并在List1中显示′代码略End Sub′整数转换成长度固定的字符串Function ads(x As Integer, n As Integer) As String Dim sx As String, nx As Integer, i As Integer sx = Str(x): nx = Len(sx) For i = 1 To n - nx sx = " " + sx Next i ____①____End FunctionPrivate Sub Command1_Click() Dim A(0 To 100) As Integer ′存放每个分数的个数 Dim B(0 To 100) As Integer ′存放每个分数的名次 Dim mc As Integer, score As Integer, i As Integer For i = 0 To 100 A(i) = 0 Next i For i = 1 To recCount ′计算每个分数的个数____②____ Next i mc = 1 For i = 100 To 0 Step -1 ′计算每个分数的名次 If A(i) <> 0 Then B(i) = mc ____③____ End If Next i List2.Clear List2.AddItem “ 姓名 分数 名次 ” List2.AddItem “ --------- ” For i = 1 To recCountscore = sScore(i)mc = B(sScore(i))List2.AddItem sName(i) + ads(score, 5) + “第” + ads(mc, 3) + “名” Next iEnd Sub解析 (1)本题考查学生对题干描述的计算名次算法的理解。表中有3个并列第4名(94分),93分应为第7名。(2)① 该程序段为自定义函数,功能是将整数转化为固定长度的字符串,Function函数通过函数名返回一个值,这个值是在过程的语句中赋给函数名的,即ads=sx。②注意观察注释语句,数组sScore存放学生分数,数组A存放每个分数的个数,该循环为计算每个分数的个数,即A(sScore(i))= A(sScore(i))+1。③该循环计算每个分数的名次,从最高分100分每次递减1分计算。数组B(i)存放每个分数的名次,考虑每个分数的个数A(i),每个分数的名次为mc=mc+ A(i)或mc=B(i)+ A(i)。答案 (1)7(2)①ads=sx②A(sScore(i))=A(sScore(i))+1③mc=mc+A(i)或mc=B(i)+A(i)2.(2016·10月浙江选考)小王与小李合作编写一个成绩统计的VB程序:小王编写一个过程,该过程从数据库读取某一指定科目的相关数据,存储在数组a中:小李编写一个过程,该过程依据数组a中的相关数据统计各班级平均分。小王与小李约定的数组a各元素含义如表所示。 程序功能如下:在文本框Text1中输入科目名称,单击“读数据库”按钮Command1,程序从数据库读取数据;单击“开始统计”按钮Command2,程序进行统计处理,结果输出在列表框List1中。程序运行界面如图所示。实现上述功能的VB程序如下,请回答下列问题:(1)根据程序运行界面中的数据及数组a各元素的含义进行分析,数组元素a(5)的值为____________(填写数值)。(2)分析程序,可知数据库的文件名为________。(3)请在划线处填入合适的代码。Dim a(1 To 600) As Integer ′数组大小满足处理要求Private Sub Command1-Click() ′本过程由小王完成,从数据库读取指定科目的各相关数据,存储在数组a中 Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset conn.ConnectionString= "provider=Microsoft.ACE.OLEDB.12.0;data source="+"Score.accdb" conn.Open Set rs.ActiveConnection=conn ′本过程的其他语句略End SubPrivate Sub Command2-Click()′本过程由小李完成,依据数组a中的相关数据统计各班级平均分 Dim i As Integer,j As Integer,n As Integer Dim p As integer,sum As Integer,aver As Single ____①____ p=n+2 For i=1 To n sum=0 For j=1 To a(i+1) ____②____ p=p+1 Next j aver=sum/a(i+1) List1.AddItem Str(i)+" "+Str(a(i+1))+" "+Str(aver) Next iEnd Sub解析 (1)根据题中表格中数组a各元素的含义,a(2)到a(n-1)分别存储从1班到(n-1)班的各班人数,所以数组元素a(5)存储的是4班的人数,从图中可以看到4班人数为“33”。(2)考查VB中的ADO访问数据库,从程序中:" data soure= "+ " Score.accdb "可判断数据库文件名为" Score.accdb " 。(3)分析本过程程序功能为“统计各班级平均分”,程序结构为双重循环,外层循环控制选择第i班,待内层循环求得本班成绩和之后求平均分(aver=sum/a(i+1)),内层循环累加本班成绩和。从变量p初值为p=n+2和循环中" p=p+1 " ,结合题目表格中给出的从a(n+2)开始依次存储每个班学生的成绩,可以判断程序中变量n是班级数,a(p)可以依次读取每个学生的成绩。所以①处为"n=a(1)"(表格中说明a(1)存储班级数),②处为累加各班每个学生的成绩到变量sum中, 即“sum=sum+a(p)”。答案 (1)33 (2)Score.accdb (3)①n=a(1) ②sum=sum+a(p)1.依据结构化程序设计的思想,当需要解决的问题规模较大、复杂时,可以按功能细分成一个个小的功能模块,这样的小程序段,在VB中被称为过程; 过程是一段能完成一个或多个特定功能的独立的程序段,并可以被其他过程调用。程序中多处重复出现处理相同功能的程序段可以通过过程简化。2.在VB中,过程有两种,一种是Sub子过程,一种是Function函数。两者的区别在于:Sub子过程只执行程序而不返回值,而Function函数执行程序后会返回值。Sub事件处理过程名(参数表)语句块End Sub其中,事件处理过程名必须符合下面的规则:对象名_事件的标准名。VB的一些常用对象上的常见事件的标准名有:窗体Form: Form_Load、Form_Unload文本框Text:Text1_Click、Text1_KeyPress 命令按钮Command:Command1_Click、Command1_DblClick4.自定义函数基本结构Function函数名(参数表)As 类型名语句块(至少有一个语句是: 函数名=表达式)End Function函数:函数是类似于过程的另一个程序模块,不同之处是函数执行完成后,函数的计算结果被送到函数的调用点上,供程序的后继部分继续进行处理。【例1】 某日期加密授权码生成方法描述如下: (1)授权码由10位字符组成,前8位为日期的密文,后2位为验证码; (2)取日期的第1位字符,若该字符第一次出现,则直接取其对应加密字符,否则取下一个不重复的加密字符。按此操作,依次取出该日期余下各位对应的加密字符; (3)求出所有日期字符数值的和,将和除16取余得到一位验证码字符;若和不小于16,则将和除16取整加1得到另一位验证码字符,否则另一位验证码字符为“X”。取出验证码重复时,处理规则与(2)相同。加密(验证码)字符对应表如下:小明设计了一个生成8位日期(YYYYMMDD格式)授权码的VB程序。程序功能如下:在文本框Text1中输入一个8位有效日期,单击“生成授权码”按钮Command1,在标签Label2中显示出该日期的授权码。运行效果如图所示。(1)若输入的日期是“20181213”,则该授权码的验证码字符是______________________。(2)请在划线处填入合适代码。Dim f(0 To 15) As IntegerConst Code = " KnGjLtWb0aPHZqYc "Private Sub Command1_Click()Dim rq As String, sq As String, c As Integer, i As Integer, d As IntegerFor i = 0 To 15f(i) = 0Next irq = Text1.Textsq = " " : d = 0If Len(rq) <> 8 ThenLabe12.Caption = "请输入8位日期!"ElseFor i = 1 To 8c = Val(Mid(rq, i, 1))d = d + csq = ____①____Next iIf d >= 16 Thenyz = GetChar(d Mod 16) + GetChar(d '16 + 1)Elseyz = ____②____End IfLabel2.Caption = sq + yzEnd IfEnd SubFunction GetChar(x As Integer) As String ′获取不重复的加密字符Dim flag As Booleanflag = FalseDo While flag = Falsef(x) = f(x) + 1If f(x) = 1 Then ____③____f(x) = f(x) + 1flag = TrueElsex = (x + 1) Mod 10 End IfLoopEnd Function解析 若输入的日期是“20181213”,前4位互不重复,分别取出各自位置上的字符,后4位与前3位重复,对应的第4、5、6、7上的字符。自定义函数GetChar是获取数x在Code中获取不重复的加密字符,数组f是表示数字0-15出现的次数,初始值为0,下标为x的数组先加1再判断是否等于1,若等于1,表示该数字没有出现过,找到对应的加密字符。变量sp表示对日期的加密,每一位上的数字取出不重复的加密字符,并进行正向连接。当和d小于16时,有d Mod 16取出加密字符和“X”两位验证码。答案 (1)GKn0jLtWba (2)①GetChar(c) + sq②GetChar(d Mod 16) +" X " ③GetChar = Mid(Code, x + 1, 1)【变式训练1】 质数又称素数,是指除了1和本身之外不再有其他因数的数。如果两个质数的差为2,则这两个质数称为孪生质数对;编写VB程序,功能:单击“显示孪生质数对”按钮Command1,在列表框List1中显示100 以内的所有孪生质数对(运行效果如图所示)。实现上述功能的VB代码如下。请在划线处填入合适代码。Dim a(1 To 50) As IntegerPrivate Sub Command1_Click()Dim i As Integerk = 0: i = 3Do While i <= 100If ____①____Then k = k + 1:a(k) = ii = i + 2LoopFor i = 2 To kIf____②____Then List1.AddItem Str(a(i - 1)) + " 和" + Str(a(i))End IfNext iEnd SubFunction prime(x As Integer) As Boolean ′判断是否是质数 prime = TrueFor i = 2 To Int(Sqr(x)) If x Mod i = 0 Then ______③____Exit For End IfNext iEnd Function解析 自定义prime的功能是判断数x是否是质数,如果是返回True,否则返回False,且函数值必须通过函数名返回,因此当条件x Mod i = 0成立时,函数值为False。程序的功能先找出100以内的质数,把他们分别存储在a再找出相邻两个差为2的质数对。答案 ①prime(i) ②a(i)-a(i - 1))=2 ③prime = False二、递归算法 绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言中习惯用递归来实现循环。【例2】 以下VB程序段:Private Sub Command1_Click()Dim n As Integer, f As Integern = Val(Text1.Text)f = fac(n)Label2.Caption = Str(f)End SubFunction fac(n As Integer) As IntegerIf n = 1 Then fac = 1 Else fac = n * fac(n - 1)End Function程序运行时,若在文本框Text1中输入8,下列说法正确的是( )A.程序运行出错B.控件Label2中显示 1C.控件Label2中显示 8D.控件Label2中显示40320解析 本题考核的知识点递归的算法思想。在文本框Text1中输入8,将返回8*f(7),f(7)=7*f(6),f(6)=6*f(5),f(5)=5*f(4),f(4)=4*f(3),f(3)=3*f(2),f(2)=2*1,将f(2)的结果代回,f(8)=8!=40320,但函数返回值为整数,超出了整数的范围,将出现溢出的报错。答案 A【变式训练2】 有如下程序:Private Function f(x As Single, n As Integer) As SingleIf n = 0 Thenf = 1Else If n Mod 2 = 1 Then f = x * f(x, n '2) Else f = f(x, n '2) 'x End IfEnd IfEnd FunctionPrivate Sub Command1_Click()Label1.Caption = Str(f(4, 6))End Sub程序运行时,单击按钮Command1,标签Label1显示的内容是( )A.1 B.4 C.27 D.64解析 在自定义函数中,4和6作为参数,分别传送赋值给自定义函数中的x和n。f(4, 6)= f(x, n 2) x=f(4,3)4, f(4,3) 4= x * f(x, n 2) 4=4*f(4,1) 4,f(4,1)= x * f(x, n 2)=4*f(4,0), 4*f(4,0)=4。答案 B三、VB 访问 Access 数据库1.通过ADO对象中的Connection对象连接数据库,步骤如下(右边是对应的代码):2.通过ADO对象中的Recordset对象读取数据库表中记录,步骤如下(右边是对应的代码):【例3】 有一Access数据库“school.accdb”存放在f:2015Imt[JP]vb文件夹中,其中的“student”数据表用来存储学生的基本情况信息,包括学号(num)、姓名(name)、性别(sex)、分数(score),括号内的为对应字段名。下列VB程序用来实现根据学号查询并显示学生信息,运行界面如下图所示。在文本框Text1中输入学生的学号,单击“查询”,在文本框Text2、Text3、Text4中分别显示学生姓名、性别、分数。为了实现上述目标,在划线处填入合适的语句或表达式:Private Sub Command1_Click()Dim adocn As New adodb.ConnectionDim adors As New adodb.RecordsetDim str2 As String,str1 As Stringstr1="Provider-Microsoft.ACE.OLEDB,12.0;data source=f:2015Imtvb____①____"adocn.Open str1str2="select * from students where num="+Text1.Textadors.Open str2,adocn,adOpenDynamic,adLockOptimisticIf adors,EOF=Ture Then MsgBox" 你输入的学号不存在"Else Text2.Text=adors.Fields("name").Value Text3.Text=adors.Fields("sex").Value ____②____End Ifadors:Closeadocn.CloseEnd Sub解析 本题主要考查数据库的访问方法。划线①处代码设置连接数据库的字符串,“data source”是指被连接的数据库文件。划线②处代码是在文本框Text4中输出分数。答案 ①school.accdb②Text4.Text=adors.Fields(“score”).Value【例4】 小王编写了一个VB程序,用于读取某数据库中的数据,部分代码如下: Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset conn.ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=" & App.Path & " mydata.accdb" Set rs.ActiveConnection = conn rs.Open "select * from keti" n=0 Do While Not rs.EOF n=n+1 rs.MoveNextLoop下列对于以上代码的理解正确的有( )①连接的数据库文件名是“mydata”②“ConnectionString”是conn对象的属性值③查询的数据表名称是“keti”④程序运行后,变量n的值表示该数据表中记录的总数⑤省略语句“rs.MoveNext”,程序也可以正常运行A.①②③④ B.②③④C.③④⑤ D.③④解析 conn和rs是数据常见的两个对象,ConnectionString是conn的属性,在该属性中包含连接的数据库名称mydata.accdb的信息。语句rs.Open "select * from keti "中,open是rs的方法,在该语句中,包含了查询的数据表名称keti信息。变量n表示记录条数,每读一条,n增加1,同理rs.MoveNext语句不可以少,表示读取一条后,指针向下移动,否则会形成死循环。答案 D【变式训练3】 用 VB 程序读取数据库中数据的部分代码如下: Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim cnt As Integer Private Sub Form_Load() conn.ConnectionString="Provider=Microsoft.ACE.OLEDB.12.0;DataSource=" &App.Path& test.accdb“ conn.OpenSet rs.ActiveConnection = conn rs.Open " select * from 学生信息"cnt = 0Do While Not rs.EOFcnt = cnt + 1List1.AddItem rs.Fields(" 姓名 ")rs.MoveNextLoopEnd Sub下列描述中正确的是( )A.从表中读取的总记录数为:cntB.连接的数据库文件名:testC.程序中读取记录的表名是:test.accdbD.List1 中显示的内容是所有记录中“学生信息”字段的值解析 读取的数据库名称为test.accdb,数据表名称为学生信息,每读取一条记录,cnt的值增加一条,因此cnt为记录总数。语句List1.AddItem rs.Fields(“姓名”)表示,只显示姓名字段的值。答案 A 展开更多...... 收起↑ 资源列表 专题四 自定义函数及VB访问数据库.doc 专题四 自定义函数及VB访问数据库.pptx