题型:综合题 题类:模拟题 难易度:困难
浙江省杭州市2015年高考模拟命题比赛信息技术(1)
VB程序运行界面如图2所示,在文本框Text1中输入查询的等级,单击“查询”按钮Command1,在列表框List1中显示所有该等级的学生学号和姓名,并按照学号从小到大排序,并在标签Label2处显示学生的人数,如果人数为0,则在列表框中显示“没有该等级的学生”。按此要求编写程序如下,但加框处代码有错误,请改正。
Private Sub Command1_Click()
Dim stuna(1 To 100) As String '存放学生姓名的数组定义为stuna
Dim stunum(1 To 100) As String '存放学生学号的数组定义为stunum
Dim i As Integer, j As Integer, n As Integer
Dim t As String
'连接数据库
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + App.Path + "\stugrade.accdb"
cn.Open
strSQL = "select * from Chinese where 语文等级='" + Text1.Text + "'"
Set rs.ActiveConnection = cn
rs.Open strSQL
n = 0
Do While Not rs.EOF
n = n + 1
stuna(n) = rs.Fields("姓名").Value
stunum(n) = rs.Fields("学号").Value
rs.NextMove '①
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
List1.Clear '清除列表框
If n = 0 Then
List1.AddItem "没有该等级的学生"
Else
For i = 1 To n - 1 '按姓名排序
For j = n To i + 1 Step -1
If stuna(j) < stuna(j - 1) Then '②
t = stunum(j): stunum(j) = stunum(j - 1): stunum(j - 1) = t
t = stuna(j): stuna(j) = stuna(j - 1): stuna(j - 1) = t
End If
Next j
Next i
For i = 1 To n
List1.AddItem stunum(i) + " " + stuna(i)
Next i
Label2.Caption = "该等级的学生共有" + Str(n) + "名"
End If
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
分数 |
0~59 |
60~69 |
70~79 |
80~89 |
90~99 |
等级 |
E级 |
D级 |
C级 |
B级 |
A级 |
现要求根据上表统计出各等级学生人数占总人数的比例。小李编写了一个VB程序帮助老师实现该功能:程序运行时,将每位学生的得分(两位整数)存储到数组a中,并在列表框List1
中显示。单击“统计”按钮后,在列表框List2中显示从A级至E级,各等级的人数占总人数的百分比例(四舍五入保留整数)。程序运行界面如图所示:
请阅读代码,并回答以下问题:
Dim n As Integer
Dim a(1 To 50) As Integer
Private Sub Form_Load( )
Dim adocn As New ADODB. Connection
Dim adors As New ADODB. Recordset
Dim str1 As String
adocn.ConnectionString = "Provider = Microsof.ACE.OLEDB.12.0;Data source=" +App. Path +”\school. accdb”
adocn. Open
str1 =“select * from students”
ardors.Open str1, adocn
'将每个学生的得分读入数组a中,并在列表框list1中显示,统计学生总人数n
'代码略
End Sub
Private Sub Comd1_C1ick( )
Dim cou As Integer,k as Integer
Dim b(0 To 4) As Integer
Const dj = “A级B级C级D级E级”
For i=1 Ton
k=a(i)\10-5
If k<0 Then ①
b(k)= b(k) + 1
Next i
For i=0 To 4
cou = '⑶改错
List2. AddItem ② + Str(cou) +“%”
Next i
End Sub
试题篮