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

【加试题】用选择排序算法对一组数据进行排序,已知第一遍排序结束后的数据序列为66,78,93,87,82,则下列选项中可能是原始数据序列的是:(   )
A . 78,93,87,82,66 B . 93,78,66,87,82 C . 78,93,66,82,87 D . 93,66,78,87,82
用选择排序将七个数“2022,2017,2018,2014,2021,2012,2015”从小到大进行排序,则第二轮交换数据后的顺序是(   )
A . 2022,2021,2018,2017,2014,2012,2015 B . 2012,2014,2018,2017,2021,2022,2015 C . 2012,2017,2018,2014,2021,2022,2015   D . 2022,2021,2018,2014,2017,2012,2015  
【加试题】某排序算法的VB程序段如下:

n = 10

Text1.Text = ""

  For i = 1 To 5

    For j = n To i + 1 Step -1

      If a(j) < a(i) Then

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

      End If

    Next j

  Next i

  For i = 1 To 10

      Text1.Text = Text1.Text + Str(a(i))

  Next i

数组元素a(1)到a(10)的值依次为“965,155,195,444,106,734,172,983,898,360”,执行该程序段,文本框Text1中显示的是(   )

A . 106 155 172 195 360 444 734 898 965 983 B . 106 155 172 195 360 734 444 983 898 965 C . 983 965 898 734 444 360 172 195 155 106 D . 106 155 172 195 360 965 444 734 898 983
异或(xor)是一个数学逻辑运算符,如:x xor y,其运算具体方法描述如下:

⑴分别将十进制数x,y转换为二进制,并将转换的每位二进制数存储到数组a,b中;如果两个二进制位数不相等,则位数较少的前面用“0”补足,使之a,b数组元素个数一致;

⑵取出数组a,b中下标相同的数组元素进行运算,若值相同,则结果为0,否则为1;

根据上述运算方法,示例如表所示。

变量

十进制

二进制

x

19

1

0

0

1

1

数组a

a(1)

a(2)

a(3)

a(4)

a(5)

y

9

0

1

0

0

1

数组b

b(1)

b(2)

b(3)

b(4)

b(5)

x xor y

1

1

0

1

0

小明编写了一个VB程序,功能如下:在文本框Text1、Text2中分别输入x、y的值,单击“异或”按钮Command1,程序对数据进行异或运算,并将结果显示在列表框List1中。

  1. (1) 在设计程序界面时,要使按钮Command1显示“异或”二字,则应该修改Command1的属性。
  2. (2) 实现上述功能的VB程序如下,在划线处填入合适的代码,加框处代码有错,请改正。

    Function f(z As Integer) As String

    '此程序段实现将十进制数z转换为二进制数f

    Dim y As Integer

    Do While z > 0

            y = z Mod 2

            z =      ①     

            f = str(y) & f

     Loop

    End Function

    Private Sub Command1_Click()

    Dim x,y,k,m As Integer

    Dim s1 As String, s2 As String, s3 As String

    Dim a(15) As String, b(15) As String

    x = Val(Text1.Text): y = Val(Text2.Text)

    If x < y Then

       m = x: x = y: y = m

    End If

    s1 = f(x): s2 = f(y)         's1表示x的二进制数,s2表示y的二进制数

    k = Len(s1)

    For i = 1 To k               '将转换后的二进制数按位分别存储到数组a和b

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

         If i <= Len(s2) Then

            b(i) = Mid(s2, i, 1)

         Else

                   '② 

         End If

    Next i

    S3=""

    For i = 1 To k

       If     Then  '③

    s3 = "0" + s3  

    Else

    s3 = "1" + s3

       End If

    Next i

    List1.AddItem "异或结果是:" + s3

    End Sub

     ② ③

  3. (3) 十进制数10和十进制数20的异或结果是
小刘设计了一个排序算法,该排序算法会将数组a中奇数位的元素从小到大排列,偶数位的元素从大到小排列,程序界面如图,算法的VB程序段如下:

Private Sub Command2_Click()

Dim i As Integer, j As Integer, tmp As Integer

Dim s1 As String, t As Integer, s2 As String

t=1

For i=1 To n-2

    For j= To n Step 2     ‘改错

        If a(i)*t>a(j)*t Then

            tmp =a(i): a(i)= a(j): a(j)=tmp

        End if

    Next j

                   ‘填空①

Next i

For i =1 To n

    If     Then       ‘填空②

        s1 =s1 Str(a(i))

    Else

        s2=s2+Str(a(i))

    End If

Text2. Text=“奇数位:”+s1

Text3. Text=“偶数位:”+s2

End Sub

回答以下问题:

  1. (1) 若要修改按钮 Command上显示的文字,应修改的属性名是(单选,填字母:A .Text/B .Caption/C .Click)
  2. (2) 程序代码中,For语句加框处有错,应改为.
  3. (3) 划线部分的代码应填①
  4. (4) 若将划线处“For i=1 To n-2”修改为“For i=1 To n-1”,是否会出错? (填是/否)
有一组正整数,要求仅对其中的素数进行升序排序。排序后素数在前,非素数在后排序示例如下。

排序前

86

71

5

41

81

79

37

89

排序后

5

37

41

71

79

89

86

81

实现上述功能的VB程序如下,但加框处代码有错,请改正。

Const n = 8

Dim a(1 To n) As Integer

Private Sub Command1_ click ( )

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

Dim flag As Boolean, sl As String, s2 As String

‘ 读取一组正整数,存储在数组a中

‘ 代码略

For i = 1 To n

  s1 = s1 + Str(a(i))

Next i

Text1. Text = s1

For i = 1 To n-1

        ‘①

    If IsPrime(a(k)) Then flag = True

    Else flag = False

    For j = i + 1 To n

      If IsPrime (a(j)) Then

        If       Then    ‘②

          k = j

          flag = True

        End If

      End If

    Next j

    If k <> i Then

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

    End If

  If Not flag Then Exit For ‘ Exit For表示退出循环

  Next i

  ‘依次输出排序后的数据

  ‘代码略

  For i=1 To n

    s2 = s2 + Str(a(i))

  Next i

  Text2. Text = s2

End Sub

Function IsPrime (m As Integer) As Boolean

‘ 本函数判断整数m是不是素数。是素数返回值为True,不是素数返回值为False

‘ 代码略

End Function

加框①处代码应改为

加框②处代码应改为

某同学将对分查找程序进行了改编,程序运行时,自动产生9个[10,99]之间的不重复随机数并降序排列,在文本框Text1中显示。在文本框Text2中输入查找键key,单击“查找”按钮Command1,将查找结果显示在文本框Text3中。程序运行界面如图所示。

Key = Val (Text2. Text)

i =1

j=9

flag = False

Do While i <= j And flag = False

  m=(i+j)\2

  If     ⑴     Then

    j=m-1

  ElseIf     ⑵     Then

    i=m+1

  Else

    If     ⑶     Then

      j=m-1

    ElseIf     ⑷     Then

      i=m+1

    Else

      flag = True

    End If

  End If

Loop

If flag Then Text3. Text = “在第”+ Str(m) +“个”Else Text3. Text =“找不到”

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

①Key \ 10 > a(m) \ 10    ②Key Mod 10 < a(m) Mod 10

③Key \ 10 < a(m) \ 10    ④Key Mod 10 > a(m) Mod 10

则(1)(2)(3)(4)处语句依次为(  )

A . ①②③④ B . ④②①③ C . ①③④② D . ①②④③
分析完善程序。

假设银行的年存储利率为3%,如果现在存储10000元钱,问多少年后连本带利超过12000元。设定:连本带利=本金*(1+利率)年数。

假设n年后连本带息超过12000,根据题意得出数学关系式:10000*(1+3%)n>12000,求最小的n。

