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

小张设计了一个“加减运算练习”VB程序。界面如下图所示。单击“出题”Command1按钮显示两个运算数和运算符号,并计数。在文本框Text1中输入计算结果后单击“判断”按钮Command2,如果计算结果正确,则得分加10分,直至完成10题测试。VB程序如下,但加下划线处代码有错,请改正。

Dim n,s As Integer    'n为试题计数器,s为得分

Dim a, b As Integer  'a,b 为两个运算数

Dim c As String 'c为运算符:"+ "表示加法,"-"表示减法

Private Sub Form_Load()

n = 0:

s = 0

End Sub

Private Sub Command1_Click()   ‘出题按钮

Randomize

n = n + 1

If n < 11 Then

      Label1.Caption = "No:" + Str(n)

      a = Int(Rnd * 100)  'a,b为运算数,且要求a不小于b

      b = Int(Rnd * 100)

      If   Then t = a: a = b: b = t                '(1)

      If  Rnd > 0.5  Then c = "+" Else        '(2)

      Label5.Caption = Str(a) + c + Str(b) + "="

      Text1.Text = ""

Else

   Command1.Caption = "完成测试"

End If

End Sub

Private Sub Command2_Click()   ‘判断按钮

If c = "+" Then

             If   a + b = Val(Text1.Text) Then  s = s + 10

           Else

             If  Then  s = s + 10    '(3)

End If

Label3.Caption = "得分:" + Str(s)

End Sub

如果两个质数的差为2,则这两个质数称为孪生质数对;编写VB程序,实现如下功能:单击“显示孪生质数对”按钮Command1,在列表框list1中显示100以内的所有孪生质数对(运行效果如图所示)。

实现上述功能的VB代码如下, 但划线处代码有错,请改正。

Dim a(1 To 50) As Integer

Private Sub Command1_Click()

Dim i As Integer

k = 0: i = 3

Do While i <= 100

   If  ① prime(i)   Then      ‘⑴

      k = k + 1

      a(k) = i

   End If  

   i = i + 2

Loop

For i = 2 To k

   If   ②a(i) = a(i +1)+2   Then   ‘⑵

      List1.AddItem Str(a(i - 1)) + "和" + Str(a(i))

   End If

Next i

End Sub

Function prime(x As Integer) As Boolean

prime = False

For i = 2 To Int(Sqr(x))

   If  x Mod i = 0  Then

      prime = True

      Exit For

   End If

Next i

End Function

  ②  

下表记录了6个数据的排序过程。分析表中数据可知,该排序采用的算法与排序方式分别为

原始数据

65

57

59

44

45

69

第1遍

44

65

57

59

45

69

第2遍

44

45

55

57

59

69

第3遍

44

45

57

65

59

69

 
A . 冒泡排序,升序 B . 选择排序,升序 C . 冒泡排序,降序 D . 选择排序,降序
编写VB程序,实现如下功能:在文本框Text1中输入十进制整数,文本框Text2中输入待转换进制(范围2~16),单击“转换”按钮Command1,在列表框List1中输出该整数对应的进制结果,运行效果如图1所示。

图片_x0020_7

图片_x0020_8

图1

图2

  1. (1) 设计时,属性窗口对象列表如图2所示,则该程序共有个对象。
  2. (2) 为实现上述功能,请在划线处填入合适的代码。

    Private Sub Command1_Click()

       Const code = "0123456789ABCDEF"

       Dim s1 As String, s As String   '变量s存储转换后的结果

       Dim x As Long, R As Integer

      

       If R >= 2 And R <= 16 Then

          x = Val(Text1.Text)

          s = ""

          Do While x > 0

            y = x Mod R

            x =

            s1 = Mid(code, y + 1, 1)   '将余数转换为对应的字符

            s =

          Loop

          List1.AddItem "(" & Text1.Text & ")10" & " →(" & s & ")" & R

        End If

    End Sub

  3. (3) 在Text1中输入180,在Text2中输入8,list1中输出
以下程序的功能是随机生成100个97-122之间的正整数(包括97和122),并将一个区间内的数(第x个元素到第y个元素)取出并按升序输出。请修改加框处的错误。

Private Sub Command1_Click()

Dim a(1 To 100) As Integer

x = Val(Text1.Text)

y = Val(Text2.Text)

For i = 1 To 100

     (1)

  List1.AddItem Str(a(i))

Next i

