查找算法及程序实现 知识点题库

有 VB 程序段如下:

a(1) = 2: a(2) = 2: a(3) = 5: a(4) = 6: a(5) = 7

Key = 2

i = 1: j = 5: flag = False Do While i <= j And Not flag

m = (i + j) \ 2 If Key = a(m) Then

s = "找到第" + Str(m) + "个" flag = True: Exit Do

ElseIf Key < a(m) Then j = m - 1

Else

i = m + 1 End If

s = Str(m) + s Loop Label1.Caption = s

执行该程序段后,在标签 Label1 中显示的内容是(   )

A . 1  3 B . 3  1 C . 找到第 1 个 D . 找到第 2 个
【加试题】将11个数据43、26、34、76、45、16、56、90、13、45、81依次存放在数组a(1)到a(11)中,部分VB程序段如下:

min=a(1)

n=Val(Text1.Text)

For i=n to 2 step -1

 If a(i)<min Then

min=a(i)

Next i  

Text2.Text=Str(min)

假设在文本框Text1中输入“8”,则文本框Text2输出的值是(  )

A . 90 B . 26 C . 16 D . 13
【加试题】维吉尼亚密码。如下图所示,分别用行和列表示待加密的字符(明文)和当前字符的密钥,行和列的交叉点的字符即为加密后的结果(密文)。在加密时,密文与明文的字母大小写形式保持一致,如:明文字母为大写,则加密后的密文字母也为大写;当密钥长度不足时重复使用密钥。

例如:当明文M=HelloWorld,密钥K=abc时,密文C=HfnlpYosnd。运算过程如下所示:

明文:HelloWorld

密钥:abcabcabca

密文:HfnlpYosnd

依据上述算法描述设计了如下VB程序。请回答下列问题:

  1. (1) 若明文是Jia,密钥是Pass,则输出的密文是:
  2. (2) 请在划线处填上合适的代码

    Const MIN_ASC = 65

    Function X2D(x As String) As String

      Dim s As String, zf As String, i As Integer

      s = ""

      For i = 1 To Len(x)

        zf = Mid(x, i, 1)

        If zf >= "a" And zf <= "z" Then

          s=s+

        Else

          s = s + zf

        End If

     Next i

     X2D = s

    End Function

    Private Sub Command1_Click()

    Dim M As String, K As String, C As String, flag As Boolean

    Dim i As Integer, t As Integer, ch As Integer, pos As Integer, j As Integer

    M = Text1.Text       '明文

    K = Text2.Text       '密钥

    t = Len(K)

    K = X2D(K)

    C = ""

    For i = 1 To Len(M)

      ch = Asc(Mid(M, i, 1))

      flag = False

      If ch >= 97 And ch <= 122 Then ch = ch - 32: flag = True

      pos=                  '密钥的字符位置值

      If pos = 0 Then pos = t

      j = Asc(Mid(K, pos, 1))      '密钥字符的ASCII值

      ch = ch - MIN_ASC

      j = j - MIN_ASC

      ch=

      ch = ch + MIN_ASC

      If flag Then ch = ch + 32     '设置字母的大小写形式

      C = C & Chr(ch)

    Next i

    Text3.Text = C

    End Sub

小明编写了一个数据插入程序。程序输入一个数字,将该数字插入一列有序数据:-5,3,4,12,20,45,70,并使数据序列保持有序。设计的算法是从前往后找位置插入。

Private Sub Command1_Click()

 Dim a(1 To 8) As Integer

 Dim n, i, j, x As Integer

 List1.Clear

 List2.Clear

 a(1) = -5: a(2) = 3: a(3) = 4: a(4) = 12: a(5) = 20: a(6) = 45: a(7) = 70

 For j = 1 To 7

  List1.AddItem Str(a(j))

 Next j

 x = Val(Text1.Text)

 i = 1

 Do While x > a(i) And i < 8 ’找x的插入位置

  ① 

 Loop

 For j = 8 To i + 1 Step -1 ’移动数据

  ② 

 Next j

 a(i) = x

 For j = 1 To 8

  List2.AddItem Str(a(j))

 Next j

 Label1.Caption = “插入的位置是” &Str(i)

