资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2019-9-25,#,#,专题四自定义函数及,VB,访问数据库,【考纲标准】,考试内容,考试要求,1.,过程与自定义函数,c,2.,递归算法,a,3.VB,访问,Access,数据库,通过,ADO,对象连接数据库,通过,RecordSet,对象获取数据表中的数据,a,1.,(20174,月浙江选考,),小王编写了一个依据成绩计算名次的,VB,程序,成绩为,0,到,100,之间的整数。算法的基本思想:先统计每个分数的个数,然后按照分数从高到低依次计算每个有效分数,(,该分数的个数不为,0),对应的名次,分数相同时名次并列。最高分为第,1,名,该分数的名次与个数之和为下一个有效分数的名次,以此类推。程序用数组,A,存放每个分数对应的个数,数组,B,存放每个分数对应的名次。例如,下表中最高分,100,有,2,个,并列第,1,名,则分数,96,的名次为分数,100,的名次加上分数,100,的个数,即第,3,名。,程序运行时,学生数据显示在列表框,List1,中,单击,“,计算,”,按钮,Command1,,计算结果显示在列表框,List2,中,程序运行界面如图所示。,分数,100,99,98,97,96,95,94,0,个数,(A,数组,),2,0,0,0,1,0,3,0,名次,(B,数组,),1,3,4,实现上述功能的,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.,(201610,月浙江选考,),小王与小李合作编写一个成绩统计的,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,函数执行程序后会返回值。,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),相同。加密,(,验证码,),字符对应表如下:,小明设计了一个生成,8,位日期,(YYYYMMDD,格式,),授权码的,VB,程序。程序功能如下:在文本框,Text1,中输入一个,8,位有效日期,单击,“,生成授权码,”,按钮,Command1,,在标签,Label2,中显示出该日期的授权码。运行效果如图所示。,值,(,十进制,),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,(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)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,:,2015ImtJPvb,文件夹中,其中的,“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.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,
展开阅读全文