For i = x To y - 1

  k = i

  For     (2)

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

  Next j

  If k <> i Then

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

  End If

Next i

For i = x To y

  List2.AddItem Str(a(i))

Next i

End Sub

  ⑵ 

有如下 VB 程序段: i = 1

Do While i <= 5

If i = 1 Or a(i - 1) <= a(i) Then i = i + 1

Else

t = a(i): a(i) = a(i - 1): a(i - 1) = t i = i - 1

End If Loop

数组元素a(0)到a(8)的初始值依次为“0,4,7,3,5,1,8,6,2”。执行该程序段后,数组元素a(1)到a(8)的值分别是

A . 1 3 4 5 7 8 6 2 B . 7 5 4 3 1 8 6 2 C . 4 7 3 1 2 5 6 8 D . 4 7 3 8 6 5 2 1
自然常数e,约为2.71828,其值可通过泰勒公式计算获得

小明编写了一个VB程序来计算e的近似值,功能为在文本框Text1中输入公式n值,单击“计算”命令按钮Command1,在标签Labe2中显示计算结果,程序运行界面如图所示。

  1. (1) 代码“Private Sub Commandl_Click()”中的Click是(单选,填字母:A .对象名/B .属性名/C .事件名)。
  2. (2) 为实现上述功能,请在画线处填入合适代码。

    Private Sub Command1__Click()

      Dim I As Double,p As Double

      Dim e As Double

      n=    ①   

      e=1

      i=1

      p=1

      Do While i<=n

        p=    ②   

        e=e+p

            ③   

      Loop

      Label2. Caption=“e的值是:”+Str(e)

    End Sub

     ② ③ 

有n个整数存储在a数组,将其中的奇数转存到b数组中,并将b数组从小到大排序。部分程序如下:

t = 0

For i = 1 To n

  If a(i) Mod 2 = 1 Then

    t = t+1

   

  End If

Next i

For i = 1 To t-1

  For j = t To i + 1 Step-1

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

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

    End if

  Next j

Next i

方框中应填写的正确语句是(  )

A . b(i) = a(i) B . b(i) = t C . b(t) = a(i) D . b(t) = a(t)
玫瑰花数是一个四位正整数,该数每一位上的数字4次方之和等于它本身。如:1634=14+64+34+44,小张设计VB程序用于找出所有可能的玫瑰花数,程序运行界面如下图所示。

  1. (1) 在窗体中要显示玫瑰花图像(文件名为flower.bmp),需添加图像框image1,并设置其属性(单选,填字母:A .Image/B .Pictrue/C .Caption/D .Text)的值为“flower.bmp”。
  2. (2) 为实现上述功能,请在划线处填入合适的代码。

    Private Sub Command1_Click()

     Dim sum As Integer, a As Integer, b As Integer

     Dim i As Integer, c As Integer, d As Integer

     List1.Clear

     sum = 0      '玫瑰花个数

     For i = 1000 To 9999

    a = i Mod 10     '求个位上的数字

     b =①       '求十位上的数字

     c = i \ 100 Mod 10       '求百位上的数字

     d = i \ 1000         '求千位上的数字

     If a ^ 4 + b ^ 4 + c ^ 4 + d ^ 4 = i Then

     List1.AddItem Str(i)

    End If

     Next i

     Label1.Caption = "玫瑰花个数为:" + Str(sum)

    End Sub

  3. (3) 解决该问题主要采用的算法是
编写VB程序,实现如下功能:在左边的文本框Text1中输入字符,单击“加密”按钮Command1时,逐个字符进一行加密,加密过程是:先在“加密表”m中找到相应字符,再得到其所对应位置的密钥Text3(下方),并在右边的文本框Text2中显示密文,运行效果如图所示。本题不考虑解密问题。

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

  1. (1) 如图所示,若将Text3中的密钥改为:“I. am. a. good. student. from. Zhejiang”(不含双引号),文本框Text1中依然输入“zjks”,单击“加密”按钮Command1,则在文本框Text2中显示的是
  2. (2) 请在划线处填入合适代码。

    Private Sub Command1_Click()

    Dim s As String, m As String

    Dim t As String

    s1=Len(Text3.Text)

    If s1 < 26 Then

    Text2.Text=“请重新输入密钥!”

    Exit Sub

    End If

    s=Text1.Text

    n=Len(s)

    For i=1 To n

    k=Mid(s,i,1)

    m= “abcdefghijklmnopqrstuvwxyz”

    a=1:b=26

    Do While a<=b

    c=   ①  

     If k= Mid(m,c,1) Then

    Exit Do

    End If

    If    ②   Then

    b=c-1

    Else

    a=c+1

    End If

    Loop

    s3=Text3.Text

    t=t+    ③    

    Next i

    Text2.Text=t

    End Sub

     ② ③ 

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

