4.3 非数值计算 知识点题库

某对分查找算法的VB程序段如下:

i=l:j=9:n=0

key=Val(Text1,Text)

Do While i<=j

  n=n+1

  m=Fix((i+j) / 2)

  If key=d(m) Then Exit Do            ‘Exit Do表示退出循环

  If key<d(m) Then j=m-1 Else i=m+1

Loop

数组元素d(1)到d(9)的值依次为“7,12,18,25,39,58,61,72,86”。若该程序段运行结束后,n的值为2,则key的值是(  )

A . 39 B . 18 或61 C . 18 或72 D . 12 或61
如图a所示的“学生信息”数据表中存储着全校学生的“7选3”选课信息杰克同学编写了一个VB程序,用于查询每个同学的选考科目,程序运行界面如图b所示。

程序运行时,在文本框Text1中输入学号,单击“开始查询”按钮(Command1),在“查询结果”区域显示查询到的学生姓名和选考科目数据。

学校共有n名学生,数组a、b分别保存了所有学生的学号和姓名信息。数据库数据按学号从小到大排列,第i个学生的学号保存在a(i),对应的姓名保存在b(i),该学生的选考科目保存在c(i)中。

实现上述算法的VB程序如下,在程序划线处填入适当的代码,把程序补充完整。

Dim n As Integer, a( 1000 ) As String

Dim b ( 1000 ) As String

Private Sub Command1_Click ( )

Dim x As String, pos As Integer

Dim conn As New ADODB Connection, rs As New ADODB. Recordset

conn ConnectionString = “provider = Microsoft. ACE OLEDB. 12.0; data source = “ & App. Path &" \students. accdb”

conn. Open

Set rs. ActiveConnection = conn

rs.Open “学生信息”

n = 0    ‘考生数初始化

Do While Not rs. EOF

  n=n+1

  a(n) = rs Fields (0): b(n) = rs Fields (1): c(n) = rs Fields(2)

       ①      

Loop

x= Text. Text

     ②     

If pos > 0 Then

  Text2 Text = b(pos):Text3 Text = c(pos)

Else

  Text2.Text= “找不到” : Text3.Text =“”

End if

End Sub

Function Search(Key As string) As Integer

Dim i As Integer, j As Integer, m As Integer

i = 1: j = n: Search = 0

Do While i < = j

  m = Fix((1+j) / 2)

  If Key = a(m) Then

         ③      

    Exit Function

  ElseIf a(m) > Key Then

    j = m-1

  Else

    i=m+1

  End If

Loop

End Function

 ② ③ 

有如下VB程序段:

Dim i As Integer, sum As Integer

Dim a(1 To 6) As Integer, b(1 To 6) As Integer

sum = 0

a(6) = 18: a(5) = 7: b(6) = 14: b(5) = 16

For i = 4 To 1 Step -1

 a(i) = a(i + 2) - a(i + 1)

 b(i) = b(i + 2) - a(i)

 If b(i) Mod 3 = 0 Then sum = sum + b(i)

Next i

Text1.Text = Str(sum)

该程序段运行后,文本框Text1中显示的内容是(  )

A . 39 B . 30 C . -9 D . 12
给定任意的查找键,在序列3,5,8,12,15,23中进行查找,下列说法不正确的是(  )
A . 若用顺序查找实现,则最少查找1次 B . 若用对分查找实现,则最少查找1次 C . 若用顺序查找实现,则最多查找6次 D . 若用对分查找实现,则最多查找4次
(郊游活动)有n名同学参加学校组织的郊游活动,已知学校提供给这n名同学的郊游总经费为cnt元,与此同时每位同学都自带了部分钱。为了方便郊游,活动地点提供m(n<=m<=100)辆自行车供人租用,租用每辆自行车也需要花费钱,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。