Dim s as single

Dim r as single

Dim n as integer

s=10000

r=0.03

n=0

Do while            

   n=n+1

s=s*(1+r)

Loop

Print n;”年后”:”连本带利超过”;s

根据上述回答下列问题

  1. (1) 本题采用的算法是(填写:解析法/穷举法/排序法/递归法)
  2. (2) 写出参考程序中空白处表达式
小李基于选择排序算法编写了一个VB程序,功能如下:在文本框Text1中显示排序前的数据,单击“排序”按钮Command1,在文本框Text2中显示剔除重复数据后的升序排序结果。程序运行界面如下图所示。算法的思路:第i趟排序从a(i)….a(bottom)中查找最小值并记录其下标k,同时将后面的每个元素与a(i)比较是否重复,若发现重复数据,进行剔除处理;找到最小值与a(i)交换。

实现上述功能的VB程序如下,在橫线处填入合适的代码。

Const n = 10

Dim a(1 To n) As Integer

Private Sub Command1_Click()

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

Dim k As Integer, bottom As Integer

'获取排序前数据,依次存储在数组 a 中,并在文本框 Text1 中显示。代码略

bottom = n: i = 1

Do While i <= bottom - 1

k = i: j = bottom

Do While j > i

If a(j) < a(k) Then

k = j

ElseIf a(j) = a(i) Then         '若发现重复数据,进行剔除处理

a(j) = a(bottom)

IfThen k = j

bottom = bottom - 1

End If

j = j - 1

Loop

If k <> i Then

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

Else

EndIF

Loop

For i = 1 To

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

Next i

End Sub

小温编写了一个有关环形数据排序的VB程序,实现如下功能:排序前的原始数据在窗体左边环形显示,单击“排序”按钮Command1后,原始数据中最小元素的位置固定不变,从该位置开始数据按逆时针升序,排序后的数据在右边环形显示。例如,排序前a(1)到a(10)的数据依次为“1,11,19,18,016,8,9,17,4",按顺时针顺序在窗体左边环形显示,则排序后a(1)到a(10)的数据依次为9,4,1,19,18,17,16,11",在窗体右边环形显示。程序运行界面如图所示。

请回答下列问题。

  1. (1) 该环形数据排序的VB程序主要采用(选填:冒泡排序/选择排序)算法。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Constn= 10

    Dim a(1 To n) As Integer

    Private Sub Command1_ Click()

         Dim Left As Integer, Right As Integer, Lstart As Integer, Rstart As Integer

         Dim i As Integer, j As Integer, t As Integer, s As String

         '随机生成n个不重复元素的数组a,并在左边环形显示,代码略

         k= 1

         For i= 2 Ton

             If a(i) < a(k) Thenk=i

         Next i

         Lstart = (k+n- 2) Mod n+ 1: Rstart= k Mod n+ 1

         i= 1

         Do Whilei<= (n-1)\2

             Left = Lstart

             For j= 1 To

                 p= (Left+ n-2) Mod n+ 1

                 If a(Left) > a(p) Then

                     t= a(Left): a(Left) = a(p): a(p)= t

                 End If

                 Left= p

             Next j

             Rstart= Rstart Mod n + 1

             Right = Rstart

             Do While

                 p=RightModn+1

                 If  Then

                     t= a(Right): a(Right) = a(p): a(p)=t

                 End If

                 Right= p

             Loop

             Lstart =

              i=i+ 1

         Loop

         排序后的数据在右边环形显示,代码略

    End Sub

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

key = Val(Text1.Text)

i = 1 : j = 9

Text2.Text = ""

Do While i <= j

     图片_x0020_100008

    If key = a(m) Then Exit Do

    If key < a(m) Then

        i = m + 1

    Else

        j = m – 1

    End If

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

Loop

数组元素a(1)到a(9)的值依次为88,75,70,68,61,58,55,50,43,本框Text1中输入的值是58,执行该程序段,文本框Text2中显示的是61,50,55,则方框处的代码应为(   )

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

