算法的程序实现 知识点题库

(加试题) 有如下VB程序段:

Dim a(1 To 10) As Integer

Dim s As String, n, i As Integer

s = "54851845236": n = Len(s)

For i = 1 To n - 1

a(i) = Val(Mid(s, i, 2))

Next i

For i = 1 To n - 2

k = i

For j = i + 1 To n - 1

If a(k) < a(j) Then k = j

Next

If k <> i Then

t = a(k): a(k) = a(i): a(i) = t

End If

Next i

Text1.Text = Str(a(1))

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

A . 18 B . 54 C . 85 D . 8
合唱队列是按队员的身高进行排列,形成中间高两边有序降低的队形;例如有六个队员“己、戊、丁、丙、乙和甲”的身高依次由小到大,则排列后的顺序为“戊、丙、甲、乙、丁、己”。小李用VB编写模拟“合唱队列”程序,功能如下:在文本框Text1中输入各队员身高,输入结束并回车,则输入的各队员身高分别存入数组a中;单击“合唱队列”按钮Command1,对数组a的元素进行有序排列后,将各元素存入数组C中形成合唱队列,并将结果显示在文本框Text2中。程序运行界面如图所示:

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

  1. (1) 如果输入各队员身高为“190,191,194,179,166”,则合唱队列的结果为
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Dim a(1 To 20) As Integer

    Dim n As Integer

    Private Sub Text1_KeyPress(KeyAscii As Integer)

    ‘将输入各队员身高分别存入数组a中,队员个数为n,代码略!

    End Sub

    Private Sub Command1_Click()

      Dim c(1 To 20) As Integer

      Dim right As Integer, left As Integer, i As Integer

      For i = 1 To n – 1          

        For j =1 To n-i

            If      ①      Then          

                t = (j): a(j) = a(j + 1): a(j + 1) = t

            End If

        Next j

    Next i

    ‘下列程序段实现数组C的合唱队列

    m = (1 + n) \ 2

    left = m: right = m

    c(m) = a(n)

    i = 2

    Do While i <= n

        If i Mod 2 = 0  Then

            right = right + 1

            c(right) = a(n-i+1)

        Else

                     ②      

            c(left) = a(n-i+1)

        End If

        i = i + 1

    Loop

    s =      ③     

    For i = 2 To n

        s = s + "," + Str(c(i))

    Next i

    Text2.Text = s

    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) 为实现程序功能。请在划线处填入合适的代码。

    ①处填入的代码为。  

    ②处填入的代码为。  

有如下程序段:

For i=1 To 9

 For j=10 To i+2 Step-1

  If a(j) < a(j-2) Then

   t=a(j): a(j)=a(j-2): a(j-2)=t

  End If

 Next j

Next i

数组元素a(1)到a(10)的值依次为“10,9,8,7,6,5,4,3,2,1”,执行该程序段后,数组元素a(8)中的值为(  )

A . 7 B . 8 C . 9 D . 10
纪念品分组问题。某教师节晚会的纪念品分组规则如下:

按纪念品价值进行分组,每组总价值不超过限定值w且最多包含两件,要求分组数最少。编写VB程序解决该问题,程序运行时,在文本框Text1中依次输入每件纪念品的价格(不超过w),以逗号分隔,在文本框Text2中输入限定值w,单击“分组”按钮,在标签Label2上输出最少的分组数。程序运行界面如图所示。

  1. (1) 要使程序启动后,窗体的标题栏显示“纪念品分组”文字,可在 Form Load事件过程中添加语句(单选,填字母:A .Fron1=“纪念品分组”/B .Form1.Name=“纪念品分组”/C .Form1. Caption=“纪念品分组”/D . Forml.Text=纪念品分组”)。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码;并且加框处代码有错,请改正。

    Private Sub Command1  Click()

    Dim a(1 To 1000), n As Integer, w As Integer, cnt As Integer

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

    Dim s As String, ch As String

    Dim p As Integer, q As Integer

    s= Text1. Text: w= Val (Text2 Text): n=0

    For i= 1 To Len (s)

    ch= Mid(s, i, 1)

    If ch=“,”Then

    n=n+1:a(n)=t:t=0

    Else

    t=

    End If

    Next i

    For i= n To 2 Step-1

    For j= 1 To    ‘

    If a(i)< a(j+1)Then

    t=a(j):a(j)=a(j+1):a(+1)=t

    End If

    Next j

    Next i

    cnt=0

    p=1:q=n

    Do While<p

    cnt=cnt+1

    If Then

    p=p+1: q=q-1

    Else

    p=p+1

    End If

    Loop

    If p= q Then cnt=cnt+1

    Labe12 Caption=Str(cnt)

    End Sub

  3. (3) 若在文本框 TextI中输入“50.30,100,70,80,40,50,20,”,文本框Text2中输入“110”,单击“分组”按钮,标签Labe12中显示的内容是
