4.3 非数值计算 知识点题库

小明编写了一个VB程序,功能如下:在文本框Text1中输入一段英文,并在文本框Text2中输入英文段落中的某个单词(或字符串),单击“最大间距”按钮(Command1)后,在文本框Text3中显示该单词在文中某两次出现的最大间距,若只出现一次或不出现则显示值为0。程序运行界面如下图所示:

实现上述功能的VB程序如下:

Private Sub Command1_Click()  

Dim a(1 To 1000) As String   '数组a存储文中出现该指定单词(或字符串)的各个位置

Dim s As String, c As String ,ch As String

Dim n As Integer, max As Integer, i As Integer

s = Text1.Text 

c = Text2.Text

n = 0: Max = 0

For i = 1 To Len(s) - Len(c) + 1

    ch =     ①   

    If ch = c Then

        n = n + 1

        a(n) = i

        If n >= 2 Then

If a(n) - a(n - 1) - Len(c) > Max Then Max = a(n) - a(n - 1) - Len(c)

        End If

    End If

Next i

Text3.Text =     ②  

End Sub

以上程序段运行时,为了实现上述功能,划线处①和②应填入的代码分别为: 

 ②

【加试题】计算机的基本功能是计算,信息加工处理本质上都是通过计算完成的。现有一图像模糊处理的算法,以10*10像素图像的模糊处理为例,具体算法如下:

⑴各像素点的颜色信息值(介于0至255之间的一个正整数),存储至数组a中。

⑵给定模糊处理的模糊中心位置p和模糊半径r(r>1),中心位置p即为半径为1的区域,

①确定模糊中心点在如下数阵中的位置。若模糊中心为36时,该模糊中心在数阵中对应位置为第4行第6列;

图a

②根据中心点和模糊半径确定模糊处理的像素点的范围。

⑶依序将模糊处理范围内的像素点进行模糊处理。模糊处理的方式为:最外侧的像素点颜色信息不变,中间各像素点的新颜色信息值为该像素点上下左右相邻四个像素点颜色信息值的平均值。

程序运行时,在文本框Text1中输入模糊的中心点p,在文本框Text2中输入模糊的半径r,窗体加载,通过列表框List1输出图像模糊处理前的信息,单击命令按钮Command1后通过列表框List2输出模糊后的图像信息。程序运行效果如图b所示。相应的模糊中心位置由椭圆圈注,中间各像素点由矩形框圈注

图b

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

  1. (1) 若以a(48)为模糊中心,布置成如图a所示数阵后模糊中心处于数阵的第行。
  2. (2) 请在划线处填入合适的代码。

    Const n = 10

    Dim a(1 To n * n) As Integer  '介于0至255之间的值,存储10*10图像像素点的颜色信息

    Private Sub Form_Load()

    '读取100个正整数,存储在数组a中以表示10*10图片的像素点颜色信息,代码略。

    '并按右对齐方式将该图片的各像素点颜色信息输出至列表框List1中,代码略。

    End Sub

    Private Sub Command1_Click()

      Dim r As Integer, p As Integer

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

    p = Val(Text1.Text) :r = Val(Text2.Text)

     

    i = 1

      Do While j > n

        j = j - n

        i = i + 1

      Loop

    '确定模糊处理的范围,处理范围的起始行,结束行,起始列,结束列保存到i1,i2,j1,j2中,代码略

    For i = i1+1 To i2-1    '中间像素点的模糊处理

       For j = j1+1 To j2-1

       

        a(k) = ave(k)

       Next j

       Next i

      '并按右对齐方式将该图片的各像素点颜色信息输出至列表框List2中,代码略。

    End Sub

    Function ave(k As Integer) As Integer

      ave =

    End Function

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

数组元素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最小元素值。运行效果如图1所示,实现该功能的VB程序如下:

图1

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  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

  1. (1) 要使程序运行时,文本框Text1无显示内容,下列方法不能实现该要求的是(单选,填字母:A .在Form_Load事件处理过程中添加语句“Text1.Text=""”/B .在Command1_Click事件处理过程中添加语句“Text1.Text=""”/C .设计程序界面时,在属性面板设置文本框Text1的Text属性值为空)
  2. (2) 程序代码中,加框处有错,请改正。
  3. (3) 程序代码中,将划线处代码补充完整。
  4. (4) 程序代码中,虚线框内自定义函数中主要采用的算法是(单选,填字母:A .冒泡排序/B .选择排序/C .顺序查找/D .对分查找)。
