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

【加试题】VB应用程序“跳远成绩排序”功能如下:

 按指定格式录入数据,例:0373,张乐晓,3.90。编号宽度固定为4位,姓名宽度固定为3个汉字,不足部分以全角空格补齐,第9个字符开始为跳远成绩。

 在文本框按回车表示录入一项数据结束,录入的数据经处理后编号、姓名、成绩分别存放在数组编号bh、xm、cj中并将原始数据显示在List1中。

 点击命令按钮Command1后进行排序并将排序后的结果显示在List2中。

 程序运行界面如图所示。

  1. (1) 请在划线处填入适当的代码

    Dim bh(1 To 8) As String

    Dim xm(1 To 8) As String

    Dim cj(1 To 8) As Single

    Dim num As Integer

    Private Sub Command1_Click()

      Dim i As Integer, j As Integer, k As Integer, tmp_1 As String, tmp_2 As Single

      For i = 1 To 7

        k = i

        For j = k + 1 To 8

          If  Then  k = j

        Next j

        If k <> i Then

          tmp_1 = bh(k): bh(k) = bh(i): bh(i) = tmp_1

          tmp_1 = xm(k): xm(k) = xm(i): xm(i) = tmp_1

          tmp_2 = cj(k): cj(k) = cj(i): cj(i) = tmp_2

        End If

      Next i

      For i = 1 To 8

        List2.AddItem bh(i) & xm(i) & Str(cj(i))

      Next i

    End Sub

    Private Sub Form_Load()

      num = 0

    End Sub

    Private Sub sr_txt_Keypress(KeyAscii As Integer)

      Dim srsj As String      '输入数据

      If KeyAscii = 13 Then

        num = num + 1

        srsj = sr_txt.Text

        bh(num) = Mid(srsj, 1, 4)

        xm(num) = Mid(srsj, 6, 3)

        cj(num) =

        List1.AddItem srsj

        If num = 8 Then num = 0

      End If

    End Sub

  2. (2) 在事件处理过程Command1_Click()中采用的算法是
A班一组同学的英语听力成绩分别为24、27、16、15、24、18,下列采用排序算法及第二遍的排序结果分别为: (   )

原始数据

24

27

16

15

24

18

第一遍

27

24

16

15

242

18

第二遍

第三遍

27

24

24

15

16

18

第四遍

27

24

24

18

16

15

第五遍

27

24

24

18

16

15

A . 冒泡排序,27 24 16 15 24 18 B . 冒泡排序,27 24 18 16 15 24 C . 选择排序,27 24 16 15 24 18 D . 选择排序,27 24 18 16 15 24
小李父母开了一家农家乐,顾客可以到桔园自摘桔子,收费标准是门票每人20元,采摘的桔子每斤10元,付费时若能完成小游戏则有优惠。

用VB软件设计的自摘收费程序,功能如下:在文本框Textl中输入自摘的人数n,在文本框Text2中输入摘得桔子重量w。界面右上方是小游戏部分,程序在文本框Text3显示随机产生的桔子层数m,根据图中所示的堆桔子方法(第1层1个;第2层4个;第3层9个……),请顾客计算出m层桔子总数s,输入到文本框Text4中,单击“是否优惠计算”按钮Command1,就会在标签Label4中输出最后的费用f,并在标签Label7中给出提示是否“优惠后的费用”。运行效果如图所示: 

             

  1. (1) 自摘收费程序所用的算法是(填:解析算法/枚举算法)。
  2. (2) 为实现上述功能,请在划线①和②处填入合适的代码。

    Dim m As Integer

    Private Sub Command1_Click() 

    Dim n As Integer, s As Integer

    Dim w As Single, f As Single

    n = Val(Text1.Text)              '输入大人人数n

    w = Val(Text2.Text)             '输入重量w

    f = 20 * n + 10 * w              '计算无优惠的费用f

    s = 0

    For i = 1 To m                            '计算桔子总数

     s = s + i * i

    Next i

    If  s=  Then  '判断是否拿到优惠计算费用

         f = f * 0.5 + s * 0.3'计算优惠后的费用

         Label7.Caption = "恭喜你,这是优惠后的费用!"

    Else

         Label7.Caption = "很遗憾,你没有算对哦!"

    End If

    Label4.Caption = Str(f)        '输出最后的费用f

    End Sub

    Private Sub Form_Load()

    Randomize

    m =               '随机产生15层及以内的桔子层数不含0

    Text3.Text = Str(m)

    End Sub

  3. (3) 若3位顾客摘得5斤桔子,游戏中需要计算出3层桔子的总个数,但是他们没有算对桔子个数,在text4中输入了16,那么这3位顾客需付总费用元。