下列VB程序段的功能为:对数组a中的n个元素进行排序,生成左右交替上升的数据序列。如排序前a中元素依次为:48,34,86,46,85,100,程序运行后a中元素依次为:34,48,86,100,85,46。

For i=1 To

  k=i

  For j=i+1 To n-i+1

    If a(k)>a(j)Then k=

  Next j

  If k<>i Then t=a(k):a(k)=a(i):a(i)=t

  For j=

    If a(j)< a(j+1)Then t=a(j):a(j)=a(j+1):a(j+1)= t

  Next j

Next i

上述程序段3个方框处的表达式分别为(  )

A . (1)n-1       (2)j+1       (3)i To n-i+1 B . (1 )n-1       (2)j+1      (3)i To n-i C . (1)n\2         (2)j        (3)i+1 To n-i+1 D . (1)n\2        (2)j         (3)i+1 To n-i
有如下VB程序段:

n = 8

For i= 1 To n

  d(i)= Int(Rnd * 10)+1

Next i

For i= 2 To n -1

  k = 1

  For j=1 To n-i

    If d(j)*k>d(j+2)*k Then

      Temp=d(j):d(j)=d(j+2):d(j+2)=temp

    End If

  Next j

Next i

执行该程序段后,d数组各元素可能是(  )

A . 3,10,3,5,4,4,10,1 B . 0,3,4,5,6,6,7,8 C . 2,1,3,4,5,6,8,7 D . 6,4,5,6,5,7,1,10
七灯游戏是一款经典的益智类游戏。游戏中,有七盏灯排成一圈,如图a所示,初始时灯的开关状态随机生成,操作其中某一盏灯,则可以切换该灯的“开/关”状态,同时,这盏灯对面的两盏灯也会切换“开/关”状态,如图b所示:

图a为初始状态,操作圈中的灯,则该灯与对面的两盏灯都会切换“开/关”状态,如图b所示。假设这些灯的编号为0到6号,“开/关”状态随机产生,并输出到列表框List1中,接着需要从中选出数盏灯进行操作,使得最后所有灯都打开(已证明方案-一定存在且唯一), 并在列表框List2中输出灯的编号。

程序采用枚举策略,一一尝试对每盏灯状态进行“切换”操作,“1”表示对当前灯进行切换,“0”表示不操作。

程序运行界面如图c所示。

  1. (1) 0-6号灯的初始状态为“关  关  关  开  关  关  开”,如对1号灯进行切换操作,对面随之切换灯的编号是:
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

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

    Private Sub Command1_Click()

      Dim i As Integer, x As Integer, pos As Integer

      Dim flag As Boolean

      List2.Clear

      For i = 0 To

        x = i:pos = 0:flag = True

        For j = 0 To 6

            b(j)= a(j)

        Next j

        Do While x > 0

            If x Mod 2 = 1 Then

                b(pos)= 1 - b(pos)

                b((pos + 3) Mod 7) = 1 – b((pos + 3) Mod 7)

               

            End If

            pos = pos + 1

            x = x \ 2

         Loop

         For j = 0 To 6

             IfThen flag = False:Exit For

         Next j

         If flag Then

            pos = 0

            Do While i > 0

               If i Mod 2 = 1 Then List2.AddItem “第” + CStr(pos)+ “号”

               i = i \ 2

               pos = pos + 1

            Loop

            Exit For

         End If

       Next i

    End Sub

    Private Sub Form_Load()     ‘随机生成初始数据

        Dim i As Integer

        Randomize

        List1.Clear

        For i = 0 To 6

            a(i)= Int(Rnd * 2)

            If a(i)= 1 Then

                List1.AddItem “第” + CStr(i) + “号:”+ “开”

            Else

                List1.AddItem “第” + CStr(i) + “号:” + “关”

            End If

         Next i

    End Sub

选择算法,解决问题。

在使用计算机解决问题时,选择合适的算法,是有效解决问题的关键。

分析下面的问题,请选择最合适的算法:(    )

猴子吃桃问题:

小猴有一天摘了若干个桃子,他非常贪吃,当天就吃掉了一半还多一个;第二天接着吃剩下的桃子一半多一个;以后每天都是如此,到了第七天吃桃子时,却发现只剩下一个。请问,小猴那天一共摘了几个桃子?