顺序查找算法程序如下,下列说法正确的是(  )

Dim d(1 to 10) as Integer

n=10 : count = 0

For i = 1 To n

count = count + 1

If               Then

Label1.Caption = “顺序查找在数组的第” & i & “位找到了” & v

Exit For

End If

Next i

If                Then

Label1.Caption = “顺序查找没有找到” & v

End If

A . ①处的代码为key=d(i) B . ②处的代码为i>n C . 在最好情况下,查找结束时变量count 的值为0 D . 当变量count 的值为10,说明已经找到了
查找最接近的数。编写一个查找最接近的数的VB程序:程序运行时,在文本框Text1中输入产生随机数的个数(1到100之间),单击命令按钮“产生随机数并升序排列”后,在列表框List1中显示已经按升序排列后的随机整数。然后在文本框Text2中输入要查找的整数,单击命令按钮“查找”后,在标签Label3中显示随机整数序列中与待查找数最接近的整数(当最接近的数有2个时,输出较大的一个)。程序运行效果如图所示。实现上述功能的VB代码如下,请在横线处填入合适代码。

Dim n As Integer     ‘存储随机数的个数

Dim f(1 To 100) As Boolean     ‘f (i)为true时表示随机整数i已经产生过

Dim a(1 To 100) As Integer     ‘依次存放升序排序后的n个随机数

Private Sub Command1_Click()     ‘命令按钮“产生随机数并升序排列”的单击事件

Dim i As Integer

Randomize

For i=1 To 100

 f(i)=False

Next i

n=Val(Text1. Text)

For i=1 To n

 t=Int(Rnd * 100+1)

 Do While f(i)=True

  t=Int (Rnd * 100+1)

 Loop

 

Next i

j=0

For i=1 To 100     ‘实现排序并输出

 If f(i)=True Then

 

  a(j)=i

  List1.AddItem Str(i)

 End If

Next i

End Sub

Private Sub Command2_Click()     ‘命令按钮“查找”的单击事件

Dim key As Integer

key=Val(Text2. Text)

If key <=a(1) Then Label3. Caption=Str(a(1)) : Exit Sub

If key >=a(n) Then Label3. Caption=Str(a(n)) : Exit Sub

L=1: R=n

Do While L <=R     ‘找到与key较为接近的两个数a(R)和a(L)

 m=(L+R) \2

 If key <=a(m) Then

  R=m-1

 Else

  L=m+1

 End If

Loop

IfThen      ‘在a(R)和a(L)中选出更接近key的数

 Label3. Caption=Str(a(R))

Else

 Label3. Caption=Str(a(L))

End If

End Sub

某单位招考公务员,2010年和2011年分别有4 020名和2 000名考生报名,下列VB程序用于统计两次考试都参加的考生信息。程序界面设计如图所示,2010年和2011年的考生信息分别显示在List1和List2中,点击“统计”按钮,在List3中显示两次考试都参加的考生信息和总人数。

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

    Dim a (1 To 4020 ) As String

    Dim b (1 To 2000 ) As String

    Private Sub Form_Load( )

    Dim conn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim constr As string

    constr=“Provider=Microsoft.ace.OLEDB.12.0;”

    constr=constr &“Data Source=” & App.Path+“\data\KaoSheng.accdb”

    conn.ConnectionString=constr

    conn.open()

    Dim sql As String

    ‘将参加2010年下半年考试的考生的身份证号码按升序存放在a数组中

    sql=“select * from kaoshengInfo where year=‘2010’order by sfzh asc”

    rs.Open sql,conn

    i=0

    Do While Not rs.EOF

     i=i+1

     a(i)=rs(“sfzh”)

     List1.additem(a(i))

     rs.MoveNext

    Loop

    ‘将参加2011年下半年考试的考生的身份证号码按升序存放在b数组中

    sql=“select * from kaoshengInfo where year=‘2011’order by sfzh asc”

    rs.Open sql,conn

    i=0

    Do While Not rs.EOF

     i=i+1

     b(i)=rs(“sfzh”)

     List2.additem(b(i))

     rs.MoveNext

    Loop

    rs.Close

    End Sub

    Private Sub Command1_Click ()

    Dim bot As Integer, top As Integer, m As Integer

    Dim i As Integer, ans As Integer

    ans=0

      For i=1 To 2000

        bot=1

        

       Do While  bot <=top

         m=Fix ( ( bot+top ) / 2 )

         If a ( m )=b ( i ) Then

          List3.AddItem  a ( m )

           

          Exit Do

         ElseIf  Then

          top=m-1

         Else

          bot=m+1

         End If

       Loop

     Next i

     List3.AddItem“总计”+str(ans)+“人次”

    End Sub

  2. (2) 分析上述代码,在数据库中用于存放考试信息的数据表名称是