租车原则是首先考虑自带经费多的部分同学优先租相对花费少的自行车,尽量少花学校经费以达到最多同学租车的结果。比如学生带的钱为9,3,6,7,5,租车的钱分别需要15,8,12,6,9,11,如果5个人都能租车,至少需要学校提供经费为(6-3)+(8-5)+(9-6)+(11-7)+(12-9)=16,如果学校经费只有10元,则自带钱最少的同学不租车,这时所需学校经费为(6-5)+(8-6)+(9-7)+(11-9)=7。计算过程中采用二分查找法来判断租用自行车的人数能否达到最大值。

  1. (1) 若7位同学自带经费分别为5,17,15,12,10,9,14,自行车租车费用分别为27,14,27,25,17,18,23,21,学校提供经费为25元,则最多有位同学能够租用到自行车。
  2. (2) VB程序代码如下,请在划线处填入合适的代码。

    Dim a( 1 To 100) As Integer, b( 1 To 100) As Integer

    Dim n As Integer, m As Integer

    Private Sub Command1_Click() 

      Dim left As Integer, right As Integer, mid As Integer, an s As Integer

      n=Val(Text 1.Text) :m=Val(Text 2.Text)

    ‘从数据库读取n位同学带的钱存储在数组a,m辆自行车租用的钱存储在数组b,代码略。

    Call px(a(),n)

    Call px(b(),m)

    left =1:right=n:ans= 0

    Do While left<=right

      mid=(left+right) \ 2

      If check(mid) =True Then

        ① 

        right =mid-1

      Else

        left =mid+ 1

      End If

    Loop

    Label 1.Caption=“能租车的最大人数为”+Str(ans)

    End Sub

    Sub px(d() As Integer, s As Integer)

      Dimi as integer, j as integer, k as integer

      For i=2Tos

        k=d(i)

        j=i-1

       Do While k<d(j)

         d(j+1)=d(j)

         j=j-1

         If j=0ThenExitDo

      Loop

        ②  

      Next i

    End Sub

    Function check(mid As Integer) As Boolean

      Dim cnt As Integer, jf As Integer, t As Integer

      cnt=Val(Text 3.Text)

    For t=1Ton-mid+ 1

        If b(t) >a(mid+t-1) Then jf=b(t) -a(mid+t-1) Else jf= 0

          ③ 

      Next t

      If cnt>= 0 Then check=True

    End Function

     ② ③ 

删除字符串中的非字母字符,并查找出ASCII码值最大的字母。程序功能如下: 在文本框Text1中输入一个字符串,单击命令按钮Command1,在文本框Text2中显示删除非字母字符后的字符串,在文本框Text3中显示ASCII码值最大的字母,运行界面如图所示。

  1. (1) 程序中的Command1_Click()属于。(单选,填代码:A .对象名/B .事件名/C .属性名/D .事件处理过程名)
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Private Sub Command1_Click()

    Dim result As String, s As String, c As String, cmax as string

    Dim i As Integer, j As Integer

    s = Text1.Text

    Text2.Text = ""

    For i = 1 To Len(s)

    If c >= "A" And c <= "Z" Or c >= "a" And c <= "z" Then

    result =②

    End If

    Next i

    Text2.Text = result

    j = 2

    cmax = Mid(result, 1, 1)

    Do While j <= Len(result)

    If Mid(result, j, 1) > cmax Then cmax = Mid(result, j, 1)

    Loop

    Text3.Text = cmax

    End Sub

编写了一个寻找最长连续相同子串的程序,功能如下:程序运行时,在文本框Text1中输入一个非降序字符串。单击输出按钮Command1后,在文本框text2上显示最长相同子串。程序运行界面如图所示。

  1. (1) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click()

    Dim a(1 To 100) As String, s As String

    Dim i As Integer, m As Integer, n As Integer, pos As Integer

    Dim L As Integer, R As Integer, length As Integer, Max As Integer

    s = Text1.Text

    n = Len(s)

    For i = 1 To n

     a(i) = Mid(s, i, 1)

    Next i

    For i = 1 To n

     L = i + 1: R = n

     Do While L <= R

     m = (L + R) \ 2

     If Then

     L = m + 1

     Else

     R = m - 1

     End If

     Loop

     If length > Max Then

     Max = length : pos = i

     End If

     i = i + length - 1

    Next i

    Text2.Text =

    End Sub

  2. (2) 上述程序段中加框处代码有误,请改正。
  3. (3) 若文本框Text1中输入的非降字符串是“00111222”,执行这段程序后,文本框Text2中输出的内容是
二分查找又称折半查找,是一种应用于有序数列的高效查找算法。下列数列中适合二分查找算法的是(     )
A . 85    78    59    53    19    18 B . 67    62    68    4     1    17 C . 11    99    4    25    3     39 D . 43    71    78   81    6     55
结合分治策略,递归也可以用三个字概况。分:将原有问题成K个子问题;治:对这K个子问题。如果子问题的规模仍然不够小,则将其再分解为K个子问题,如此进行下去,直到问题足够小时,就很容易求出子问题的解。合:将求出的小规模问题的解为一个更大规模问题的解,自下而上逐步求出原问题的解。
查找并删除重复数据的算法是基于顺序查找的优化,主要思路是把待查数据的起点元素设置成查找关键字,然后从后往前查找,通过结束时所停留的数据位置来判断查找结果(即结束时若停留在数据序列的起点,则表示数据序列中无重复数据;否则,存在重复数据,删除该数据后继续查找)。

