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

采用冒泡排序将六个数“22,14,18,17,21,16”从小到大进行排序,则第二轮交换数据后的顺序是(   )
A . 14,22,16,18,17,21 B . 14,16,18,17,21,22 C . 14,16,22,17,18,21 D . 14,22,16,17,18,21
已知 a =1 , b = 2 ,c =3 计算下列表达式的值:
  1. (1) a+b * c :  
  2. (2) (a-b)/a+b :  
  3. (3) a-b/a+b :  
  4. (4) (a+b)\b mod c 
  5. (5) c mod b + a : 
【加试题】对于数组(形如a数组:4、5、6、1、2、3或b数组:1、2、3、4、5、6),我们称元素1为此二数组的拐点。为寻找此类递增或循环递增数组的拐点,可以用顺序查找和对分查找的方法,通常相比之下对分查找算法较优,以下为使用对分法查找拐点的算法。

做法是比较中点与当前查找范围第1个数大小关系,用对分法使查找范围逼近拐点;当余下数组只有二个元素时,可根据此二元素大小关系得到拐点的位置。

依据上述描述设计了VB程序,界面如图所示。请回答下列问题:

图片_x0020_74  

  1. (1) 对于循环递增数组“9、10、11、12、13、14、15、16、17、18、19、20、1、2、3、4、5、6、7、8”,代码中加框处执行的次数为次。
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 20) As Integer

    Private Sub Command1_Click()

        Dim Low As Integer, High As Integer

        Low = 1

        High = 20

        Do While High > Low

            If        ①         Then              '当只余下两个元素时

                If       ②           Then

                    Label1.Caption = "拐点元素为" + Str(a(1)) + ",下标为" + Str(1)

                Else

                    Label1.Caption = "拐点元素为" + Str(a(High)) + ",下标为" + Str(High)

                End If

                Exit Do

            End If

           

            If a(m) >= a(Low) Then

                Low = m

            Else

         ③     

            End If

        Loop

    End Sub

    Private Sub Form_Load()

        '生成循环递增的数组a,代码略

    End Sub

     ② ③ 

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

  S=“7218634594”:n=Len(s)

  t=0

  For i=1 To n-1

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

  Next i

  For i=1 To n-2 Step 2

       k=i

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

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

       Next j

       If k<>i Then

           temp=a(i):a(i)=a(k):a(k)=temp:t=t+1

       End If

    Next i

    Text1.Text=Str(t)  
运行程序段后, t的值为(  )

A . 1 B . 2 C . 3 D . 4
编写一个VB程序,判断某字符串是否为回文字符串。所谓回文字符串,指一个字符串从左往右读和从右往左读是完全一样的。程序运行时,单击“判断”按钮后,在标签Label2中显示判断结果。程序运行效果如图所示。

 

实现上述功能的程序如下,请回答下列问题:

Private Sub Com1_Click( )  

Dim s As String

Dim flag As Boolean

Dim n As Integer, i As Integer

  s = Text1.Text

  _________     ‘①

  flag = True

  i = 1

  Do While i <= n \ 2

    If  Mid(s, i, 1) < >________________ Then      ‘②

       flag = False

       Exit Do       '退出Do循环

    End If

    i = i + 1

  Loop

  If flag Then

     Label2.Caption = s + "是回文字符串"

  Else

     Label2.Caption = s + "不是回文字符串"

  End If

End Sub

  1. (1) 当前代码的事件处理过程名为
  2. (2) 为使程序完成相应功能

    下划线①处应填入代码

    下划线②处应填入代码

原始的冒泡排序是单向的,它始终是从第一个(或最后一个)一个元素开始扫描。小王对冒泡排序进行了改进,从两端进行扫描,首先从数组的左端到右端进行扫描,把最大的数往后交换(以升序为例),再从右端到左端进行扫描,把最小的数往前交换,多次扫描后,最终得到一个有序的序列。他定义了left1、right1两个变量,变量left1表示左边指针,变量right1表示右边指针,每一遍排序,左边指针向右移动一位,右边指针向左移动一位。一趟排序,把最大值沉到最后一个,最小值冒泡到最前一个,最终让数组有序。运行界面如图a,单击“生成数据”按钮在列表框List1中显示生成的10个随机数,单击“排序”按钮后,将排序结果显示在列表框List2中。

