题型:综合题 题类:常考题 难易度:困难
【bj】高中信息技术综合库——利用数据库管理信息1
数据库文件“stud. accdb”信息如图所示。
程序界面如图所示,左边列表框List1中显示所有学生信息(包括编号和完成次数),单击“排序”按钮(Command),所有编号按照作业完成次数从高到低显示在列表框List2中。
代码如下:
Dim conn As New ADODB. Connection
Dim rs As New ADODB. Recordset
Dim n As Integer
Dim a(500)As String
Dim b(500)As Integer
Private Sub Fom Load()
Dim i As Integer
conn. Connection String="Provider=Mi-crosoft. AC
A.OLEDB. 12.0;DATA Source="& App. Path &"\stud. accdb"
conn Open
Set rs. Active Connection=conn
rs. Open "Select*From info"
n=0
Do While not rs.EOF '到记录集最后一条记录后退出循环
n=n+1
a(n)=rs. fields("id")
b(n)=rs. fields("finshed")
rs. MoveNext '移动到下一条记录
Loop
For i=1 To n
List1. AddItem a(i)+" "+Str(b(i))
Next i
rs. Close
conn. Close
Set rs= Nothing
Set conn= Nothing
End sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, t1 As Integer, t2 As String, k As Integer
For i=1 To n-1 'n表示学生总数
k=i 'k保存第i大的数,一开始假定是a(i)
For j=i+1 To n
If b(k)<b(j) Then k=j '比较完成数
①
If ② Then
t1=b(i): b(i)=b(k): b(k)=t1 '交换完成次数
t2=a(i): a(i)=a(k): a(k)=t2 '交换编号
End If
Next j
Next i
For i=1 To n '在列表框List2中输出排序结果
Listt2. Addltem a(i)+" "+Str(b(i))
Next i
End sub
假如我们用数组表示上述大根堆:
a(1) |
a(2) |
a(3) |
a(4) |
a(5) |
a(6) |
a(7) |
a(8) |
a(9) |
9 |
6 |
8 |
5 |
3 |
4 |
7 |
2 |
1 |
现有一算法把一个无序数组改造成大根堆。例如:我们在上图的大根堆中再增加一个值为8的新元素,如下图所示。
数组存储为:
a(2) |
a(3) |
a(4) |
a(5) |
a(6) |
a(7) |
a(8) |
a(9) |
a(10) |
6 |
8 |
5 |
3 |
4 |
7 |
2 |
1 |
8 |
具体操作方法如下:
第一步:因为a(10)大于它的双亲结点a(5),故需交换a(10)和a(5)的值;
数组存储为:
第二步:因为a(5)大于它的双亲结点a(2),故需交换a(5)和a(2)(t)值;
数组存储为:
a(1) |
a(2) |
a(3) |
a(4) |
a(5) |
a(6) |
a(7) |
a(8) |
a(9) |
a(10) |
9 |
8 |
8 |
5 |
6 |
4 |
7 |
2 |
1 |
3 |
第3步:因为a(2)不大于它的双亲结点a(1),故无需做交换操作。此时新元素已经放到了正确的位置,新的大根堆构造完成,上移行动结束。
试题篮