编写VB程序,实现上述算法。程序功能如下:运行程序时,在列表框List1中显示数组a中的原始数据,并在列表框List2中输出去重后的数组a中的数据,即相同的数据仅保留一个。同时在标签Label1中显示删除的数据总个数,运行效果如图所示,程序代码如下:

Const maxn=10

Dim a(1 To maxn)As Integer

Private Sub Form_Load( )

´maxn个数据在数组a中,并在列表框List1中显示

End Sub

Private Sub Command1_Click( )

  Dim i As Integer, n As Integer       ‘n用于存储当前查找的数字长度

  Dim j As Integer, key As Integer       ‘key用于存储本次查找的关键字的数据位置

    key=1:n=maxn

    Do While key<=n

    i=n-1

    Do While       ‘①

        i=i-1

    Loop

    If i=key Then        ‘找到重复数据,删除;未找到,设定下一查找关键字

       key=key+1

    Else

      For j=i To n-1

          a(j)=a(j+1)

      Next j

      n=n-1

    End If

  Loop

  For i= 1To n

      List2.AddItem a(i)

  Next i

  Labell.Caption="共删除重复数据:"&___________&"个"

End Sub

  1. (1) 程序代码“Sub Form_Load( )”中,Load是(单选,填字母:A .属性名/B .事件名/C .方法名/D .类名)。
  2. (2) 程序代码中,加框处循环条件有误,请改正。
  3. (3) 请将程序代码中的画线处赋值语句补充完整。
  4. (4) 如图所示的原始数据中,重复数是“1,7,10”,该程序运行时,最先删除的重复数是
用对分查找法和顺序查找法在数字序列“1,2,3,5,8,13,21,34,55”中查找数字13,两种方法都能访问到的数字是(  )
A . 3 B . 5 C . 8 D . 34
根据对分查找的思想来查找两个递增序列中最小值所在的位置,其中第一个递增序列中的数据全部大于第二个递增序列中的数据,且两个序列中没有重复数据,如组合序列3、4、5、6、1、2是由两个递增序列“3、4、5、6”和“1、2”组成的,组合序列的最小值是1,在组合序列中的位置是第5位。

为实现上述功能,小王编写如下VB程序,首先在Text1中输入两个满足条件的序列,数字之间用“,”隔开且以“,”结尾,单击按钮“Cod1”,在Text2中输出最小值所在序列中的位置,程序运行界面如下图所示。

图片_x0020_100008

  1. (1) 在界面中,具有Caption属性的对象有个。
  2. (2) 在横线处填入合适的代码。

    Private Sub Cod1_Click( )

        Dim s As String, ch As String

        Dim i As Integer, j As Integer, n As Integer, c As Integer

        Dim a(100) As Integer

        s = Text1.Text: c = 0: n = 0

        For i = 1 To Len(s)

            ch = Mid(s, i, 1)

            If ch >= "0" And ch <= "9" Then

                

            Else

                n = n + 1

               

                c = 0

            End If

        Next i

        i = 1: j = n

        Do While 图片_x0020_100009

            m = (i + j) \ 2

            If a(m) > a(i) Then

                i = m

            Else

                j = m

            End If

        Loop

       

    End Sub

  3. (3) 加框处的表达式有误,请改正。
数组a中存储的是两个数列交替排序的n个正整数,下标为奇数的数组元素都是奇数且为升序排列,下标为偶数的数组元素都是偶数且为降序排列。排序示例如下。

a(1)

a(2)

a(3)

a(4)

a(5)

a(6)

a(7)

a(8)

a(9)

a(10)

1

10

3

8

5

6

7

4

9

2

依据对分查找思想,设计一个在数组a中查找数据key的程序,实现该功能的VB程序如下,请回答下列问题:

Private Sub Search_Click()

    Const n = 10

    Dim a(1 To n) As Integer

    Dim i As Integer, j As Integer, m As Integer, f As Boolean, key As Integer

    '读取一组正整数,按上述规则存入数组 a 中。代码略

    key = Val(Text1.Text)

    If key Mod 2 = 1 Then i = 1 Else i = 2

    j = n :f = False

    Do While i <= j And Not f

        If key Mod 2 = 0 Then

            m = (i + j) \ 2 - (i + j) \ 2 Mod 2

        Else

            m =     ①   

        End If

        If key = a(m) Then

            f = True

        ElseIf   Then

            j = m - 2

        Else

            i =     ②    

        End If

    Loop

    If f Then Label1.Caption = Str(m) Else Label1.Caption = "不存在"