Dim a(1 To 10) As Integer

a(1) = 20: a(2) = 19: a(3) = 17: a(4) = 15: a(5) = 15

a(6) = 15: a(7) = 16: a(8) = 20: a(9) = 25: a(10) = 27

L = 1: R = 10

Do While L <= R

    m = (L + R) \ 2

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

        R = m - 1

    Else

        L = m + 1

    End If

Loop

Text1.Text = Str(R)

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

A . 4 B . 5 C . 6 D . 7
有如下VB程序  

Key = Int(Rnd * 5 + 5)

i = 1: j = 10: sum = 0

Do While i <= j

    m = (i + j ) \ 2

    If a(m) <= Key Then

        i = m + 1

    Else

        j = m - 1

    End If

    sum = sum + m

Loop

数组元素a(1)到a(10)分别是2、4、5、6、6、6、8、8、10、12,程序运行后,sum的值不可能是 (     ) 

A . 10 B . 14 C . 22 D . 26
某密码强度判断程序功能如下:在文本框Text1中输入由大写字母、小写字母、数字和其他字符4种不同类型字符组成的密码字符串,单击“判断”按钮Cmd1,在标签框Label3中显示判断结果。程序运行界面如图所示。

密码强度判断条件如下:密码长度小于6,则强度为“弱”。在密码长度大于等于6的情况下,若只出现一种字符,则密码强度为“弱”;若出现两种不同字符,则密码强度为“中”,出现三种以上不同字符,则密码强度为“强”。

  1. (1) Cmd1对象属于类。(单选,填字母:A .Label/B .TextBox/C .CommandButton)
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Cmd1_Click()

        Dim n As Integer, i As Integer, m As Integer, s As String, c As String

       

        If n<6 Then

            Label3.Caption="弱"

        Else

            s="0000"

            For i=1 To n

                c=Mid(Text1.Text, i, 1)

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

                    Mid(s, 4, 1)="1"            '将字符串s第4位上的字符替换为"1"

                ElseIf c>="A" And c<="Z" Then

                    Mid(s, 3, 1)="1"

                ElseIf c>="a" And c<="z" Then

                    

                Else

                    Mid(s, 1, 1)="1"

                End If

            Next i

            m=0

            For i=1 To 4

                If Mid(s, i, 1)="1" Then

            Next i

            If m<2 Then

                Label 3.Caption="弱"

            ElseIf m=2 Then

                Label 3.Caption="中"

            Else

               Label3.Caption="强"

            End If

        End If

    End Sub

  3. (3) 若文本框 Text1中输入的内容为“a26$gh2!”,则单击“判断”按钮Cmd1,事件过程运行结束时,变量s的值为
某单位招聘人员,根据应聘人员的笔试成绩从高到低取一定比例的人员进入面试,若按比例计算出的人数为小数,则直接取整(不四舍五入),若进入面试的最后1名有多个同分人员,同分人员也进入面试。程序运行界面如下,请完成后面的小题:

  1. (1) 程序运行时自动清空文本框Text1中显示的内容,应该在            事件处理过程执行相关命令
    A . Form_load B . Text1_Change C . Command1_Click
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    '人员编号和笔试成绩分别存储到数组变量id 和score中,应聘总人数存储在变量n中面试比例在文本框Text1中输入,所输入比例值必须使面试人数大于1且小于n,代码略。

    Private Sub Command1_Click( )

        Dim i As Integer, j As Integer, st As String, t As Integer

        For i = 1 To n - 1             '按笔试成绩从高到低排序

            k = i

            For j = i + 1 To n

                If  Then k = j

            Next j

            If k <> i Then

                st = id(k): id(k) = id(i): id(i) = st

                t = score(k): score(k) = score(i): score(i) = t

            End If

        Next i

        num =

        j=num+1

        Do while j<=n

            If  Then Exit Do

            j=j+1

        Loop

        For k=

            List2.AddItem Str(k) + " " + id(k) + " " + Str(score(k))

        Next k

    End Sub

  3. (3) 程序中加框处代码有错,请改正
