4.3 非数值计算 知识点题库

编写VB程序,实现如下功能:在文本框text1中输入自然数n,单击“产生n个随机数,并求和与最大数计算”按钮Command1,则在列表框List1中输出n个小于100的随机整数,并输出n个随机数的和与最大值,界面如图所示。

  1. (1) 观察运行界面,选项中没有用到的控件是        ( 选项
    A . B . C . D . )。
  2. (2) 设计该窗体界面时,需要将窗体form1的属性设置为“最大随机数”。
  3. (3) 请完善下列程序代码:

    Private Sub Command1_Click()

    Dim a(1 To 10) As Integer

    Dim s As Integer

    Dim max As Integer

    n = Val(Text1.Text)

    i = 1

    Do While i <= n

       a(i) = Int(Rnd * 100)

       List1.AddItem Str(a(i))

       s = s + a(i)

      ①          

    Loop

    max = a(1)

    For i = 2 To n

       If a(i) > max Then  ②

    Next i

    List1.AddItem "和为:" + ③

    List1.AddItem "最大值为:" + Str(max)

    End Sub

    供①②选填:

    a.n=n+1      b. i=i+1       c.max=a(i)     d. a(i)=max

    空格③处应填写的代码为:

【加试题】有如下VB程序:

  Function f(n As Integer)As Long

    Text1.Text=Trim(Str(n))+Text1.Text             ‘函数Trim的作用是去掉字串首尾空格

    If n=1 Then

       f=1

    Else

       f=3*f(n\2)

    End If

  End Function

  Private Sub Command1_Click()

    Text1.Text=“”

    Text1.Text=Trim(Str(f(8)))+Text1.Text

  End Sub

单击按钮Command1后,文本框Text1中显示的值是(  )

A . 31248 B . 811248 C . 842127 D . 271248
【加试题】某同学用VB编写如下程序:

  Private Sub Command1_Click()

    Dim k As Integer,a As Integer,b As Integer

    a=Val(Text1.Text)

    b=Val(Text2.Text)

    Label1.Caption=trans(a,b)

  End Sub

  Function trans(m As Integer,n As Integer)As String

    If m<>0 Then

       r=m Mod n

       trans=trans(m\n,n)+Str(r)

    Else

      trans=0

     End If

    End Function

程序运行时,在文本框Text1和Text2中分别输入11和2,则Label1中的输出结果是(  )

A . 01011 B . 1011 C . 01101 D . 11010
编写“矩形面积”程序,实现如下功能:按一定比例随机生成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个互不重复的数字,值的范围是[1,n],分别保存在数组元素a(1)到a(n)中,如果数字i保存在a(i),认为数字i在正确的位置上。若干个相互占用了位置的数字称为一组,一个在正确位置上的数字单独为一组,比如6个数字2,3,1,4,6,5分别保存在数组元素a(1)到a(6)中,则2、3、1为一组,4为一组,6、5为一组。该程序的功能为输出每组的情况。运行界面如下图:

  1. (1) 数组元素a(1)到a(5)的值分别为2、5、3、1、4,这5个元素总共有组。
  2. (2) 请在划线处填入合适的代码

      Const n = 10

      Dim a (1 To n)  As Integer    ‘保存原始数据

      Dim b(1 To n )  As Boolean ‘数组b用来标记相应的位置有没有找过

      Private Sub Command1 _ Click ()

        Dim i As Integer , sum As Integer ,  total As Integer

        sum = 0: total = 1  ‘total 表不第几组

        i = 1

        List 2.Addltem “第”& Str (total) & “组”

        Do While sum < n

            Do While Not b (i)

                List 2.Addltem a (i)

                b(i) = True

               

                sum = sum + 1

            Loop

            If sum < n Then

                total = total + 1

                List 2.Addltem “第” &  Str ( total ) &■“组”

                i = 1

                Do While b(i) ‘该循环用来查找下一组的开始位置

               

                Loop

            End If

        Loop

      End Sub

    Private Sub Form _ Load ()

      Dim i As Integer

      Randomize

      For i = 1 To n ‘产生 n 个不一样的整数,范围为[ 1, n ]

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

        Do While

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

        Loop

      Next i

      For i = 1 To n

        List1.Addltem a (i)

        b (i) = False

      Next i

    End Sub

    Function f(x As Integer , y As Integer )  As Boolean

    ‘该函数的功能:判断x和数组a中前y个数有没有重复,有重复返回值True,否则False

    End Function