实现上述功能的 VB 程序如下,请回答下列问题:

Dim b(1 To 10) As Integer

Dim left1 As Integer, right1 As Integer Private Sub Cd1_Click()

Dim i As Integer, j As Integer

  For i = 1 To 10

b(i) = Int(Rnd * 100) + 10 List1.AddItem Str(b(i))

  Next i left1 = 1 right1  = 10

End Sub

Private Sub Cd2_Click()

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

Do While left1 < right1

    For j = left1 To right1 - 1

    If b(j) > b(j + 1) Then

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

    End If

    Next j

    For j = right1 To    ‘改错

        If b(j) < b(j - 1) Then

            t = b(j): b(j) = b(j - 1): b(j - 1) = t end If

    Next j

    right1 =           ‘填空

Loop

‘将排序结果显示在列表表框List2中,代码略

End Sub

  1. (1) 根据题意,“生成数据”按钮的对象名是
  2. (2) 程序代码中,加框处有错,请改正。
  3. (3) 请将划横线处代码补充完整。right1 =
  4. (4) 如果有数组a,其a(1)~a(5)的值分别是“7,14,12,6,18”,按照上面双向排序的算法思路(升序),则do while循环中,第二次循环结束时,数组元素a(2)的值为 
有如下程序段,数组元素a(1)到a(5)的值依次为“33,24,4,16,77”,执行该程序段后,变量t的值为(  )

t=0

For i=1 To 4

flag=False

For j=5 To i+1 Step-1

If a(j)>a(i) Then flag=True

  t=t+1

  temp=a(j):a(j)=a(i):a(i)=temp

End If

Next j

If flag=False Then Exit For

Next i

A . 2 B . 3 C . 4 D . 5
某数组有7个元素,依次为2001、2005、2008、2009、2010、2015、2018,若采用对分查找中算法在该数组中查找数据2018,需要查找的次数是(  )
A . 1 B . 2 C . 3 D . 4
数据排序。编写VB程序,使其具有以下功能:通过文本框随机输入几个无序的整数,并存储在数组a中,然后将这些无序的数进行排序,使得这些数按从小到大的顺序排列。

程序运行时,在文本框Text1中依次输入一个整数后按回车键,输入的整数顺序显示在列表框List1中,单击“排序”按钮 Command1,排序后的数据显示在列表框List2中程序运行界面如图所示,回答以下各题:

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

    Dim a (1 To 20) As Integer, n As Integer    ‘ 定义全局变量

    Sub jh (x As Integer, y As Integer)

    ‘jh 为自定义过程,其功能是交换变量x、y的值 Dim temp As Integer

      temp = x

      x = y

      y = temp

    End Sub

    Private Sub Command1_Click ( )

      Dim i As Integer, temp As Integer

      Dim swap As Boolean

      swap = True

      Do while swap = True

        swap = False

        For i = 1 To n-1

          If a(i) > a(i+1) Then

            Call jh (a(i), a(i+1))     ‘ 调用过程jh,对两个数进行交换

                    ①        

          End If

        Next i

      Loop

      For i = 1 To n

        List2. AddItem a (i)

      Next i

    End sub

    ‘ 输入数据,存储在数组a中,并显示在列表框List1中

    Private Sub Text1_ Key Press (KeyAscii As Integer)

      If KeyAscii = 13 Then ‘表示按下回车键

        n = n+1

                ②        

        List1. AddItem a(n)

        Text1. Text =“ ”

      End if

    End sub

    Private Sub Form_ Load ( )

      n = 0

    End sub

     ② 

  2. (2) 本题中采用的排序算法应属于(填:冒泡排序/选择排序/插入排序)
某程序实现以下功能:将文本框Text1中的成绩按降序存入数组score中,在文本框Text2中输入一个成绩存变量key,输出大于等于key的成绩个数。程序运行界面如下图所示:

