4.3 非数值计算 知识点题库

某查找算法的部分VB代码如下:

shifouzhaodao = False    ‘shifouzhaodao:是否找到

szysxh = 0        ‘szysxh:数组元素序号

Do While szysxh < 5 And not shifouzhaodao

   szysxh = szysxh + 1

   if dczsz(szysxh) = Key then shifouzhaodao = true

Loop

if not shifouzhaodao then szysxh = 0

数组元素dczsz (1)到dczsz (5)的数据依次为“-1,3,7,10,7”,当变量key值为7时,运用该算法处理后,变量i的值是(   )

A . 0 B . -1 C . 3 D . 5
【加试题】某对分查找自定义函数search()的VB程序段如下:

  Function search(key As Integer)As String

    Dim pos As Integer,i As Integer,j As Integer

    Dim nc As String

    i=1:j=6:nc=“”

    Do While i<=j

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

        nc=nc+Str(m)

        If d(m)=key Then

            Exit Do        ‘Exit Do表示退出Do While循环

        ElseIf key<d(m)Then

             j=m-1

        Else

             i=m+1

    End If

      Loop

      search=nc

    End Function

数组元素d(1)到d(6)的值依次为“23,34,45,65,78,98”,则下列说法正确的是 (  )

A . 调用函数search(25)的返回值为字符串“3  2” B . 调用函数search(34)的返回值为字符串“45  32” C . 调用函数search(56)的返回值为字符串“3  5  4” D . 调用函数search(98)的返回值为字符串“45  78  98”
某对分查找算法的VB程序段如下:

i=1 : j=8 : t=0

key=Int(Rnd()*7)+14

Do While i<=j

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

   t=t+1

 if a(m)=key Then

      Exit Do else

      If a(m)>key Then  j=m-1

Else  

         i=m+1

End if

   End if Loop

数组元素 a(1)到 a(8)的值依次为“2,11,14,15,18,19,20,22”,该程序段运行结束后,变量t的最大值可能是(  )

A . 1 B . 2 C . 3 D . 4
对数组a中6个有序数据“11,22,33,44,55,66”,用下面的程序代码查找数据“23”,程序执行完毕后,下列各变量值正确的是(  )

Dim a(1 To 6)As Integer

Dim i As Integer,j As Integer,Key As Integer,m As Integer

a(1)=11:a(2)=22:a(3)=33: a(4)=44:a(5)=55:a(6)=66

i=1:j=6:p=0:Key=23

Do While i<=j

p=p+1

  m=(i+j)\2

  If j Mod 2=0 Then m=m+1

  If a(m)=Key Then Exit Do

  If Key<a(m) Then j=m-1

Else i=m+1

Loop

A . i=5 B . j=4 C . m=3 D . p=2
某对分查找算法的VB程序段如下:

i=1:j=7:s=""

key=Int(Rnd * 100)

Do While i< = j

  m=(i+j)\2

  If key = a(m)Then

      s = s + " M":Exit Do         'Exit Do表示退出循环

  Elself key < a(m)Then

      j = m - 1:s = s + "L"

  Else

      i = m + 1:s = s + "R"

  End If

Loop

Text 1.Text = s

数组元素a(1)到a(7)的值依次为“24,35,38,41,45,69,78”。该程序段执行后,文本框 Text1中显示的内容可能是(  )

A . RL B . LMR C . RLR D . LRLM
已知一无序数组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))
有多组“123”连接的字符串,如“123123123”,若删除其中一个任意位置的字符,如第8位字符“2”,则得到新字符串“12312313”。编写一个如图所示的VB程序,实现以下功能:输入非空新字符串s,找出被删除字符在原字符串中的位置。如输入“12312313”,则输出“原字符串的第8个字符被删除”。

s= Text1.Text

For i= 1 To Len(s)

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

Next

L=1: R= Len(s) + 1

Do While L<R

    m= (L+R) \2

    If  Then

        R= m

    Else

        L=m+ 1

    End If

Loop

Label1 .Caption = "原字符串的第"+ + "个字符被删除"

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

A . ⑴ (m- 1) Mod 3 +1<>a(m)  ⑵ Str(L) B . ⑴ (m- 1) Mod 3+<>a(m)    ⑵ Str(m) C . ⑴ m Mod 3= a(m)          ⑵ Str(L) D . ⑴ m Mod 3 = a(m)          ⑵ Str(m)
(加试题)编写一个成绩查询程序,输入要查找的分数,输出该分数的名次及同分人数,其算法是:用数组a存放不同的分值,数组m存储相同分数的人数,数组mc存储不同分数的名次。例如,数据库中有一组成绩(已按降序排列):98,95,95,92,90,90,87,按该算法,各数组值如下表所示:

i

1

2

3

4

5

a

98

95

92

90

87

m

1

2

1

2

1

mc

1

2

4

5

7

程序界面如下图所示,在文本框Text1中输入查询成绩,点击“查找”按钮,若找到,则输出该分数的名次和同分数的人数,若找不到,则输出“查无此分”。

程序代码如下,请在划线处填入合适的代码。

Dim n As Integer

Dim a(1 To 1000) As Integer     ‘存放不同的分数值

Dim m(0 To 1000) As Integer     ‘存放相同分数的人数

Dim mc (0 To 1000) As Integer     ‘存放此分数的名次

Private Sub Form_Load()

Dim conn As New ADODB. Connection

Dim rs As New ADODB. Recordset

Dim tmp As Integer

Dim s As Integer

tmp = -1: n = 0

conn. Connectionstring = “provider=Microsoft. ACE.OLEDB. 12. 0; data source=”& App. Path  & “\mydb. accdb”

conn. Open

Set rs. ActiveConnection = conn

rs.Open "Select * from score"

mc(0) = 1: m(0) = 0

Do While Not rs. EOF

s = rs. Fields (“成绩”)

If s = tmp Then       ‘当前读入分数与上一个分数相同

m(n) =    ①    

Else

n = n + 1

a(n) = s

m(n) = 1

mc(n) =     ②   

End If

    ③   

rs. MoveNext

Loop

End Sub

Private Sub Command1_Click0

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

key = Val (Text1.Text)

i = 1: j = n

mid = (i + j) \ 2

Do While i <= j And    ④    

mid = (i + j) \ 2

If a(mid) < key Then

j = mid – 1

Else

i = mid + 1

End If

Loop

If a(mid) = key Then

Label2. Caption = “名次: ”+ Str(mc (mid)) + “同分人数: ”+ Str(m(mid))

Else

Label2. Caption =“查无此分”

End If

End Sub

 ② ③  ④

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。

数组元素a(1)至a(5)依次为5,22,28,42,55,在a(3)处分成两段,交换位置后为:

a(1)

a(2)

a(3)

a(4)

a(5)

28

42

55

5

22

旋转数组a的最小元素是5。

数组d(1)至d(5)依次为0,1,1,1,1,在d(5)处分成两段,交换位置后为:

d(1)

d(2)

d(3)

d(4)

d(5)

1

0

1

1

1

旋转数组d的最小元素是0。

小明依据查找算法思想,设计一个查找旋转数组d最小元素的程序,功能如下:运行程序时,利用“添加”按钮Command1和文本框Text1依次输入旋转数组d的值,在列表List1中显示旋转数组,单击“求解”按钮Command2,在标签Label2中显示旋转数组d最小元素值。运行效果图所示,实现该功能的VB程序如下。

  1. (1) 要使程序运行时,文本框Text1无显示内容,下列方法不能实现该要求的是(单选,填字母:A .在Form_Load事件处理过程中添加语句“Text1.Text="" ”/B .在Command1_Click事件处理过程中添加语句“Text1.Text=""”/C .设计程序界面时,在属性面板设置文本框Text1的Text属性值为空)
  2. (2) 程序代码中,加框处有错,请改正。

    Dim n As Integer

    Dim d(1 To 100) As Integer     '数组d存储待排序数据

    Private Sub Command1_Click()

    '按旋转数组规则将数据存入数组d中,代码略

    End Sub

    Private Sub Command2_Click()

     Dim mid As Integer, L As Integer, R As Integer

     L = 1: R = n

     mid = L

     Do While d(L) >= d(R)

     If L=R Then'改错

     mid = R

     Exit Do

     End If

     mid = (L + R) \ 2

     If d(L)=d(R) And d(mid)=d(R) Then

    mid =   ⑶         '填空

     Exit Do

     End If

     If d(L) < d(mid) Then

     L = mid

    ElseIf d(mid) < d(R) Then

     R = mid

     End If

     Loop

    Label2.Caption = "最小值为" + Str(d(mid))

    End Sub

     End If

     Next i

    End Function

  3. (3) 程序代码中,将划线处代码补充完整。
  4. (4) 程序代码中,虚线框内自定义函数中主要采用的算法是(单选,填字母:A .冒泡排序/B .选择排序/C .顺序查找/D .对分查找)。