A . 解析法 B . 递归法 C . 穷举法 D . 排序法
小李编写VB程序,功能如下:单击“产生数组”按钮Command1,则随机生成10个取值范围是1~10的正整数,分别存储到数组a中,对数组a的元素进行升序排列,并在标签Label1中显示;再单击“重复数”按钮Command2,则在排序后的数组a中查找连续个数最多的一组重复数值,若有两组连续重复数个数一样多,则取数值小的一组,将重复数的数组元素下标显示在标签Label2中。运行界面如图所示。

  1. (1) 已知窗体名称为Form1,要使程序加载时,窗体标题自动显示为“统计重复数”,则可在              (单选,填字母)事件过程中添加代码:Form1.Caption = “统计重复数”。
    A . Form_Click() B . Form_Load() C . Form1_Click() D . Form1_Load()
  2. (2) 实现上述功能的程序如下,请在划线处填写合适代码,使程序正常运行。

    Dim a(1 To 10) As Integer

    Dim n As Integer

    Private Sub Command1_Click()

    Dim i As Integer , j As Integer, k As Integer, temp As Integer

      Dim s As String

      Randomize

      n = 10

      For i = 1 To n

        a(i) = Int(Rnd * 10) + 1

      Next i

      For i = 1 To n - 1

        k = i

        For j = i + 1 To n

          If a(j) < a(k) Then

        Next j

        If k <> i Then

          temp = a(i): a(i) = a(k): a(k) = temp

        End If

      Next i

      s = ""

      For i = 1 To n

        s = s + Str(a(i))

        If i < n Then s = s + ","

      Next i

      Label1.Caption = s

    End Sub

    Private Sub Command2_Click()

      Dim i As Integer, j As Integer, k As Integer

      Dim length As Integer, origin As Integer

      Dim s As String

      k = 1:origin=1:length = 1

      For i = 2 To n

        If a(i) = a(i - 1) Then

          k = k + 1

          If k > length Then

            length = k

            origin = 

          End If

        Else

          k = 1

        End If

      Next i

      s = ""

      For j = origin To

        s = s + Str(j)

      Next j

      Label2.Caption = s

    End Sub

  3. (3) 程序加框处代码有错,请改正。
查找并删除重复数据的算法是基于顺序查找的优化,主要思路是把待查数据的起点元素设置成查找关键字,然后从后往前查找,通过结束时所停留的数据位置来判断查找结果(即结束时若停留在数据序列的起点,则表示数据序列中无重复数据;否则,存在重复数据,删除该数据后继续查找)。

编写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”,该程序运行时,最先删除的重复数是
某凯撒密码的解密程序段如下:

def decrypt(code,key):#code:密文key: 密钥

    code_ new = "

    for s in code:

        m=  ①        #按照输入的key值,做移位运算

        if m<97:

               ②   

            code_ new + = chr(m)

        returm code_ new

    code = input(‘请输入密文:’)

    key = intinput(‘请输入密钥:’)

    code_ new = decrypt(code, key)

print(code_ new)

  1. (1) 在划线填入适当的语句或表达式,将程序补充完整。

     ② 

  2. (2) 若输入的code为“verygood”,key为“2”,则输出的值为
用对分查找的方法求不等式2x+3x-5≤n(n≥0)的最大正整数解,编写的VB程序段如下:

Private Sub Command1_Click( )

    Dim L As Integer, R As Integer,n As Integer

    x As Integer

    n=Val(Text1.Text)

    L=1

    R=n+1

    Do While

          x=(L+R)\2

          if 2^X+3*x-5<=n Then L=x+1

          Else R=x-1

    Loop

    Label1.Cption=“方程2^X+3*x-5<=n的最大正整数解为:”+

         

End Sub

要使程序实现上述算法思想,则方框上的语句是(     )

A . ①L<R   ②Str(L) B . ①L<R  ②Str(R) C . ①L<=R  ②Str(L) D . ①L<=R  ②Str(R)
有如下 VB 程序段:

s = "AAABBBCCCCDDEFF"

i = 1: j = Len(s): Key = "H": v = ""

Do While i <= j

    m = (i + j) \ 2

    c = Mid(s, m, 1)

    If c = Key Then Exit Do

    If c > Key Then

        j = m - 1: v = v & c

    ElseIf c < Key Then

       i = m + 1: v = v & c

    End If

Loop

执行完以上程序后,v的值为(   )

A . CDFF B . CDF C . CDEF D . DEF
有n个连续的自然数,删除首尾两端之外的其中一个数后存储在数组元素a(1)到a(n-1)中,利用对分查找算法找出这个数的某VB程序段代码如下:

Const n=10

i= 1:j=n- 1

Do While j-i>= 2

    m=(i+j)\2

    If  ⑴  Then

        i= m

    Else

          ⑵ 

    End If

Loop

Text1.Text= Str(  ⑶  )

上述程序中(1)(2)(3)划线处可选语句有:

①a(j)-a(m)=j-m

②a(m)-a(i)=m-i

③j=m-1

④j=m

⑤a(i)+1

⑥a(i)

则上述程序中(1)、(2)、(3)划线处的代码依次为(       )