【加试题】有一组正整数,基于冒泡排序对其中的数进行升序排序。排序后奇数在前,偶数在后。排序示例如下:

排序前

78

30

64

39

49

4

8

32

18

32

排序后

39

49

83

4

8

18

30

32

64

78

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

Const n = 10

Dim d(1 To n) As Integer

Private Sub Command1_Click()

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

  '读取一组正整数,存储在数组d中,代码略

  i = 1

  Do While i <= n - 1

    For j = n To i + 1 Step -1

      If d(j) Mod 2 = d(j - 1) Mod 2 Then

        If  Then              '(1)

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

        End If

                                    '(2)

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

      End If

    Next j

    i=i+1

  Loop

  '依次输出排序后的数据,代码略

End Sub

 ⑵ 

编写VB程序,实现如下功能:有一个四位数,此数十位上的数字是7,且这个四位数是一个完全平方数,现要找出符合以上要求的所有四位数,并统计共有几个数。单击Command1按钮,将符合要求的四位数显示在列表框List1中,统计个数显示在标签Label2中,界面如图所示。

  1. (1) 若要修改窗体背景颜色,可在其属性窗口中属性的属性值进行修改。
  2. (2) 解决这个问题采用的算法是(填字母:A 、解析算法  B 、枚举算法)
  3. (3) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click()

      Dim i As Integer, x As Integer, c As Integer

      c = 0

      For i = 1000 To 9999

          x =

         If And x = 7 Then

               '将符合条件的四位数显示在列表框中

    num = num + 1

         End If

      Next i

      Label2.Caption = "共有:"+ +"个"

    End Sub

有如下VB程序段:

s=″72186345945″:c=0

For i=1 To 6

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

Next i

For i=1 To 4 Step 2

k=i

For j=i+2 To 6 Step 2

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

Next j

If k<>i Then

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

End If

Next i

Text1.Text=Str(c)

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

A . 1 B . 2 C . 3 D . 4
某对分查找算法的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
填空题
  1. (1) 使用二分法从数据1,3,6,9,15,16,45中查找数据16,共经过次查找就可以找到。
  2. (2) 定义一个数组如下:

    Dim a(10 to 20) as integer

    则此数组中元素的个数为

  3. (3) 法就是在分析具体问题的基础上,抽取出一个数学模型,这个数学模型能用若干个解析式表示出来,解决了这些表达式,问题也就得以解决。
  4. (4) 表达式Abs(-5)的值是
  5. (5) 将数学表达式gt2改写为VB表达式
编写“矩形面积”程序,实现如下功能:按一定比例随机生成a(1)至a(100)数组元素的值:0或1(0多1少);将这100个数组元素,按行依次转化为10×10的二维阵列; 当数组元素的值为0 时显示成“□”,当数组元素的值为1时显示成“◆”,并在列表框 List1中输出。寻找阵列中,由“□”字符构造出的最大面积的矩形,在标签Label1中显示最大面积所占的单位数。程序运行界面如图所示。

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

Dim a(1 To 100) As Integer Private Sub Command1_Click()

Dim i As Integer, s As Integer, smax As Integer ‘用于随机生成数据,并将阵列按规则在列表框中输出,该部分功能的代码略。

smax = 0

For i = 1 To 100

If a(i) = 0 Then s = search(i) If s > smax Then smax = s

Next i

Label1.Caption = "最大面积的矩形,占" + Str(smax) + "个单位。" End Sub

Function search(i As Integer) As Integer

Dim x As Integer, x1 As Integer, xend As Integer Dim y As Integer, y1 As Integer

Dim s As Integer

x = (i - 1) Mod 10 + 1   '起始列号 y = (i - 1) \ 10 + 1    '起始行号 x1 = x

y1 = y xend = 10

search = 0

Do While y1 <= 10

If a((y1 - 1) * 10 + x) = 1 Then Exit Do   '判断 x1 = x

Do While x1 <= xend

If a((y1 - 1) * 10 + x1) = 1 Then

x1 = x1 – 1   '改错

Else

x1 = x1 + 1

End If Loop

y1 = y1 + 1

s = (x1 - x) * (       )   '填空 If s > search Then search = s

Loop

End Function

