题型:综合题 题类:常考题 难易度:困难
浙江省杭州市2016年信息技术高考模拟卷十三
注:BMI指数的计算公式为:BMI=体重(千克)除以身高(米)的平方(kg/m2)。 BMI<18.5为偏瘦(表明营养不足);BMI=18.5~24.9为体重正常;BMI=25~29.9为超重;BMI>30为肥胖。
该VB应用程序的代码如下:
Dim stuBMI(1 To 55) As Single
Dim stuName(1 To 55) As String
Private Sub Command1_Click()
Dim k As Integer, i As Integer, j As Integer
Dim t1 As Single, t2 As String
Dim Results As String
For i = 1 To 54
For j = i + 1 To 55
If stuBMI(j) < stuBMI(k) then ②
Next j
If k<>I Then
t1 = stuBMI(i): stuBMI(i) = stuBMI(k): stuBMI(k) = t1
t2 = stuName(i): stuName(i) = stuName(k): stuName(k) = t2
End If
Next i
List1.AddItem "姓名" + vbTab + "BMI指数" + vbTab + "结果"
For i = 1 To 55
If stuBMI(i) < 18.5 Then
Results = "偏瘦"
ElseIf stuBMI(i) >= 18.5 And stuBMI(i) < 25 Then
Results = "正常"
ElseIf stuBMI(i) >= 25 And stuBMI(i) < 30 Then
Results = "超重"
Else
Results = "肥胖"
End If
List1.AddItem stuName(i) + vbTab + str(stuBMI(i)) + vbTab + Results
Next i
End Sub
Private Sub Form_load()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
Dim i As Integer
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + App.Path + "\Student.accdb"
conn.Open
strSQL = "SELECT * FROM Student"
Set rs.ActiveConnection = conn
rs.Open strSQL
i = 0
Do While Not rs.EOF
i = i + 1
stuName(i) = rs.Fields("StuName")
stuBMI(i) = Round(rs.Fields("Weight") / rs.Fields("height") ^ 2, 1)
rs.MoveNext
Loop
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub
⑴预处理。用数组a存放不同的分值,数组b存放相同分数的人数,数组s存放高于此分数的人数,数组下标表示名次。依次从数据库读取每个学生的成绩(数据库中每个学生的成绩已降序存储,即从高到低排列),当读入数与前一个数相同时,该名次的人数加1,当读入数与前一个数不同时,名次加1,即数组下标加1,存储当前分数,求高于本分数的人数并存储。
举例:如果数据库中有一组成绩(降序):95,95,93,93,92,91,90,按上述算法处理,三个数组的最终结果如图所示。
数组/下标 | 1 | 2 | 3 | 4 | 5 |
a | 95 | 93 | 92 | 91 | 90 |
b | 2 | 2 | 1 | 1 | 1 |
s | 0 | 2 | 4 | 5 | 6 |
⑵对需要查找的成绩二分查找。读入需要查找的成绩x,在数组a中二分查找成绩,若找到,输出名次、相同分数的人数和高于本分数的人数;若找不到,输出“查无此分”。
程序代码如下,在横线处填入合适的代码。
Dim rank As Integer
Dim a(1 to 1000) As Integer ‘存放不同的分数值
Dim b(1 to 1000) As Integer ‘存放相同分数的人数
Dim s(1 to 1000) As Integer ‘存放高于此分数的人数
rank=0
Private 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={#blank#}1{#/blank#} ‘名次增加1
a(rank)={#blank#}2{#/blank#} ‘存储当前分数到数组a中
s(rank)={#blank#}3{#/blank#} ‘求高于本分数的人数并存储至数组s
b(rank)=1 ‘将自身统计入同分人数
End If
{#blank#}4{#/blank#} ‘更新上一个分数
rs.Movenext
Loop
End Sub
Private 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 {#blank#}5{#/blank#}
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 If
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),故无需做交换操作。此时新元素已经放到了正确的位置,新的大根堆构造完成,上移行动结束。
试题篮