A . ①③⑤ B . ②④⑤ C . ①③⑥ D . ②④⑥
现有一个整数型数组a (下标1到n),其值的规律是先升序中间相等,之后降序。现要找到降序的拐点,如数列2、4、8、12、18、 18、 18、18、5、3,其降序的拐点为最后一个18所在的位置,即8号位置。部分程序如下:

L=1:R=n

Do While L<=R

    m=(L+R)\2

    If  ①  Then

        R=m-1

    Else

       L=m+1

    End If

Loop

Text1.Text =  ②   

为实现上述功能,则程序中①、②处填写的代码是(    )

A . ①a(m) > a(m + 1)     ②Str(R) B . ①a(m)>a(m+1)       ②Str(L) C . ①a(m) >= a(m + 1)   ②Str(R) D . ①a(m) >= a(m + 1)   ②Str(L)
某对分查找算法的VB程序段如下:

key = Val (Text1. Text)

i=1:j=10

Text2. Text = "”

Do While i< = j

    m = Int((i +j)/2+0.5)

    If key = a(m) Then Exit Do

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

    Text2.Text = Text2.Text + Str (a (m))

Loop

数组元素a(1)到a(10)的值依次为“1,2,3,4,5,6,7,8,9,10",文本框Text1中输入的值是4,执行该程序段,文本框Text2中显示的是(    )

A . 6  3  5  4 B . 5  2  3 C . 5  3 D . 6  3  5
某对分查找算法的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
某教室在上午8点到12点的时间段可以安排活动。为了安排尽可能多场次的活动,按以下方法安排:先安排结束时间早的活动;若有多个活动的结束时间相同,则优先安排占用时间少的活动。要求编写一个VB程序,实现上述功能。在文本框Text1中输入一批数据(数据都用逗号分隔并以逗号结尾),奇数位置数据表示某活动的起始时间,偶数位置数据表示该活动的结束时间,单击“确定”按钮Command1后,在列表框List1中显示各活动的起始和结束时间,在列表框List2中显示选择安排的活动。运行界面如图所示。

 

  1. (1) 要清空Text1中的内容,可以把Text1对象的属性设置为空值。(单选,填字母:A . Caption / B . Text / C . Text.Clear)。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Private Sub Command1_Click()

        Const n = 100

        Dim ss As String, t As String, i As Integer

        Dim k As Integer, p As Integer, temp As Integer

        Dim s(1 To n) As Integer, f(1 To n) As Integer

        Dim num(1 To n) As Integer, flag(1 To n) As Boolean

        ss = Text1.Text

        starttime = 480: endtime = 720      '教室可以安排活动时间为8:00到12:00

        k = 0: p = 0

        For i = 1 To Len(ss)

            ch = Mid(ss, i, 1)

            If ch <> "," Then

                t = t + ch

            Else

                

                p = (k - 1) \ 2 + 1

                If k Mod 2 = 1 Then s(p) = convert(t) Else f(p) = convert(t)

                t = ""

            End If

        Next i

        For i = 1 To p

            num(i) = i

        Next i

        For i = 1 To p

            List1.AddItem Str(num(i)) + " " + ff(s(i)) + " " + ff(f(i))

        Next i

        For i = 1 To p - 1

            For j = p To i + 1 Step -1

                If Then

                    temp = num(j): num(j) = num(j - 1): num(j - 1) = temp

                    temp = s(j): s(j) = s(j - 1): s(j - 1) = temp

                    temp = f(j): f(j) = f(j - 1): f(j - 1) = temp

                End If

            Next j

        Next i

        For i = 1 To p

            If s(i) >= starttime And f(i) <= endtime Then

                flag(i) = True

                

            End If

        Next i

        List2.AddItem "活动号 起始时间 结束时间"

        For i = 1 To p

            IfThen

                List2.AddItem Str(num(i)) + "  " + ff(s(i)) + "  " + ff(f(i))

            End If

        Next i

    End Sub

    Function convert(s As String) As Integer

        '把时间格式的s转换为整数,如"08:20"转化为500。代码略

    End Function

    Function ff(t As Integer) As String

        '把整数t转换为时间格式,如500转化为"08:20"。代码略

    End Function

  3. (3) 程序加框处的代码有误,请改正。
某对分查找算法的VB程序段如下:

i=1:j=7

f=False

key=Val(Text1. Text)

Do While i<=j And Not f

    m=(i+j)\2

    If a(m)=key Then f=True

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

Loop

List1. AddItem Str(i)+Str(j)+Str(m)

数组元素a(1)到a(7)的值依次为"23,42,58,66,77,83,98",运行上述程序段后,列表框List1中

显示的结果为"5 4 5",则文本框Text1中输入值的范围是(      )

A . [66,77] B . [66,77) C . (66,77] D . (66,77)