End Sub

  1. (1) 代码“List1.Clear”中的Clear是。(单选。填字母:A .属性名/B .事件名/C .方法名)
  2. (2) 为实现程序功能。请在划线处填入合适的代码。

    ①处填入的代码为。  

    ②处填入的代码为。  

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

t=“”: i=0 : j=9 : key=62: f=False

Do While i<=j And Not f

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

    t=t+Str(rn)

    If a(m)=key Then

        f=True

    Elself a(m) > key Then

         i=m+1

         t=t+“→”

    Else

        j=m-1

        t=t+“←”

    End If

Loop

数组元素a⑹到a⑼的值依次为“99, 94, 90, 87, 78, 70, 63, 56, 45, 36”,执行该程序段,t的值是(  )

A . “4→7←5→” B . “4→ 7← 5→ 6→” C . “4→7←5→6” D . “4→ 7← 5”
小明编写了一个简单算式计算器程序,功能如下:在文本框Text1中输入一个加法的算式,形式为:a+b,a和b都为正整数。单击按钮Command1后,在标签Labe1上显示算式的计算的结果。程序运行界面如下图所示:

  1. (1) 在设计程序界面时,应使用图b所示“控件工具箱”中的(填数字编号)添加标签框对象。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click()

     Dim key As String

     Dim a As Integer, b As Integer, ans As Integer, ch As String

     key=Text1.Text

     i=1 

     Do While i<=Len(key)

      ch=Mid(key,i,1)

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

      

      Else

       Exit Do ′退出循环

      End If

     Loop

     

     b=Val(Mid(key,i+1,Len(key)-i))

     ans=a+b

     Label1.Caption="算式计算结果为:"+Str(ans)

    End Sub

  3. (3) 运行时,在文本框中输入“123+10”,单击“计算”按钮后,对语句ch=Mid(key,i,1)执行次数是(单选,填字母:A .执行3次/B .执行4次/C .执行5次/C .执行6次)
如果一个数大于等于4,它的平方根肯定不会超过它自己,且一个数的平方根最多不会超过它的一半,例如求8的平方根,8的一半是4,4^2=16>8,如果这个数越大越是如此。小王利用这一规律使用对分查找思想计算某数的算数平方根,编写了一个VB程序,功能如下:单击“产生”按钮Command1,产生一个大于等于0且小于100的随机整数,并显示在文本框Text1中;单击“计算”按钮Command2,在文本框Text1中显示随机整数的平方根,且结果只保留整数部分,小数部分舍去。程序运行界面如图所示:

  1. (1) 观察程序界面,具有 Caption 属性的对象有个。
  2. (2) 程序代码中,将划线处代码补充完整。

    Private Sub Command1_Click()

        Dim a As Integer

        Randomize

       

        Text1.Text = Str(a)

    End Sub

    Private Sub Command2_Click()

        Dim L As Integer, R As Integer, m As Integer

        Dim x As Integer, square As Integer

        x = Val(Text1.Text) L = 0

        R =

        Do While L < R

                    '改错

            square = m * m

            If square > x Then

                R = m - 1

            Else

               

            End If

        Loop

        Text2.Text = Str(L)

    End Sub

  3. (3) 程序代码中,加框处有错,请改正。
用VB编写“单词查询”程序,实现如下功能:在文本框Text中输入一段英文文本(以“.”为结束符),在文本框Text2中输入一个英文字母,单击“获取单词”按钮Command1,在列表框 List中依次显示Text1中包含该英文字母的所有单词。程序运行界面如图所示。

  1. (1) 程序运行时,文本框 Text1显示“请输入英文短句”,可在 Form_Load事件过程中添加代码(单选,填字母:A .Text1. Caption=”请输入英文短句”/B .Text1.Text= “请输入英文短句”/C .Text. AddItem “请输入英文短句”)
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click( )

    Dim s As String, tmp As String, As String

    Dim n As Integer, i As Integer

    Dim flag As Boolean

    Dim cnt As Integer     ‘存储符合条件的单词数

    s=Text1.Text

    n=Len(s)

    flag False

    List1.Clear

    For i =1 Ton

        c= Mid(s, i, 1)

        If c >= “a” And < “z” Or c > = “A” And c < = “z” Then

               ①   

            If= Text2. Text Then flag True: cnt= cnt +1

        Else

            If flag Then List1. AddItem tmp

            tmp = “”

               ②   

        End If

    Next i

        If cnt = 0 Then

            List1.AddItem “找不到符合条件的单词.”

        End If

    End Sub

     ② 

  3. (3) 若在文本框Text2中输入“M”,则单击“获取单词”按钮后,列表框List1中显示的单词个数是