某对分查找算法的VB程序段如下:

Dim d(1 To 63) As Integer, i As Integer, s As Integer

For i=1 To 63

 d(i)=i

Next i

Key=Int(Rnd*3)+1

s=0: i=1: j=63

Do While i<=j

m=(i+j)\2

If Key=d(m) Then Exit Do      'Exit Do表退出循环

If Key<d(m) Then

j=m-1: s=2*s

Else

i=m+1: s=2*s+1

End If

Loop

Label1.Caption=str(s)

若运行该程序段后,标签Label1中显示的结果是28,则查找的key值是(  )

A . 28 B . 29 C . 57 D . 58
有8阶楼梯,从第0阶开始往上走,每次可以走一步或者两步,自定义函数fg可以计算走完n阶楼梯有多少种走法,程序如下:

Function fg(n As Integer)As Integer

If n=1 fg=1

If n=2 fg=2

If n>=3 fg=fg(n-1)+fg(n-2)

End Function

请问走完这8阶楼梯的走法有(  )

A . 34种 B . 35种 C . 36种 D . 37种
有一组原来按升序排列的正整数,第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) 请在划线处填入合适的代码。

     ② ③ 

递归的基本思想是把的问题层层转化为规模较小的问题求解。对递归而言,,二者缺一不可。
用二分法求解 x3- x2 + x - 1 = 0,完善下面程序。

def f(x):

    #定义方程

    return x**3-x**2+x-1

a=float(input("请输入解区间的左边界:"))

b=float(input("请输入解区间的右边界:"))

while abs(b-a)>1e-6:

    x0=(a+b)/2

    if:

        b=x0     

    if:

        a=x0  

    if:

        break

print("解为:",x0)

input("运行完毕,请按回车键退出...")

下列关于流数据的描述,不正确的是(    )
A . 数据必须采集完成后处理 B . 数据价值随着时间的流逝降低 C . 可以采用流计算进行实时分析 D . 实时分析流数据可以得到更有价值的结果
某对分查找算法的部分代码如下:

i=1:j=1000:flag=True:p=0

key=val(Text1.Text)

Do While i<=j And flag

    m=(i+j)\2

    p=p+1

    if a(m)=key Then flag=False

    if a(m)>key Then j=m-1 Then i=m+1

Loop

数组元素a(1)到a(1000)中存放着升序排列的数据。下列说法正确的是(   )

A . 若key的值小于a(1),则执行该段程序后,变量j的值等于1 B . 若key的值等于a(1),则执行该段程序后,变量p的值等于10 C . 若key的值等于a(1000),则执行该段程序后,变量i的值等于1001 D . 无论key的值是否在数值中a中,执行该段程序后,变量i的值均不可能等于m
有如下 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
某对分查找算法的VB程序段如下:

key = Int(Rnd * 10) * 2

s = "": i = 1: j = 10

Do While i <= j

  m = (i + j) \ 2

  If a(m) = key Then

    Exit Do

  ElseIf a(m) > key Then

    j = m - 1: s = s + "0"

  Else

    i = m + 1: s = s + "1"

  End If

Loop

Text1.Text = s

数组a的值依次为1,3,4,7,9,10,14,17,18,19,执行该程序段后,文本框Text2中显示的内容为“1010”,则key的值可能是(   )

A . 12 B . 13 C . 14 D . 15
有VB程序段如下:

i=1 : j=9 : s="" : flag= False

Key= Val(Text1. Text)

Do While i <= j And Not flag

    m=(i+j) \ 2

    s=s+Str(m)

    If a(m)= Key Then

        flag= True

        Exit Do      'Exit Do表示退出循环

    ElseIf Key>a(m) Then

        i=m+1

    Else

        j=m-1

    End If

Loop

If flag= False Then s="没有找到"

Label1. Caption= s

已知数组a共有9个整数元素,依次为“8,7,3,1,9,5,6,4,2”,若在文本框Text2 中输入“3”,执行下列程序后,Label1中显示的结果是(    )

A . 没有找到 B . 3 C . 9 D . 521
         是重复反馈过程的活动,其目的通常是逼近所需目标或结果。        是直接或间接地调用函数自身。(   )
A . 枚举  递归  B . 递归  迭代 C . 迭代  递归  D . 递归  迭代