实现上述功能的部分代码如下:

key = Val(Text2.Text) i = 1: j = 10

Do While i <= j m = (i + j)  2

if   i = m + 1

Then

Else

j = m - 1 End If

Loop

 

Label1.Caption = "大于等于" + Str(key) + "的成绩有" + Str(num) + "个"

上述程序段2个方框处的代码分别为(    )。

A . ⑴key <= score(m)  ⑵num = i B . ⑴key <= score(m)  ⑵num = j C . ⑴key < score(m)    ⑵num = i D . ⑴key < score(m)    ⑵num = j
某对分查找算法的VB程序段如下:

Key=Val(Text1.Text)

i=1:j=10: f=false: n=0

Do While i<= j and f=false

  n=n+1

  m=(i+j+1)\2

  if a(m)=key then f=true

  if a(m)>Key Thenj=m 1Elsei=m+1

Loop

数组元素a(1)到a(10)的值依次为“4,7,10,12,15,19,20,23,28,30”。在文木框Text1中输入待查找的数,执行该程序段后n的值为4,则key值可能的是(    )

A . 10 B . 12 C . 19 D . 30
以下程序用于统计自然数1到n之间出现多少个x(0<=x<=9),空缺处应填入的代码是(    )

n = Val(Text1.Text)

x = Val(Text2.Text)

k = 0

For i = 1 To n

        ①       

   Do While temp <> 0

      y= temp Mod 10

      If      ②        Then k = k + 1

      temp = temp \ 10

   Loop

Next

Label1.Caption = Str(k)

A . ①temp=n  ② y=x B . ①temp = i  ② y=x C . ①temp=i   ② i=x D . ①temp=n  ② i=x
对用户输入的字符串进行解密的 VB 程序段如下:

s = Text1.Text

For i = 1 To Len(s)

ch = Mid(s, i, 1)

nk = Asc(ch) - i

If nk < 0 Then nk = nk + 127

Text2.Text = Text2.Text + Chr(nk)

Next i

已知大写字母A的ASCII码值为65,小写字母a的ASCII码值为97,在文本框Text1中输入内容“yhT5”,执行程序段后,文本框Text2显示的内容为(  )

A . YHt5 B . xgS4 C . zjW9 D . xfQ1
有如下程序段:

Dim i As Integer,Sum As Integer

Dim a(1 To 11)As Integer

i=10:a(11)=49

Do While i>=1

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

    If a(i)Mod 3=0 Then Sum=Sum+a(i)

    i=i-1

Loop

Text1.Text=Str(Sum)

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

A . 174 B . 180 C . 36 D . 42
某排序算法的VB程序段如下:

For i=8 To 2 Step-1

  For j=i-2 To 1 Step -2

     If a(j)<a(i) And i Mod 2=1 Then

        t=a(j):a(j)=a(i):a(i)=t

    ElseIf a(j)>a(i) And i Mod 2=0 Then

        t=a(j):a(j)=a(i):a(i)=t

    End If

  Next j

Next i

数组元素a(1)到a(8)的值依次为20、15、62、26、74、64、 20、32,执行该程序段后,数组元素的值依次是:(    )

A . 20、15、20、26、62、32、74、64 B . 74、15、62、20、26、32、20、64 C . 15、20、20、26、32、62、64、74 D . 74、15、62、26、20、32、20、64
有如下VB程序段:

For i = 1 To 8

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

Next i

For i = 1 To 3

    For j = 1 To 8 - i * 2

        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(8)各元素可能的值是(    )

A . 3,1,8,7,11,13,17,15 B . 3,1,5,7,9,13,15,21 C . 5,3,5,7,9,17,15,19 D . 17,1,13,7,9,13,7,15
编写“素数查找”程序,实现如下功能:单击“生成”按钮,随机生成50个150至200(包括150和200)之间的正整数,显示在下方,每行显示10个,共5行。单击“筛选”按钮,从上面50个数中筛选出是素数的数,重复的只显示一次。程序运行界面如图所示。