删除字符串中的非字母字符,并查找出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

数组a为一组循环有序不重复的数组,如(a(1)=25,a(2)=41,a(3)=100,a(4)=5,a(5)=7,a(6)=9)。依据对分查找思想:设计个在数组a中查找数据Key并显示在列表框的程序,界面如图所示。实现该功能的VB程序段如下:

1=1:r=6

Key=Val(Text1.Text)

Do While <=r

m=Int((1+r)\2)

If a(m)=Key Then

Exit Do

Elself a(m)>=a(1) Then

ElseIf a(m)<a(1) Then

End If

Loop

上述程序中方框处可选语句为:

①If a(m)<Key And a(r)>Key Then 1=m+1

Else r=m-1

②List1.AddItem "第"+Str(m)+ "值是"+Str(a(m))

③If a(m)>Key And a(1)<=Key Then r=m-1

Else=m+1

则(1)、(2)、(3)处语句依次是(  )

A . ③①② B . ②①③ C . ①③② D . ②③①
把学生成绩由高到低排序后,按姓名在前、成绩在后的顺序依次存储在数组a中。例如(“张三”“97”“李四”“92”“王五”“87”,……)。设计一个VB程序,利用对分查找思想实现在数组a中查找成绩为Key的学生姓名。程序段如下:

i=1: j=n     'n代表学生的数量

Key=Val(Text1.Text)

Do While i<=j

m=

If Val(a(m))>Key Then i=m\2+1 Else j=m\2-1

Loop

List1.Clear

j=j+1

Do While i<=n

If Val(a(2*j))=Key Then List1.AddItem a(2*j-1)+""+a(2*j)

Else exit do

j=j+1

Loop

上述程序中方框处可能的语句是(  )

A . (i+j)\2 B . (i+h)/2 C . ((i+j)12)*2 D . ((i+j)\2)/2
已知直角三角形的斜边长度,利用对分查找算法计算其他两条整数边长的VB程序段如下:

flag = True : p = 0

Key = 5

For i = 1 To Key - 1

L = i

            

Do While            

M = (L + R) \2

p = p + 1

If i * i + M * M < Key * Key Then

      L = M + 1

ElseIf i * i + M * M > Key * Key Then

      R = M - 1

Else

    Text2.Text = Str(i) + “” + Str(M) + “” + Str(key)

    flag = False

    i = Key

End If

Loop

Next i

If flag Then Text2.Text = “没有符合条件的整数勾股数对!”

上述程序段2个划线处的代码分别为(  )

A . ①R=Key-1 ②L<=R And flag B . ①R=Key ②L<=R And flag C . ①R=Key – 1 ②L<=R Or  flag D . ①R=Key – 1 ②L<=R And flag=False
有如下 VB 程序段:

s = ""

low = 1: high = 8

Key = Text1.Text

Do While low <= high

    m = (low + high) \ 2

    If a(m) < Key Then

       high = m - 1

    Else

        low = m + 1

        s = s + Str(low)

    End If

Loop

数组元素 a(1)到 a(8)的值依次为“27,25,20,15,12,8,6,5”。该程序段执行后s的值为“5,6”,Text1中输入待查找数可能是(    )

A . 8 B . 7 C . 12 D . 14
在文本框Text1中输入待加密的n个字符(仅由ASCII码字符构成,最多支持960个字符),输入后单击加密按钮,在文本框Text2中产生密文。加密方式如下:

①定义一个数组a(1 to 961)。产生一个3到6之间的随机整数k,将十进制数960均分成k份,字符在字符串中的位置除以k的余数决定该字符存放在第几份数据中(余数为1保存在第一份数据中,余数为2保存在第二份数据中……,余数为0保存在第k份数据中);

②用十进制数127减去每个字符的ASCII码值,得到的差作为该字符的密文,并保存在数组a中,同一段内的密文依次存放;