多数高次方程不存在求根公式,求精确根非常困难,因此寻找方程的近似根就显得特别重要。由于数轴上的点是有序的,所以我们可以用对分查找法找出高次方程在某一区间的实根,即:不断地将区间对分,使得区间中点的值不断逼近方程的根,当区间小于精度的时候我们就停止对分,并用此时区间的中点值作为方程的根。

现有三次方程y=5x^3-55x^2+170x-130,其函数图象如图所示:

观察该函数图象发现函数有一实根在区域(1.2)之间,因此我们取两者的中点m=(1+2)/2代入方程进行检测发现f(1.5)=18.125。因为f(1.5)>0,因此区间应该往左移动,得下一个区间(1,1.5)然后继续进行检测。如果区间差值≤误差率,则认为该中点是方程的根。根据上述方法描述设计一个VB求解程序的根,要求单击求解按钮Command1,在文本框Text1中显示方程的根,部分程序如下。

  1. (1) 代码“PrivateSubCommand1_Click()”中的Command1_Click()是(单选,填字母:A.对象名/B.事件名/C.事件处理过程)
  2. (2) 将划线处的代码补充完整。

    PrivateSubCommand1_Click()

    DimiAsDouble,jAsDouble,mAsDoubleDimrAsDouble,yAsDouble

    i=1:j=2:y=1:r=j-iDoWhiley<>0Andr>0.00001

    m=(i+j)/2

    y=

    Ify>0Then

    j=m

    ElseIfy<0Then

    i=m

    EndIf

    Loop

    Text1.Text=m

    EndSub

【加试题】有1个升序排列的数组a(a(1)~a(n),n≥3),从左到右相邻两个元素的差值(后一个元素值减去前一个元素值)先由小到大、再由大到小,且相邻两个差值不相等,为了查找相邻两个元素的最大差值,小李编写的VB程序段如下:

i=1:j=n

Do While i+1<j   

     m=(i+j)\2

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

   

     Else

   

     End if

Loop

Label 1.Caption=“相邻两个元素的最大差值是”+Str(a(j) -a(i) )

上述程序段两个方框处的语句分别为(  )

A . ①i=m ②j=m B . ①i=m ②j=m-1 C . ①i=m+1②j=m-1 D . ①i=m+1②j=m
有如下VB程序段:

i=1:j=6:s=" "

Key=Text1.Text

Do While i<=j

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

  s=s+" "+a(m)

  If Key> a(m)Then

    i=m+1

  Else

    j=m-1

  End If

Loop

Text1.Text=s

数组元素a(1)到a(6)的值分别为“Beijing”“Cuangdong”“Jiangsu”“Jiangxi”“Shanghai”“Zhejiang”,己按字典序排序。当key的值为“Zhejiang”时,单击命令按钮Command1,文本框Text1中显示的内容为 (  )

A . Jiangxi Zhejiang B . Jiangsu Shanghai Jiangxi Zhejiang C . Jiangxi Zhejiang Shanghai D . Jiangsu Shanghai Zhejiang
   二分查找又叫,该方法主要将数列排列,采用的方式查找数据。二分查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。