某班级学生为毕业晚会的一个节目设计一个仿“V”字的造型,先筛选出班级里所有男生,然后将参演的n 名男生按照身高,摆出中间低两边高(先右后左)的造型,如图所示。

原1-7号男生身高

171 172 180 174 176 179 178

筛选排序后序列

171 172 174 176 178 179 180

“造型设计”后序列

180 178 174 171 172 176 179

王林同学用VB编写模拟“节目造型”程序,功能如下:从数据库中导出所有学生编号、性别和身高数据;单击“筛选排序”按钮Command1,选出“男生”且按身高升序排列显示在文本框Text1中;单击“设计造型”按钮Command2,根据身高仿“V”字的造型进行有序排列,并将结果显示在文本框Text2 中。程序运行界面如图所示。举例说明如下:

Const n = 7

Dim h2(1 To n) As Integer

Dim height1(1 To n) As Integer, height 2 (1 To n) As Integer

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

Dim sex(1 To n) As Boolean ' 男生sex=true

Private Sub Form_Load()

    'n名学生的身高和性别由数据库导出,分别存储在数组height1和sex中,代码略!

End Sub

Private Sub Command1_Click()

    For i = 1 To n - 1

        For j = n To i + 1 Step -1

            IfThen

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

            End If

        Next j

    Next i

    For i = 1 To n

        Text1.Text = Text1.Text + " " + Str(height1(i))

    Next i

End Sub

Private Sub Command2_Click()

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

    mid = Int((1 + n) / 2)

    left = 0: right = 0

   

    For i = 2 To n Step 2

        right = right + 1

        height2(mid + right) = height1(i)

        left = left + 1

        

    Next i

    For i = 1 To n

        Text2.Text = Text2.Text +“ “ + Str(height2(i))

    Next i

End Sub

为实现以上功能,请在画线处填写正确代码。

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

i=1 : j=8

key=Text1.Text

Do While i<j

    m=(i+j)\2

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

Loop

数组a(1)至a(7)分别是"123","25","35","477","66","8","82",当在Text1中输入5时,运行这段程序后,下面说法错误的是(   )

A . i<j执行4次 B . j的值是5 C . i的值是6 D . m的值是5
实现某排序算法的部分VB程序如下:

For i=1 To 6

    k=i

    For j=i+1 To 7

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

    Next j

    If i<>k then

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

    End If

Next i

在排序过程中,经过某一遍排序“加工”后,数组元素a(1)到a(7)的数据依次为“10,41,75,12,63,11,85”,则下一遍排序“加工”后数组元素a(1)到a(7)的数据依次是(    )

A . 10,11,41,75,12,63,85 B . 10,11,75,12,63,41,85 C . 10,11,12,75,63,41,85 D . 10,11,12,41,63,75,85
有如下程序段:

For i=1 To 2

    For j=1 To 6-i

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

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

        End If

    Next j

Next i

数组元素a(1)到a(6)的值依次为“71,54,58,29,31,78”,经过该程序段“加工”后,数组元素a(1)到a(6)的值依次为(    )

A . 29,31,54,58,71,78 B . 78,71,58,54,31,29 C . 54,29,31,58,71,78 D . 71,58,54,78,31,29
有如下程序段:

For i = 1 To 4

    For j = i + 1 To 5

        If a(j) > a(i) Then t = a(j): a(j) = a(i): a(i) = t

    Next j

Next i

数组元素a(1)~a(5)的值依次为“15,4,12,7,9”,整个排序过程中,数组中数据比较次数和交换次数分别是(  )

A . 比较11次,交换3次 B . 比较11次,交换4次 C . 比较10次,交换3次 D . 比较10次,交换4次