请回答下列问题:

  1. (1) 根据程序的运行界面,没有 Caption 属性的控件为类(单选,填字母: A .窗 体/ B .命令按钮/ C .列表框/ D .标签)。
  2. (2) 程序代码中,去除“判断”处语句,是否会影响程序的结果(选填:是/否)。
  3. (3) 程序代码中,“改错”处的语句有误,请改正。
  4. (4) 程序代码中,将“填空”处的语句补充完整。
由n行数字组成的数字三角形如图所示。设计一个算法,对于由n行数字组成的数字三角形(数字范围[1,50],计算从三角形的顶至底的路径经过的数字和的最大值,每一步可以从当前点走到左下方的点也可以走到右下方的点。

寻求路径最大值的算法设计如下:

按三角形的行划分,若有n行,则有n-1个步骤

①从底层开始,本身数即为最大值

②倒数第二层的计算取决于底层的数据:

12+6=18,13+14=27,24+15=39,24+8=32;

③倒数第三层的计算取决于底二层的数据:

27+12=39,39+7=46,39+26=65;

④倒数第四层的计算取决于底三层的数据:

46+11=57,65+8=73;

④最后的路径:13—8—26—15—24其和为86。

根据上述算法描述,设计程序界面如下图所示,点击“生成金字塔”按钮,在列表框中生成数字金字塔,点击“寻求路径最大值”按钮,在文本框text1中输出最大值。

依据上述描述设计如下VB程序:

Const n = 5

Dim sx As String

Dim i, j, k, a(1 To 100) As Integer Private Sub Command1_Click() List1.Clear

For i = 1 To n For j = 1 To i

    ①  

sx = sx + Str(a((i - 1) * n + j)) Next j

For k = n To i Step -1 sx = " " + sx

Next k List1.AddItem sx sx = ""

Next i End Sub

Private Sub Command2_Click() For i = n To 1 Step -1

For j = 2 To i

If    ②   Then

a((i - 2) * n + j - 1) = a((i - 1) * n + j - 1) + a((i - 2) * n + j - 1)

Else

a((i - 2) * n + j - 1) = a((i - 1) * n + j) + a((i - 2) * n + j - 1)

End If Next j

Next i

    ③  

End Sub

请回答下列问题:

  1. (1) 若数字金字塔如图 ,输出路径最大值是
  2. (2) 请在①②③划线处填入合适的代码。

     ② ③ 

已知一无序数组a(下标1到n),通过引入数组b(下标1到n),使得a(b(1))≤a(b(2))≤a(b(3))≤……≤a(b(n))(示例如图所示),对这些有序数据可进行对分查找。则第一次查找时,中点位置m与中点值分别是(  )

A . m的值是Fix((1+n)/2),中点值是a(m) B . m的值是Fix((1+n)/2),中点值是a(b(m)) C . m的值是Fix((b(1))+b(n))/2),中点值是a(m) D . m的值是Fix((b(1))+b(n))/2),中点值是a(b(m))
淳安千岛湖中有若干座岛屿,有些岛屿之间有桥相连,有些岛屿之间无桥相连,可以通过其它的岛屿相连。现在我们来建立一种关系矩阵模拟这种现象,如有9个岛屿,依次编号为1~9,相互之间有桥相连在矩阵中用1表示;无桥相连用0表示;对于自身也用0表示,即矩阵的左上角到右下角的对角线全为0。

李同学设计了一个用来求两座岛屿之间相连所需桥的数量的VB程序,点击“生成矩阵”按钮Command1,随机产生一个关系矩阵,并在列表框List1中显示。在文本框Text1和Text2中输入岛屿的编号(1~9),点击“求解”按钮Command2,在Labell中输出两座岛屿之间相连所需桥的数量。VB程序运行界面如图所示。

对无桥相连的两座岛屿p1,p2之间相连的算法思想如下:

①p1岛屿所在行开始,将与其相连的岛屿依次添加到数组b中。

②若数组b中未出现岛屿p2,则依次查找与其相连岛屿的所在行,将新出现的相连的岛屿添加到数组b中。

③在查找过程中同时记录查找步数。

