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

编写VB程序代码,实现如下功能:在文本框Text1中输入金额(整数)后,点击“转换”按钮Command1后,在文本框Text2中显示该金额的大写,程序运行界面如图所示:

  1. (1) 要使窗体标题上显示的文本由“人民币”改为“人民币大小写”,可在其属性窗口中将属性的属性值改为“人民币大小写”。
  2. (2) 为了实现上述功能,请在划线处填入合适的代码。

    Private Sub Command1_Click()

    Dim dx As String, dw As String

    Dim s As String, c As String

    Dim ch As String

    Dim i As Integer

    dx = "零壹贰叁肆伍陆柒捌玖拾"                       

    dw = "亿仟佰拾萬仟佰拾元"                         

    s = Text1.Text                                    

    c = ""

    If  Len(s) > 9

        Text2.Text = "输入的数据超出所能转换的范围"

    Else

        For i = 1 To Len(s)          

           ch =  Mid(s, i, 1)

           c = c + + Mid(dw, 9 - Len(s) + i, 1)

        Next i

        Text2.Text = c + "整"

    End If

    End Sub

  3. (3) 由上述算法可知,若在文本框Text1中输入“20”,则文本框Text3显示的结果为
【加试题】有如下VB程序段:

  Key=Val(Text1.Text)

  i=1:j=10

  flag=False

  s=””

  Do While i<一i And NOt flag

  mid1=Int(i+(j-i)/3)

  mid2=Int(j-(i-i)/3)

  If Key=a(mid1)Then

    flag=True

  ElseIf Key<a(mid1) Then

    j=mid1-1

  ElseIf Key=a(mid2) Then

    flag=True

  ElseIf Key>a(mid2) Then

    j=mid2+1

    Else

      i=mid1+1

      i=mid2-1

      End If

      s=s&”  ”& mid1 & “:”&  mid2

 Loop

 Text2.Text=s

已知数组a(1 To 10)中的数据分别是12,21,34.45,59,63,72,86,94,100,在文本框Text1中输入34,程序运行后文本框Text2中显示的内容是(  )

A . 4:7  1:2 B . 4:7  1:2  3:3 C . 4:7  1:3  3:3 D . 4:7  3:3
【加试题】有如下VB程序段:

  K=Val(Text1.Text)

  left1=1:right1=10

  Do While(left1<=right1)

    mid1=(left1+right1)\2

    If a(mid1)<=k Then left1=mid1+1 Else right1=mid1-1

  Loop

  Text2.Text=Str(right1)

已知数组a(1)到a(10)的原始数据为1,4,5,5,5,5,8,9,9,10。程序运行时,在文本框Text1中输入5,文本框Text2显示的内容是(  )

A . 5 B . 10 C . 3 D . 6
某对分查找算法的VB程序段如下:

k = Val(Text1.Text)

i = 1: j = 6: Label1.Caption = ″ ″: f = False

Do While i <= j And Not f

m = (i + j) \ 2

If a(m) = k Then f = True

If a(m) > a(i) Then

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

Else

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

End If

Label1.Caption = Label1.Caption + Str(a(m))

Loop

数组元素a(1)到a(6)的值依次为“58,66,72,24,35,40”,在文本框Text1中输入的值为35,执行该程序段,标签Label1中显示的值是(  )

A . 72 35 B . 24 35 C . 72 24 35 D . 72 24 24 35
有如下VB程序段:

a(l) = 5: a(2) = 16: a(3) = 22: a(4) = 28: a(5) = 35

a(6) = 43: a(7) = 52: a(8) = 67: a(9) = 78: a(10) = 89

i = 1: j = 10: n = 0: flag = True

Key = Val(Textl. Text)

Do While i <= j And flag = True

  m = (i + j) \ 2

  If a(m) = Key Then

    flag = False

  Elself a(m) < Key Then

    i = m + 1

    n = n - 1

  Else

    j = m - 1

    n = n + 1

  End If

Loop

变量n的值最终为0,则文本框Text1输入的数值范围可能是(  )