小吴编写了一个查找数组中不重复数据的VB程序,功能如下:程序运行时在列表框List1中显示原始数据(存储在数组a中),单击“查找”按钮Command1后,在列表框List1中显示数组中元素值只出现一次的数据。程序运行界面如图所示。

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

Const n = 10    ‘数组元素的总数

Dim a(1 To n) As Integer

Private Sub Form_Load()

‘该过程对数组a进行赋值,并在列表框List1中显示,代码略

End Sub

Private Sub Command1_Click()

Dim i As Integer, j As Integer,flag(1 To n) As Boolean

‘flag(i)记录第i个元素是否重复出现

For i = 1 To n      ‘flag(i)=true开始假设都只出现1次

 flag(i) = True

Next i

For i = 1 To n

 If flag(i) Then

  For j = i + 1 To n

    If Then flag(i) = False: flag(j) = False    ‘①

  Next j

 End If

Next i

For i = 1 To n

  If Then List2.AddItem Str(a(i))    ‘②

Next i

End Sub

 ② 

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

key=Val(Text 1.Text)

Text 2.Text=“”

flag=True

i=1:j=8

Do While i<=j And flag=True

     m=(i+j)\2

     If key=a(m) Then

       flag=False

     ElseIf key>a(m) Then

       i=m+1

     Else

       j=m-1

     End If

     Text 2.Text=Text 2.Text+Str(m)

Loop

数组元素a(1)到a(8)的值依次为“1,3,5,8,10,13,16,21”,在文本框Text 1中输入7,执行该程序段,下列说法正确的是(  )

A . Flag的值为False B . 文本框Text 2中显示的内容为4 2 3 C . i的值为3 D . j的值为4
某对分查找算法的部分VB程序如下:

i=1: j=12: k=0: S=""

key=Val(Text1.Text) : c= "N" : flag= False

Do While i <= j And flag = False

  m=(i+j+1)\2: k=k+1

  If key = a(m) Then c= "Y" : flag= True

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

    s=s & Str(a(m))

Loop

Text2.Text = s : Text3.Text = c

数组a(1)到a(12)的值依次为“99,91,85,76,68,61,53,42,34,27,20,13”,执行该程序段后,下列说法正确的是(  )

A . 该程序段只能进行两位正整数的查找 B . 在文本框Text1中输入两位任意正整数,则k的值介于1和3之间 C . 在文本根Text1中输入76,程序执行后变量i和j的值分别为1和6 D . 若文本框Text2中显示了两个正整数,则文本框Text3中显示的内容一定是Y
某算法的VB程序段如下:

key = Int (Rnd*5)*2+ 11

i = 1: j = 8: c = 0

Do While i <= j

    m = (i+j+1) \ 2

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

    c = c+1

Loop

数组元素a(1)到a(8)的值依次为“23,21,19,18,16,15,14,11”。若该程序段执行后,下列说法错误的是(  )

A . i的值为j+1 B . i的值可能是9 C . j的值可能是5 D . c的值一定是3
以下程序生成10个整数,并且完成从小到大排序

Dim a(1 To 10) As Integer

Randomize

a(1) = Int(100 * Rnd)   ‘先生成第1个数

For i = 2 To 10        ‘然后生成2到第10个

  temp = Int(100 * Rnd)

  Low = 1

  high = i - 1

    Do While Low <= high

      m = (Low + high) \ 2

      If temp >a(m) Then

              ①      

      Else

        high = m - 1

      End If

   Loop

   For j = i - 1 To Low Step -1   ‘从原来有数据的最后位置开始逐个数据后移

     a(j + 1) = a(j)

   Next j

      ②      

Next i

则空缺处代码为(     )

A . ①Low = m + 1  ② a(Low) = temp B . ① Low = m  ② a(Low) = temp C . ①Low = m + 1  ② a(high) = temp D . ① Low = m  ② a(high) = temp
某对分查找算法的VB程序段如下:

t="": i=0: j=9: key=62: f=False