某数据查找程序:在文本框Text1和Text2中分别输入矩阵的行数m和列数n,单击“产生”按钮,随机产生m×n个范围是[1,10]的整数,并在列表框List1中以矩阵显示。在文本框Text3中输入整数数据key,单击“查找”按钮,将查找key在矩阵中的位置,并在列表框List2中输出查找结果。例如矩阵行数为7,矩阵列数为4,查找数据为3,程序运行界面如图所示。

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

    Dim a(1 To 100) As Integer

    Dim m As Integer, n As Integer

    Private Sub Command1_Click()

        Dim i As Integer, j As Integer, x As Integer

        Dim s As String

        m = Val(Text1.Text)

        n = Val(Text2.Text)

        Randomize

        For i = 1 To m

            For j = 1 To n

                x = Int(Rnd * 10 + 1)

                 

            Next j

        Next i

        s = ""

        For i = 1 To m * n

            s = s + Str(a(i))

            If i Mod n = 0 Then

                List1.AddItem s

                 

            End If

        Next i

    End Sub

    Private Sub Command2_Click()

        Dim i As Integer, x As Integer, y As Integer

        Dim key As Integer, flag As Boolean

        key = Val(Text3.Text): flag = False

        For i = 1 To m * n

            If key = a(i) Then

                x = (i - 1) \ n + 1

                y =  

                list2.AddItem Str(key) + "的坐标为:第" + Str(x) + "行,第" + Str(y) + "列"

                flag = True

            End If

        Next i

        If Not flag Then

            list2.AddItem "未查找到相应数据!"

        End If

    End Sub

  2. (2) 若随机产生矩阵 ,查找数据为3,则在列表框List2中显示内容是
下列VB程序段功能为:字符串s1、s2仅由字母组成,长度相同,在忽略大小写的情况下判断两者是否相同,结果显示在Label1中。

For i = 1 To Len(s1)

c1 = Mid(s1, i,1): c2 = Mid(s2, i, 1)

    If  Then

       If  Then Exit For      '退出For循环

       If  Then Exit For

       If  Then Exit For

    End If

Next i

If i > Len(s1) Then Label1.Caption =“相等” Else Label1.Caption =“不相等”

上述程序段中方框处可选语句为:

①Abs (Asc(c1) - Asc(c2)) <> 32 ②c1 <> c2

③c1 >= "a" And c2 >= "a" ④c1 <= "Z" And c2 <= "Z"

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

A . ①②③④ B . ①③④② C . ②①④③ D . ②④③①
有如下VB 程序代码段:

i = 1: j = 10: c = 0

k = Val(Text1.Text)

Do While i <= j

    m = (i + j) \ 2

    c = c + 1

    If a(m) >= k Then

        j = m - 1

    Else

        i = m + 1

    End If

Loop

数组元素a(1)到a(10)的值依次为“1,4,10,21,21,26,27,29,30,36”,在文本框Text1中输入“21”,执行该程序段后,下列说法正确的是(    )

A . 变量i的值是3 B . 变量j的值是4 C . 变量c的值是4 D . 变量m的值是3
下面代码的输出结果是(   )。

def add(x):

    if x>0:

        return x+add(x-l)

    else:

        return 0

    result=add(10)

print(result)

A . 0 B . 10 C . 55 D . 45
下列关于大数据处理的说法,错误的是 (     )
A . 处理大数据一般采用分治思想 B . 数据采集只能收集结构化数据  C . 图计算主要针对图数据 D . 并行处理能节省复杂问题的处理时间
某对分查找算法的VB程序如下:

'随机产生包含10个整型元素的升序序列,依次存入数组a,代码略

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

key = Val(Text1.Text)

Do While i <= j

    m = (i + j)\ 2

    c = c + 1

    s = s + Str(a(m))

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

Loop

在文本框 Text1中输入待查找数,执行该程序后,下列说法不正确的是(   )

A . i的值有可能大于m B . c的值是3或者4 C . i的值一定比j的值大 D . s的值可能是"70 60 40 30 50"
给定一个词典(单词按字典顺序排列,数量不超过12000个),寻找词典中所有的复合单词,并将复合单词以字典逆序显示输出。复合单词:被定义为由词典中两个单词连接而成的单词。

例如:

分析:如果词典中的单词数量比较少,我们可以采取将第i个单词与第j个单词拼接成“新单词”并在字典中查找,但如果词典中单词数量多(如12000个)此种方法速度慢,我们发现词典中的单词是有序排列,可以加快查找复合单词的速度,本题的算法策略是:对第i个单词,从第j(j=i+1)个开始判断,如果第j个单词前半部分(长度为第i个单词的长度)跟第i个单词一致,则在词典中查找第j个单词的后半部分。如果找到,则为一个复合单词。