A . (28,35) B . (43,52) C . [52,67] D . [78,89]
字符加密:用VB编写某字符串加密解密程序(仅针对ASCII码字符) ,其加密过程如下:

首先,分别求出特加密ASCII字符的ASCII码,然后用7位二进制来表示,比如“4”的ASCII码为十进制52,转换为7位二进制为“0110100”

其次,从左至右依次记为第1、2、3....7位,分别把第3、4、5位取反,即0变1, 1变0,至此“0110100”变为“0101000”,将此二进制转换为ASCII码为40,对应的字符为“(”,即“4”经过加密后得到加密字符左括号“(”。

在文本框Text1中输入ASCII字符,单击命令按钮Command,则在文本框Text2中显示经过加密的字符。VB代码如下,程序界面如图所示。

上述加密与解密过程实际上是可以互逆的,请完成下列问题。

  1. (1) 若在文本框Text1中输入字符“46785”,则文本框Text2中显示加密字符
  2. (2) 请在划线处填入合适的代码。

    Private Sub Command1_Click()

      Dim a(1 To 7) As Integer

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

      Dim ascl As String, s As String, s1 As String

      i=1

      S=Text1.Text

      Text2.Text=“”

      Do While i=Len(Text1.Text)

          s1= Mid(s, i, 1)

          ascl=Asc(s1)

          n=0

          For j=7 To 1 Step-1

              If j=3 Or i=4 Or j=5 Then

                  a(j)=

              Else

                  a(j) = asc1 Mod 2

              End If

              ascl=asc1\2

              n=

          Next j

          Text2.Text =Text2.Text+

          i=i+1

      Loop

    End Sub

【加试题】有如下程序段:

a(1)=2

For i=2 to 7

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

Next i

i = 1 : j = 7

Do While i <= j

m =(i + j)\ 2

If a(m)= Key Then Exit Do

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

Loop

若key的值为15,则程序执行结束后,j的值为(  )

A . 3 B . 4 C . 5 D . 6
在文本框 TxtIn中输入原文,单击“加密”按钮,对文中所有英文字母进行加密,其它字符不变,在文本框 TxtOut中输出加密结果。

加密规则如下表所示:

原字

A

B

C

X

Y

Z

a

b

c

x

y

z

密字

z

y

x

c

b

a

Z

Y

X

C

B

A

注:“A”的ASCⅡ码值是65,“a”的ASCI码值是97。

  1. (1) 若输入的内容是“ Beauty!”(不包括双引号),则输出为

    程序运行界面如图所示

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

    Private sub Cmd1- Click()

      Dim i As Integer, s As String, c As String, ans As String

        ①

            For i=1 To Len(s)

              c= Mid(s, i, 1)

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

          c=②

        End If

        ③

      Next i

      TxtOut. Text =ans

    End Sub

  3. (3) 根据上述程序,“加密”按钮名称是  。
对包含100个元素递增排序的数组a,采用对分查找法找某关键字,若查找不成功,则关键字的比较次数最多是(  )
A . 100 B . 6 C . 7 D . 8
统计“英文句子单词平均长度”的程序,其实现功能为在文本框Text1中输入要统计的英文句子,单击“统计”按钮Command1。进行统计,求出句子中共有几个单词、句子单词的平均长度,并显示在标签框Labell中。程序运行界面如图所示。

  1. (1) 代码“Private sub command1 Click()”中的Commandl_Cick是(单选,填字母:A .对象名/B .事件名/C .事件处理过程名)。
  2. (2) 实现上述功能的VB程序如下,请在画线处填入合适的代码。

    Private sub Commandl_Click ()

      Dim s As String

      Dim n As Integer

      Dim cnt As Integer

      Dim i As Integer

      Dim num As single

      Dim cd As Single

      Dim ave As single

      s=Text1.Text

      n=Len (s)

      num=0

      cd=0

      cnt=0

      For i=1 To n

          ① 

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

          cnt=cnt+1

        Elself c>=“0”And c<=“9”Then

          cnt=cnt+1

        Else

          If cnt>0 Then

            num=num+1

            cd=cd+cnt

              ② 

          End If

        End If

      Next i

      If cnt>0 Then

        num=num+1

        cd=cd+cnt

      End If

      ave=cd/num

      Label1. Caption=“总共有”+Str(num)+“个单词,平均长度为”+str(ave)

    End sub

     ② 

  3. (3) 若在文本框中输入“you are“No1”. ”,则经过上述程序统计共有单词数为个。
如果数组a(下标1到n)满足a(1)≤a(2)≤…≤a(i-1)≤a(i)≥a(i+1)≥…≥a(n),则称数组a是单峰的,并称a(i)是数组a的“峰顶”。下列程序段用于查找数组a中的“峰顶”,并返回该“峰顶”值。

Dim a(1 To 10) As Integer

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

 M = (L + R) \ 2

 If a(M) < a(M - 1) And a(M) > a(M + 1) Then

     ⑴  

 ElseIf a(M) > a(M - 1) And a(M) > a(M + 1) Then

     ⑵  

 ElseIf a(M) > a(M - 1) And a(M) < a(M + 1) Then

    ⑶  

 End If

End Function

Private Sub Command1_Click()

 Label1.Caption = "“峰顶”值是:" + Str(Search(1, 10))

End Sub

上述程序中划线处可选语句为:

①Search = Search(M + 1 , R)

②Search = Search(L , M - 1)

③Search = a(M)

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

A . ①②③ B . ①③② C . ③①② D . ②③①
【加试题】有1个升序排列的数组a(a(1)~a(n),n≥3),从左到右相邻两个元素的差值(后一个元素值减去前一个元素值)先由小到大、再由大到小,且相邻两个差值不相等,为了查找相邻两个元素的最大差值,小李编写的VB程序段如下:

i=1:j=n

Do While i+1<j   

     m=(i+j)\2

     If a(m+1) -a(m) >a(m) -a(m-1) Then

   

     Else

   

     End if

Loop

Label 1.Caption=“相邻两个元素的最大差值是”+Str(a(j) -a(i) )

上述程序段两个方框处的语句分别为(  )

A . ①i=m ②j=m B . ①i=m ②j=m-1 C . ①i=m+1②j=m-1 D . ①i=m+1②j=m
小明设计了如下一个查找数据的程序:在一组升序的数列当中,查找不小于k的最小数的位置,如果该值存在,则返回其第一次出现的位置,如果不存在则返回0。程序界面如下:

  1. (1) 若在Text1中输入“8”,Tex2、Text3输出的分别为
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 10)As Integer

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

    As Integer

    If L>R Then

      find = 0:Exit Function

    Elself a(L)>= key Then

      find = L:Exit Function

    Else

        ① 

      If a(m)<key Then

        find = find(M + 1,R,key)

      Elself  ②  Then

        find = find(L,M - 1,key)

      Else

        find = M

      End If

    End If

    End Function

    Private Sub Command1_Click()

    Dim k As Integer

    Dim p As Integer

    k = Val(Text1.Text)

      ③ 

    Text2.Text = a(p)

    Text3.Text = Str(p)

    If p = 0 Then

      Text2.Text = "无"

    End If

    End Sub

    Private Sub Form_Load()

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

    =7:a(7)= 10:a(8)= 13:a(9)= 19:a(10)= 21

    For i= 1 To 10

      Listl.AddItem Str(a(i))

    Next i

    End Sub

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

i=1: j=12: k=0: S=""

key=Val(Text1.Text) : c= "N" : flag= False

Do While i <= j And flag = False

  m=(i+j+1)\2: k=k+1

  If key = a(m) Then c= "Y" : flag= True

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

    s=s & Str(a(m))

Loop

Text2.Text = s : Text3.Text = c

数组a(1)到a(12)的值依次为“99,91,85,76,68,61,53,42,34,27,20,13”,执行该程序段后,下列说法正确的是(  )

A . 该程序段只能进行两位正整数的查找 B . 在文本框Text1中输入两位任意正整数,则k的值介于1和3之间 C . 在文本根Text1中输入76,程序执行后变量i和j的值分别为1和6 D . 若文本框Text2中显示了两个正整数,则文本框Text3中显示的内容一定是Y
某对分查找算法的VB程序段如下:

i= 1 : 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

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

Loop

数组元素d(l)到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
某对分查找算法的VB程序段如下:

'数组元素f(1)到f(9)赋初值为0,代码略
Key = Val(Text1.Text)

i = 1: j = 9: flag = False

Do While i <= j And flag = False

  m = (i + j) \ 2

  f(m) = 1

  k = k + 1

  If a(m) = Key Then

    flag = True

  ElseIf a(m) > Key Then

    j = m - 1

  Else

    i = m + 1

  End If
Loop

整型数组元素a(1)到a(9)为升序序列,在文本框Text1中输入待查找数,执行该程序段后,f(1)到f(9)各元素值为“0,0,0,0,1,1,1,0,0”,则下列选项中描述正确的是 (    )

A . k的值为4 B . i与j的关系为i>j C . m的值为7 D . flag的值可能为True,也有可能为False
给定n个不同的正整数(小于等于100),将它们分组,使得每组中任意两个数互质(它们的公约数为1)。按照以下算法对n个数进行分组:

n个正整数由文本框Text1输入,依次存储到a数组中,b(1 to 25)中存储100内的素数,c数组存储每一组的数字个数及对应数字,d数组存储每一组内所含的质因子,相同质因子只存储一次,最后分组情况显示在列表框List1中。

c数组初始状态:

组别

第一组

第二组

位置

0

1

2

3

4

5

6

7

8

9

10

11

12

13

0

0

0

0

0

0

0

0

0

0

0

0

0

0

d数组初始状态:

组别

第一组

第二组

位置

1

2

3

4

5

6

25

26

27

28

29

30

50

0

0

0

0

0

0

0

0

0

0

0

0

0

若第一个数据为70,确定分组的过程为:先查找第一组内所含的质因子中是否含有70的质因子,未找到,则c数组中表示第一组数据个数的值加1,并将70添加到c数组的第一组内,同时在d数组第一组中依次添加70所含的各个质因子。

c数组变化情况:

组别

第一组

第二组

位置

0

1

2

3

4

5

6

7

8

9

10

11

12

13

1

70

0

0

0

0

0

0

0

0

0

0

0

0

d数组变化情况:

组别

第一组

第二组

位置

1

2

3

4

5

6

25

26

27

28

29

30

50

2

5

7

0

0

0

0

0

0

0

0

0

0

尝试将第2~n个整数分组。在确定某数分组的过程中,若已有的组内不存在该数所含的质因子,则将其分到第一个符合条件的组;否则,将其分到新生成的组中。

分组完毕后数组存储情况如下表。

c数组:

组别

第一组

第二组

位置

0

1

2

3

4

5

6

7

8

9

10

11

12

13

2

70

99

0

0

0

0

3

25

54

11

0

0

0

d数组:

组别

第一组

第二组

位置

1

2

3

4

5

6

25

26

27

28

29

30

50

2

5

7

3

11

0

0

5

2

3

11

0

0

按照上述要求编写一个VB程序,其运行界面如图所示。

  1. (1) 按照上述算法,若有“35、40、26、18、63、77 ”6个整数,至少分成组(填具体数字)。
  2. (2) 请在划线处填入合适的代码。

    Const n = 6          '数据个数

    Dim a(1 To n) As Integer     '存储原始数据

    Dim b(1 To 25) As Integer    '存储100以内的素数

    Dim c(0 To (n + 1) * n) As Integer   '存储每一组的数字个数及对应数字

    Dim d(1 To 25 * n) As Integer        'd数组存储每一组内含有的质因子

    Private Sub Command1_Click()

        Dim t As Integer, i As Integer, j As Integer

        Dim k As Integer, m As Integer, p As Integer

        Dim y As Integer, zu As Integer

        Dim st As String

        For t = 1 To n

            k = 1

            i = 1

            Do While d((k - 1) * 25 + i) <> 0

                If a(t) Mod d((k - 1) * 25 + i) = 0 Then

                    

                    i = 0

                End If

                i = i + 1

            Loop

            m = (k - 1) * (n + 1)  '每一组存储数字个数的所在位置

            c(m) = c(m) + 1

            

            For j = 1 To 25

                If a(t) Mod b(j) = 0 Then

                    

                    i = i + 1

                End If

            Next j

        Next t

        p = 0

        Do While c(p) > 0

            st = ""

            For i = 1 To c(p)

                st = st + Str(c(p + i))

            Next i

            zu = p \ (n + 1) + 1

            List1.AddItem "第" + CStr(zu) + "组为:" + st

            'Cstr的功能:将数值型转为字符串型

            p = p + n + 1

            y = y + 1

        Loop

        List1.AddItem "至少分:" + CStr(y) + "组"

    End Sub

    Private Sub Form_Load()

    '读取文本框Text1中的各个数据依次存储到数组a中,存储100以内的素数到数组b中,代码略

    End Sub

采用二分查找方法,在1-100中查找53需要比较(   )次。

left=1

right = 100

cnt=0

while left<=right:

  mid=(left+right)//2

  cnt +=i

  if mid==53:

    Break

  elif mid<53:

    left = mid+1

  else:

    right = mid-1

print("采用二分查找方法,在1-100中查找53需要比较()次".format(cnt))

A . 5 B . 6 C . 7 D . 8
小明过生日,他要一个三层的大蛋糕,每一层都是一个小蛋糕。蛋糕店刚好有对应上、中、下三层的三类蛋糕,大家知道多层蛋糕一般都是上层最小,中层其次,下层最大,不然蛋糕就不漂亮了。所以请你帮助明明计算,在知道每一类蛋糕的体积的前提下有多少符合条件的方案。

如下图所示,其中第一层蛋糕有5种,体积分别为4、3、5、8、1;第二层有4种,体积分别为6、4、8、5;第三层有7种,体积分别为5、9、4、5、7、6、4。所选方案须符合“第一层<第二层<第三层”,如:第层选3,第二层选4第三层选6。方案共有31种。

请在划线处填入适当的代码。

Dim a(100) As Integer, b(100) As Integer, c(100) As Integer

'a、b、c数组分别存储上、中、下三层蛋糕的体积

Dim i As Integer, j As Integer, cnt As Integer, ans As Integer

Dim na As Integer, nb As Integer, nc As Integer

'na,nb、nc分别记录上、中、下三层蛋糕的种类数量

Private Sub Command1_ Click( )

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

    For i=1 To na-1

        For j=na To i+1 Step-1

            If a(j) < a(j-1) Then tmp=a(j) : a(j) =a(j-1) : a(j-1)= tmp

        Next j

    Next i

    For i=1 To nc-1

        For j=nc To i+1 Step-1

            If c(j) < c(j-1) Then tmp= c(j) :c(j)=c(j- 1) :c(j- 1)= tmp

        Next j

    Next i

    For i=1 To

        L=0 : R=na+ 1

        Do While L+1<R

            m=(L+ R)\ 2

            If a(m) < b(i) Then

                L=m

            Else

                R= m

            End If

        Loop

        cnt= L

        L=0 : R=nc十1

        Do While L+1<R

            m=(L+R)\2

            If  Then

                R= m

            Else

                

            End If

        Loop

        cnt=cnt * ()

        ans= ans+cnt

    Next i

    Label1. Caption="共有"十Str(ans) + "种方案

End Sub

Private Sub Form_ Load(  )

    '随机生成三层蛋糕的数量存储在na、nb、nc中,生成三层蛋糕的体积存储在a、b、c数组中,并输出,代码略

End Sub

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

Key = Val(Text1.Text)

c=0:i=1:j=10

Do While i<=j

    m=(i+j)\2

    c=c+1

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

Loop

Text2.Text = Str(c)

数组a(1)到a(10)的值依次为“10,15,15,25,27,28,33,35,36,56”,执行该程序段后,文本框Text2中显示的值为3,则key值可能是(    )

A . 10 B . 15 C . 28 D . 36