请根据算法将下列程序补充完整。

Private Sub Command1_Click()

    Label3.Caption = ""

    For i = 1 To 50

        a(i) =

        If i Mod 10 = 0 Then

            Label3.Caption = Label3.Caption + CStr(a(i)) + vbCrLf '换行

        Else

            Label3.Caption = Label3.Caption + CStr(a(i)) + " "

        End If

    Next i

End Sub

Private Sub Command2_Click()

    Label4.Caption = ""

    n = 0

    For i = 1 To 50

        For k = 2 To a(i) - 1

            If Then Exit For

        Next k

        If k = a(i) Then

            n = n + 1

        If n = 1 Then b(n) = a(i)

        For j = 1 To n - 1

            If b(j) = a(i) Then: Exit For

            If j = n - 1 Then b(n) = a(i)

        Next j

    End If

Next i

For j = 1 To n

    Label4.Caption = Label4.Caption + + " "

Next j

老张要准备一道晚宴,需要上n个菜,为了省事他在n个不同的餐厅订好了这些菜。现在他需要尽快取回这些菜,对于每一道菜,有两种取菜方式:

1)让各店的外卖员送货上门,对于第i个菜需要花费a(i)的时间。

2)自己去餐厅取回家,每次出门仅能取回一道菜,对于第i个菜,从出门到回家整个过程需要花费b(i)的时间。

每家餐厅都有各自的外卖员送菜,并且无论老张是否在家,他们都能把菜送到。为了节省时间,能由外类员送的菜尽量由外卖负各自送达,现在需要知道最少花费多少时间能集齐所有的菜。

比如n=4,a(i)=(30,70,40,50),b(1)=(20,10,20,30},那么花费时间少的方案是第一个菜和第三个菜让让外卖员送,第二个菜和第四个菜老张自己取,一共需要40分钟。

设计VB程序计算最少时间,界面如下图

实现上述功能的VB程序如下,回答以下问题:

  1. (1) 根据程序语句判断对象Lab3属于类。

    (单选,填字母:A .Form1/B .Label /C .TextBox / D .CommandButton)

  2. (2) 请在划线处填入合适的代码。

    Const n=4

    Dim a(1 To n) As Integer    'n道菜由每家餐厅外卖员送达耗时

    Dim b(1 To n) As Integer    'n道菜自取耗时

    Private Sub Form Load)

        '产生外卖送货各道菜耗时,并存储到数组a中,并显示

        '产生自取各道菜耗时,并存储到数组b中,并显示

        '代码略

    End Sub

    Private Sub Command1_Click()

        Dim i As Integer, max As Integer, ans As Integer

        Dim left As Integer, right As Integer, m As Integer

        For i=1 To n

            If a(i) > max Then       '外卖员送菜的最长时间

        Next i

        left= 1: right = max: ans = max

        Do While left <= right

            m= (left + right) \ 2

            If Then

                ans = m: right=m-1

            Else

                left=m+1

            End If

        Loop

        Lab3. Caption=“最快”+ Str(ans) + “分钟”

    End Sub

    Private Function check(t As Integer) As Boolean

        Dim total As Integer

        check = False

        For i =1 To n

            If a(i) > t Then

                total ='如果外卖来不及就自己取

            End If

        Next i

      If  Then check = True

    End Function

  3. (3) 程序中加框处代码有错,请改正。
有如下VB 程序段:

Key = Val(Text1.Text):s = 0: i = 1: j = 7

Do While i <= j

    m = (i + j) \ 2

    s = s + m

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

Loop

Text2.Text = Str(s)

数组元素a(1)到a(7)的值依次为“12,15,18,20,20,20,29”,在文本框Text1中输入待查数,执行该程序段后,则文本框 Text2 中显示的内容不可能的是(    )

A . 7 B . 9 C . 15 D . 17
是指在密码算法中引进的控制参数,对一个算法采用不同的参数值,其解密结果就不同。比如,恺撒密码的密钥为3,加密和解密使用同一个密钥,被称为体制。