③将随机产生的数k加64后保存在数组元素a(961)中,并一起参与加密;

④将数组a中所有有密文值的数组元素从后往前依次存放到数组b中;

⑤将数组b中的每个密文用3位数字保存,不足3位的前面用0补足,然后依次连接保存在变量sc中;

⑥在文本框Text2中输出sc。

例如:

①若现有待加密的字符串为“zp123”,产生的随机数k=3,则960分成3份,每份可存放320个值,分别为a(1)至a(320),a(321)至a(640),a(641)至a(960);

②由于Asc(“z”) =122,则127-122=5。字符“z”在待加密字符串中的位置是1,除以k的余数为1,因此数字“5”放在第一份数据的第一个位置,即a(1)=5;同理可得,第一份数据为a(1)=5,a(2)=77;第二份数据为a(321)=15,a(322)=76;第三份数据为a(641)=78;

③将随机产生的k与十进制数64的和保存到a数组的最后一个值中,即a(961)=64+3=67;

④将数组a中所有有密文值的数组元素从后往前依次存放到数组b中,得到b(1)=67,b(2)=78,b(3)=76,b(4)=15,b(5)=77,b(6)=5;

⑤将数组b中的每个元素用0补足3位后依次连接并保存在sc中,得到sc=“067078076015077005”;

⑥输出sc。

注:(asc(“0”)=48,asc(“A”)=65,asc(“a”)=97)

Private Sub command1_Click()

    Dim a(1 To 961) As Integer

    Dim sr, sc As String

    Dim i, j, k, m, n, t As Integer

    Dim b(1 To 961) As Integer

    Randomize

    k = Int(Rnd * 4 + 3)

    sr = text1.Text

    For i = 1 To 961

        a(i) = -1

    Next i

    a(961) = k + 64

    t = 960 / k

    For i = 1 To Len(sr)

        m = i Mod k - 1

        n = i \ k + 1

        If i Mod k = 0 then n = n - 1: m = m + k

           ①     = 127 - Asc(Mid(sr, i, 1))      ‘将密文存储到数组a中

    Next i

    For i = 1 To Len(sr) + 1

        j = j + 1

        Do While a(j) = -1

            j = j + 1

        Loop

        b(Len(sr) + 2 - i) = a(j)      ‘将有密文值的a数组元素存储到数组b中

    Next i

    For i = 1 To Len(sr) + 1

        sc =   ②         ‘连接密文并保存到sc中

    Next i

    text2.Text = sc

End Sub

Function space(x As Integer) As String

    For i = 1 To    ③  

        space = space & "0"

    Next i

End Function

  1. (1) 若加密后的密文为“068029041”,则随机数是;在Text1中输入的明文是
  2. (2) 在填写空白处缺失的代码。

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

ans = 0: L  = 0: R = 7

key = 2 ^ (Int(Rnd * 5))

Do While L <= R

    m = (L + R + 1) \ 2

    If a(m) > key Then

        L = m + 1

        ans = ans + 1

    Else

        R = m - 1

        ans = ans - 1

    End If

Loop

数组 a(0)到 a(7)的值依次为16,16,8,8,4,2,2,1,该程序运行后,ans 的值不可能的是(     )

A . 0 B . -4 C . 1 D . -1
有如下VB 程序段:

Private Sub Command1_Click()

    Dim a(1 to 10) As Integer

    Dim i As Integer, j As Integer, Key As Integer, c As Integer, m As Integer

    Dim flag As boolean

    flag = True: c = 0

    i = 1: j = 10

    Key = Int(Rnd() * 17) + 8

    Do While i <= j And flag = True

        c = c + 1

        m = (i + j) \ 2

        If Key = a(m) Then

            flag = False

        ElseIf Key > a(m) Then

            j = m - 1

        Else

            i = m + 1

        End If

    Loop

End sub

数组元素a(1)到a(10)的值依次为50、45、40、35、27、24、15、7、5、3,程序运行后变量c的值可能是:(     )

A . 1 或2 B . 2 或3 C . 3 或4 D . 4 或5
编写“数对查询”程序,实现如下功能:生成11个随机整数存入数组,并在标签Label1中显示。在文本框Text1中输入一个正整数,单击“搜索”按钮Command1,在数组中查找和为该正整数的两个数,并在列表框List1中输出查询结果。程序运行界面如图所示:

