您的当前位置:首页正文

高考信息技术大一轮优选(课件+习题) (37)

来源:个人技术集锦


第6节 VB访问Access数据库

模拟演练

1.最新国际体操竞赛的评分规则简单描述如下:

①两位D组裁判分别打“难度分”,取平均值作为该参赛选手的最终难度分。 ②五位E组裁判分别打“完成分”,在5个E组打分结果中,去掉一个最高分和一个最低分,然后取平均值作为该参赛选手的最终完成分。 ③难度分和完成分之和,即该参赛选手的最终得分。 例如:某参赛选手打分如下:

D组裁判打分 E组裁判打分 6.5 6.9 9.5 9.0 8.3 8.8 7.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) 存储参赛人数n a(1) … a(7)

数组元素的含义 a(1)和a(2)为第1位选手的D组两位裁判的打分。 a(3)、a(4)、…、a(7)为第1位选手的E组五位裁判的打分

a(8) … a(14) … a(8)和 a(9)为第2位选手的D组两位裁判的打分。 a(10)、a(11)、…、a(14)为第2位选手的E组五位裁判的打分 … 实现上述功能的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; source=”+“成绩.accdb” conn.Open

Set rs.ActiveConnection=conn ’本过程的其他语句略 End Sub

Private Sub Command2_Click()

’依据数组a中的相关数据统计各班级平均分

Dim i As Integer, j As Integer, n As Integer, p As Integer Dim max As Single, min As Single, sum Single ① For i=1 To n

data

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 i End 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 String Dim b (1 To 2000 ) As String Private Sub Form_Load( ) Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim constr As string

constr=“Provider=Microsoft.ace.OLEDB.12.0;”

constr=constr &“Data Source=” & App.Path+“\\data\\KaoSheng.accdb” conn.ConnectionString=constr conn.open() Dim sql As String

’将参加2010年下半年考试的考生的身份证号码按升序存放在a数组中 sql=“select * from kaoshengInfo where year=‘2010’order by sfzh asc”

rs.Open sql,conn i=0

Do While Not rs.EOF i=i+1

a(i)=rs(“sfzh”) List1.additem(a(i)) rs.MoveNext Loop

’将参加2011年下半年考试的考生的身份证号码按升序存放在b数组中 sql=“select * from kaoshengInfo where year=‘2011’order by sfzh asc” rs.Open sql,conn i=0

Do While Not rs.EOF i=i+1

b(i)=rs(“sfzh”) List2.additem(b(i)) rs.MoveNext Loop rs.Close End Sub

Private Sub Command1_Click ()

Dim bot As Integer , top As Integer , m Dim 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

As Integer

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 Integer

Dim 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 Integer start=1 pa=start recCount=x-1

If recCount Mod 30 <> 0 Then ①

For i=1 To y ’将当前考生人数添加到30的整数倍 recCount=recCount+1 sName(recCount)=“” Next i End If

For 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+30 Next j Text1.Text=\"\"

start=1

For 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 k End Sub

Private Sub form_load()

Dim myconn As New ADODB.Connection Dim myrecord As New ADODB.Recordset

myconn.ConnectionString=“provider=microsoft.ace.oledb.12.0;data source=e:\\kaochang.accdb” myconn.Open

strsql=\"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.MoveNext Loop

myrecord.Close End 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。

因篇幅问题不能全部显示,请点此查看更多更全内容