试题

试题 试卷

logo

题型:综合题 题类:常考题 难易度:困难

浙江省高中信息技术 VB访问Access数据库同步练习

编写一个成绩查找程序,只要输入成绩,即可输出其排名、同分数的人数以及比此分高的人数。具体算法思路如下:

⑴预处理。用数组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=    ‘名次增加1

    a(rank)=   ‘存储当前分数到数组a中

    s(rank)=   ‘求高于本分数的人数并存储至数组s

    b(rank)=1     ‘将自身统计入同分人数

   End If

        ‘更新上一个分数

  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

    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

举一反三
小朋友拍照:有来自K(1<=K<=20)个不同国家的N(1<=N<=100)个小朋友排成一行准备拍照。国籍用数字1,2,3……K表示,每个小朋友的国籍依次存入数组a(1)到a(N)。由于小朋友太多,没有办法全部被拍入。摄像师决定拍摄一段连续区间内的小朋友,这个区间内每种国籍的小朋友至少要有1个,求满足要求的最小区间长度。

例如有10个小朋友,5种国籍,从左到右排列,国籍编号依次是2,1,2,4,3,3,5,5,3,5,则最小的一段包含所有5种国籍的区间是从第2个到第7个小朋友,区间长度为6。

算法解析:区间的长度至少为K(国籍的数量),最大为N(小朋友的数量)。我们可以通过二分K到N之间的求得最小区间长度。

实现上述功能的VB代码如下,但加框处代码有错,请改正。

Dim a(1 To 100) As Integer   '依次存储为1到100的小朋友的国籍编号

Dim K As Integer

Dim N As Integer

Private Sub Form_Load()   '窗体加载,生成数据

'产生N的值,表示人数

'产生K的值,表示国籍种数

'产生编号为1到N的小朋友的国籍编号,并存储在数组a中

'代码略

End Sub

Private Sub Command1_Click()    '使用二分的思想计算最小区间

Dim M As Integer

i = K: j = N       '答案的范围为K到N,即最少K,最多N个小朋友

Do While i <= j   

    M = (i + j) \ 2     '二分,求中间值

    If pd(M) = True Then   '调用Pd函数,判断区间长度为M时,是否包含所有国籍

      j = M – 1 

      ans = M        '若以M为区间长度可包含所有国籍,更新答案

    Else

      i =           '第①处错误

    End If

Loop

Text1.Text = Str(ans)

End Sub

Function pd(M As Integer) As Boolean

Dim f(1 To 20) As Integer  'f(i)表示国籍为i的小朋友是否包含

Dim t As Integer           't用于统计当前区间包含的国籍数量

pd = False

For i = 1 To N - M + 1     '枚举以i为起点的M个小朋友中,各个国籍是否包含

    For j = i To i + M - 1

      f(a(j)) = 1            '等于1,表示国籍为a(j)的小朋友已包含,0表示不包含

    Next j

    t = 0

    For j = 1 To K      '统计已包含的国籍的数量

      t =          '第②处错误

    Next j

    If t = K Then pd = True: Exit Function           '若包含K个国籍,返回True

    For j = 1 To K     'f数组元素重新初始化为0

      f(j) = 0

    Next j

Next i

End Function

小明利用所学的知识帮助语文老师设计一个语文学考等级查询系统,要求如下:输入某个等级,就能查出该等级的所有学生学号和姓名,并统计出该等级学生的人数,以便语文老师方便了解学生的学考情况。语文学考成绩分A、B、C、D、E五个等级,学生信息存储在数据库文件“stugrade.accdb”的数据表“Chinese”中,数据表“Chinese”的结构如图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

返回首页

试题篮