资源简介 教师备用题库编写一个成绩查找程序,只要输入成绩,即可输出其排名、同分数的人数以及比此分高的人数。具体算法思路如下:(1)预处理。用数组a存放不同的分值,数组b存放相同分数的人数,数组s存放高于此分数的人数,数组下标表示名次。依次从数据库读取每个学生的成绩(数据库中每个学生的成绩已降序存储,即从高到低排列),当读入数与前一个数相同时,该名次的人数加1,当读入数与前一个数不同时,名次加1,即数组下标加1,存储当前分数,求高于本分数的人数并存储。举例:如果数据库中有一组成绩(降序):95,95,93,93,92,91,90,按上述算法处理,三个数组的最终结果如图所示。数组/下标12345a9593929190b22111s02456(2)对需要查找的成绩二分查找。读入需要查找的成绩x,在数组a中二分查找成绩,若找到,输出名次、相同分数的人数和高于本分数的人数;若找不到,输出“查无此分”。/程序代码如下,在横线处填入合适的代码。Dim rank As IntegerDim a(1 to 1000) As Integer ’存放不同的分数值Dim b(1 to 1000) As Integer ’存放相同分数的人数Dim s(1 to 1000) As Integer ’存放高于此分数的人数rank=0Private Sub Form_Load() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim tmp As Integer, n As Integer tmp=-1: n=0 conn.ConnectionString=“provider=Microsoft.ACE.OLEDB.12.0;data source=“App.Path+”Score.accdb” conn.open Set rs.ActiveConnection=conn rs.open “Select * from score” n=0 Do While Not rs.EOF n=n+1 mark=rs.fields(“成绩”) If mark=tmp Then ’当前读入分数与上一个分数相同,则对应名次的人数增加1 b(rank)=b(rank)+1 Else ’当前读入分数与上一个分数不同时 rank= ① ’名次增加1? a(rank)= ② ’存储当前分数到数组a中? s(rank)= ③ ’求高于本分数的人数并存储至数组s? b(rank)=1 ’将自身统计入同分人数 End If ④ ? ’更新上一个分数? rs.Movenext LoopEnd SubPrivate Sub Command1_Click() Dim x As Integer,low As Integer,high As Integer,mid As Integer x=Val(Text1.Text) low=1: high=rank mid=(low+high) 2 Do While low <=high and ⑤ ? mid=(low+high) 2 If a(mid) < x Then high=mid-1 Else low=mid+1 End If Loop If a(mid)=x Then Label1.Caption=“名次:“+mid+”同分人数:“+b(mid)+”高于此分人数:”+s(mid) Else Label1.Caption=“查无此分” End IfEnd Sub答案 ①rank+1 ②mark ③n-1 或b(rank-1)+s(rank-1) ④tmp=mark ⑤a(mid)<>x解析 ①rank变量存储当前的名次信息,当前读入的分数和上一次分数不同,故名次需增加1,所以rank=rank+1。②分数信息在mark变量中,此处要求将分数存入a(rank)中,故填mark。③根据旁边注释“求高于本分数的人数”,我们可以断定当前分数与上一个分数一定不同时,执行此语句,又因为当前正在处理第n个人成绩,故可以断定比第n个人(即当前处理的这个人)分数高的人一共有n-1个,故填n-1。前一名次的人数为b(rank-1),分数高于前一名次的人数为s(rank-1),故此处代码也可以是“b(rank-1)+s(rank-1)”。④把当前分数迭代到tmp中,以便在读取下一个分数时,可以和当前分数(在下一轮就变成“上一个分数”)进行比较。⑤二分查找的循环条件是“查找区间中所有元素且未找到查找键”,即:low<=high and a(mid)<>x。分析程序:若最终找不到查找键,循环得以结束的条件必然是low<=high不再成立,若能找到查找键,则循环结束的条件必然是 a(mid)<>x 不再成立。第6节 VB访问Access数据库模拟演练1.最新国际体操竞赛的评分规则简单描述如下:①两位D组裁判分别打“难度分”,取平均值作为该参赛选手的最终难度分。②五位E组裁判分别打“完成分”,在5个E组打分结果中,去掉一个最高分和一个最低分,然后取平均值作为该参赛选手的最终完成分。③难度分和完成分之和,即该参赛选手的最终得分。例如:某参赛选手打分如下:D组裁判打分E组裁判打分6.56.99.59.08.38.87.6该选手“难度分”为(6.5+6.9)/2=6.7。E组裁判打分去掉一个最高分和一个最低分之后,计算“完成分”为(9.0+8.3+8.8)/3=8.7。所以该选手最终得分为6.7+8.7=15.4分。小杜编写一个VB程序:程序运行时从数据库读取参赛选手人数和参赛选手的打分数据,依次存储在数组a中;单击“统计”按钮,依据数组a中的相关数据统计各选手的“难度分”“完成分”和“最终得分”,并在列表框List1中输出。数组a各元素的含义如下,程序运行界面如图所示。/数组元素数组元素的含义a(0)存储参赛人数na(1)a(1)和a(2)为第1位选手的D组两位裁判的打分。 a(3)、a(4)、…、a(7)为第1位选手的E组五位裁判的打分…a(7)a(8)a(8)和 a(9)为第2位选手的D组两位裁判的打分。 a(10)、a(11)、…、a(14)为第2位选手的E组五位裁判的打分…a(14)……实现上述功能的VB程序如下,请回答下列问题:(1)根据程序运行界面中的数据及数组a各元素的含义,数组元素a(8)和a(9)的值为 (填序号:A.6.2和5.6/B.5.8和6.2/C.6.1和5.5)。?(2)分析程序,可知数据库的文件名为 。?(3)请在划线处填入合适的代码。Dim a(0 To 210) As Single ’数组大小满足处理要求Dim d(1 To 30) As Single ’依次各选手的难度分Dim e(1 To 30) As Single ’依次各选手的完成分Dim f(1 To 30) As Single ’依次各选手的最终得分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=”+“成绩.accdb” conn.Open Set rs.ActiveConnection=conn ’本过程的其他语句略End SubPrivate Sub Command2_Click()’依据数组a中的相关数据统计各班级平均分Dim i As Integer, j As Integer, n As Integer, p As IntegerDim max As Single, min As Single, sum Single ① ?For i=1 To n p=(i-1)*7+1 d(i)=(a(p)+a(p+1))/2 sum=0 max=a(p+2) : min=a(p+2) For j=p+2 To p+6 sum=sum+a(j) If a(j) > max Then max=a(j) ② min=a(j)? Next j e(i)=(sum-max-min)/3 f(i)=d(i)+e(i)List1.AddItem Str(i)+“ ”+Str(d(i))+“ ”+Str(e(i))+“ ”+Str(f(i)) Next iEnd Sub答案 (1)C(2)成绩.accdb(3)①n=a(0) ②If a(j)解析 本题综合考查算法的程序实现和VB访问数据库。(1)根据程序运行界面中的数据及数组a各元素的含义,知数组元素a(8)和a(9)的平均值为5.8分,也就是第二位选手的难度分为5.8分,只有C选项的平均分为5.8分。(2)数据库的文件名的扩展名格式为“accdb”,通过分析数据库连接部分代码,容易找出数据库的文件名为“成绩.accdb”。(3)①变量n代表参赛选手的人数,根据题意,数组元素a(0)为参赛选手人数,所以需要将数组元素a(0)的值赋给变量n,即n=a(0);②通过分析得知变量min代表五位E组裁判打“完成分”的最低分。通过连续求数组中最值的算法得出②处答案为If a(j)2.某单位招考公务员,2010年和2011年分别有4 020名和2 000名考生报名,下列VB程序用于统计两次考试都参加的考生信息。程序界面设计如图所示,2010年和2011年的考生信息分别显示在List1和List2中,点击“统计”按钮,在List3中显示两次考试都参加的考生信息和总人数。/(1)实现上述功能的 VB 程序如下, 请在横线处填入合适代码。Dim a (1 To 4020 ) As StringDim b (1 To 2000 ) As StringPrivate Sub Form_Load( )Dim conn As New ADODB.ConnectionDim rs As New ADODB.RecordsetDim constr As stringconstr=“Provider=Microsoft.ace.OLEDB.12.0;”constr=constr &“Data Source=” & App.Path+“dataKaoSheng.accdb”conn.ConnectionString=constrconn.open()Dim sql As String’将参加2010年下半年考试的考生的身份证号码按升序存放在a数组中sql=“select * from kaoshengInfo where year=‘2010’order by sfzh asc”rs.Open sql,conni=0Do While Not rs.EOF i=i+1 a(i)=rs(“sfzh”) List1.additem(a(i)) rs.MoveNextLoop’将参加2011年下半年考试的考生的身份证号码按升序存放在b数组中sql=“select * from kaoshengInfo where year=‘2011’order by sfzh asc”rs.Open sql,conni=0Do While Not rs.EOF i=i+1 b(i)=rs(“sfzh”) List2.additem(b(i)) rs.MoveNextLooprs.CloseEnd SubPrivate Sub Command1_Click ()Dim bot As Integer , top As Integer , m As IntegerDim i As Integer ,ans As Integer ans=0 For i=1 To 2000 bot=1 ① ? Do While bot <=top m=Fix ( ( bot+top ) / 2 ) If a ( m )=b ( i ) Then List3.AddItem a ( m ) ② ? Exit Do ElseIf ③ Then? top=m-1 Else bot=m+1 End If Loop Next i List3.AddItem“总计”+str(ans)+“人次”End Sub(2)分析上述代码,在数据库中用于存放考试信息的数据表名称是 。?答案 (1)①top=4000 ②ans=ans+1 ③a(m)>b(i) (2) kaoshengInfo解析 本题考查数据库的使用和对分查找。(1)题目中需要找出两年都参加的人数,采取的做法是枚举考生较少的一年的人,也就是b数组,同时利用对分法去验证枚举到的人在另一年(a数组中)是否存在。对分的上界为bot,下界为top,分别为1和4 000,若查找到则输出并将ans加1,否则当查找值b(i)小于中间值a(m)时,改变下界,是一个标准的对分查找程序。(2)注意到程序中的“select * from kaoshengInfo where year=‘2011’order by sfzh asc”。这是数据库查询语句,表示从kaoshengInfo这张数据表中查询,where year=‘2011’表示查询所有2011年的记录。3.小王为学校教务处编写了一个排考场座位的VB程序。考场采用“6排5列”共30人的模式。程序执行后,考生的考号与姓名显示在列表框List1中,单击“考场座位”按钮Command1,考场号与座位显示在Text1中,程序运行界面如图a所示,考生数据存放在数据库文件“kaochang.accdb”中,数据表如图b所示。/ 实现上述功能的VB程序如下,请回答下列问题:(1)当“Form_Load()”事件处理过程运行结束时,变量x的值为 。?(2)请在横线处填入合适的代码。Private Sub Command1_Click()Dim y As IntegerDim start As Integer ’考场第1位数据元素的下标Dim pa As Integer ’数据库导入VB时学生数据下标Dim pb As Integer ’考场座位数据下标Dim i As Integer,j As Integer,k As Integer,m As Integerstart=1pa=startrecCount=x-1If recCount Mod 30 <> 0 Then ① ? For i=1 To y ’将当前考生人数添加到30的整数倍 recCount=recCount+1 sName(recCount)=“” Next iEnd IfFor j=1 To recCount / 30 pa=start pb=start For i=1 To 30 kcsName(pb)=sName(pa) pb=pb+1 If i Mod 5=0 Then pa=start+i 5 Else ② ? End If Next i start=start+30Next jText1.Text=""start=1For k=1 To recCount / 30 m=start Text1.Text=Text1.Text+“第”+Str(k)+“考场”+vbCrLf ’vbCrLf为换行标志符,实现Text1中内容换行显示 For i=1 To 6 For j=1 To 5 Text1.Text=Text1.Text+“”+kcsName(m) m=m+1 Next j Text1.Text=Text1.Text+vbCrLf Next i Text1.Text=Text1.Text+vbCrLf+vbCrLf ③ ?Next kEnd SubPrivate Sub form_load()Dim myconn As New ADODB.ConnectionDim myrecord As New ADODB.Recordsetmyconn.ConnectionString=“provider=microsoft.ace.oledb.12.0;data source=e:kaochang.accdb”myconn.Openstrsql="select*from三中 "myrecord.Open strsql,myconn x=1 List1.AddItem“考号 姓名” List1.AddItem“--------------”Do While Not myrecord.EOF ’读取数据库数据,存入数组kh(x)、sName(x)中,代码略 List1.AddItem kh(x)+“ ”+sName(x) x=x+1 myrecord.MoveNextLoopmyrecord.CloseEnd Sub答案 (1)43(2)①y=30-recCount Mod 30②pa=pa+6③start=start+30解析 (1)数据库名称是kaochang.accdb,数据表名称是“三中”,注意数据表是没有扩展名的。变量x记录读取到的学生数据的数组下标,当x=42时,Do While Not myrecord.EOF是指到数据表的最后一条记录后退出循环,当前条件成立,还在数据表内,所以继续执行,x=x+1,x为43,跳出循环。(2)①If recCount Mod 30 <> 0 Then y=30-recCount Mod 30 For i=1 To y recCount=recCount+1 sName(recCount)=" " Next i End If选择嵌套循环结构的作用:首先判断学生人数是不是30的倍数,若不是,求出相差人数,通过循环结构将加入的数组元素赋值为空字符串。②If i Mod 5=0 Then pa=start+i 5 Else pa=pa+6 End If本段选择结构的作用:当i不是5的倍数时,是考场中的一行,根据题图示意,应该下标加6。③For k=1 To recCount / 30 m=start Text1.Text=Text1.Text+“第”+Str(k)+“考场”+vbCrLf ’vbCrLf为换行标志符,实现Text1中内容换行显示 For i=1 To 6 ’此处略 Next i Text1.Text=Text1.Text+vbCrLf+vbCrLf start=start+30 Next k此处程序段的作用:分考场显示学生姓名,For k=1 To recCount / 30表示根据考场个数确定循环次数。第2考场时,开始的kcsName数组下标加30。第6节 VB访问Access数据库真题再现选考题组 (2016浙江10月学考+选考,17,6分)小王与小李合作编写一个成绩统计的VB程序:小王编写一个过程,该过程从数据库读取某一指定科目的相关数据,存储在数组a中;小李编写一个过程,该过程依据数组a中的相关数据统计各班级平均分,小王与小李约定的数组a各元素含义如表所示。数组元素数组元素的含义a(1)存储班级数na(2)从a(2)到a(n+1)依次存储第1、第2、…、第n个班级的人数…a(n+1)a(n+2)从a(n+2)开始依次存储第1班每个学生的单科成绩,第2班每个学生的单科成绩、…、第n班每个学生的单科成绩……程序功能如下:在文本框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)33(2)Score.accdb(3)①n=a(1) ②sum=sum+a(p)或其他等价代码解析 本题属于难题,要求学生有较好的分析问题和处理问题的能力。主要考查利用VB对数组库中数据进行简单的统计。(1)本小题考查数组元素和数组下标的认识。数组元素a(n+1)存储的是第n个班级的人数。a(5)存储的是第4个班级的人数,其值为33。(2)本小题考查通过ADO对象中的Conn对象连接数据库。根据ConnectionString连接字符串,可知连接的数据库文件是Score.accdb。(3)本小题考查对数组中的数据进行统计的能力。①确定需要统计的班级数,n的值从a(1)中读入,即n=a(1)。②统计出每一个班级全体同学指定科目的成绩总分sum。这里是一个累加运算。当前数组下标的位置是p,a(p)是指当前位置读入的成绩,因此累加运算为sum=sum+a(p)。课件16张PPT。第6节 VB访问Access数据库一 通过ADO对象连接数据库二 通过Recordset对象获取数据表中的数据四 数据库访问的标准代码如下:教材研读三 算法在数据管理中的综合应用一、通过ADO对象连接数据库 ADO 是微软公司提供的一种应用程序访问数据库的编程接口。该接口包含了多个对象,其中Connection (连接)对象用于与数据库建立连接,在建立连接后,可以通过Recordset (记录集)对象获取数据表中的数据。 通过ADO 对象中的Connection 对象连接数据库,步骤如下(右边是对应的代码):教材研读说明:①conn 是定义的Connection 对象的名字。②ConnectionString 是连接字符串,它主要有两个属性:provider 是数据库引擎的名称;data source 是指定连接的数据库文件,该处“App.Path”表示程序文件所在的路径,“mydb.accdb”是数据库文件名。此处也可以用绝对路径,比如c:mydb.accdb。二、通过Recordset对象获取数据表中的数据 通过ADO 对象中的Recordset 对象读取数据库表中记录,步骤如下(右边是对应的代码): 说明:①rs 是定义的 Recordset 对象的名字。 ②select 语句是结构化查询语言 SQL 中常见的语句,主要用于从数据表中查询数据。“select*from info”表示从“info”这张表中读取所有的记录(通配符“*”表示所有,即All)。 ③“info”是表名。 ④打开 Recordset 时,若 Recordset 非空,则默认指向第一条记录。 ⑤EOF 属性:若当前记录的位置在最后的记录之后,则返回true,否则返回 false。EOF 相当于读取记录的结束标志。 ⑥rs.Fields(“zd”)返回当前记录中“zd”字段的值。rs.Fields(0)返回当前记录中第一个字段的值,如果第一个字段名为“zd”,则 rs.Fields(0) 与rs.Fields(“zd”) 返回值相同。依次类推,rs.Fields(1)表示返回第2个字段的值。 ⑦MoveNext 方法:指针移到下一条记录。 ⑧这段代码应该在连接数据库后,关闭数据库前。三、算法在数据管理中的综合应用 VB 程序获取到的 Access 数据库表中的数据,可采用数组等方式进行存储,并可以通过编程对这些数据进行各种加工处理,如统计、分析、查找、排序等。四、数据库访问的标准代码如下:?Dim conn As New ADODB.ConnectionDim rs As New ADODB.Recordsetconn.ConnectionString=“provider=Microsoft.ACE.OLEDB.12.0;data source=“& App.Path &”computer.accdb” ??????数据库文件名为:computer.accdbconn.Openset rs.ActiveConnection=connrs.Open “SELECT * FROM info”??????数据表名为:infon=0Do While Not rs.EOF n=n+1 a(n)=rs.Fields(“xh”)??????Fields(“xh”)表示读取“xh”字段的值,此处等同于Fields(0) b(n)=rs.Fields(“jg”) ??Fields(“jg”)表示读取“jg”字段的值,此处等同于Fields(2) rs.MoveNextLooprs.Closeconn.closeset rs=nothingset conn=nothing 有一Access数据库“school.accdb”存放在f:2015mtvb文件夹中,其中的“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:2015mtvb(1) school.accdb ”adocn.Open str1str2=“select * from students where num=”+Text1.Textadors.Open str2,adocn,adOpenDynamic,adLockOptimisticIf adors.EOF=True Then MsgBox “你输入的学号不存在”Else Text2.Text=adors.Fields(“name”).Value Text3.Text=adors.Fields(“sex”).Value(2) Text4.Text=adors.Fields(“score ”).Value ?End If adors.Close adocn.CloseEnd Sub为了实现上述目标,在划线处填入合适的语句或表达式:(1) ????。(2) ????。解析 本题主要考查数据库的访问方法。(1)划线(1)处代码设置连接数据库的字符串,“data source”是指被连接的数据库文件。(2)划线(2)处代码是在文本框Text4中输出分数。 展开更多...... 收起↑ 资源列表 教师备用题库.docx 模拟演练.docx 真题再现.docx 第6节 VB访问Access数据库.pptx