Do While i <=j And Not f

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

   t=t+Str(m)

   If a(m)= key Then

     f=True

     ElseIf a(m)>key Then

       i=m+1

       t=t+"→"

   Else

     j=m-1

     t=t+"←"

   End If

Loop

数组元素a(0)到a(9)的值依次为“99,94,90,87,78,70,63,56,45,36”执行该程序段的值是(    )

A . "4→7←5→" B . "4→7←5→6→" C . "4→7←5→6" D . "4→7←-5"
某对分查找算法的VB程序段如下:

'数组元素f(1)到f(9)赋初值为0,代码略
Key = Val(Text1.Text)

i = 1: j = 9: flag = False

Do While i <= j And flag = False

  m = (i + j) \ 2

  f(m) = 1

  k = k + 1

  If a(m) = Key Then

    flag = True

  ElseIf a(m) > Key Then

    j = m - 1

  Else

    i = m + 1

  End If
Loop

整型数组元素a(1)到a(9)为升序序列,在文本框Text1中输入待查找数,执行该程序段后,f(1)到f(9)各元素值为“0,0,0,0,1,1,1,0,0”,则下列选项中描述正确的是 (    )

A . k的值为4 B . i与j的关系为i>j C . m的值为7 D . flag的值可能为True,也有可能为False
实时处理与批处理整合的优势有(    )

①增加了系统开销

②有利于降低使用成本

③可以在同一个平台做批处理计算和流计算

④缩短了批处理计算和流计算之间的切换延时

A . ①②③ B . ①②④ C . ①③④ D . ②③④
在文本框Text1中输入待加密的n个字符(仅由ASCII码字符构成,最多支持960个字符),输入后单击加密按钮,在文本框Text2中产生密文。加密方式如下:

①定义一个数组a(1 to 961)。产生一个3到6之间的随机整数k,将十进制数960均分成k份,字符在字符串中的位置除以k的余数决定该字符存放在第几份数据中(余数为1保存在第一份数据中,余数为2保存在第二份数据中……,余数为0保存在第k份数据中);

②用十进制数127减去每个字符的ASCII码值,得到的差作为该字符的密文,并保存在数组a中,同一段内的密文依次存放;

③将随机产生的数k加64后保存在数组元素a(961)中,并一起参与加密;

④将数组a中所有有密文值的数组元素从后往前依次存放到数组b中;

⑤将数组b中的每个密文用3位数字保存,不足3位的前面用0补足,然后依次连接保存在变量sc中;

⑥在文本框Text2中输出sc。

例如:

①若现有待加密的字符串为“zp123”,产生的随机数k=3,则960分成3份,每份可存放320个值,分别为a(1)至a(320),a(321)至a(640),a(641)至a(960);

②由于Asc(“z”) =122,则127-122=5。字符“z”在待加密字符串中的位置是1,除以k的余数为1,因此数字“5”放在第一份数据的第一个位置,即a(1)=5;同理可得,第一份数据为a(1)=5,a(2)=77;第二份数据为a(321)=15,a(322)=76;第三份数据为a(641)=78;

③将随机产生的k与十进制数64的和保存到a数组的最后一个值中,即a(961)=64+3=67;

④将数组a中所有有密文值的数组元素从后往前依次存放到数组b中,得到b(1)=67,b(2)=78,b(3)=76,b(4)=15,b(5)=77,b(6)=5;

⑤将数组b中的每个元素用0补足3位后依次连接并保存在sc中,得到sc=“067078076015077005”;

⑥输出sc。

注:(asc(“0”)=48,asc(“A”)=65,asc(“a”)=97)

Private Sub command1_Click()

    Dim a(1 To 961) As Integer

    Dim sr, sc As String

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

    Dim b(1 To 961) As Integer

    Randomize

    k = Int(Rnd * 4 + 3)

    sr = text1.Text

    For i = 1 To 961

        a(i) = -1

    Next i

    a(961) = k + 64

    t = 960 / k

    For i = 1 To Len(sr)

        m = i Mod k - 1

        n = i \ k + 1

        If i Mod k = 0 then n = n - 1: m = m + k

           ①     = 127 - Asc(Mid(sr, i, 1))      ‘将密文存储到数组a中

    Next i

    For i = 1 To Len(sr) + 1

        j = j + 1

        Do While a(j) = -1

            j = j + 1

        Loop

        b(Len(sr) + 2 - i) = a(j)      ‘将有密文值的a数组元素存储到数组b中

    Next i

    For i = 1 To Len(sr) + 1

        sc =   ②         ‘连接密文并保存到sc中

    Next i

    text2.Text = sc

