第4单元 计算与问题解决 知识点题库

一个好的算法应具有(     )。
A . 正确性、高效性、可读性、健壮性 B . 正确性、可读性、严密性、高效性 C . 正确性、合理性、可读性、健壮性 D . 正确性、合理性、严密性、高效性
【加试题】对于数组(形如a数组:4、5、6、1、2、3或b数组:1、2、3、4、5、6),我们称元素1为此二数组的拐点。为寻找此类递增或循环递增数组的拐点,可以用顺序查找和对分查找的方法,通常相比之下对分查找算法较优,以下为使用对分法查找拐点的算法。

做法是比较中点与当前查找范围第1个数大小关系,用对分法使查找范围逼近拐点;当余下数组只有二个元素时,可根据此二元素大小关系得到拐点的位置。

依据上述描述设计了VB程序,界面如图所示。请回答下列问题:

图片_x0020_74  

  1. (1) 对于循环递增数组“9、10、11、12、13、14、15、16、17、18、19、20、1、2、3、4、5、6、7、8”,代码中加框处执行的次数为次。
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 20) As Integer

    Private Sub Command1_Click()

        Dim Low As Integer, High As Integer

        Low = 1

        High = 20

        Do While High > Low

            If        ①         Then              '当只余下两个元素时

                If       ②           Then

                    Label1.Caption = "拐点元素为" + Str(a(1)) + ",下标为" + Str(1)

                Else

                    Label1.Caption = "拐点元素为" + Str(a(High)) + ",下标为" + Str(High)

                End If

                Exit Do

            End If

           

            If a(m) >= a(Low) Then

                Low = m

            Else

         ③     

            End If

        Loop

    End Sub

    Private Sub Form_Load()

        '生成循环递增的数组a,代码略

    End Sub

     ② ③ 

下列选项中,最适合用计算机编程解决的问题是(  )
A . 编写文章 B . 计算N的阶乘(N!) C . 制作动画 D . 播放视频
小王编写了一个寻找最长连续相同子串的程序,功能如下:在文本框Text1中输入一个字符串,点击“查找最长子串”按钮后,在标签Label1上显示出最长子串的长度。程序运行如图所示。

  1. (1) 根据题意,“查找最长子串”按钮的对象名为
  2. (2) 请在划线处填入合适的代码。

    Private Sub cmd1_Click()

    Dim i As Integer, n As Integer

    Dim max As Integer, count As Integer

    Dim s As String s = Text1.Text

    n =

    count = 1: max = 1

    For i = 2 To n

    If  Then count = count + 1

    Else

    If count > max Then max = count

    End If

    count =  End If

    Next i

     

    Label1.Caption = "最长连续子串字符数为:" + Str(max) End Sub

  3. (3) 若删除加框处的代码,在Text1中输入“AAAbbcd00000”,则程序结果是(填写数字)
【加试题】火柴棍可以拼成数字0~9,拼法如图1 所示。

图1

输入火柴棍的数量n(n≤24),计算可以拼出多少个“A+B=C”的等式?要求:

① 加号与等号各自需要两根火柴棍。

② A、B、C为非负的整数,且该数非零时,最高位不能是0。

③ 如果A≠B,则A+B=C 与B+A=C 视为不同的等式。

④ n 根火柴棍必须全部用上。

小明发现,数字1用的火柴棍最少,24根火柴棍全部用上的话,能拼出最大的整数A或B不超过1111,C不超过2222。他编写了一个VB 程序,在文本框Text1中输入火柴棍的数量,单击“统计”按钮Command1,在文本框Text2中输出“A+B=C”的方案数,程序界面如图2所示。

图2

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

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

    Private Sub Command1_Click()

    Dim a(0 To 2222) As Integer '存储每个整数需用的火柴棍数

    Dim n As Integer, ans As Integer

    Dim i As Integer, j As Integer

    n = Val(Text1.Text)

    For i = 0 To 2222

    a(i) = 0

    Next i

    '得到0~9 中每个数字需用的火柴棍数

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

    a(5) = 5: a(6) = 6: a(7) = 3: a(8) = 7: a(9) = 6

    n = '去掉等号与加号后,剩余的火柴棍数量

    For i = 10 To 2222 '计算出10~n 中每个数字需用的火柴棍数

    a(i) = a() + a(i Mod 10)

    Next i

    ans = 0

    '枚举0~n 中任意两个数,判断~否符合A+B=C 的火柴棍数量

    For i = 0 To 1111

    For j = 0 To 1111

    If a(i) + a(j) + a() = n Then

    ans = ans + 1

    End If

    Next j

    Next i

    Text2.Text = Str(ans)

    End Sub

  2. (2) 输入的火柴棍的数量为14 时,方案数为 。
有100个大小、形状一样的玻璃球,其中有1个玻璃球的质量轻于其他99个玻璃球,如何用一台无砝码的天平,以最快的速度找出这颗轻玻璃球?运用“三分筛选”法来模拟“寻找”这个玻璃球的算法如下:

步骤1:如果待筛选的玻璃球个数小于或等于,则认定已经找出了这颗玻璃球(认定方法参照步骤2中描述),停止筛选,并输出筛选总次数;否则,重复执行步骤2。

步骤2:按编号依次将玻璃球均分成3份,如果有多余的则放入第3份中。比较第1、2份的玻璃球质量:

①如果第1份等于第2份的质量,则选取第3份的玻璃球作为下一次筛选的对象;

②如果第1份小于第2份的质量,则选取第1份的玻璃球作为下一次筛选的对象;

③如果第1份大于第2份的质量,则选取第2份的玻璃球作为下一次筛选的对象。

重复执行步骤1。

例如:第1次筛选的小球编号区间是1~100,均分成3份的待称重小球编号分别是1~33、34~66、67~100;第2次则选取以上3份的其中一份进行再筛选、再均分,……,直至找到。

解决上述问题的VB程序功能如下:运行程序,在列表框List1中显示100组数据,每组数据分别代表每个编号及对应的小球质量(其中有且只有一个小球的质量与其他小球不同),单击“查找”按钮 Command1,在列表框List2中显每次筛选的编号区间和完成筛选的总次数。程序运行界面如图所示。

  1. (1) 如果编号为88的小球是较轻的,按照题中给定算法,到此小球需经历的筛选次数是
  2. (2) 实现上述功能的VB程序如下。请在划线处填入合适的代码。

    Const maxn = 100

    Dim a (1 To maxn) As Integer

    Dim w (1 To 2) As Integer     ‘ 数组w用来存储第1份和第2份小球的质量

    Private Sub Form Load ( )

    ‘ 此处代码用来模拟产生100个小球的质量,分别存储在数组元素a(1)~a(100)中

    ‘ 其中只有1个小球的质量为8,随机存储在数组a的某元素中,其余质量均为10

    ‘ 此处代码略

    End Sub

    Private Sub Command1_Click( )

    Din 1eft As Integer, right As Integer     ‘ left为起始编号, right为结束编号

    Dim s As Integer, C As Integer     ‘s 为每次查找的区间长度

    left = 1:right = maxn

    c = 1:s = right:i = 0

    List2 AddItem Str(i+1) +"---->” + Str(maxn)

    Do While right - left > =3

      w(1) = o:w(2) = 0:k =1

      i = left

      s =       ①    

      Do While i < = (s \3)*2 + left -1

    ‘Do语句用于将待筛选的数据进行区域划分

        w(k) = w(k)+a(i)

        If i = (s\3)*k+ left -1 Then k = k+1

        i = i+1

      Loop

      If w(1) = w(2) Then

        left = left + (s\3)*2

      ElseIf w(1) < w(2) Then

                ②     

      Else

        right = left+(s\3)

        left =s\3+ left

      End If

              ③     

      List2. AddItem Str (left) & ”---->” & str(right)

    Loop

    List2. AddItem "经过”+s tr(c) +" 次后找到”

    End sub

     ② ③ 

【加试题】某对分查找算法的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表示退出循环

     Else If 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”。若该程序段执行后,文本框Text 1中显示的内容可能是(  )

A . RL B . LMR C . RLR D . LRLM
某对分查找算法的部分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=Val(Text1.text)

s = 0: i = 1: j = 11

Do While i <= j

  m = (i + j) \ 2

  If Key > a(m) Then

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

  Else

    j = m - 1: s = 2 * s

  End If

Loop

Text2.Text = Str(s)

数组a(1)到a(11)的值依次为“2,13,24,31,35,44,47,50,61,88,101”,在文本框Text1中输入下列选项值,所得输出结果与其他三项不相同的是(   )

A . 25 B . 34 C . 35 D . 65
  调用函数,将返回一个窗口。如果想在窗口上绘制或是放置对象,需要指定这个对象在窗口的即坐标。pygame中的坐标系原点在,水平方向为轴,垂直方向为轴。
要将显示一个有背景色的窗口改为显示一个有背景图片的窗口应将*处改为两句,请填写在①②处。

screen.fill((255,255,0))    #窗口填充黄色*

  )  #加载背景图像

(  ) #将背景图画在窗口

pygame.display.update()        #窗口刷新

函数 pyplot.figure的功能是(     )
A . 显示图片 B . 读入文件 C . 设置字体 D . 创建绘图区
一辆卡车运矿石,晴天每天运20次,雨天每天最多运12次,他一共运了8天,共112次,则晴天和雨天各有几天。用VB程序来解决这个问题,单击按钮Command1,在文本框Text1中输出晴天的天数,在文本框Text2中输出雨天的天数,程序代码如下:

Private Sub Command1_Click()

    i=1

    j=7

    Do While _______

        i=_______

        j=________

    Loop

    Text1.Text=Str(i)

    Text2.Text=Str(j)