i=1:j=10:k=0

key=Val(Text1.Text)

Do While i<=j

k=k+1

m=(i+j+1)\2

If a(m)<key Then

i=m+1

Else

j=m-1

End If

Loop

数组元素a(1)到a(10)的值依次为10,12,14,17,19,20,20,27,29,32。在文本框Text1中输入12,执行该程序段后,以下变量值正确的是(   )。

A . i=1 B . j=1 C . m=2 D . k=3
有一组原来按升序排列的正整数,第p个至第q个数据(p和q的值分别由文本框Text1和Text2输入,且p<q)的区间被打乱,其他数据的位置不变,小陈首先依据冒泡排序的思想对该区间中的数据进行升序排序使得整组数据恢复升序排列,然后依据对分查找的思想在该组数据中查找满足[k1, k2](k1和k2的值分别由文本框Text3和Text4输入,且k1<k2)范围的数据个数并显示在标签Label1中。相关示例如下(其中p=4,q=7,k1=70,k2=80)。

排序前

55

70

70

78

71

79

75

80

80

90

排序后

55

70

70

71

75

78

79

80

80

90

查找该组数据中满足[k1, k2]范围的数据个数为:8

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

  1. (1) 下列对象中没有Caption属性的是 (单选,填字母:A . 标签 Label1 /B . 命令按钮 Command1 /C . 文本框 Text1)。
  2. (2) 程序加框处代码有错,请改正。

    Private Sub Command1_Click()

    Const n = 10

    Dim a(1 To n) As Integer, k As Integer

    Dim i As Integer, j As Integer, k1 As Integer, k2 As Integer

    Dim p As Integer, q As Integer 

    Dim b As Integer      '查找满足条件的第一个数据所在数组元素的下标

    '读取排序前的一组正整数,存储在数组a中。代码略

    p= Val(Text1.Text)

    q = Val(Text2.Text)

        For i = p To q - 1

            For j =  Step -1

                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

        k1 = Val(Text3.Text) 

        k2 = Val(Text4.Text) 

        i = 1: j = n

        Do While i <= j

            m = (i + j) \ 2

            If   ①    Then

                i = m + 1

            Else

                j = m - 1

            End If

        Loop

        b =    ②   

        i = 1: j = n

        Do While i <= j

            m = (i + j) \ 2

            If a(m) <= k2 Then

                i = m + 1

            Else

                j = m - 1

            End If

        Loop

    Label1.Caption = Str   ③     

    End Sub

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

     ② ③ 

酒店房间管理问题:某酒店房间(房间数小于1000)编号按1,2..连续编号,客房经理对没有人住的房间使用如下方法来登记管理。连续的空房间,登记第一个房间的编号和连续的空房间数,比如空房间1,2,6,7,8,10,则登记3条记录,分别为1_2,6_ 3, 10_1。某旅客如果退房,需要把这个房间号也登记进去,共有4种情况需要处理:

1)上靠:若退的房间号为3,则原来登记的记录变为1_3,6_3,10_1;

2)下靠:若退的房间号为5,则原来登记的记录变为1_2,5_4,10_1;

3)上下靠:若退的房间号为9,则原来登记的记录变为1_2,6_5;

4)上下都不靠:若退的房间号为4,则原来登记的记录变为1_2,4_1,6_3,10_1

据上述规则,小明编写了相应的VB程序,程序启动时读入空房间数据,并在列表框List1中显示,在文本框Text11中输入退房号,单击“退房”按钮后更新列表框List1中的数据。程序界面如图所示,请回答下列问题:

单击退房按钮

 

  1. (1) 当前登记的记录有3条,分别是2_3,6_2,9_4。某旅客退掉8号房间,则登记的记录将变为
  2. (2) 实现上述VB程序如下,请在划线处填入合适的代码。

    Dim a(0 To 10) As Integer     ‘保存第i条记录的开始房间号

    Dim b(0 To 10) As Integer     ‘保存第i条记录的房间数

    Dim sp As Integer

    Private Sub Form_load()

    ‘程序启动时从数据库读取原始k条记录,依次存入a(1),b(1),a(2),b(2),...a(k),b(k)代码略

        a(0)=0: b(0)=0: sp=k+1: a(sp)=0: b(sp)=0

    End sub

    Private Sub Command1_Click()

        Dim i As Integer, j As Integer

        c = Val(Text1.Text)

        i = 1

        Do While a(i) < c

            i = i + 1

        Loop

        i = i - 1

    '处理退房登记问题

        If a(i) + b(i) = c Then

            If a(i + 1) = c + 1 Then   ‘处理第3种情况

                

                For j = i + 1 To sp - 1

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

                Next j

                sp = sp - 1

            Else      ‘处理第1种情况

                b(i) = b(i) + 1

            End If

        ElseIf c + 1 = a(i + 1) Then     ‘处理第2种情况

            a(i + 1) = c: b(i + 1) = b(i + 1) + 1

        Else

            For j =

                a(j) = a(j - 1): b(j) = b(j - 1)

            Next j

            a(i + 1) = c: b(i + 1) = 1:

        End If

        List1.Clear

        For i = 1 To sp - 1

            List1.AddItem "" & Str(i) & Str(a(i)) & Str(b(i))

        Next i

    End Sub

有如下VR程序段:

tail=6: i=1: r=2

Do While i<r

    For j= tail To i+1 Step-1

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

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

        End If

    Next j

    i=i+1

    For j=i To tail-1

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

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

        End If

    Next j

    tail=tail-1

Loop

数组元素值“73、56、28、61、44、92”,运行程序,数组元素a(1)到a(6)的值依次为(   )

A . 73,61,56,92,44,28 B . 92,73,56,61,44,28 C . 92,73,61,56,28,44 D . 92,73,61,56,44,28
小王编写了一个对指定范围[a,b]内的数据排序的程序,范围外的数据保持原样。如指定4-10,就是第4个到第10个数据进行升序排序,其他不排。实现上述功能的主要VB程序段如下:

For i=a To b- 1

    For j=

        If  Then

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

        End If

    Next j

Next i

方框处的语句分别是(      )

A . ①a To b-i+a-1   ②x(j)>x(j+ 1) B . ①a To b-i+a-1   ②x(j)<x(j+ 1) C . ①b- 1 To i+ 1 step-1   ②x(j)>x(j+ 1) D . ①b-1 To i+ 1 step-1   ②x(j)<x(j+ 1)
某学校高一年级共有500名学生,10个班,现需要根据某次考试的技术成绩从高到低进行考试号编排,考试号从100开始,如出现成绩一样的情况,则考试号按学生学号从大到小编排,如图所示。为此,小王编写了一个VB程序,程序功能如下:单击“读取数据”按钮 Command1,程序从数据库中读取学生的学号、成绩分别存储在数组xh、cj中,并在列表框List1输出;单击“编排”按钮Command2,程序进行处理,输出结果在列表框List2中。程序运行界面如图所示。

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

Const n=500

Dim xh(1 To n) As Integer    '存放学生学号

Dim cj(1 To n) As Integer    '存放学生成绩

Dim i, d, k, t, y As Integer

Private Sub Command1 Click()

    '本过程从数据库中读取学生数据,存储在相应的变量中,并在List1中显示

    '代码略

End Sub

Private Sub Command2_Click()

    For i=1 To n-1

        For j=n To i+1 Step-1

            If c(j)>cj(j-1) Then

                t=ci(j): cj(j)=cj(j-1): cj(j-1)=t

                t=xh(j):xh(j)=xh(j-1):xh(j-1)=t

            End If

        Next j

    Next i

    k=1

    For i=2 To n

        If    ①   Then

            k=k+1

            y=0

        Else

            y=1

        End If

        If (y=1 And k> 1) Or (i=n And k> 1) Then

            For d=i-k To i-2

                For    ②    To (i-k+1) Step-1

                    If xh(j)>xh(j-1) Then

                        t=xh(j): xh(i)=xh(j-1): xh(j-1)=t

                    End If

                Next j

            Next d

            k=1

        End If

    Next i

    List2.Clear

    List2.AddItem " "+"学号"+"  "+"技术成绩"+"  "+"考试号"

    For i=1 To n

        List2.AddItem Str(xh(i))+"  "+Str(cj(i))+"  "+   ③  

    Next i