编写vb程序,寻找词典中所有复合单词并输出显示。运行程序,在列表框list1中显示从词典数据库中导入的单词,单击“统计”按钮command1,在列表框list2中按降序显示该词典中所有复合单词。程序运行界面如图所示。

  1. (1) 如图所示,复合单词有
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码

    Dim conn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim n As Integer

    Dim a(1 To 200) As String

    Function search(key As String) As Boolean

       

        i = 1: j = n

        Do While i <= j

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

            If key = a(m) Then

    search = True: Exit Do

            ElseIf key > a(m) Then

                i = m + 1

            Else

                j = m - 1

            End If

        Loop

    End Function

    Private Sub Command1_Click()

        Dim i As Integer, j As Integer, temp2 As String

        Dim out(0 To 100)

        For i = 1 To n

            For j = i + 1 To n

                If a(i) = Mid(a(j), 1, Len(a(i))) Then

                    

    If search(temp2) = True Then

                        cnt = cnt + 1

                        k = cnt

                        Do While a(j) > out(k) And k > 0      '找到a(j)应该插入的位置k

                            k = k - 1

                        Loop

                        For p = cnt To k + 1 Step -1     'k到末尾元素均后移一位

                            out(p) = out(p - 1)

                        Next p

                        

                    End If

                End If

            Next j

        Next i

        For i = 1 To cnt

            List2.AddItem out(i)

        Next i

    End Sub

    Private Sub Form_Load()

        Dim i As Integer

        连接字典数据库

        打开数据库中字典数据表,代码略

        n = 0

        Do While Not rs.EOF

            n = n + 1

            a(n) = rs/Fields("words")

            rs/MoveNext

        Loop

       关闭数据连接,代码略

        List1.Clear

        For i = 1 To n

            List1.AddItem a(i)    '在列表框List1中显示单词

        Next i

    End Sub

在平面坐标系上分布着n个点,从这n个点的集合中取出4个点,使之构成一个正方形,要求正方形的边长与x轴、y轴平行。程序界面如第15题图所示,点击“生成”按钮,自动产生n个点的坐标,这n个点按x坐标值升序排列,x坐标相同时按y坐标值升序排列。

点击“查找”按钮,查找所有符合要求的正方形。算法思路:枚举正方形对角线上的线段端点A、C(即保证线段AC与x轴呈斜45度的夹角),通过A、C点,计算出正方形另-条对角线上的线段端点B、D,再查找B、D是否存在,若存在,则说明该正方形可以生成。

  1. (1) 能够在List1中显示“OK”的语句是(单选,填字母:A . List1.Addtem"OK"/ B . List1.Caption="OK"/C . List1.AddItem="OK")
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Dim n As Integer, x(1000) As Integer, y(1000) As Integer

    Private Sub Command2_Click( )

    '生成n个点的坐标,并按要求排序,代码略

    '第i个点的坐标保存在x(i)和y(i)并显示在List1 中

    End Sub

    Private Sub Command2_Click()

        Dim i As Integer, j As Integer

        For i=1 To n

            For j=i+1 To n

                If  Then

                    If search(x(i), y(j)) = True And search() = True Then

                        '将4个坐标点显示在List2中,代码略

                        cnt=cnt+1

                    End If

                End If

            Next j

        Next i

        List2AddItem "总共有" + Str(cnt) + "个符合要求的正方形"

    End Sub

    Function search(x As Integer, sy As Integer) As Boolean

        Dim L As Integer, R As Integer, m As Integer

        search = False: L= 1: R= n

        Do While L<= R

            m=(L+R)\2

            If sx < x(m) Or  Then

                R=m-1

            ElseIf x> x(m) Or x= x(m) And ey > y(m) Then

                L=m+1

            Else

                search = True: Exit Do

            End If

        Loop

    End Function

  3. (3) 程序中加框处代码有错,请改正。
小明和小华玩猜数字的游戏,所猜数字不超过800,小明首先猜400,小华说大了,小明又猜200,当小华再次说大了,小明猜100,当小华说小了,小明猜150,以此类推,直到猜到正确的数字。上述方法中蕴含的算法思想是(    )
A . 穷举算法 B . 递归算法 C . 二分查找法 D . 顺序查找法
二分查找实际上就是(       )的一种典型运用。
A . 动态规划法 B . 分治策略 C . 回溯法 D . 递推法