End Sub

则下列说法正确的是(   )

A . ①应填的代码为 i*20+j*12<>112 B . ②应填的代码为i-1 C . ③应填的代码为j+1 D . 描述该算法的思想为解析算法
某对分查找算法的VB程序段如下:

Dim a(1 To 10) As Integer

n=0:a(1)= 1

For i=2To 10

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

Next i

Key = Int(Rnd( )* 5)

Top= 1: bottom= 10

Do While Top <= bottom

    m = (Top + bottom) \2

    n=n+ 1

    If Key = a(m) Then

        Exit Do

    ElseIf Key > a(m) Then

        Top=m+ 1

    Else

        bottom= m- 1

    End If

Loop

运行该程序段后,n的值不可能的是(      )

A . 1 B . 2 C . 3 D . 4
下列关于算法的说法,错误的是(   )。
A . 算法必须有输出 B . 算法就是程序 C . 算法不一定有输入 D . 算法必须在有限步执行后能结束
某对分查找算法的VB程序段如下:

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

i = 1:j = 20:s = ""

key = Val(Text1. Text)

Do While i < = j

    m = (i + j)\2

    s = s + Str(a(m))

    If a(m)= key Then Exit Do        'Exit Do表示退出循环

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

Loop

Text2. Text = s

在文本框Text1中输入待查找数,执行该程序段后,下列选项中,文本框Text2中显示的内容不可能的是(    )

A . 78 50 46 33 B . 51 37 41 48 C . 74 50 46 51 D . 73 83 87 89
在VB中,下列程序段执行后,变量a,b,c的值分别是(   )

a=1: b=1:c=1

do while a+b+c<=10

    a=a+1

    b=b*2

    c=b/2

loop

A . 2,2,1 B . 3,4,2 C . 4,8,4 D . 4,4,2
某对分查找算法的VB程序段如下:

key=Val(Text1.Text)

i=1: j=8

Text2.Text=“ ”

Do While i<=j

    m=Int(i+j)/2)

    If key=a(m) Then Exit Do       'Exit Do 表示退出循环

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

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

Loop

数组元素a(1)到a(8)的数据依次为“12,25,36,47,68,79,87,99”,文本框Text1中输入的值是12,执行该程序段后,文本框Text2中显示的是(     )

A . 68 47 25 12 B . 47 25 12 C . 68 36 12 D . 25 47
小明的支付宝帐号密码忘记了,但他还零星记得有关于密码的一些信息:

①密码是八位数字,前两位为19

②最后两位数字是91

③能被77和133整除

程序界面如图所示,单击“找回密码”按钮(Command1)后,可能的密码显示在列表框List1中。

解决此问题的相应的程序如下:

Private Sub Command1_Click()

    Dim i As Long, s As Long

    For i = 0 To 9999

        s =  ①                  's表示该八位数密码

        If    ②   Then            '符合密码的条件,s能被77和133整除

            List1.AddItem Str(s)

        End If

    Next i

End Sub

  1. (1) 在应用程序界面设计时,添加“List1”对象用于显示可能的密码,应使用如图所示的“控件工具箱”中的(填写相应的编号)。
  2. (2) 将窗体Form1上显示的文本“Form1”改为“寻找密码”,可在其属性窗口中将属性的属性值修改为“寻找密码”。
  3. (3) 解决此问题的算法是。(填:枚举算法/解析算法/查找算法)
  4. (4) 在程序下划线处,填入适当的语句或表达式,把程序补充完整:

     ② 

小智在分析应用功能组成后,根据功能需求编写了如下网络应用Python代码:

from flask import Flask,render_template,request

app =                

@app.route("/")

def index():

#显示“主页”页面,代码略

@app.route("/introduce")

def introduce():

#显示“介绍”页面,代码略

@app.route("/exercise",methods=["GET","POST"])

def exercise():

#显示“练习”页面,代码略

@app.route("/top")

def toplist():

#显示“排行榜”页面,代码略

if __name__ == "__main__":

app.             

  1. (1) 请在划线处补充代码。
  2. (2) 请用实线将下列访问的“在线加法练习系统”功能的URL与相应的路由及视图函数连接起来。(答案填写格式如:A-d 、B-a)

    A.//127.0.0.1:5000/top

    toplist()

    a.@app.route("/top")

    B.//127.0.0.1:5000/

    exercise()

    b.@app.route("/exercise",methods=["GET","POST"])

    C.//127.0.0.1:5000/exercise

    introduce()

    c.@app.route("/introduce")

    D.//127.0.0.1:5000/instance

    index()

    d.@app.route("/")

                                                       

  3. (3) 在Flask Web应用框架中,可以通过网页模板来显示内存变量的值或对象等,以下在模板文件index.html中用于显示内存变量xxjs值的正确代码为           
    A . {{xxjs}} B . {{#xxjs#}} C . {{%xxjs%}} D . {%xxjs%}