End Sub

  1. (1) 如原始数据里漏输了一个学生,已知该学生的学号为“20170240”,成绩为“99”,则增加该学生数据后,运行程序时,该学生的考试号为
  2. (2) 请在画线处填入合适的代码。

     ② ③ 

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

i = 1: j = 20

m = (i + j + 1) \2

Do While i < j And Key <> a(m)

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

    m = (i + j + 1) \2'①

Loop

数组元素a(1)到a(20)各不相同且按降序排列,若查找键key与a(4)相等,执行该程序段,①处语句的执行次数有(    )

A . 5 B . 4 C . 3 D . 2
数组a中存储的是左右交替上升的n个正整数,如下表所示:

a(1)

a(2)

a(3)

……

a(n-2)

a(n-1)

a(n)

3

25

38

……

55

31

12

依据对分查找思想,设计一个在数组a中查找数据key的程序。实现该功能的VB程序如下,但加框处代码有错,请改正。

Private Sub Command1_Click( )

    Const n=6

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

    Dim i As Integer,j As Integer,m As Integer,key As Integer

    ′读取一组正整数,按上述规则存入数组a中,代码略。

    key=Val (Text1.Text)

    i=1

j=(n+1)\2

flag=True

Do While  And Not flag′

        m=(i+j)\2

        If key=a(m) Then

           flag=True

        ElseIf key<a(m) Then

           j=m-1

        Else

           i=m+1

        End If

     Loop

     If Not flag And j>0 Then

         m=

         If key=a(m) Then flag=True

      End If

      If flag Then

         Text2.Text=Str(m)

      Else

         Text2.Text=“找不到”

      End If

End Sub

其中,加框处应改正为

有以下VB程序段:

Dim a As String, b As String, p As String, s As String

a = Text1.Text

b = Text2.Text

c = Text3.Text

p = “ ”

For i = 1 To Len(a)

    If b = Mid(a, i, Len(b)) Then

        s = s + c

        p = p + Str(i)

    Else

        s = s + Mid(a, i, 1)

    End If

Next i

Label1.Caption = p

若文本框Text1中输入“Hello,Python!I use Python!”,文本框Text2中输入“Python”, 文本框Text3中输入“VB”运行该段程序后,标签Label1中显示的是(  )

A . 7 20 B . 8 21 C . 12 26 D . 13 27
某校要举行国际象棋比赛,计划组织k场对弈。每个人最多参加2场对弈,最少参加0场对弈。每个人都有一个与其他人不相同的等级(用一个正整数来表示)。在对弈中,等级高的人用黑色的棋子,等级低的人用白色的棋子。每个人最多只能用一次黑色的棋子和一次白色的棋子。为增加比赛的可观度,观众希望k场对弈中双方的等级差的总和最小。

比如有7个选手,他们的等级分别是30,17,26,41,19,38,18,要进行3场比赛。最好的安排是选手2对选手7,选手7对选手5,选手6对选手4。此时等级差的总和等于(18-17)+(19-18)+(41-38)=5达到最小。

窗体form1的运行界面如下图所示,用户在文本框Text1中输入各位选手的等级(以逗号分隔),在文本框Text2中输人要对弈的场数k,单击计算按钮Commmand1,在文本框Text3中显示最小等级差总和。程序运行界面如图所示。

  1. (1) 若要使得的在程序启动时文本框text1中内容自动清空,可在以下哪个事件处理过程中编写代码实现                 (选填)
    A . form1_load() B . Text1 _Change() C . form_load() D . text1_load()
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Dim a(0 To 1000) As Integer

    Dim b(0 To 1000) As Integer

    Private Sub Command1_ Click()

        Sum=0

        k = Val(Text2. Text)

        s =Text1. Text

        cnt =1

        For i=1 To Len(s)

            c=mid(s, i, 1)

            If c="," Then cnt=cnt+1 Else

        Next i

        For i=1 To cnt-1

            For j=1 To cnt-i

                If  Then

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

                End If

            Next j

        Next i

        '计算出各等级选手之间差值

        For i=1To cnt- 1

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

        Next i

        For i=1 To k

            Min=i

            

                If b(j) < b(Min) Then Min = j

            Next j

            Sum = Sum + b(Min)

            

        Next i

        Text3. Text = Str(Sum)

    End Sub

  3. (3) 加框处的程序代码有错,应改为