实现上述功能的VB程序如下:

Const n=11

Dimd(1 To n)As Iteger

Private Sub Form_ Load( )

    '生成n个随机整数存入数组d,并在Label1中显示,代码略

End Sub

Private Sub Command1_Click( )

    Dim sum As Integer, L As Integer, R As Integer, c As Integer

        ①   

    c=0

    For L=1 To n-1

        R=n

        Do While L< R

            If   ②    Then

                List1.Addtcem Str(d(L))& " " & Str(d(R))

                c=c+1

                Exit Do      'Exit Do表示退出循环

            Else

                

            End If

        Loop

    Next L

    List.Addtem "找到和为" "& Str(sum)& "的数对共" & Str(c)&"组"

End Sub

请回答下列问题:

  1. (1) 在设计程序界面时,要修改文本框Textl中文字的字体大小,可修改文本框的属性(单选,填字母: A .Text/B .Width/C .Font )。
  2. (2) 请在划线处填入合适的代码。

     ② 

  3. (3) 程序中加框处代码有错,请改正。
  4. (4) 根据程序,若文本框Text1中输入内容为28,则能找到满足条件的数对组数为
某算法的VB程序段如下:

Private Sub Command1_Click()

    Dim key As Integer, i As Integer, j As Integer, ans As Integer

    Dim n As Integer

    n = 10

    Dim x(1 To 10) As Integer

    x(1) = 5 : x(2) = 52 : x(3) = 2 : x(4) = 72 : x(5) = 86

    x(6) = 3256 : x(7) = 123 : x(8) = 25 : x(9) = 30 : x(10) = 87

    key = Val(Text1.Text)

    i = 1 : j = n : ans = 0

    Do While i < j

        m = (i + j + 1) \ 2

        If key <= x(m) Then

            j = m - 1 : ans = ans + 1

        Else

            i = m + 1 : ans = ans + 2

        End If

    Loop

End Sub

在Text1中输入3256,单击Command1,程序运行完毕后,以下变量的值不正确的是(       )

A . i=6 B . j=5 C . ans=5 D . x(m)=5
数组a中存放着已排序的n-1个实验数据(a(1)≥a(2)≥……≥a(n-1),a(n)暂未存储数据)。现将文本框Text1中输入的新数据插入到数组a中相应位置,从而使n个数据仍保持有序。完成该功能的VB程序段如下,请在划线处填入正确的语句。

x=Val(Text1.Text)

i=1:j=n-1

Do While i<=j

    m=(i+j)\2

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

Loop

For k=n To  Step-1 

    a(k)=a(k-1)

Next k

a(i)=x

编写程序实现如下功能:在数组a中生成n(n不超过100)个可重复的随机整数,按升序排列并显示在标签Label1中。在文本框Text1中输入一个整数,单击“查找删除”按钮Command1 ,采用对分查找法在数组a中查找该数。若找到,则从数组a中删除该数(该数后面的数组元素都前移,若有多个相同的数,则删除相同数中下标最小的那个),并在标签Label2中显示删除后的结果;否则,在标签Label2 中显示“该数未找到”程序运行界面如下图所示,实现上述功能的VB代码如下。

Dima(1 To 100) As Integer, n As Integer

Private Sub Form_ Load()

    '产生n个随机整数,按升序排序并在标签Label1中显示

End Sub

Private Sub Command1_Click() 

    Dim x As Integer, k As Integer, m As Integer

    Dim key As Integer, L As Integer, R As Integer

    key= Val( Text1. Text)

    L=1 : R= n

    Do While L<=R

        m=(L+ R) \2

        If  Then R=m-1 Else L=m+ 1   '改错

    Loop

    x=L

    If    ①    Or x> n Then

        Label2. Caption= "该数未找到"

    Else

        For    ②  

            a(k- 1)=a(k)

        Next k

        Label2. Caption=" "

        For k=1 To n-1

            Label2. Caption= Label2. Caption+Str(a(k))

        Next k

        n= n -1

    End If

End Sub

  1. (1) 加框处代码有错,请改正。
  2. (2) 请在划线处填入合适的代码。

     ②