End Sub

  1. (1) 观察程序代码,该事件处理过程名为
  2. (2) 程序加框处代码有错,请改正。
  3. (3) 请在划线处填入合适的代码。

     ② 

有如下VB程序段:

key =Int(Rnd()*17+2)

i = 1: j = 9

Do While i <= j

    m = (i + j) \ 2

    If a(m) <= key Then i = m + 1 Else j = m - 1

Loop

Label1.Caption = str(i)

数组元素a(1)到a(9)的值依次为“2,4,6,8,10,12,14,16,18”,执行上述程序段后,在Label1中显示的内容不可能是(    )

A . 1 B . 2 C . 5 D . 10
对线性表进行二分查找时,要求线性表必须(    )
A . 以顺序方式存储 B . 以顺序方式存储,且数据元素有序 C . 以链接方式存储 D . 以链接方式存储,且数据元素有序
有如下VB程序段:

key = Val(Text1.Text): cnt=10

For i = 1 To cnt - 1

    n = key - a(i)

    L = i + 1: R = cnt

    Do While L <= R

        m = (L + R) \ 2

        If a(m) = n Then Exit Do

        If a(m) > n Then R = m - 1 Else L = m + 1

    Loop

    If L <= R Then Text2.Text = Str(key - a(m)) + "," + Str(a(m))

Next i

在数组a(1)~a(10)中存储的数据依次为“1,4,9,16,25,36,49,64,81,100”,在Text1中输入一个不大于200的数,执行该程序后,Text2中显示的内容可能是(   )

A . 1,99 B . 36,64 C . 81,25 D . 100,100
某对分查找算法的VB程序段如下:

For i=1 To 15

    a(i) = i

Next i

key = Int (Rnd * 20)

i = 1:j=15:n=0

Do While i<=j

    m=(i+j+1)\2

    If a(m)< key Then i=m +1 Else j=m-1

    n=n+1

Loop

执行该程序段后,变量n的值可能是(    )

A . 1 B . 2 C . 3 D . 4
某对分查找算法的VB程序如下:

key=         

i = 1: j = 10

Do While i <= j

    m = (i + j) \ 2

    If a(m) < Key Then

        i = m + 1: n = n + 1

    Else

        j = m - 1: n = n - 1

    End If

Loop

数组元素a(1)到a(10)的值依次是“2,2,4,6,9,15,15,20,25,30”若n值为2,则key的值可能为(   )

A . 6或16 B . 5或 8 C . 10或15 D . 17或29
下列描述的场景与处理方法使用不恰当的是(  )
A . 分析前一年的高铁客流数据优化高铁运行采用批处理计算 B . 京东网双12通过实时分析用户行为实现商品的推荐采用流计算 C . 图计算为腾讯超大规模社交网络图数据的各类计算提供支撑 D . 分析近五年的信息技术选考试卷梳理高频考点采用流计算
“轮转后有序数组(RotatedSortedArray)”是将有序数组取其中某一个数为分割点,将其之前的所有数都轮转到数组的末尾所得。比如{7,11,13,17,2,3,5}就是一个轮转后的有序数组,原有序数组中的子串{2,3,5}被轮转到了数组的末尾处。对于一个轮转后有序数组arr也可以进行二分查找,算法思路如下(以升序为例):每次根据查找的左侧位置L和右侧位置R求出中间位置M后,M左边[L, M]和右边[M+1,R]这两部分中至少一个是有序的(可根据中间位置数据和边界数据的大小关系判断)。

arr[M]和待查找数据Key比较

①arr[M]=Key,返回M的值

②若M位置的右侧有序,当待查找数据在右侧,则下次在右侧查找,否则在M左侧查找

③若M位置的左侧有序,当待查找数据在左侧,则下次在左侧查找,否则在M右侧查找

  1. (1) 对于轮转后有序数组{ 7,11,13,17,2,3,5}使用以上函数search( )查找key值3,所需要的查找次数为
  2. (2) 以下VB函数Search()实现了对轮转后有序数组arr进行二分查找的过程,如果查询成功,返回m值,查询失败则返回- 1。请补充程序中划线处的代码:

    Function Search (key As Integer, L As Integer, R As Integer) As Integer

        

        Do While L <=R And Search=- 1

            M=(L+ R)\2

            If arr(M)= key Then

                Search= M

            Else

                If Then

                    If arr(L)<=key And key <arr(M) Then

                        R=M-1

                    Else

                        L=M+1

                    End If

                Else

                    If  Then

                        L=M+1

                    Else

                        R=M- 1

                    End If

                End If

            End If

        Loop

    End Function