数组b内全部搜索完毕,若p2还是未出现,则两座岛屿之间无法相连,反之输出桥的数量。请回答以下问题:

  1. (1) 如上图所示的矩阵,从5号岛屿到9号岛屿最少需要经过座桥。
  2. (2) 请在划线处填入合适的代码。

    Const n = 9              ‘岛屿的数量

    Dim a(1 To n * n) As Integer

    Private Sub Command1_Click()

    Dim s As String List1.Clear

    For i = 1 To n

       For j = i To n

        If j = i Then

         a((i - 1) * n + j) = 0    ‘对角线为0

        Else

         a((i - 1) * n + j) = Int(Rnd * 2)

             ①          ‘矩阵对称

        End If

       Next j Next i

    For i = 1 To n

        s = ""

        For j = 1 To n

            s = s + Str(a((i - 1) * n + j))

        Next j

        List1.AddItem s Next i

    End Sub

    Private Sub Command2_Click()

      Dim b(1 To n) As Integer

      Dim qiao(1 To n) As Integer     ‘记录相连岛屿之间桥的数量

      Dim find(1 To n)  As Boolean     ‘记录某岛屿是否被添加到数组b中

      Dim p1 As Integer, p2 As Integer, cur As Integer, k As Integer, q As Integer

      p1 = Val(Text1.Text)

      p2 = Val(Text2.Text)

      cur = p1: k = 1: q = 0

      find(cur) = True

      Do While find(p2) = False

        For i = 1 To n

          If a((cur - 1) * n + i) = 1 And find(i) = False Then

            b(k) = i: k = k + 1

            find(i) = True

                     ②        

          End If

        Next i

        q = q + 1

        If q = k Then Exit Do Else      ③        

      Loop

      If find(p2) = True Then

        Label1.Caption = "需要经过" + Str(qiao(p2)) + "座桥"

      Else

       Label1.Caption = "无桥相连"

      End If

    End Sub

     ② ③ 

有如下VB程序段:

Dim d(1 to 5) As Integer, i As Integer

For i= 1 To 8

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

Next i

For i=1 To 5 Step 2

  k=i

  For j=i+2 To 7 Step 2

    If a(j) <a(k) Or a(j) =a(k) And a(j+1) <a(k+1)

  Next j

  Then k=j

  If i<>k Then

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

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

  EndIf

Next i

运行该程序段后,数组a各元素的值可能为(  )

A . 1,2,1,1,4,3,6,5 B . 1,1,1,2,3,4,5,6 C . 0,1,5,2,7,4,5,6 D . 3,4,5,2,6,4,7,11
有如下VB程序段:

Dim a(1 To 10)As Integer

Private Sub Form_Load()

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

a(6)=6: a(7)=7: a(8)=7: a(9)=8: a(10)=9

End Sub

Private Sub Command1_Click()

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

Dim m As Integer, p As Integer

key=Val(Text1.Text)

i=1: j=10

Do While i<=j

m=(i+j)\2

If a(m)= key Then

p=m

j=m-1

ElseIf key<a(m)Then

j=m-1

Else

i=m+1

End If

Loop

Text2.Text=Str(p)

End Sub

程序运行时,在文本框 Text1中输入3,单击按钮,文本框Text2中显示的内容是(  )

A . 2 B . 3 C . 4 D . 5
某校运动会跳远比赛,共m位(m≤20)选手参加该比赛,第一轮初赛每位选手跳3次,然后按每位选手的最好成绩,按高到低取前k名(若最好成绩相同,则名次相同)进入第二轮复赛。

每位选手的成绩数据记录规则如下:成绩数据以“;”(分号)结尾,中间用“/”(斜杠)分隔,例如:“王一超/4.10/-/3.78;李雨歆/3.87/3.85/4.20;”,表示第一位选手王一超,第一次成绩4.10米,第二次成绩无效(用“-”表示),第三次成绩3.78米,最好成绩为4.10米。第二位选手李雨歆,3次成绩分别是3.87米、3.85和4.20米,最好成绩为4.20米。

小强编写VB程序实现上述功能:程序运行时,读取所有选手数据保存在变量cj中,并显示在列表框List1中。在文本框Text1中输入进入第二轮的名次,单击“第二轮复赛名单”按钮 Command1,对数据进行统计分析,并在列表框 List2 中显示进入复赛的选手名单和最好成绩,程序运行界面如图所示,请回答下列问题。

  1. (1) 代码“List2.AddItem”中的AddItem是(单选,填字母:A .事件名 / B .方法名 / C .属性名)。
  2. (2) 实现上述功能的 VB 程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click()

       Dim cj As String, xm(1 To 20) As String, maxcj(0 To 20) As Single

       Dim s As String, c As String, t As Single, z As Integer

       Dim i As Integer, j As Integer, n As Integer, k As Integer, m As Integer

       '读取所有选手数据保存在变量cj中,并显示在列表框 List1中,代码略

       n = Len(cj)

       i = 1 : m = 1 : z = 1

       Do While i <= n

          c = Mid(cj, i, 1)

          j = i

          Do While                  ‘⑶

             i = i + 1

             c = Mid(cj, i, 1)

          Loop

          If z = 1 Then

            

          Else

             t = Val(Mid(cj, j, i - j))

             If t > maxcj(m) Then maxcj(m) = t

          End If

          z = z + 1 : i = i + 1

          If c = ";" Then m = m + 1: z = 1

       Loop

       m = m - 1

       k = Val(Text1.Text)

       For i = 1 To m - 1

          For j =

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

                c = xm(j): xm(j) = xm(j - 1): xm(j - 1) = c

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

             End If

          Next j

          If  Then

             List2.AddItem xm(i) + Str(maxcj(i))

          Else

             Exit For

          End If

       Next i

    End Sub

  3. (3) 程序中加框处代码有错,请改正。
