2020版高考信息技术二轮浙江专用 专题四 自定义函数及VB访问数据库课件(56张幻灯片)+学案

文档属性

名称 2020版高考信息技术二轮浙江专用 专题四 自定义函数及VB访问数据库课件(56张幻灯片)+学案
格式 zip
文件大小 3.7MB
资源类型 教案
版本资源
科目 信息技术(信息科技)
更新时间 2019-11-30 14:27:54

文档简介

专题四 自定义函数及VB访问数据库
【考纲标准】
考试内容
考试要求
1.过程与自定义函数
c
2.递归算法
a
3.VB 访问 Access 数据库
①通过 ADO 对象连接数据库
②通过 RecordSet 对象获取数据表中的数据
a
1.(2017·4月浙江选考)小王编写了一个依据成绩计算名次的VB程序,成绩为0到100之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数(该分数的个数不为0)对应的名次,分数相同时名次并列。最高分为第1名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组A存放每个分数对应的个数,数组B存放每个分数对应的名次。例如,下表中最高分100有2个,并列第1名,则分数96的名次为分数100的名次加上分数100的个数,即第3名。
分数
100
99
98
97
96
95
94

0
个数(A数组)
2
0
0
0
1
0
3

0
名次(B数组)
1
3
4

程序运行时,学生数据显示在列表框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 Function
Private 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 recCount
score = sScore(i)
mc = B(sScore(i))
List2.AddItem sName(i) + ads(score, 5) +“第” + ads(mc, 3) +“名”
  Next i