End Sub

Function space(x As Integer) As String

    For i = 1 To    ③  

        space = space & "0"

    Next i

End Function

  1. (1) 若加密后的密文为“068029041”,则随机数是;在Text1中输入的明文是
  2. (2) 在填写空白处缺失的代码。

已知数组元素a(1)到a(9)的值为19,28,37,46,55,64,73,82,91,若在Text1中输入29,然后执行下面程序段:

Key = Val(Text1.Text) \10

Text2.Text = ""

i = 1: j = 9: f = False

Do While i <= j And Not f

    m = (i + j)\ 2

    If a(m) Mod 10 = Key Then search = m

    f = True

    ElseIf a(m) Mod 10 > Key Then i = m + 1

    Else

        j = m - 1

    End If

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

Loop

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

A . 55 73 82 B . 5 8 9 C . 5 7 8 D . 55 82 91
阅读下列用二分法查找输入的1000以内的整数次数的程序

x=int(input("请输入要查找的1000以内的整数:"))

step=0

flag1=1

flag2=1000

while(flag1<=flag2):

    mid=① 

    step=step+1

    if mid>x:

        flag2=②     

    elif mid<x:

        flag1=③   

    else:      

        break

print("查找次数为:",step)

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

下列说法正确的是(    )

A . ①处填(flag1+flag2)/2,②处填mid-1,③处填mid+1 B . ①处填(flag1+flag2)//2,②处填mid-1,③处填mid+1 C . ①处填(flag1+flag2)//2,②处填mid+1,③处填 mid-1 D . 以上都不对
某查找算法的VB程序段如下:

i=1: j=7: n=0

Key=Val (Text1. Text)

Do While i <=j

    n=n+1

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

    If Key=d(m) Then Exit Do

    If Key <d(m) Then j= m-1 Else i =m+1

Loop

数组元素d(1)到d(7)存放的数值依次为6,45,23,36,78,58,12,若该程序段运行结束后,n的值为2,则Key的值是(    )

A . 58 B . 6或12 C . 45或58 D . 23或78
下列程序段用于在前面部分为升序后面部分为降序的数组 a 中查找最大值,返回该数值及其位置(下标)。

i = 1: j = 10

flag = False

Do While i <= j And Not flag

    m = (i + j + 1) \ 2

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

        

    ElseIf a(m) > a(m - 1) And a(m) > a(m + 1) Then

        

    ElseIf a(m) > a(m - 1) And a(m) < a(m + 1) Then

        

    End If

Loop

List1.AddItem Str(a(m)) +Str(m)

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

①i=m+1  

②j=m-1

③flag = True  

则①②③处语句依次是(  )

A . ①②③ B . ①③② C . ③①② D . ②③①
某对分查找算法的VB程序段如下:

i =1:j= 8:n= 0:key= 83

Do While i<=j

    n=n+1

    m=(i+j)\2

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

Loop

Text1。Text = Str(a(2 * j - 1))

数组元素a(1)到a(16)的值依次为“6,90,3,85,5,83,2,83,4,83,8,80,7,77,1,70”,奇数位存储序号,偶数位存储成绩。执行该程序段后,下列说法正确的是(    )

A . 循环结束后i的值为5 B . 变量m的值为4 C . 变量n的值为5 D . Text1输出结果为4
某程序代码如下所示:

i=1:j=100:Key=20

Do While i<=j

    a = i+(j- i)\4: b= i+(j- i)\ 2:c=j-(j-i)\4

    If a=Key Or b=Key Or c=Key Then ExitD o

    If i<= Key And Key< a Then j= a- 1: w= w+ 1

    If a< Key And Key < b Theni = a+ 1: j= b-1:x=x+1

    If b < Key And Key < c Then i= b+1:j=c-l:y=y+1

    If c<Key And Key<=j Then i=c+1:z=z+1

Loop

n=w+x+y+z

程序运行结束后,变量n的值是(    )

A . 1 B . 2 C . 3 D . 4