某班级学生为毕业晚会的一个节目设计一个仿“V”字造型,先筛选出班级中n名学生的所有男生,然后将参演的男生按照身高,摆出中间低两边高(先右后左)的造型,如下图1 所示。王林同学用VB编写模拟“节目造型”程序,功能如下:从数据库中导出所有学生编号、性别和身高数据;单击“筛选排序”按钮Command2,根据身高仿“V”字和造型进行有序排列,并将结果显示在文本框Text2 中。程序运行界面如图2所示。举例说明如下:

原1-7号男生身高

171 172 180 174 176 179 178

筛选排序后序列

171 172 174 176 178 179 180

“造型设计”后序列

180 178 174 171 172 176 179

图1

身高顺序:男3号〉男6号〉男7号〉男5号〉男4号〉男2号〉男1号

图2

Dim h (1 To n) As Integer

Dim height1(1 To n) As Integer

Dim height2(1 To n) As Integer

Dim n As Integer, i As Integer, j As Integer, num As Integer, tmp As Integer

Dim sex(1 To n) As String

Private Sub Form_Load()

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

End Sub

Private Sub Command1_Click()

  b = 0

  For i = 1 To n         'n名学生中的男生

    If sex(i) = “男” Then      ①      : height1(num) = h(i)

  Next i

  For i = 1 To num – 1

    For j = num To i + 1 Step -1

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

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

      End If

    Next j

  Next i

  For i = 1 To num

    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 + num) / 2)

  left = 0: right = 0

  height2(mid) = height1(1)

  For i = 1 To (num - 1) \ 2

    right = right + 1

    height2(mid + right) = height1(2*i)

    left = left + 1

         ②    

  Next i

  If num Mod 2 = 0 Then     ③   

  For i = 1 To num

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

  Next i

End Sub

  1. (1) 若参演的8名男生身高为180、171、173、174、178、175、176、170,程序执行结束后height1(5)的值是
  2. (2) 在程序下划线处填入适当的语句或表达式。将程序补充完整:

下列说法符合枚举算法的是(    )
A . 逐一判断,强调不遗漏且不重复地验证条件 B . 根据条件判断是否合适,保留合适的,舍弃不合适的 C . 为了提高解决问题的效率,使可能解的范围将至最小 D . 可作为某类问题时间性能的底线,用来引出同样问题的更高效率的算法
采用冒泡排序算法对某数据序列进行排序,第-轮排序后的结果是“2,8,6,3,5,7,9”,则第二轮排序需要交换的次数为(    )
A . 4次或2次 B . 4次或3次 C . 3次或1次 D . 2次或1次
将以下程序段补充完整。

问题:输入一个正整数n,判断n是否为素数。要判断n是否为素数,最简单的方法是:统计2到n-1之间能整除n的整数个数s,若s大于0,则n不是素数,否则就是素数。根据以上方法,完善以下程序代码。

Dim n, s As Integer

n = Val(InputBox(“n=”))

s=0

For i=2 to

    If n Mod i = 0 then

        s=        ‘统计因数个数

    End If

Next i

IfThen

    Print n &“是素数”

Else

Print n &“不是素数”

End If

关于枚举法,下列说法错误的是(    )
A . 枚举法的基本思想就是,根据问题的部分已知条件预估解的范围,并在此范围内对所有可能的情况进行逐一验证,直到找到满足已知条件的解为止 B . 枚举范围的大小直接影响着枚举法的执行效率 C . 枚举法,也称蛮力法或暴力搜索法,理论上利用这种方法可破解任何一种密码 D . 枚举范围中的判定条件直接影响着枚举法的执行效率