End 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)
存储班级数n
a(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 Sub
Private 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 i
End 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_DblClick
4.自定义函数基本结构
Function函数名(参数表)As 类型名
语句块(至少有一个语句是: 函数名=表达式)
End Function
函数:函数是类似于过程的另一个程序模块,不同之处是函数执行完成后,
函数的计算结果被送到函数的调用点上,供程序的后继部分继续进行处理。
【例1】 某日期加密授权码生成方法描述如下:
(1)授权码由10位字符组成,前8位为日期的密文,后2位为验证码;
(2)取日期的第1位字符,若该字符第一次出现,则直接取其对应加密字符,否则取下一个不重复的加密字符。按此操作,依次取出该日期余下各位对应的加密字符;
(3)求出所有日期字符数值的和,将和除16取余得到一位验证码字符;若和不小于16,则将和除16取整加1得到另一位验证码字符,否则另一位验证码字符为“X”。取出验证码重复时,处理规则与(2)相同。加密(验证码)字符对应表如下:
值(十进制)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
加密(验证码)字符
K
n
G
j
L
t
W
b
0
a
P
H
Z
q
Y
c
小明设计了一个生成8位日期(YYYYMMDD格式)授权码的VB程序。程序功能如下:在文本框Text1中输入一个8位有效日期,单击“生成授权码”按钮Command1,在标签Label2中显示出该日期的授权码。运行效果如图所示。
(1)若输入的日期是“20181213”,则该授权码的验证码字符是______________________。
(2)请在划线处填入合适代码。
Dim f(0 To 15) As Integer
Const Code = ”KnGjLtWb0aPHZqYc”
Private Sub Command1_Click()
Dim rq As String, sq As String, c As Integer, i As Integer, d As Integer
For i = 0 To 15
f(i) = 0
Next i
rq = Text1.Text
sq = ” ”: d = 0
If Len(rq) <> 8 Then
Labe12.Caption = ”请输入8位日期!”
Else
For i = 1 To 8
c = Val(Mid(rq, i, 1))
d = d + c
sq = ____①____
Next i
If d >= 16 Then
yz = GetChar(d Mod 16) + GetChar(d '16 + 1)
Else
yz = ____②____
End If
Label2.Caption = sq + yz
End If
End Sub
Function GetChar(x As Integer) As String ′获取不重复的加密字符
Dim flag As Boolean
flag = False
Do While flag = False
f(x) = f(x) + 1
If f(x) = 1 Then
   ____③____
f(x) = f(x) + 1
flag = True
Else
x = (x + 1) Mod 10
End If
Loop
End 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 Integer
Private Sub Command1_Click()
Dim i As Integer
k = 0: i = 3
Do While i <= 100
If ____①____Then k = k + 1:a(k) = i
i = i + 2
Loop
For i = 2 To k
If____②____Then
    List1.AddItem Str(a(i - 1)) + ”和” + Str(a(i))
End If
Next i
End Sub
Function prime(x As Integer) As Boolean ′判断是否是质数
prime = True
For i = 2 To Int(Sqr(x))
  If x Mod i = 0 Then
   ______③____
Exit For
  End If
Next i
End 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 Integer
n = Val(Text1.Text)
f = fac(n)
Label2.Caption = Str(f)
End Sub
Function fac(n As Integer) As Integer
If n = 1 Then fac = 1 Else fac = n * fac(n - 1)
End Function
程序运行时,若在文本框Text1中输入8,下列说法正确的是(  )
A.程序运行出错
B.控件Label2中显示 1
C.控件Label2中显示 8
D.控件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 Single
If n = 0 Then
f = 1
Else
  If n Mod 2 = 1 Then
   f = x * f(x, n 2)
  Else
   f = f(x, n 2) x
  End If
End If
End Function
Private 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.Connection
Dim adors As New adodb.Recordset
Dim str2 As String,str1 As String
str1=”Provider-Microsoft.ACE.OLEDB,12.0;data source=f:2015Imtvb  ____①____”
adocn.Open str1
str2=”select * from students where num=”+Text1.Text
adors.Open str2,adocn,adOpenDynamic,adLockOptimistic
If adors,EOF=Ture Then
 MsgBox”你输入的学号不存在”
Else
 Text2.Text=adors.Fields(”name”).Value
 Text3.Text=adors.Fields(”sex”).Value
 ____②____
End If
adors:Close
adocn.Close
End 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 & ”[ML)]ydata.accdb”
Set rs.ActiveConnection = conn
rs.Open ”select * from keti”
n=0
Do While Not rs.EOF
 n=n+1
 rs.MoveNext
Loop
下列对于以上代码的理解正确的有(  )
①连接的数据库文件名是“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& ”[99]
est.accdb”
conn.Open
Set rs.ActiveConnection = conn rs.Open ”select * from 学生信息”
cnt = 0
Do While Not rs.EOF
cnt = cnt + 1
List1.AddItem rs.Fields(”姓名”)
rs.MoveNext
Loop
End Sub
下列描述中正确的是(  )
A.从表中读取的总记录数为:cnt
B.连接的数据库文件名:test
C.程序中读取记录的表名是:test.accdb
D.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 Integer
a = Val(Text1.Text): b = Val(text2.Text)
Text3.text=f(a,b)
End Sub
Function f(x As Integer, y As Integer) As String
 Dim s As Integer, t As Integer, str As String
str = ”0123456789”
s = 1: t = 1
If x > 0 Then s = s + 1
If x > y Then
  t = s + t
ElseIf x = y Then
  t = 6
Else
  t = 5
End If
f = Mid(str,s+1,1)+Mid(str,t+1,1)
End Function
为使运行程序Text3显示的内容是15,则文本框Text1和Text2中依次输入的数字分别为(  )
A.6和5 B.5和6
C.-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”。
答案 C
2.有如下VB程序段:
Private Sub Command1_Click()
 Text1.Text = ”2012 Hero”
 Text2.Text = f(Text1.Text)
End Sub
Function 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 i
End Function
该程序段运行后,文本框Text2中显示的内容是(  )
A.2012 B.Hero
C.ero D.2012 H
解析 自定义函数的功能是只将字符串s中的小写连接起来。
答案 C
3.有如下VB程序:
Private Sub Command1_Click()
Dim n As Integer, x As String
n = Val(Text1.Text)
x = f(n)
Label1.Caption = x
End Sub
Function f(n As Integer) As String
Dim r As Integer
If n <> 0 Then
r = n Mod 2
n = n 2
If r = 0 Then
f = f(n) + ”0”
Else
f = f(n) + ”1”
End If
Else
f = ”0”
End If
End Function
End Function程序运行后,在Text1文本框中输入35,则在Label1上显示的内容是(  )
A.0100111 B.0100011
C.1100010 D.1110010
解析 这是一个递归算法,自定义函数的功能是将整数n转换成二进制数,当n=0时不再重复计算,因此第1个字符是0。
答案 B
4.有如下 VB 程序段:
Dim a(1 To 10) As Integer
Sub swap(a As Integer, b As Integer)
t = a: a = b: b = t
End Sub
Private Sub Command1_Click()
Dim min As Integer, n As Integer, i As Integer, j As Integer
n = 10
For i = 1 To n - 1
If i Mod 2 = 1 Then min = (i + 1) / 2
If i Mod 2 = 0 Then min = n + 1 - i / 2
For j = (3 + i) '2 To n - i '2
If a(j) < a(min) Then min = j
Next j
If 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 i
End 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、26
B.88、64、52、43、26、10、31、51、60、74
C.10、74、60、52、31、51、88、64、43、26
D.26、31、60、51、88、52、64、43、74、10
解析 这个题目考核过程的概念及应用。过程swap的作用是交换a和b的值。主程序中,当i是奇数时,最小值在前面,并通过选择排序的思想,找出最小值,换到前面。当是偶数时,最小值在后面的对称数,并通过选择排序的思想,找出最小值,换到后面,因此实现左右交替上升排序。
答案 A
5.通过 ADO 的Recordset Recordset对象实例rs打开的记录,如下图所示。
序号
书名
书号
作者
售价
1
解忧杂货店
ISBN9787544270878
东野圭吾
39.5
2
摆渡人
ISBN9787550013247
克莱儿·麦克福尔
36
3
白夜行
ISBN9787544258609
东野圭吾
39.5
4
追风筝的人
ISBN9787208061644
卡勒德·胡赛尼
29
5
这就是二十四节气
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,对书名要加引号。
答案 B
6.某个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 Boolean
Dim k As Integer
ok=False
 ____①____
   If k*k=t Then ____②____
End Function
请在程序划线处填入合适的代码。
解析 该自定义函数是判断t是否是完全平方数,如果是,通过函数名ok返回函数的值True,否则返回False。
答案 ①k=Int(Sqr(t)) ②ok=True
8.下列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 Sub
Function 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=b
9.在VB中,判断一个整数的各位上的数字是否重复的自定义函数:
Private Function judge(t As Long) As Boolean
Dim s As String,s1 As String, i As Integer,j As Integer
 s=Str(t): judge = False
 For i = 1 To Len(s)-1
s1 = Mid(s, i, 1)
For j = i + 1 To Len(s)
  If ____①______ Then Exit Function
Next j
Next i
____②____
End Function
请在程序划线处填入合适的代码。
解析 自定义函数judge的功能是判断数字t各位上的数字是否重复,并通过函数judge名返回函数的值。判断的条件是第i个数与他后面的所有数进行比较,如果相同则跳出自定义函数,返回函数的值为False,否则执行②语句。
答案 ①s1=Mid(s,j,1) ②judge = True
10.在VB中,将一个二进制数转化成十六进制的自定义函数代码如下:
Function btoh(s As String) As String
 Dim i As Integer, s1 As String, t As Integer
Dim str As String, j As Integer
str = ”0123456789ABCDEF”
i = Len(s)
Do While i >= 1
If ____①____ Then
s1 = Mid(s, i - 3, 4)
Else
s1 = Mid(s, 1, i)
End If
t = 0
For j = 1 To Len(s1)
t = ____②____
Next j
btoh = Mid(str, t + 1, 1) + btoh
i = i - 4
Loop
End 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 Integer
If x1 < x2 Then t = x1: x1 = x2: x2 = t
For i =____①____
  If  i Mod 3 = 2 And i Mod 5 = 3 Then ____②____
Next i
End Function
请在程序划线处填入合适的代码。
解析 自定义函数f的功能是求x2和x1两个数之间被3除多2、被5除多3的所有整数个数。并通过函数名f返回函数的值。
答案 ①x2 To x1 或 x1 To x2 Step -1 ②f=f+1
12.编写一个将十进制数转换为二进制的VB自定义函数,完成划线处应填的语句。
Function dTOb(x As Integer) As String   
Dim s As String
Do While x > 0
  If x Mod 2=0 Then s=”0” Else s=”1”
 ______①____
  x = x 2
Loop
End Function
请在程序划线处填入合适的代码。
解析 自定义函数dTOb的功能是将x转换成二进制数,并通过函数名返回函数的值。
答案 ①dTob=s+dTob
13.小明编写了一个寻找奇妙整数的 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 Integer
For n = 1 To 1000
For i = 0 To 9
a(i) = True
Next i
f = True
s1 = CStr(n ^ 2)
s2 = CStr(n ^ 3)  ′Cstr()函数的作用是将数字型变量改变成字符型变量
For j = 1 To Len(s1)
  ____①____
 If a(k) = True Then
a(k) = False
 Else
f = False
Exit For
 End If
Next j
If ____②____Then
j = 0
Do While j <= 9
    If a(j) = True Then f = False: Exit Do
    j = j + 1
Loop
If f = True Then List1.AddItem Str(n)
End If
Next n
End Sub
Function Judge(s As String) As Boolean
Dim i As Integer, k As Integer
i = 1: Judge = True
Do While ____③______
k = Val(Mid(s, i, 1))
If a(k) = True Then
a(k) = False
Else
Judge = False
Exit Do
End If
i = i + 1
Loop
End Function
请在程序划线处填入合适的代码。
解析 自定义函数judge的功能是判断数字t各位上的数字是否重复,并通过函数judge名返回函数的值。主程序中,先判断n的平方s1是否有重复,取出每个数字k,判断下标为k的f数组元素值是否是True。在调用自定义函数判断s2不重复的基础上,接着判断s1和s2中各个数字均不重复。
答案 ①k=Val(Mid(s1,j,1)) ②Judge(s2)
③Judge = True
14.编程找出100到1000之间满足以下条件的整数:该数和该数平方合并后的数字串中不存在重复的数字。例如209,其平方数为43681,209和43681合并后的数字串 “20943681”中无重复数字,209就是符合条件的数。实现上述功能的VB代码如下,但加框处代码有错,请改正。
Private Sub Command1_Click()
Dim x As Integer, y As Long, st As String
For x = 100 To 1000
y = x ^ 2
st = Str(x) & Str(y)
If Then  ′(1)
List1.AddItem ”x:” & Str(x) & ” x^2: ” & Str(y) & ”x&y: ” & Str(st)
End If
Next x
End Sub
Private Function judge(s As String) As Boolean
Dim a(1 To 100) As String
For i = 1 To Len(s)
a(i) = Mid(s, i, 1)
Next i
For i = 1 To Len(s) - 1
For j = i + 1 To Len(s)
 If   Then Exit Function ′(2)
Next j
Next i
judge = True
End 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 String
mw = 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 + c
End If
Next i
Text3.Text = jm
End Sub
Function my(n As Integer) As String
Dim s As String, i As Integer, x As Integer
s = ”ABCDEFGHIJKLMNOPQRSTUVWXYZabc
defghijklmnopqrstuvwxyz0123456789”
i = 1
Do While i <= n
t = 63 - i
x = Int(Rnd() * t + 1)
     ′(2)
s = Mid(s, 1, x - 1) + Mid(s, x + 1, t - x)
i = i + 1
Loop
End 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 String
For i = 1 To 999
 n = i
 d = CStr(n)  ′CStr函数的功能是数值转换为字符串
 ____①____b = dtob(n)
 If ishws(d) And ishws(b) Then
List1.AddItem Str(i) + ”  ” + b
 End If
Next i
End Sub
Function dtob(k As Integer) As String ′进制转换
Do While k > 0
dtob = CStr(k Mod 2) + dtob
k = k 2
Loop
End Function
Function ishws(x As String) As Boolean
ishws = True
For j = 1 To Len(x) 2
If ____②____Mid(x, j, 1) <> Mid(x, Len(x) - j + 1, 1) Then
ishws = False
Exit For
End If
Next j
End 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 = 0
Do 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 recCount
score = sScore(i)
mc = B(sScore(i))
List2.AddItem sName(i) + ads(score, 5) + “第” + ads(mc, 3) + “名”
  Next i
End 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 Sub
Private 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 i
End 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 Integer
Const Code = " KnGjLtWb0aPHZqYc "
Private Sub Command1_Click()
Dim rq As String, sq As String, c As Integer, i As Integer, d As Integer
For i = 0 To 15f(i) = 0
Next i
rq = Text1.Textsq = " " : d = 0
If Len(rq) <> 8 Then
Labe12.Caption = "请输入8位日期!"
Else
For i = 1 To 8
c = Val(Mid(rq, i, 1))d = d + c
sq = ____①____
Next i
If d >= 16 Then
yz = GetChar(d Mod 16) + GetChar(d '16 + 1)Else
yz = ____②____
End If
Label2.Caption = sq + yz
End If
End SubFunction GetChar(x As Integer) As String ′获取不重复的加密字符
Dim flag As Boolean
flag = False
Do While flag = False
f(x) = f(x) + 1
If f(x) = 1 Then
   ____③____
f(x) = f(x) + 1flag = True
Else
x = (x + 1) Mod 10
End If
Loop
End 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 Integer
Private Sub Command1_Click()
Dim i As Integer
k = 0: i = 3
Do While i <= 100
If ____①____Then k = k + 1:a(k) = i
i = i + 2
Loop
For i = 2 To kIf____②____Then
    List1.AddItem Str(a(i - 1)) + " 和" + Str(a(i))
End If
Next i
End Sub
Function prime(x As Integer) As Boolean ′判断是否是质数
prime = True
For i = 2 To Int(Sqr(x))  If x Mod i = 0 Then
   ______③____
Exit For
  End If
Next i
End 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 Integer
n = Val(Text1.Text)
f = fac(n)
Label2.Caption = Str(f)
End Sub
Function fac(n As Integer) As Integer
If n = 1 Then fac = 1 Else fac = n * fac(n - 1)
End Function程序运行时,若在文本框Text1中输入8,下列说法正确的是(  )
A.程序运行出错
B.控件Label2中显示 1
C.控件Label2中显示 8
D.控件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 Single
If n = 0 Then
f = 1
Else
  If n Mod 2 = 1 Then
   f = x * f(x, n '2)
 Else   f = f(x, n '2) 'x
  End If
End If
End Function
Private 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.Connection
Dim adors As New adodb.Recordset
Dim str2 As String,str1 As String
str1="Provider-Microsoft.ACE.OLEDB,12.0;data source=f:2015Imtvb
____①____"adocn.Open str1
str2="select * from students where num="+Text1.Text
adors.Open str2,adocn,adOpenDynamic,adLockOptimistic
If adors,EOF=Ture Then
 MsgBox" 你输入的学号不存在"
Else
 Text2.Text=adors.Fields("name").Value
 Text3.Text=adors.Fields("sex").Value
 ____②____End If
adors:Close
adocn.Close
End 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.MoveNext
Loop下列对于以上代码的理解正确的有(  )
①连接的数据库文件名是“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 = 0
Do While Not rs.EOF
cnt = cnt + 1
List1.AddItem rs.Fields(" 姓名 ")
rs.MoveNext
Loop
End Sub下列描述中正确的是(  )
A.从表中读取的总记录数为:cnt
B.连接的数据库文件名:test
C.程序中读取记录的表名是:test.accdb
D.List1 中显示的内容是所有记录中“学生信息”字段的值
解析 读取的数据库名称为test.accdb,数据表名称为学生信息,每读取一条记录,cnt的值增加一条,因此cnt为记录总数。语句List1.AddItem rs.Fields(“姓名”)表示,只显示姓名字段的值。
答案 A
同课章节目录