2020版高考信息技术一轮复习(浙江专用)专题六 算法的程序实现课件(86张幻灯片)+练习

文档属性

名称 2020版高考信息技术一轮复习(浙江专用)专题六 算法的程序实现课件(86张幻灯片)+练习
格式 zip
文件大小 1.8MB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2019-05-25 11:55:09

文档简介


专题六 算法的程序实现
挖命题
【考情探究】
考点
考试内容
考试要求
5年考情
预测热度
考题示例
考向
难度
解析算
法及程
序实现
解析算法的思想方法
c
2015浙江10月学考+选考,14,4分;2017浙江4月学考+选考,14,5分
进制转换、素数问题及其他数论问题、数学猜想等
★☆☆
★★☆
解析算法的程序实现
枚举算
法及程
序实现
枚举算法的思想方法
c
2016浙江10月学考+选考,14,5分;2018浙江4月学考+选考,14,5分;2018浙江6月学考,11,5分
字符串处理问题是考试热点,在字符串中利用逗号、空格、数字等特殊符号,完成一些统计或计算功能
★★☆
★★★
枚举算法的程序实现
排序算
法及程
序实现
冒泡排序的思想方法
c
2015浙江10月学考+选考,16,4分;2016浙江4月学考+选考,11,2分;2016浙江10月学考+选考,16,3分; 2017浙江11月学考+选考,16,3分
排序算法优化;冒泡排序变形,如双向排序、奇偶分开排序、素数合数分开排序、去重复数排序等
★★★
★★☆
冒泡排序的程序实现
选择排序的思想方法
c
2017浙江4月学考+选考,12,2分;2018浙江4月学考+选考,16,3分
排序变形,如双向排序、奇偶分开排序、素数合数分开排序等
★★★
★★☆
选择排序的程序实现
查找算
法及程
序实现
顺序查找的思想方法
c
2017浙江4月学考+选考,16,3分
顺序查找比较简单,一般不单独考,会结合其他知识点,比如在数列中插入数、删除数列中的重复数、查找替换等
★★☆
★★☆
顺序查找的程序实现
查找算
法及程
序实现
对分查找的思想方法
c
2015浙江10月学考+选考,11,2分;2016浙江4月学考+选考,12,2分;2016浙江10月学考+选考,12,2分;2017浙江4月学考+选考,11,2分; 2017浙江11月学考+选考,12,2分;2018浙江4月学考+选考,12,2分;2018浙江11月学考+选考,16,3分
一类题是考查对分查找的运用:如查找次数、查找中各个变量值的变化;另一类题是将数据源序列由单一的从小到大变成奇偶分开数列、循环有序数列、左右交替上升序列等,此类数列往往是分成前后两个有序数列,查找过程中,对分的主要思想不变,无非是增加了一些条件设置
★★★
★★★
对分查找的程序实现
递归算
法及程
序实现
递归算法的思想方法
b
递归算法本质上是自定义函数的应用,到目前为止,未在真题中出现
☆☆☆
递归算法的程序实现
算法在
数据管
理中的
应用
通过Connection对象连接数据库
a
2016浙江10月学考+选考,17,6分
一般考数据库程序题的概率不高,难度也没有单纯考数组综合运用的题大
★★☆
★☆☆
通过Recordset对象读取数据表中的数据
a
算法在数据管理中的应用
c
分析解读  本专题主要内容为几大算法的思想方法和程序实现,包括枚举、解析、排序、查找、递归,是加试题的主要考查对象。从考试属性中可看出,解析算法与枚举算法是学考+选考要求,排序、查找和递归是选考要求。题型有选择题和非选择题。其中选择题主要是加试题第11、12题,考查排序算法与对分查找的题目频度较高。非选择题第14题(学考)、第16题(加试)、第17题(加试)考查几个算法的综合应用。
纵观几次真题,程序题有逐年加难的趋势。试题中对于算法的考查不再局限于算法的基本形,而是在基本形的基础上做了许多变形,比如冒泡排序的几种变式,对分查找的变式等。还有一种变化是,在基本形的基础上增加程序的功能,比如对排序算法进行改进,从而提高排序的效率,记录排序中数据的移动过程,利用查找算法查找并删除数列中的重复数据等。
还有一个重要变化是,最近几次的真题对几个经典算法的考查逐渐弱化,开始加强对数组的考查,往往在选择题加试题的2个题中有一个是考查数组的运用,该题往往难度较大。另外最后一个大题,也即第17题一般也是数组的综合运用,是整卷难度最大的一题。一般选择题中保留一题考查排序或对分查找,考对分查找的概率高一些;大题中第16题一般考查排序或查找算法,考排序的概率高一些。
数据库程序题一般难度不大,可能是篇幅太长的缘故,真题中考数据库题的概率并不高,有很多题都是一句话带过:从数据库中读取了某数据存储到某数组变量中。如果考数据库相关知识,一般会考从代码中分析数据库文件的名称,数据表的名称,以及数据表中字段的读取方法,记录集的移动方法等基础知识。而读取数据并存储到数组变量中后,对数组的综合运用相对难度大一些,要学会分析题中各数组变量的作用,分别存储了什么类型的数据,以及数组下标的灵活运用。
破考点
【考点集训】
考点一 解析算法及程序实现
1.(2018宁波市“十校联考”,16,3分)在VB的算术运算中,最大的实数类型Double有效位数也只有15位。为了实现除法运算保留任意位数,小明根据除法原理,编写了如下程序,功能如下:在文本框Text1中输入被除数(正整数),在文本框Text2中输入除数(正整数),在文本框Text3中输入保留小数位数,单击按钮Command1,在标签Label1中显示除法运算的商。程序运行界面如图所示,但加框处代码有错,请改正。
/
Private Sub Command1_Click()
Dim x, y As Integer
Dim n As Integer
Dim s As String
x= Val(Text1.Text): y = Val(Text2.Text)
n= Val(Text3.Text)
s = s + Str(x y)
s = s + "."
k = x Mod y
For i = 1 To n
  x =x+k * 10 ’(1)
  s=Str(x y) ’(2)
  k = x Mod y
Next i
Label1.Caption = "商为:" + s
End Sub
答案 (1) x=k*10 (2) s=s+Str(xy)
2.(2018温州选考适应性测试,14,5分)数学中圆周率的计算公式为
π
4
=1-
1
3
+
1
5
-
1
7
+…,下图是计算圆周率的VB程序界面,精确到万分之一,保留4位小数输出。
/
(1)观察程序设计界面,该程序共包含   类对象。?
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim flag As Boolean
Dim t As Single, sum As Single
Dim i As Long, f As Integer
flag = False
f =-1
sum =1:i =  ①  ?
Do While Not flag
  t = 1 / (2 * i + 1) ’P1
  If t*4 < 0.0001 Then flag = True    ’P2
  ②  ?
  f = -f
  i = i + 1
Loop
Label2.Caption = Str(Int(sum*4*10000+0.5)/10000)
’P3
End Sub
(3)若将计算及输出结果精确到百万分之一,应修改的语句是   (单选,A.P1、P2/B.P1、P3/C.P2、P3)。?
答案 (1) 3 (2) ①1 ②sum=sum+f*t (3)C
考点二 枚举算法及程序实现
 (2018浙江十校联盟选考适应性考试,14,5分)编写“二进制数转换为十六进制数”程序,实现如下功能:在文本框 Text1中输入一个二进制数,单击“转换”按钮 Command1,将二进制数转换为十六进制数并在文本框 Text2 中显示。程序运行界面如图所示。
/
(1)设计如图所示的程序界面,至少要使用   个类(填数字)。?
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim s1 As String, s2 As String
Dim i As Integer, x As Integer
Const code = "0123456789ABCDEF"
s1 = Text1.Text : s2 = ""
Do While Len(s1) Mod 4 <> 0
 s1 = "0" + s1
Loop
x = 0: i =1
Do While i <= Len(s1)
 x = x*2+Val(Mid(s1,i,1))
 i=i+1
 If   ①    Then?
  s2 = s2 +Mid(code,x+1,1)
     ②   ?
 End If
Loop
Text2.Text = s2
End Sub
(3)若文本框 Text1 中输入的内容为“101101”,单击“转换”按钮后,文本框 Text2 中显示的内容是   。?
答案 (1)4 (2)① i Mod 4=1 或(i-1) Mod 4=0 (或其他等价答案) ② x=0 (3)2D
考点三 排序算法及程序实现
1.(2019届金华十校第一学期调研考试,11,2分)【加试题】有一个数组,采用冒泡排序,第一遍排序后的结果为3,18,5,35,8,9,11,13,32,那么该数组的原始顺序不可能是(  )
A.18,5,35,8,9,11,13,32,3
B.18,5,35,8,9,11,3,13,32
C.18,5,35,3,8,9,11,13,32
D.3,18,5,35,13,11,32,8,9
答案 D 
2.(2018宁波市“十校联考”,11,2分)【加试题】有如下 VB 程序段:
Dim a(1 To 10) As Integer
Dim s As String, n, i As Integer
s = "54851845236": n = Len(s)
For i = 1 To n - 1
a(i) = Val(Mid(s, i, 2))
Next i
For i = 1 To n - 2
k = i
For j = i + 1 To n - 1
  If a(k) < a(j) Then k = j
Next i
If k <> i Then
  t = a(k): a(k) = a(i): a(i) = t
End If
Next i
Text1.Text = Str(a(1))
                    
该程序段运行后,文本框 Text1 中显示的内容是(  )
A.18 B.54 C.85 D.8
答案 C 
3. (2018温州选考适应性测试,16,3分)【加试题】有一组正整数,要求对其中的奇数进行升序排序。排序后在列表框List2中也仅显示奇数部分数据,结果如图所示。
/
实现上述功能的VB代码如下,但加框处有错,请改正。
Const n=10
Dim a(1 To n) As Integer
Private Sub Command1_Click()
Dim t As Integer, i As Integer, j As Integer, m As Integer
Dim tmp As Integer
’读取一组正整数,存储在数组a中,并显示在列表框List1,代码略
i=1
Do While i <= n
  For j = n To i + 1 Step -1
    If a(j) Mod 2 = 1 Then
      Ifa(j) < a(j - 1)Then  ’(1)
        tmp=a(j):a(j)=a(j - 1) : a(j - 1) =
tmp
        t = t + 1
      End If
    End If
  Next j
Ifa(j) Mod 2 = 0 Then m = m + 1 ’(2)
i = i + 1
Loop
For i =1 To m
  List2.AddItem Str(a(i))
Next i
List2.AddItem "一共交换了" & t & "次"
End Sub
答案 (1) a(j)(2) a(i) Mod 2=1
4.【加试题】小王基于冒泡排序算法编写了一个VB 程序,功能如下:在文本框Text1 中显示排序前的数据,单击“去重”按钮Command1,在文本框Text2 中显示剔除重复数据后的升序排序结果。程序运行界面如图所示。
/
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Dim a(1 To 10) As String
Private Sub Command1_Click()
Dim i As Integer,j As Integer,t As String
’获取排序前数据依次存储在数组a中,并在文本框Text1中显示,代码略
n = 10
j = 1
For i = 1 To n- 1
 For j = 1 To i  ’(1)
  If a(j) > a(j + 1) Then
   t = a(j): a(j) = a(j + 1): a(j + 1) = t
  End If
 Next j
Next i
j = 1
Do While j <= n- 1
 If a(j) = a(j + 1) Then
k = j+1     ’(2)
For i = k To n- 1
   a(i) = a(i+1)
  Next i
  n = n- 1
  j = k
 Else
  j = j + 1
 End If
Loop
For i = 1 To n
 Text2.Text = Text2.Text + a(i)
Next i
End Sub
答案 (1)n-i (2)k = j
考点四 查找算法及程序实现
1.【加试题】有如下VB 程序段:
Dim d(1 To 10) As Integer, s As String
Dim L As Integer, R As Integer, M As Integer, key As Integer
d(1) = 1: d(2) = 5: d(3) = 7: d(4) = 10: d(5) = 12
d(6) = 13: d(7) = 19: d(8) = 20: d(9) = 23:d(10)= 30
L = 1: R = 10
s =“”
key =Val(Text1.Text)
Do While L <= R
 M = (L + R + 1) 2
 If d(M) = key Then L = 10
 If d(M) < key Then L = M + 1 Else R = M - 1
 s = s + Str(M)
Loop
Label1.Caption = s
该程序段运行后,在Text1 中输入30,标签框Label1 中显示的内容是(  )
A.6 9 10 B.6 8 9 10
C.5 8 9 10 D.5 8 10
答案 A 
2.(2018浙江“七彩阳光 ”联盟期初联考,11,2分)【加试题】某对分查找算法的 VB 程序段如下:
L = 1: R = 10: Key = 21
Do While L <= R
 m = (L + R) 2
 If a(m) <= Key Then
  L= m + 1
 Else
  R = m - 1
 End If
Loop
数组元素 a(1)到 a(10)的值依次为“3,9,21,21,21,21,27,28,39,40”,执行该程序段,变量 R、a(R)的值分别是(  )
A.2,9 B.3,21
C.6,21 D.7,27
答案 C 
3.(2018温州九校10月联考,12,2分)【加试题】有如下 VB 程序段:
i=1:j=10:p=0
f=False
k=Int(Rnd*100)+0.5
Do While i<=j And Not f
m=Fix((i+j)/2+0.5)
If k=a(m) Then
 f=True
ElseIf k j=m-1:p=p+1
Else
 i=m+1:p=p-1
  End If
Loop
Label1.Caption=Str(p)
数组元素a(1)到a(10)的值依次为“5,16,22,28,35,43,52,67,78,89”,执行该程序段后,标签显示的值不可能是(  )
A.-3 B.-1 C.1 D.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=m+1
Else
 If a(m)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
答案 A 
考点五 递归算法及程序实现
1.某同学用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 
2.楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶, 求共有多少种不同的走法。
(1)完善程序:
Private Sub Command1_Click()
Dim n As Integer
n = Val(Text1.Text)
Text2.Text = Str(f(n))
End Sub
Function f(a As Integer)
If a = 1 Then
  f = 1
ElseIf a = 2 Then
  f =  ①  ?
Else
  f =  ②   ?
End If
End Function
(2)若有10阶台阶,共有   种走法。?
答案 (1)①2 ②f(a - 1) + f(a - 2) (2)89
考点六 算法在数据管理中的应用
 小林编写了一个统计高三16个班级选考技术人数占比的VB程序。运行界面如图所示,窗体加载时,从数据库中(其中“选考三”字段中存储了“技术”选考信息)调用数据,统计各班选考技术的人数占比,并在列表框List1中显示“班级”和“选技术占比”。单击“排序”按钮Command1,数据按选技术占比降序排序,在List2中显示排序结果。
/
实现上述功能的VB程序如下,请回答下列问题:
(1)分析程序,可知调用的数据表的名称为    。?
(2)请在划线处填入合适的代码。
Dim n As Integer, i As Integer, j As Integer’变量n用于统计学生总数
Dim rate(1 To 16) As Integer, num(1 To 16) As Integer, class (1 To 16) As Integer
Dim tech(1 To 50) As Integer, cinfo(1 To 5000) As Integer, subj(1 To 5000) As String
Private Sub Form_Load()
Dim conn As New ADODB.Connection, rs As New ADODB.Recordset
conn.Connectionstring = "Provider = Microsoft.ACE.OLEDB.12.0;DATA Source="& App.Path &"stuimfo.accdb"
conn.Open
Set rs.ActiveConnection = conn
rs.Open "SELECT * FROM xkqk"
’此处代码略,实现将每个学生班级存储到数组cinfo中,选考三科目存储到数组subj中
For i = 1 To n
   ①    ’统计各班人数存储到数组num中,num(1)存储1班的人数?
Next i
For i = 1 To 16
class(i) = i
For j = 1 To n
 If class(j) = i Then
  If subj(j)="技术"Then   ②  ?
 End If
Next j
rate(i) = tech(i) / num(i) * 100
List1.AddItem ads(class(i), 3) +" "+ ads(rate(i), 7) + "%"
Next i
End Sub
Private Sub Command1_Click()
Dim i As Integer, t As Integer, s As Integer
For i = 1 To 15
For j = 16 To i + 1 Step -1
 If   ③    Then?
  t=rate(j) : rate(j) = rate(j-1) : rate(j-1) = t
  s=class(j): class(j)=class(j-1):class(j-1)=s
 End If
Next j
Next i
List2.AddItem "班级" + "  " + "选技术占比"
For i = 1 To 16
List2.AddItem Str(class(i))+ " " + Str(rate(i)) + "%"
Next i
End Sub
答案 (1)xkqk (2)①num(cinfo(i))=num(cinfo(i))+1
② tech(i)=tech(i)+1 ③ rate(j)>rate(j - 1)
过专题
【五年高考】
考点一 解析算法及程序实现
 2014—2018年真题·基础题组
                    
 (2017浙江4月学考+选考,14,5分)奇偶校验是一种校验数据传输正确性的方法。其中奇校验方法:统计二进制数据的数位中“1”的个数,若个数为奇数,则校验位值为0,否则校验位值为1。小李编写了一个计算奇校验位值的VB程序,功能如下:在文本框Text1中输入1~255间的十进制待校验数,单击“计算”按钮Command1后,在文本框Text2中显示该数对应的二进制值,并在标签Label3中显示该数的校验位值。程序运行界面如图所示。
/
(1)在设计程序界面时,要清空文本框中的显示内容,应修改该文本框中的    属性。?
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
 Dim a As Integer, s As String
 Dim n As Integer, t As Integer, v As Integer
 n = Val(Text1.Text)
 t = 0
 s = ""
 Do While n > 0
  a = n Mod 2
  n = n 2
  t =  ①  ?
  s = Str(a) + s
 Loop
 v = t Mod 2
 Text2.Text = s
 Label3.Caption = "校验位值:" +  ②  ?
End Sub
(3)运行该程序,在文本框Text1中输入22,单击“计算”按钮,则显示的校验位值是       。?
答案 (1)Text  (2)①t+a ②Str(1-v) (3)0
考点二 枚举算法及程序实现
2014—2018年真题·基础题组
1.(2018浙江6月学考,11,5分)素数只能被1和它本身整除,不能被其他自然数整除。编写VB程序实现如下功能:单击“产生奇数并判断”按钮Command1,随机产生一个三位正奇数显示在文本框Text1中,并在文本框Text2中显示其是不是素数的判断结果。例如,当随机产生的三位正奇数为953时,程序运行界面如图a所示。
/
 图a            图b
(1)在设计程序界面时,应使用图b所示“控件工具箱”中的    (填写相应编号)添加文本框Text1。?
(2)实现上述功能的VB程序如下,请在划线处填写合适的代码。
 Private Sub Command1_Click()
  Dim n As Integer, i As Integer
  Dim flag As Boolean’用于标记是不是素数
  Randomize
  n = Int(  ①  )*2+1?
  Text1.Text = Str(n)
  flag = True’标记为素数
  i = 3
  Do While i <= n - 1 And flag = True
   If n Mod i = 0 Then
    flag = False
   End If
   i = i + 2
  Loop
  If  ②   Then?
   Text2.Text = Str(n) + “是素数”
  Else
   Text2.Text = Str(n) + “不是素数”
  End If
 End Sub
(3)以下选项中,与加框处表达式“n Mod i = 0”等价的是  (单选,填字母)。?
A.n i = Int(n / i) B.n i = n/ i C.n Mod i = n i
答案 (1)② (2)①Rnd*450+50 或其他等价表达式
②flag或flag=True或 i>n-1或i=n或i>=n或其他等价表达式 (3)B
2.(2018浙江4月学考+选考,14,5分)某种编码以4位二进制码为一组,每组前两位表示方向,后两位表示距离。编写一个程序,将编码翻译成方向和距离,距离值为每组编码后两位二进制码转换为十进制数的值。具体功能如下:在文本框Text1中输入连续多组编码,单击“翻译”按钮Command1,结果显示在列表框List1中。程序运行界面如图所示。
/
(1)要使程序运行时,文本框Text1的Width属性值为2018,可在Form_Load事件过程中添加语句   (单选,填字母:A.Width=2018/B.Text1.Width=2018/C.Width.Text1=2018)。?
(2)实现上述功能的 VB 程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim s As String, c As String, d As String
Dim n As Integer, b1 As Integer, b2 As Integer, v As Integer, i As Integer
s = Text1.Text: n = Len(s): i = 1
Do While i <= n
c = Mid(s, i, 2)
If c = "00" Then
 d = "东"
ElseIf c = "01" Then
 d = "南"
ElseIf c = "10" Then
 d = "西"
Else
 d = "北"
End If
b1 = Val(Mid(s, i + 2, 1))
b2 = Val(Mid(s, i + 3, 1))
v=  ①  ?
List1.AddItem d + " " + Str(v)
  ②  ?
Loop
End Sub
(3)若文本框 Text1 中输入的内容为“1111”,单击“翻译”按钮,列表框 List1 中显示的内容是    。?
答案 (1)B (2)①b1*2+b2 ②i=i+4 (3)北 3
3.(2016浙江10月学考+选考,14,5分)编写“加法练习题生成器”程序,实现如下功能:在文本框Text1中输入题数n,单击“生成”按钮Command1,在列表框List1中显示n个两数之和小于100的加法练习题。程序运行界面如图a所示。
/
(1)在设计程序界面时,应使用图b所示“控件工具箱”中的   (填写相应编号)添加“生成”按钮。?
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Private Sub Command1_Click()
 Dim n As Integer, i As Integer, a As Integer, b As Integer
 Randomize
 n = Val(Text1.Text)
 i=   ①  ?
 Do While i<= n
  a = Int(Rnd * 100)
  b = Int(Rnd * 100)
  If  ②  Then?
 List1.AddItem "(" + Str(i) + ")" + Str(a) + "+" + Str(b) + "="
 i = i + 1
  End If
 Loop
End Sub
(3)运行该程序,在文本框中输入5,单击“生成”按钮后,对语句a = Int(Rnd * 100)执行次数的描述,最合理的是  (单选,填字母:A.执行次数等于5/B.执行次数大于等于5/C.执行次数小于等于5)。?
答案 (1)3 (2)①1 ②a+b<100 或其他等价表达式
(3)B
考点三 排序算法及程序实现
A组 2014—2018年真题·基础题组
1.(2016浙江4月学考+选考,11,2分)【加试题】有如下程序段:
For i = 1 To 2
 For j = 5 To i + 1 Step -1
   If a(j) > a(i) Then
    t = a(j): a(j) = a(i): a(i) = t
   End If
 Next j
Next i
数组元素a(1)到a(5)的值依次为“33,24,45,16,77”,经过该程序段“加工”后,数组元素a(1)到a(5)的值依次为(  )
A.77,45,33,16,24 B.77,33,45,16,24
C.77,24,45,16,33 D.77,45,33,24,16
答案 A 
2.(2015浙江10月学考+选考,16,4分)【加试题】n个数据的冒泡排序需要经过n-1遍加工,每一遍加工自下而上比较相邻两个数据,把较小者交换到上面。小刘发现:当某一遍加工过程中没有数据交换,说明数据已经有序,无需进一步加工。为此,小刘对算法进行优化,编写了一个VB程序,功能如下:运行程序时,在列表框List1中显示排序前数据,单击“排序”按钮Command1,在列表框List2 中显示这些数据按升序排序后的结果,在标签Label3中显示排序过程的加工遍数。运行效果如图所示。
/
实现上述功能的VB代码如下,但加框处代码有错,请改正。
Dim a(1 To 8) As Integer
Dim n As Integer
Private Sub Form_Load()
’n=8,排序前数据存储在数组a中,并在列表框List1中显示
’代码略
End Sub
Private Sub Command1_Click()
Dim flag As Boolean ’flag值为True表示一遍加工中发生过交换
i = 1
flag = True
Do While i <= n - 1 Or flag = True ’(1)
 flag= False
 For j= n To i + 1 Step -1
   If a(j) < a(j - 1) Then
    k = a(j): a(j) = a(j - 1): a(j - 1) = k
    flag = True
   End If
 Next j
 i = i + 1
Loop
Label3.Caption = "排序过程的加工遍数为" +Str(i) ’(2)
For i = 1 To n
 List2.AddItem Str(a(i))
Next i
End Sub
答案 (1)i <=n - 1 And flag=True (2)Str(i-1)
B组 2014—2018年真题·提升题组
1.(2018浙江4月学考+选考,16,3分)【加试题】有一组正整数,要求仅对其中的素数进行升序排序。排序后素数在前,非素数在后。排序示例如下。
排序前
86
71
5
41
81
79
37
89
排序后
5
37
41
71
79
89
86
81
实现上述功能的VB代码如下,但加框处有错,请改正。
Const n=8
Dim a(1 To n) As Integer
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer, t As Integer
Dim flag As Boolean
’读取一组正整数,存储在数组a中,代码略
For i = 1 To n - 1
k = 1 ’(1)
If IsPrime(a(k)) Then flag = True Else flag = False
For j = i + 1 To n
 If IsPime(a(j)) Then
  If a(j) < a(k) Then ’(2)
   k=j
   flag = True
  End If
 End If
Next j
If k <> i Then
 t=a(k): a(k) = a(i):a(i) = t
End If
If Not flag Then Exit For ’Exit For表示退出循环
Next i
’依次输出排序后的数据。代码略
End Sub
Function IsPrime(m As Integer) As Boolean
’本函数判断m 是不是素数:是素数返回值为True,不是素数返回值为False
’代码略
End Function
答案 (1) k=i (2)a(j)2.(2017浙江11月学考+选考,16,3分)【加试题】小李基于冒泡排序算法编写了一个VB程序,功能如下:在文本框Text1中显示排序前的数据,单击“排序”按钮Command1,在文本框Text2中显示剔除重复数据后的升序排序结果。程序运行界面如图所示。
/
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Const n = 10
Dim a(1 To n) As Integer
Private Sub Command1_Click()
Dim i As Integer, j As Integer, t As Integer
Dim bottom As Integer
’获取排序前数据依次存储在数组a中,并在文本框Text1中显示。代码略
bottom = n
i = 1
Do While i <= bottom - 1
 For j = bottom To i + 1 Step -1
   If a(j) < a(i) Then ’(1)
    t = a(j): a(j) = a(j - 1): a(j - 1) = t
   ElseIf a(j) = a(j - 1) Then  ’相邻两个数据相等,进行剔除处理
    a(bottom)=a(j) ’(2)
    bottom = bottom - 1
   End If
 Next j
 i = i + 1
Loop
Text2.Text = " "
For i = 1 To bottom
 Text2.Text = Text2.Text + Str(a(i))
Next i
End Sub
答案 (1)a(j)a(j))
(2)a(j)= a(bottom)
3.(2016浙江10月学考+选考,16,3分)【加试题】小吴为了研究冒泡排序过程中数据的“移动”情况,编写了一个VB程序,功能如下:在列表框List1中显示排序前数据(存储在数组a中),在文本框Text1中输入初始位置(即下标值),单击“排序”按钮Command1后,在标签Label1中显示指定初始位置的数据在排序过程中的位置变化情况,排序后的数据显示在列表框List2中。程序运行界面如图所示。
/
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Dim a(1 To 8) As Integer
Dim n As Integer
Private Sub Form_Load()
a(1) = 30: a(2) = 47: a(3) = 30: a(4) = 72
a(5) = 70: a(6) = 23: a(7) = 99: a(8) = 24
n = 8
For i = 1 To 8
 List1.AddItem a(i)
Next i
End Sub
Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer
Dim pos As Integer
Dim s As String
s = Text1.Text
pos = Val(Text1.Text)
For i = 1 To n - 1
 For j = n To i + 1 Step -1
  If a(j) < a(j - 1) Then
   k=a(j)   ’(1)
   a(j - 1) = a(j)
   a(j) = k
   ’如果pos位置的数据参与交换,则更新pos值,记录pos变化位置
   If pos = j Then
    pos = j - 1
    s = s + "→" + Str(pos)
   Else ’(2)
    pos = j
    s = s + "→" + Str(pos)
   End If
  End If
 Next j
Next i
  Label1.Caption = "位置变化情况:" + s
  For i = 1 To n
 List2.AddItem Str(a(i))
Next i
End Sub
答案 (1) k=a(j-1) (2)ElseIf pos=j-1 Then
考点四 查找算法及程序实现
A组 2014—2018年真题·基础题组
1.(2017浙江4月学考+选考,11,2分)【加试题】某对分查找算法的VB程序段如下:
key = Val(Text1.Text)
i = 1: j = 10
Text2.Text = ""
Do While i <= j
 m = Int((i + j) / 2 + 0.5)
 If key = a(m) Then Exit Do  ’Exit Do表示退出循环
 If key < a(m) Then j = m - 1 Else i = m + 1
 Text2.Text = Text2.Text + Str(a(m))
Loop
数组元素a(1)到a(10)的值依次为“8,17,24,30,36,40,55,58,61,66”,文本框Text1中输入的值是30,执行该程序段,文本框Text2中显示的是(  )
A.40 24 B.40 24 36 C.36 24 D.36 17 24
答案 B 
2.(2016浙江10月学考+选考,12,2分)【加试题】某对分査找算法的VB程序段如下:
i= 1 : j =9 : n =0
key=Val(Text1.Text)
Do While i<= j
n=n+1
m=Fix((i + j) / 2)
If key = d(m) Then Exit Do
 If keyLoop
数组元素d(1)到d(9)的值依次为“7,12,18,25,39,58,61,72,86”。若该程序段运行结束后,n的值为2,则key的值是(  )
A.39 B.18或61
C.18或72 D.12或61
答案 D 
B组 2014—2018年真题·提升题组
1.(2018浙江4月学考+选考,12,2分)【加试题】数组a 为一组正整数,奇数在前,偶数在后。奇数与偶数已分别按升序排序。依据对分查找思想:设计一个在数组a 中查找数据Key 的程序。实现该功能的VB 程序段如下:
i = 1: j = 10
Key = Val(Text1.Text)
Do While i <= j
 m = (i + j) 2
 If a(m) = Key Then Exit Do ’Exit Do表示退出循环
 If Key Mod 2 = 1 And a(m) Mod 2 = 0 Then
   (1) 
 ElseIf Key Mod 2 = 0 And a(m) Mod 2 = 1 Then
   (2) 
 Else
   (3)  
 End If
Loop
If i > j Then s = "没有找到!" Else s = "位置:" + Str(m)
Text2.Text = s
上述程序中方框处可选语句为:
①i = m + 1
②j = m - 1
③If Key < a(m) Then j = m - 1 Else i = m + 1
则(1)、(2)、(3)处语句依次是(  )
A.①、②、③ B.①、③、②
C.②、①、③ D.③、②、①
答案 C 
2.(2017浙江11月学考+选考,12,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表示退出循环
 ElseIf key < a(m) Then
   j = m - 1: s = s + "L"
 Else
   i = m + 1: s = s + "R"
 End If
Loop
Text1.Text = s
数组元素a(1)到a(7)的值依次为“24,35,38,41,45,69,78”。若该程序段执行后,文本框Text1中显示的内容可能是(  )
A.RL B.LMR C.RLR D.LRLM
答案 C 
3.(2016浙江4月学考+选考,12,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))
答案 B 
4.(2018浙江11月学考+选考,16,3分)【加试题】数组a中存储的是左右交替上升的n个正整数,如下表所示:
a(1)
a(2)
a(3)
……
a(n-2)
a(n-1)
a(n)
3
25
38
……
55
31
12
依据对分查找思想,设计一个在数组a中查找数据key的程序,实现该功能的VB程序如下,但加框处代码有错,请改正。
Private Sub Command1_Click()
Const n = 6
Dim a(1 To n) As Integer, flag As Boolean
Dim i As Integer, j As Integer, m As Integer, key As Integer
’读取一组正整数,按上述规则存入数组a中,代码略
key = Val(Text1.Text)
i = 1
j = (n + 1) 2
flag = False
Do While  i < j  And Not flag ’(1)
 m = (i + j) 2
 If key = a(m) Then
   flag = True
 ElseIf key < a(m) Then
   j = m - 1
 Else
   i = m + 1
 End If
Loop
If Not flag And j > 0 Then
 m = n-i ’(2)
 If key = a(m) Then flag = True
End If
If flag Then
 Text2.Text = Str(m)
Else
 Text2.Text = "找不到"
End If
End Sub
答案 (1)i<=j (2)n-i+2 或 n-j+1
考点五 递归算法及程序实现
考点六 算法在数据管理中的应用
2014—2018年真题·提升题组
 (2016浙江10月选考,17,6分)【加试题】小王与小李合作编写一个成绩统计的VB程序:小王编写一个过程,该过程从数据库读取某一指定科目的相关数据,存储在数组a中;小李编写一个过程,该过程依据数组a中的相关数据统计各班级平均分,小王与小李约定的数组a各元素含义如下表所示。
数组元素
数组元素的含义
a(1)
存储班级数n
a(2)
从a(2)到a(n+1)依次存储第1、第2、……、第n个班级的人数

a(n+1)
a(n+2)
从a(n+2)开始依次存储第1个班级每个学生的单科成绩、第2个班级每个学生的单科成绩、……、第n个班级每个学生的单科成绩


程序功能如下:在文本框Text1中输入科目名称,单击“读数据库”按钮Command1,程序从数据库读取数据;单击“开始统计”按钮Command2,程序进行统计处理,结果输出在列表框List1中。程序运行界面如图所示。
/
实现上述功能的VB程序如下,请回答下列问题:
(1)根据程序运行界面中的数据及数组a各元素的含义进行分析,数组元素a(5)的值为    (填写数值)。?
(2)分析程序,可知数据库的文件名为    。?
(3)请在划线处填入合适的代码。
Dim a(1 To 600)As Integer  ’数组大小满足处理要求
Private Sub Command1_Click()
 ’本过程由小王完成,从数据库读取指定科目的各相关数据,存储在数组a中
 Dim conn As New ADODB.Connection
 Dim rs As New ADODB.Recordset
 conn.ConnectionString=“provider = Microsoft.ACE.OLEDB.12.0;datasource=”+“Score.accdb”
 conn.Open
 Set rs.ActiveConnection=conn
 ’本过程的其他语句略
End Sub
Private Sub Command2_Click()
 ’本过程由小李完成,依据数组a中的相关数据统计各班级平均分
 Dim i As Integer,j As Integer,n As Integer
 Dim p As Integer,sum As Integer,aver As Single
    ①   ?
 p=n+2
 For i=1 To n
  sum=0
  For j=1 To a(i+1)
      ②   ?
   p=p+1
  Next j
  aver=sum/a(i+1)
  List1.AddItem Str(i)+“ ”+Str(a(i+1))+“ ”+Str(aver)
 Next i
End Sub
答案 (1)33 (2)Score.accdb
(3)①n=a(1) ②sum=sum+a(p)
解析 本题属于难题,要求学生有较好的分析问题和处理问题的能力。主要考查利用VB对数据库中数据进行简单的统计。
(1)本小题考查对数组元素和数组下标的认识。数组元素a(n+1)存储的是第n个班级的人数。a(5)存储的是第4个班级的人数,其值为33。
(2)本小题考查通过ADO对象中的conn对象连接数据库。根据ConnectionString连接字符串,可知连接的数据库文件是Score.accdb。
(3)本小题考查对数组中的数据进行统计的能力。①确定需要统计的班级数,n的值从a(1)中读入,即n=a(1)。②统计出每一个班级全体同学指定科目的成绩总分sum。这里是一个累加运算。当前数组下标的位置是p,a(p)是指当前位置读入的成绩,因此累加运算为sum=sum+a(p)。
 教师专用题组
1.(2015浙江10月学考+选考,11,2分)【加试题】已知单调函数f(x)在[0,1]区间存在一个x0,使f(x0)=0。现用对分查找法搜索x0的值,开始搜索区间为[0,1],若经过10次对分查找后还需继续搜索,则第11次搜索区间的长度为(  )
A.1/2 B.1/10 C.1/102 D.1/210
答案 D 
2.(2017浙江4月选考,16,3分)【加试题】小王编写了一个实现文字查找替换功能的VB程序,运行界面如图所示。文本框Text1显示原文内容,Text2中输入查找内容,Text3中输入替换内容,单击“全部替换”按钮Command1后,Text4显示查找替换的结果,Text5显示替换的次数,Text6显示“查找内容”在原文中的起始位置。
/
实现上述功能的VB程序如下,但加框处代码有错,请改正。
Private Sub Command1_Click()
Dim s As String, resule As String, pos As String
Dim count As Integer, i As Integer
i = 1: count = 0
result = "": pos = ""
Do While i <= Len(Text1.Text)
 s = Mid(Text1.Text, i, Len(Text2.Text))
 If s = Text2.Text Then
  result = result + Text3.Text
  count = count + 1
  pos = pos + Str(count)  ’(1)
  i = i + Len(Text2.Text)
 Else
  result = result + Text2.Text  ’(2)
  i = i + 1
 End If
Loop
Text4.Text = result
Text5.Text = Str(count)
Text6.Text = pos
End Sub
答案 (1)pos+Str(i)
(2)result=result+Mid(Text1.Text,i,1)
3.(2015浙江10月选考,14,5分)编写VB程序,实现如下功能:在文本框Text1和Text2中分别输入一个整数,单击命令按钮Command1,在列表框List1中显示结果,运行效果如图a所示。结果包含两列数据,第1列为相邻两数之间的摄氏温度值(间隔1摄氏度、升序),第2列为对应的华氏温度值。
/
图a
/
图b
(1)要使命令按钮Command1上显示的文本改为“转换”,可在其属性窗口(图b)中将    属性的属性值修改为“转换”。?
(2)为实现上述功能,请在划线处填入合适代码或选项。
Private Sub Command1_Click( )
Dim t1 As Integer,t2 As Integer
Dim i As Integer,t As Integer
Dim f As Single    ’f存储华氏温度值
List1.Clear
t1=Val(Text1.Text)
t2=Val(Text2.Text)
If   ①  Then ’(选填字母,从下面A、B、C、D四个选项中选取一项)?
  t=t1:t1=t2:t2=t
End If
i=t1
Do While   ② ? ’(选填字母,从下面A、B、C、D四个选项中选取一项)?
  f=i*9/5+32 ’摄氏温度转换为华氏温度
  List1.AddItem Str(i)+“ ”+Str(f)
  i=  ③ ? ’(填程序代码)?
Loop
End Sub
划线①、②处的选项:
                    
A.i<=t2 B.f<=t2
C.t1>t2 D.i答案 (1)Caption (2)①C ②A ③i+1
【三年模拟】
A组 2017—2019年模拟·考点题组
考点一 解析算法及程序实现
1.基姆拉尔森公式可根据日期判断是星期几。基姆拉尔森公式在VB中的计算式如下:week= (d + 2 * m + 3 * (m + 1) 5 + y + y 4 - y 100 + y 400 + 1) Mod 7。在公式中d表示日期中的日数,m表示月份数,y表示年数。余数为0表示星期日,余数为1表示星期一,以此类推。在公式中有个特殊的地方:把一月和二月看成上一年的十三月和十四月,例:如果是2004-1-10,则换算成2003-13-10代入公式计算。小明编写了VB程序,运行界面如图所示,程序代码如下。
/
Private Sub Command1_Click()
 Dim y As Integer,m As Integer,d As Integer,week As Integer
 Dim ss As String,weekday As String
 ss = “日一二三四五六”
 y = Val(Text1.Text)
 m = Val(Text2.Text)
 d = Val(Text3.Text)
 If  ①  Then?
  m = m + 12
  y = y - 1
 End If
 week = (d + 2 * m + 3 * (m + 1) 5 + y + y 4 - y 100 + y 400 + 1) Mod 7
 weekday =  ②  ?
 Label1.Caption = “星期” & weekday
End Sub
(1)代码“Private Sub Command1_Click()”中的Command1_Click()是    (单选,填字母:A.对象名/B.事件/C.事件处理过程)。?
(2)为实现上述功能,请在划线处填入合适的代码。
(3)由上述算法可知,2010年2月5日应为星期    。?
答案 (1)C (2)①m=1 Or m=2或m<3或m<=2
②Mid(ss,week+1,1) (3)五
2.(2019届金华十校第一学期调研考试,14,5分)趣味数学题:n的阶乘n!=1×2×3×4×5×…×n,当n≥5时,其结果末尾必然包含1或多个0,求n!(5≤n≤32726)末尾包含0的个数。
算法思路:n较大时,n!的值将超出long类型范围,求出n!的结果再数0的个数不现实。那么末尾的0到底是从哪里来的?每一个因子5与任一偶数相乘就会产生一个0。所以末尾有多少0是由因子5的个数决定的,求出因子5的个数即是末尾0的个数。程序运行界面和代码如下所示。
/
(1)为使窗体加载时,窗体标题栏自动显示为“第14题程序”,则可以在        过程(填写过程名)中添加代码:Form1.Caption=“第14题程序”。?
(2)实现上述算法的VB程序如下,请补充程序中划线处的代码。
Private Sub Command1_Click()
Dim n As Integer
n = Val(Text1.Text)
i = 1
Do While  ①  ?
 s = s + n 5 ^ i
 i = i + 1
Loop
List1.AddItem Str(n) + "!末尾包含 0 的个数:" +  ② ?
End Sub
(3)根据上述算法,2018!末尾包含 0 的个数是    。?
答案 (1)Form_load (2)①5 ^ i <= n 或其他等价表达式
② Str(s) (3) 502
考点二 枚举算法及程序实现
 一个十进制整数的二进制表示中,如果数字“1”的个数多于数字“0”的个数,则称该整数为A 类数。如十进制整数26 的二进制表示为11010,26 是一个A 类数。下列VB程序的功能是:寻找前1000 个自然数中所有A 类数,在List1中输出,并统计个数,在Text1中输出。
请在下面划线处填入合适的代码。
Private Sub Command1_Click()
 Dim i, n ,s ,t, k As Integer ’s 为A 类数的个数,t 为二进制数中“1”的个数,k 为“0”的个数
 s = 0
 For i = 1 To 1000
  n = i: t = 0: k = 0
  Do While n > 0
    If  ①   Then t=t+1 Else k=k+1?
      ②  ?
  Loop
  If t>k Then
   List1.AddItem Str(i)
   s = s + 1
  End If
 Next i
 Text1.text = Str(s)
End Sub
答案 ①n Mod 2 <>0 或n Mod 2=1 ②n=n2
考点三 排序算法及程序实现
1.【加试题】有以下VB 程序段:
For i = 1 To 2
 For j = 1 To 5-i
  If d(j) > d(j +1)Then
   t = d(j):d(j) = d(j +1):d(j +1) = t
  End If
 Next j
Next i
数组元素a(1)到a(5)的值依次为“48,36,78,18,15”,经过该程序段“加工”后,数组元素a(1)到a(5)的值依次为(  )
                    
A.36,15,18,48,78 B.36,18,15,48,78
C.15,18,36,48,78 D.15,18,48,36,78
答案 B 
2.(2018浙江“五校联考”第一次考试,11,2分)【加试题】有如下VB程序段:
Dim a(1 To 6) As String
Text1.Text = ""
For i = 1 To 3
For j = 1 To 6 - i
 If a(j) < a(j + 1) Then t = a(j): a(j) = a(j + 1): a(j + 1) = t
  Next j
  Text1.Text = Text1.Text + a(j)
Next i
数组元素a(1)到a(6)的值依次是“231”“123”“12”“59”“41”“33”。该程序段执行后,文本框Text1中显示的内容是(  )
A.123341 B.23112359
C.12123231 D.594133
答案 C 
3.有如下程序段:
bottom = 6: i = 1: r = Val(Text1.Text)
Do While i < r
For j = bottom To i + 1 Step -1
 If a(j) > a(j -1) Then
  t = a(j): a(j) = a(j -1): a(j -1) = t
 End If
Next j
i = i + 1
For j = i To bottom -1
 If a(j) < a(j + 1) Then
  t = a(j): a(j) = a(j + 1): a(j + 1) = t
 End If
Next j
bottom = bottom -1
Loop
数组元素a(1)到a(6)的值依次为“73、56、28、61、44、92”,若在文本框Text1中输入“2”,则经过该程序段“加工”后,数组元素a(1)到a(6)的值依次为(  )
A.73,61,56,92,44,28 B.92,73,56,61,44,28
C.92,73,61,56,28,44 D.92,73,61,56,44,28
答案 B 
4.(2018浙江“七彩阳光 ”联盟期初联考,16,3分)【加试题】有一组正整数,要求对其中的数据进行排列,排列后奇数在前,偶数在后。自前到后的第一个偶数排到最后一个位置,空出的位置排列自后向前的第一个奇数,依此类推。其中最后一个数据排到奇数与偶数交接处。排序示例如下。
排序前
71
85
64
55
42
62
33
17
34
30
排序后
71
85
17
55
33
30
62
42
34
64
实现上述功能的 VB 程序如下,但加框处代码有错,请改正。
Const n = 10
Dim a(1 To n) As Integer
Private Sub Command1_Click()
Dim i As Integer, j As Integer
Dim temp As Integer, flag As Boolean
’读取一组正整数,存储在数组 a 中,代码略
i = 1: j = n
temp = a(j): flag = True
Do While i < j
 If flag Then
  If a(i) Mod 2 = 0 Then
   a(j) = a(i)
   j = j - 1
   flag = Not flag
  Else
   j = j-1 ’(1)
  End If
 Else
  If a(j) Mod 2 = 1 Then
   a(i) = a(j)
   flag = Not flag
  Else
   j = j - 1
  End If
 End If
Loop
a(i+j) = temp ’(2)
’依次输出排序后的数据,代码略。
End Sub
答案 (1)i = i + 1 (2)a(i) = temp或a(j) = temp
5.【加试题】合唱队列是按队员的身高进行排列,形成中间高两边有序降低的队形。例如有六个队员“己、戊、丁、丙、乙、甲”身高依次由低到高,则排列后的顺序为“戊、丙、甲、乙、丁、己”。小李用VB编写模拟“合唱队列”程序,功能如下:在文本框Text1中输入各队员身高,输入结束后回车,则输入的各队员身高分别存入数组a中;单击“合唱队列”按钮Command1,对数组a的元素进行有序排列后,将各元素存入数组c中形成合唱队列,并将结果显示在文本框Text2中。程序运行界面如图所示。
/
(1)如果输入各队员身高为“190,191,194,179,166”,则合唱队列的结果为            。?
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Dim a(1 To 20) As Integer
Dim n As Integer
Private Sub Text1_KeyPress(KeyAscii As Integer)
’输入各队员身高分别存入数组a中,队员个数为n,代码略
End Sub
Private Sub Command1_Click()
Dim c(1 To 20) As Integer
Dim right As Integer,left As Integer,i As Integer
For i = 1 To n-1
 For j = 1 To n-i
  If   ①   Then?
   t = a(j):a(j)= a(j + 1) :a(j + 1)= t
  End If
 Next j
Next i
’下列程序段实现数组c的合唱队列
m=(1+n) 2
left=m:right = m
c(m)=a(n)
i = 2
Do While i< = n
 If i Mod 2 = 0 Then
  right = right +1
  c(right) = a(n-i+l)
 Else
     ②   ?
  c(left)= a(n-i+l)
 End If
 i = i+l
Loop
s=   ③   ?
For i = 2 To n
 s = s+","+Str(c(i))
Next i
Text2.Text = s
End Sub
答案 (1)166,190,194,191,179
(2)①a(j)>a(j+1) ②left=left-1 ③Str(c(1))
考点四 查找算法及程序实现
1.【加试题】某对分查找算法的VB程序段如下:
i = 1: j = 8: c = 0
Do While i <= j
 c = c + 1
 m = Fix((i + j) / 2)
 If key = b(m) Then Exit Do
 If key < b(m) Then j=m-1 Else i=m+1
Loop
数组元素b(1)到b(8)的值依次为“22,32,39,48,71,82,96,106”。若该程序段运行结束后,c的值为2,则key的值是(  )
                    
A.48或32 B.48或96
C.32或82 D.82或96
答案 C 
2.【加试题】某对分查找算法的VB程序段如下:
1 = 1 : j = 7 : s =""
Do While i <= j
 m = (i + j) 2
 If a(m) = Key Then
  s = "E":Exit Do
 Elself a(m) > Key Then
  j=m-1
  s = "L"
 Else
  i=m+1
  s = "R"
 End If
Loop
数组元素a(1)到a(7)的值依次为“25,42,53,66,77,83,98”,若key=60,运行上述程序段后,下列条件表达式成立的是(  )
A.s = "E" B.s = "L"
C.s = "R" D.s = "LRR"
答案 C 3.有以下VB程序段:
i = 1:j=10 : flag=True : cs=0
Key = Int(Rnd()*10) + 28
Do While i<=j And flag = True
 m =(i+ j)2:cs=cs+1
 If a(m)=Key Then
  flag=False
 ElseIf a(m)< Key Then
  i= m+1
 Else
  j=m-1
 End If
Loop
数组元素a(1)到a(10)的值依次是3,10,17,23,27,30,35,40,45,50,变量cs的值可能是(  )
A.1或2 B.2或3
C.3或4 D.4或5
答案 C 
4.(2018宁波“十校联考”,12,2分)【加试题】数组a中依次存放6个有序数据“23,33,44,55,66,77”。
Dim a(1 To 6) As Integer
Dim s As String, n, key As Integer
a(1) = 23: a(2) = 33: a(3) =44
a(4) = 55: a(5) = 66: a(6) = 77
i = 1: j = 6: c = 0: key = 35
Do While i <= j
 c = c + 1
 m = (i + j) 2
 If (j - i + 1) 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=3 B.j=2
C.c=3 D.m=2
答案 D 
5.(2018稽阳联谊学校联考,12,2分)【加试题】有如下程序段:
Dim a(1 To 10) As Integer
Dim i As Integer, j As Integer, m As Integer
Dim key As Integer
i = 1: j = 10: key = Val(Text1.Text)
Do While i <= j
m = (i + j) 2
If key < a(m) Then
 j = m - 1
ElseIf key > a(m) Then
 i = m + 1
Else
 Do While m > 1
  If a(m - 1) = key Then
   m = m - 1
  Else
   Exit Do
  End If
 Loop
 Exit Do
End If
Loop
数组中a(1)到a(10)依次为“1,1,2,3,3,3,3,4,4,4”,若在文本框Text1中输入3,经上述程序段执行后,变量m的值为(  )
A.7 B.6 C.5 D.4
答案 D 
6.(2018浙江名校协作体试题,12,2分)【加试题】已知一无序数组a中的元素为“90,15,40,72,65,32,81,6”,通过引入数组b存储数组a中的元素按升序排列时的下标,数组b元素为“8,2,6,3,5,4,7,1”,使得a(b(1))≤a(b(2))≤a(b(3))≤……≤a(b(n)),从而对数组a中的数据进行对分查找。部分程序如下:
i = 1: j = 8: c=0
key = Val(Text1.Text)
Do While i <= j
  m = Int((i + j) / 2)
  t = b(m)
  c = c + 1
  If a(t) = key Then p = t: Exit Do
  If a(t) < key Then
    i = m + 1
  Else
    j = m - 1
  End If
Loop
当文本框Text1中输入的值为32时,程序运行结束后变量c的值为(  )
A.1 B.2 C.3 D.4
答案 C 
7.(2018浙江“五校联考”,12,2分)【加试题】有如下VB程序段:
i = 1: j = 10:n = 0: Key = Val(Text1.Text)
Do While i <= j
 m = (i + j) 2
 If a(m) < Key Then
  i = m + 1: n = n + 1
 Else
  j = m - 1: n = n - 1
 End If
Loop
数组元素a(1)到a(10)依次是33,42,48,57,69,71,75,89,91,96,在文本框Text1中输入89,则变量n的最终值为(  )
A.2 B.1 C.0 D.-2
答案 A 
8.“轮转后有序数组(Rotated Sorted Array) ”是将有序数组取其中某一个数为分割点,将其之前的所有数都轮转到数组的末尾所得。比如{7,11,13,17,2,3,5}就是一个轮转后的有序数组,原有序数组中的子串{2,3,5}被轮转到了数组的末尾处。对于一个轮转后有序数组a也可以进行对分查找,算法思路如下(以升序为例):每次根据查找的左侧位置L和右侧位置R求出中间位置M后,M左边[L, M]和右边[M+1, R]这两部分中至少一个是有序的(可根据中间位置数据和边界数据的大小关系判断)。
a[M]和待查找数据key的比较方法:
(1)a(M)=key,返回M的值。
(2)若M位置的右侧有序,当待查找数据在右侧时,则下次在右侧查找,否则在M左侧查找。
(3)若M位置的左侧有序,当待查找数据在左侧时,则下次在左侧査找,否则在M右侧查找。
程序功能如下:运行时给数组a赋值,并在列表框List1中显示。在文本框Text1中输入查找的数,单击按钮 Command1后在标签Label2上显示查找结果。
/
(1)对于轮转后有序数组{7,11,13,17,2,3,5}使用函数Search查找key值3,所需要的查找次数为    。?
(2)请补充程序划线处的代码。
Const n = 7
Dim a(1 To n) As Integer
Private Sub Form Load()
’给数组a赋值,并在列表框显示,代码略
End Sub
Private Sub Command1_Click()
Dim x As Integer, pos As Integer
x = Val(Text1.Text)
   ①   ?
If pos = -1 Then
 Label2.Caption ="未找到"
Else
 Label2.Caption ="该数的下标位置为"+Str(pos)
End If
End Sub
Function Search(key As Integer, L As Integer, R As Integer) As Integer
Search = -1
Do While L <= R And Search = -1
 M = (L + R) 2
 If a(M)=key Then
  Search = M
 Else
  If  ②    Then?
   If a(L)<= key And key < a(M) Then
    R = M - 1
   Else
    L = M+1
   End If
  Else
   If   ③  Then L = M + 1 Else R = M - 1?
  End If
 End If
Loop
End Function
答案 (1) 2 (2)①pos=Search(x, 1, n)
② a(M)>a(R) ③ a(M)9.【加试题】为了方便输入,手机输入法一般都需要有联想功能,当用户按键时,会给出相对应的单词。目前智能手机上还保留着的“T9 输入法”也是如此。“T9 输入法”将26 个字母映射到了数字键2~ 9 上,如图a 所示。这里,我们将实现一个“T9 输入法”联想功能的简化版:给出一个按键序列,在已有的单词库中查找会有几个单词对应这个按键序列。程序运行界面如图b 所示,程序从数据库中读取了所有单词,显示在左侧列表框中。文本框Text1 中输入用户的按键序列“569”,单击“查找”按钮Command1后,可以在该单词库中找到4 个可能的单词:low、kmw、loy、joy,它们的按键序列都是“569”,因此在文本框Text2 中输出“4 个”。已知单词都是小写字母且长度不会超过9 个字符,用户输入的按键序列中不会包含数字键1。
1
2
abc
3
def
4
ghi
5
jkl
6
mno
7
pqrs
8
tuv
9
wxyz
 /
     图a          图b
实现上述功能的VB程序如下,请回答下列问题:
(1)若数据库中的单词如图b 所示,那么按键号码为“369”时,对应的单词是      。?
(2)请在划线处填入合适的代码。
Private Sub Command1_Click()
Const map As String=“22233344455566677778889999”
Dim a(1 To 100) As String
Dim b(1 To 100) As Long
Dim key As Long, sn As Long
Dim i As Integer, j As Integer
Dim cnt As Integer, n As Integer
Dim tmps As String, c As String
’从数据库中读出所有单词,存放在数组a 中
’数据库中单词总个数为n,代码略
’以下代码将单词a(i) 根据T9 输入法按键分布变成一个整数,存放在b(i)中
For i = 1 To n
 sn = Len(a(i))
 tmps =“”
 For j = 1 To   ①   ?
  c = Mid(a(i), j, 1)
  c_index = Asc(c) - Asc(“a”) + 1
  tmps = tmps &   ②  ?
 Next j
 b(i) = Val(tmps)
Next i
’查找并统计个数
key = Val(Text1.Text)
cnt = 0
For i = 1 To n
 If   ③   Then?
  cnt = cnt + 1
 End If
Next i
Text2.Text = cnt &“个”
End Sub
答案 (1)fox (2)①sn 或Len(a(i))
②Mid(map,c_index,1) ③b(i) = key
考点五 递归算法及程序实现
1.【加试题】某VB程序使用了递归函数,代码如下:
Private Sub Command1_Click()
  Text1.Text = f(3)
End Sub
Function f(x As Integer) As String
  If x = 1 Then f = 1 Else f = f(x-1) + 2
End Function
运行程序并点击按钮Command1后,文本框Text1中显示的内容是(  )
                     
A.1 B.3 C.5 D.7
答案 C 
2.【加试题】有如下VB程序。
Function f(i As Integer)
  If i = 1 Then
   f = 2
  Else
   f = 2 * 10 ^ (i - 1) + f(i - 1)
  End If
End Function
Private Sub Command1_Click()
  Dim n As Integer, s As Integer, i As Integer
  n = Val(Text1.Text)
  s = 0
  For i = 1 To n
   s = s + f(i)
  Next i
  Label1.Caption = Str(s)
End Sub
若在Text1中输入5,则Label1上显示的内容为(  )
A.22222 B.24690 C.20000 D.2468
答案 B 
考点六 算法在数据管理中的应用
 【加试题】课堂随机提问产生器。小叶同学发现老师在上课提问时经常叫座位靠前的同学回答问题,有时一节课会重复叫到某一位同学多次,为了实现每个同学被叫到回答问题的概率均等,且在一节课老师提问次数少于班级总人数时,被叫到过回答问题的同学本节课不再被叫到,小叶同学用VB设计了一个课堂随机提问产生器,功能如下:运行程序时,在列表框List1中显示班级学生数据,单击“随机叫号”按钮Command1,在文本框Text1、Text2中分别显示学生的学号和姓名,其应用程序界面如图所示。
/
班级学生的具体数据信息存放在数据库文件“student.accdb”的“stu”表中,班级学生数不超过60。实现上述功能的VB程序代码如下,请在划线处填上合适的代码。
Dim xh(1 To 60) As Integer ??定义存储学生学号的数组xh
Dim xm(1 To 60) As String ??定义存储学生姓名的数组xm
Dim flag(1 To 60) As Boolean ??定义存储学生是否被提问过的数组flag
Dim n As Integer ??定义存储班级学生总数的变量n
Dim num As Integer ??定义存储产生的随机序号num
Dim total As Integer ??定义存储产生的人数总数total
Private Sub Command1_Click()
  Randomize
  num = Int(Rnd * n) + 1
  Do While   ①  ?
   num = Int(Rnd * n) + 1
  Loop
  flag(num) = True
  total = total + 1
  Text1.Text = xh(num)
  Text2.Text = xm(num)
  If   ②   Then?
   For i = 1 To n
    flag(i) = False
   Next i
  End If
End Sub
Private Sub Form_Load()
  Dim conn As New ADODB.Connection ??定义Connection对象实例conn
  Dim rs As New ADODB.Recordset ??定义Recordset对象实例rs
  conn.ConnectionString ="provider=Microsoft.ACE.OLEDB.12.0;data source="& App.Path &"student.accdb"??设置conn的数据库连接字符串
  conn.Open ??打开数据库连接
  rs.ActiveConnection = conn ??设置rs的ActiveConnection属性,关联conn
  rs.Open "SELECT * FROM stu" ??打开记录集,获取数据
  n = 0
  Do While Not rs.EOF
   n = n + 1
   xh(n) = rs.Fields(0) ??学生学号字段的序号为0
   xm(n) = rs.Fields(1) ??学生姓名字段的序号为1
   List1.AddItem xh(n) & "-----" & xm(n)
   rs.MoveNext
  Loop
  rs.Close
    ③  ?
  For i = 1 To n ??初始化flag数组的值
   flag(i) = False
  Next i
  total = 1
End Sub
(1)如将产生随机数的程序代码“Int(Rnd * n) + 1”的变量n直接用xh数组下标60来替换,会出现没有学生回答问题的现象,请简要说明原因:                                  。?
(2)程序中①划线处应填入        ;?
程序中②划线处应填入        ;?
程序中③划线处应填入        。?
答案 (1)当班级人数少于60时,如果用60来产生随机数,会出现随机号大于班级人数的现象,从而导致没有学生与之对应 (2)①flag(num)或flag(num)=True ②total>=n
③conn.Close
B组 2017年—2019年模拟·综合题组
1.【加试题】某高校学籍管理系统软件有2 万个学生的电子档案(已按学籍号排序),假设从中取出一条记录并与待查项进行比较所花时间为8毫秒,则用对分法在该系统中查找任意一位学生档案最多花费的时间为(  )
                    
A.120毫秒 B.10 毫秒
C.8万毫秒 D.16 万毫秒
答案 A 
2.有以下VB 程序段:
For i=1 To 3
 For j=i + 1 To 8
  If a(i) > a(j) Then t = a(i):a(i) = a(j):a(j) = t
 Next j
Next i
假设a(1)~ a(8)原先的值分别是23、12、47、10、39、18、10、12,那么经过这段程序“加工”后,数组元素a(1)~ a(8)分别是(  )
A.10、10、12、47、39、23、18、12
B.10、10、12、12、18、23、39、47
C.10、10、12、23、39、18、47、12
D.10、10、12、12、39、18、47、23
答案 A 
3.【加试题】有如下VB 程序段:
Dim s(1 To 6) As String
Text1.Text = “”
For i = 1 To 5
 For j = i + 1 To 6
  If s(i) + s(j) < s(j) + s(i) Then
   t = s(j): s(j) = s(i): s(i) = t
  End If
 Next j
Next i
For i = 1 To 6
 Text1.Text = Text1.Text + s(i)
Next i
若数组元素s(1)到s(6)的值依次为“4,343,312,12,246,121”,运行该段代码后,文本框Text1 中显示的内容为(  )
A.434331224612121 B.434331224612112
C.343312246121124 D.121122463123434
答案 A 
4.【加试题】有以下对分查找算法:在一个包含有重复元素且从小到大排序(相等元素排在一起)的整数数组a中,查找某个重复出现的整数key,其中数组元素的总个数是n。
i = 1: j = n
Do While i <= j
  m = (i + j) 2
  If a(m) < key Then
  i = m + 1
 Else
  j = m - 1
 End If
Loop
执行该程序后,下列说法正确的是(  )
A.程序可以找到重复元素key最开始出现的位置,该位置信息由变量i指示
B.程序可以找到重复元素key最后出现的位置,该位置信息由变量i指示
C.程序可以找到重复元素key最开始出现的位置,该位置信息由变量j指示
D.程序可以找到重复元素key最后出现的位置,该位置信息由变量j指示
答案 A 
5.某学校举行校园歌手比赛,数组a存放歌手的得分,数组mc存放名次。名次计算规则为:先对数组a中的元素按由高到低排序,分值最高为第1名,分值相同则名次相同。VB程序段的部分代码如下:
For i = 1 To 19
 For j = 20 To i + 1 Step -1
  If  ①  Then t =a(j) : a(j)=a(i) : a(i)=t?
 Next j
Next i
mc(1)=  ②  ?
For i = 2 To 20
  If a(i) <> a(i - 1) Then  ③  Else   ④  ?
Next i
下列①②③④代码中正确的是(  )
A.①处代码为a(j)B.②处代码为i
C.③处代码为mc(i) = mc(i + 1)
D.④处代码为mc(i) = mc(i - 1)
答案 D 
6.某查找算法的VB程序段如下:
Key = Val(Text1.Text)
i = 1
j = 10
Do While i <= j
 mid1 = i + (j - i) 3
 mid2 = j - (j - i) 3
 If a(mid1) = Key Or a(mid2) = Key Then
  Exit Do
 ElseIf Key < a(mid1) Then
  j = mid1 - 1
 ElseIf Key > a(mid1) And Key < a(mid2) Then
  i = mid1 + 1
  j = mid2 - 1
 Else
  i = mid2 + 1
 End If
 Text2.Text = Text2.Text + Str(a(mid1)) + Str(a(mid2))
Loop
数组元素a(1)到a(10)的值依次为“15,19,23,25,27,32,33,38,43,48”,若在文本框Text1中输入38,执行该程序段,文本框Text2中显示的是(  )
A.25 33 B.23 32 C.38 48 D.25 32
答案 A 
7.(2018温州选考适应性测试,12,2分)【加试题】有如下VB程序段:
i = 1 : j = 10 : flag = True : n = 0
Key =Val(Text1.Text)
Do While i <= j And flag = True
m = (i + j) 2
If a(m) = Key Then
 flag = False
ElseIf a(m)> Key Then
 i = m + 1 : n = n - 1
Else
 j = m - 1 : n = n + 1
End If
Loop
数组元素a(1)到a(10)依次是99,94,90,87,70,69,60,56,45,36,变量n的值最终是0,则文本框Text1输入的数字可能是(  )
A.100 B.87 C.69 D.41
答案 C 
8.【加试题】某对分查找算法的VB 程序段如下:
i = 1:j = 4:s = 40
Key = Int(Rnd*6 + 65)
Do While i <= j
 m = Fix((i + j) / 2)
 If Chr(Key) = a(m) Then
  s = s:Exit Do ’Exit Do 表示退出循环
 ElseIf Chr(Key) < a(m) Then
  j = m - 1
  s = s + j
 Else
  i = m + 1
  s = s - i
 End If
Loop
Text1.Text = Str(s)
数组元素a(1)到a(4)的值依次为“A”“C”“D”“F”,该程序段执行后,文本框Text1 中显示的内容不可能是(提示:“A”的ASCII 码是65)(  )
A.37 B.38 C.39 D.40
答案 B 
9.【加试题】现有n根棍子,第i根棍子的长度为ai。想要从中选出三根棍子组成周长尽可能长的三角形,输出最大的周长;若无法组成三角形,则输出0。如当n=5,a={2,3,4,5,10}时,输出12,即选择了3、4、5分别为三边的长度。当n=4,a={4,5,10,20}时,无法组成三角形,输出0。加框处代码有误,请改正。
Dim a(1 To 1000) As Integer
Dim n As Integer
Private Sub Form_Load()
??确定 n 的值和数组 a 的各个元素值,即每根棍子的长度值,代码略
End Sub
Function max(x As Integer , y As Integer) As Integer
  If x > y Then
    max = x
  Else
    max = y
  End If
End Function
Private Sub Command1_Click()
Dim i As Integer , j As Integer , k As Integer
Dim ans As Integer , c As Integer , longest As Integer , rest As Integer
ans = 0
??令iFor i = 1 To n
  For j = i + 1 To n
   For k = j + 1 To n
    c = a(i) + a(j) + a(k)
    longest = max(longest, c) ??(1)
    rest = c - longest  ??rest 保存最短的两条边的和
    If ans > c Then ??(2)
     ans = max(ans , c)
    End If
   Next k
  Next j
Next i
Print ans
End Sub
答案 (1)max(a(i),max(a(j),a(k)))或其他等价表达式
(2)rest > longest
10.【加试题】数组a中有50个正整数,已按升序排列。在文本框Text1中输入一个正整数m,寻找数组a中是否有一对数的和等于给定的数m。若存在和为m的数对,输出该数对包含的两个整数,小的在前,大的在后。若有多个数对满足条件,则输出最先找到的数对。若找不到符合要求的数对,则输出“没有符合条件的数对”。小吴为此编写了VB程序,代码如下,但加框处代码有错,请改正。
Dim a(1 To 50) As Integer
Const n = 50
Private Sub Command1_Click()
 Dim m As Integer, left As Integer, right As Integer
 Dim flag As Boolean, mid As Integer
 flag = False:m = Val(Text1.Text)
 For i = 1 To n-1
  left = i ??(1)
  right = n
  Do While left    mid = (left + right) 2
   If a(i) + a(mid) < m Then
    left = mid + 1
   Else If a(i) + a(mid) > m Then
    right = mid-1
   Else
    List1.AddItem Str(a(i)) & “ ” &Str(a(mid))
    flag = True
   End If
  Loop
 Next i
 If Not flag Then List1.AddItem=“没有符合条件的数对”
End Sub
答案 (1)left=i+1 (2)left<=right And Not flag
11.小朋友拍照。有来自K (1<=K<=20)个不同国家的N(1<=N<=100)个小朋友排成一行准备拍照。国籍用数字1,2,3,……,N表示,每个小朋友的国籍依次存入数组a(1)到a(K)。由于小朋友太多,没有办法全部被拍入。摄像师决定拍摄一段连续区间内的小朋友,这个区间内每种国籍的小朋友至少要有1个,求满足要求的最小区间长度。例如有10个小朋友,5种国籍,从左到右排列,国籍编号依次是2, 1,2,4,3,3,5, 5,3,5,则最小的一段包含所有5种国籍的区间是从第2个到第7个小朋友,区间长度为6。?
算法解析:区间的长度至少为K(国籍的数量),最大为N (小朋友的数量)。我们可以通过对分K到N 之间的值求得最小区间长度。
实现上述功能的VB代码如下,但加框处代码有错,请改正。
Dim a(1 To 100) As Integer ’依次存储1到100的小朋友的国籍编号
Dim K As Integer, N As Integer
Private Sub Form Load()
’产生N的值,表示人数,产生K的值,表示国籍种数
’产生编号为1到N的小朋友的国籍编号,并存储在数组a中
’代码略
End Sub
Private Sub Command1_Click() ’使用对分的思想计算最小区间
Dim M As Integer
i = K: j = N
Do While i <= j
 M = (i + j) 2
 If pd(M) = True Then ’调用Pd函数,判断区间长度为M时,是否包含所有国籍
  j=M - 1
  ans = M
 Else
  i =M-1 ’(1)
 End If
Loop
Text1.Text = Str(ans)
End Sub
Function pd(M As Integer) As Boolean
Dim f(1 To 20) As Integer ’f(i)表示国籍为i的小朋友是否包含
Dim t As Integer ’t用于统计当前区间包含的国籍数量
pd = False
For i = 1 To N - M + 1
 For j=i To i + M-1
  f(a(j)) = 1
 Next j
 t = 0
 For j - 1 To K ’统计已包含的国籍的数量
  t=t + j ’(2)
 Next j
 If t = K Then pd = True: Exit Function’若包含 K 个国籍,返回 True
 For j = 1 To K ’f数组元素重新初始化为0
  f(j) = 0
 Next j
Next i
End Function
答案 (1)M+1 (2)t+f(j)
课件86张PPT。考点清单
考点一 解析算法及程序实现考向基础
1.解析算法的基本思想
用解析的方法找出表示问题的前提条件与所求结果之间关系的数学表 达式,并通过数学表达式的计算来实现问题的求解。
如:已知圆的半径为r,求圆的面积s,则可通过公式s=3.14*r*r计算得到。2.解析算法的程序实现
(1)分析问题,建立正确的数学模型,找到数学计算式或数学算法。要注 意的是,有些问题能找到一个明确的公式,但是有些问题可能是一个运 算过程,比如除二倒取余法求二进制,辗转相除法求最大公约数等问 题。
(2)将数学计算或数学算法转化为VB运算过程。例 【加试题】将十进制数转化为二进制数的VB程序段如下:
方框中的代码由以下三部分组成:
①s=Str(r)+s
②y=y2
③r=y Mod 2代码顺序正确的选项是?(  )
A.②③①  B.②①③
C.①③②  D.③②①解析 本题主要考查Do循环语句。根据题意以及进制转化知识“除2 倒取余法”可知,先求余数(Mod运算)并保存,再求商(整除 ),商用来下 一次求余数。重复执行该过程直到商为0。答案????D考向突破
  解析算法一般难度不大,重点题型是各种进制之间的相互转换。考向基础
1.枚举算法的基本思想
将问题的可能解一一列举,逐个判断,找到所有符合条件的解。即使中 途找到符合的解也要继续找下去,要将所有可能解找完才结束。设计枚 举算法时要尽量减小罗列范围(提高算法的效率),不能遗漏,也不能重 复。考点二 枚举算法及程序实现例 密码破解技术中最简单的就是暴力破解,如果黑客事先知道了账户 号码,而用户的密码又设置得十分简单,比如密码是6位数字组合,黑客会 使用暴力破解程序,该程序通过尝试所有的6位数字组合很快就可以破 解出密码。暴力破解程序的算法实际上是?(  )
A.枚举算法  B.解析算法
C.排序算法  D.查找算法解析 本题考查枚举算法的基本思想。答案????A2.枚举算法的程序实现
根据枚举算法的主要思想:一一列举,逐个判断。因此一般情况下枚举 算法的代码具有以下特点:
(1)用循环语句在一定范围内列举所有可能的解。
(2)用选择语句判断和选择真正的解。
枚举算法的一般格式:
注意:循环语句不一定用For语句,也可用Do语句。3.多变量列举
某些枚举算法的问题比较复杂,可能有多个变量需要列举,此时就需要 多重循环,也即循环嵌套。格式如下:
如鸡兔同笼问题、百鸡百钱问题等。在设定多个变量的列举范围时,可
以利用验证条件,尽可能缩小列举范围,减少列举变量,从而减少循环的 嵌套。如百鸡百钱问题:100元钱买100只鸡,公鸡5元一只,母鸡3元一只, 小鸡1元3只。则代码如下:利用验证条件,代码可优化为:考向突破
  字符串处理是重点题型,近几次真题第1个大题(学考)多次考到字 符串分析和处理。字符串问题中,应重点掌握Len函数和Mid函数。例 小明编写了一个简易加法器VB程序,运行界面如图a所示。在文本 框Text1中输入一个数字后再输入空格表示一个加数输入完毕,连续不 断输入不同的加数,待所有需要相加的数输入完毕后,单击“求和”按 钮Command1后,在标签Label1中显示加数的个数以及总和。
?     图a            图b(1)该界面中除了窗体外,还使用了  ????个对象,界面中用于输出结果 的标签Label1,是使用了图b控件工具箱中的   ????(填数字)控件添加 的。
(2)实现上述功能的VB程序如下,在划线处填入合适的代码。
Private Sub Command1_Click()
Dim s As String,t As String,c As String
Dim n As Integer
Dim k As Integer ’记录加数的个数
Dim sum As Integer ’记录和
s=Text1.Textt=""
   ①  ????
For i =1 To n
 c =Mid(s, i, 1)
 If c= " " Then ’如果是空格的情况
  sum=sum + Val(t)
  k=k + 1
  t= ""
 Else
  t=   ②  ????
 End IfNext
Label1.Caption="这" +   ③  ????+ "个数的和为:"+ Str(sum)
End Sub
(3)如果输入“5 4 6 8”,则得到的和为    ????。解析 (1)略。
(2)①此处计算字符串s的长度。②遇到空格,说明一个数已经提取完成, 如果不是空格,说明是在取数的过程中,因此t=t+c。③变量k记录加数的 个数。
(3)只有遇到空格,才执行累加,输入“5 4 6 8”,最后一个8后没有 空格,因此只计算前三个数的和。答案????(1)3;① (2)①n=len(s)
②t+c或t+mid(s,i,1) ③str(k) (3)15考向基础
1.冒泡排序的基本思想
把待排序的n个元素的数组看成是垂直堆放的一列数据,从最下面的一 个元素起,自下而上地比较相邻的两个元素中的数据,将较小的数据换 到上面。重复这一过程,直到处理完最后两个元素中的数据,称为一遍 加工。第一遍加工完成后,最小的数据已经上升到第一个元素的位置。 然后对余下的n-1个元素重复上述处理过程,直至最后进行余下两个数 据的比较和交换。n个数需要n-1遍排序。考点三 排序算法及程序实现以数据130,20,98,15,67,3为例,从小到大冒泡排序的操作过程如下:第一遍排序:3与67比较,3换到前面,67换到后面;3与15比较,3换到 前面,15换到后面;3与98比较,3换到前面,98换到后面;3与20比较,3换到 前面,20换到后面;3与130比较,3换到前面,130换到后面。第一遍结束,3 排到了第1的位置,下一次排序,3不再参与比较。
第二遍排序:67与15比较,两个数位置不变;15与98比较,15换到前面,98 换到后面;15与20比较,15换到前面,20换到后面;15与130比较,15换到前 面,130换到后面。第二遍结束,15排到了第2的位置,下一次排序,3、15 不再参与比较。
第三遍排序:67与98比较,67换到前面,98换到后面;67与20比较,两个数 位置不变;20与130比较,20换到前面,130换到后面。20排到了第3的位 置,下一次排序,3、15、20不再参与比较。第四遍排序:98与67比较,两个数位置不变;67与130比较,67换到前面,13 0换到后面。67排到了第4的位置,下一次排序,3、15、20、67不再参与 比较。
第五遍排序:98与130比较,98换到前面,130换到后面。98排到了第5的位 置。共6个数,前5个已经排到了正确的位置,则排序任务完成。
2.冒泡排序的程序实现①外循环“For i=1 To n-1”中的变量i表示第i遍冒泡排序,n个数需要n- 1遍排序。
②内循环“For j=n To i+1 Step-1”可看出,冒泡比较的方向是从后往 前,两两比较,第i遍的比较次数是n-i次,交换次数最多是n-i次,交换次数 最少是0次。
③从小到大排序(升序),If语句中条件表达式为a(j)a(j-1)。例1 实现某排序算法的部分VB程序如下:
For i=1 To 4
 For j=5 To i+1 Step -1
  If a(j)   t=a(j):a(j)=a(j-1):a(j-1)=t
  End If
 Next j
Next i
在经过某一遍排序“加工”后,数组元素a(1)到a(5)的数据依次为“28,7 0,53,57,30”。则下一遍排序“加工”后数组元素a(1)到a(5)的数据应 该是?(  )A.28,30,70,53,57  B.28,30,53,57,70
C.28,30,57,53,70  D.28,30,53,70,57解析 本题主要考查冒泡排序算法的代码特点。冒泡排序的基本操作 是比较相邻的两个数据,因此代码中会出现相邻的两个数组变量的比 较,比如题中If a(j)在所有的元素中选出最小(大)的数据,把它与第一个数据交换,然后在其 余的元素中再选出最小(大)的数据与第二个数据交换。以此类推,直至 所有数据排序完成。
如果有n个数要求从小到大排序,操作方法是在所有的元素中选出最小 的数据,把它与第一个数据交换,这是第一遍加工(或称第一遍排序),第 一遍排序完成后,最小的数据就到了第一位。第二遍加工是在剩下的n- 1个数中选出最小的数,把它与第二个数据交换,第二遍排序完成后,第二 小的数就到了第二位。第三遍加工是在剩下的n-2个数中选出最小的 数,把它与第三个数据交换,……。n个数需要n-1遍排序。以数据130,20,98,15,67,3为例,从小到大选择排序的操作过程如下:第一遍排序:挑出最小值3,与排第一位的130交换位置,其他数据位 置不变。
第二遍排序:在剩下(除3以外)的数据中挑出最小值15,与排第二位的20 交换位置,其他数据位置不变。
第三遍排序:在剩下(除3、15以外)的数据中挑出最小值20,与排第三位的98交换位置,其他数据位置不变。
第四遍排序:在剩下(除3、15、20以外)的数据中挑出最小值67,与排第 四位的98交换位置,其他数据位置不变。
第五遍排序:在剩下(除3、15、20、67以外)的数据中挑出最小值98,发 现它已经在第五位,因此不需要交换,所有的数据位置不变。共6个数,前 5个已经排到了正确的位置,则排序任务完成。
4.选择排序的程序实现
选择排序的代码如下:
For i=1 To n-1 If k<>i Then
  temp=a(i):a(i)=a(k):a(k)=temp
 End If
Next i
①外循环“For i=1 To n-1”中的变量i表示第i遍选择排序,n个数需要n- 1遍排序。
②矩形框内代码用于寻找数据元素a(i)到a(n)的最小值,变量k记录当前 找到的最小值的位置,即数组元素的下标,则a(k)就是当前找到的最小的 数组元素。思想方法是先假设数组的第i项是最小的(第i遍排序),因此k记为i,然后把从第i+1项开始的所有数组元素跟a(k)进行比较,如果比a (k)小,则用k记录该元素的下标。这样循环结束后,变量k中存储的就是 数组中从第i项至第n项的最小元素的下标,a(k)就是第i项至第n项中的 最小元素。
③从小到大排序(升序),If语句中条件表达式为a(j)a(k)。例2 对下列一组原始数组13,15,2,11,8,18 进行选择排序,第一遍排序结 束,数组的状态不可能是?(  )
A.2,15,13,11,8,18  B.18,15,2,11,8,13
C.13,15,2,11,18,8  D.13,15,18,11,8,2解析 选择排序算法第一遍一定会把最大或最小的数交换到最前或最 后,因此选C。答案????C5.冒泡排序与选择排序的区别与联系例3 某校通过政府招投标中心采购一套多媒体教学设备,有5家单位参 加竞标,竞标价分别为19万、15万、21万、13万、12万元人民币。若采 用选择排序算法对标价从大到小排序,需要进行数据互换的次数是?
(  )
A.1  B.2  C.3  D.4解析 原始数据:19,15,21,13,12,第一遍排序,19与21互换,得到21,15,19,1 3,12;第二遍排序,15与19互换,得到21,19,15,13,12;第三遍排序与第四遍 排序都不需要进行数据互换。因此总共是2次数据互换。答案????B考向突破
1.冒泡排序算法的变形
标准写法:排序思想解析:n个数需要n-1遍排序;每一遍排序都是从最后一个数开 始,两两比较,小的数换到前面,大的数换到后面;第一遍把最小数推到了 第一个位置,第二遍把第二小的数推到了第二个位置,……。因此排序 过程中,数据是从前往后依次排好的。
①变形一排序思想解析:与标准式唯一的差异就是两个比较项从a(j-1)和a(j)变成 a(j+1)和a(j),因此循环语句也从“For j=n To i+1 Step-1”变成了“For j =n-1 To i Step-1”,而程序在执行过程中没有任何差别,与标准式是完全 一样的。
②变形二排序思想解析:跟标准型不一样的是本代码中每一遍冒泡是从前往后两 两比较的,因此每一遍排序达到的效果是把最大值推到了最后面。第一 遍排序后,最大值就到了最后位置,第二遍后,次大值就到了倒数第二个 位置,……。因此排序过程中,数据是从后往前依次排好的。
③变形三排序思想解析:在第i遍的排序中,把第i+1到第n个数依次与a(i)比较,如 果比a(i)小,则交换。它的最大特点是:所有数据跟某个位置上的数去比 较。如第1遍排序时,所有数都跟a(1)比较;第2遍排序时,所有数都跟a(2) 比较;以此类推。排序过程中,数据是从前往后依次排好的。
④冒泡排序的错误变形错误原因分析:从语句“For j=i To n-1”可看出每一遍的冒泡过程是把 最大值从前往后推,因此排序过程中,是后面的数据先排好,前面的数据 是乱的,但是第i遍的冒泡过程是从第i个数开始的,因此i位置前面的数 据不能参与排序。而后面的数据是已经排好的,其实是不需要参与排序 的。因此要改成“For j=1 To n-i”。
2.选择排序算法的变形
选择排序的变形考法几乎没有。
选择排序的错误变形:错误原因分析:在选择最小值的过程中,把第i+1到第n个数依次与a(i)比较,“If a(j)当某一遍排序过程中没有数据交换,说明数据已经有序,无需进行下一 遍排序。
代码如下:
Dim flag As Boolean    ??????flag值为True表示一遍加工中
发生过交换i=1
flag=True
Do While i <= n - 1 And flag=True
 flag=False
 For j=n To i + 1 Step -1
   If a(j) < a(j - 1) Then
    k=a(j): a(j)=a(j - 1): a(j - 1)=k
    flag=True
   End If
 Next j
 i=i + 1
Loop
4.选择排序算法的优化
在数组的所有元素中同时找出最小和最大的元素,然后将这两个元素分 别与第一个和最后一个元素交换数据,在余下的元素中找出最小和最大 数据的元素,分别与第二个和倒数第二个元素交换数据,以此类推,直到 所有元素的数据按升序排列。代码如下:
p=1: q=10
Do While p < q
 iMin=p:iMax=p
 For i=p + 1 To q  If a(i) < a(iMin) Then iMin=i
  If a(i) > a(iMax) Then iMax=i
 Next i
 t=a(iMin): a(iMin)=a(p): a(p)=t
 If iMax=p Then iMax=iMin
 t=a(iMax): a(iMax)=a(q): a(q)=t
 p=p + 1
 q=q - 1
Loop普通的选择排序是从头到尾一个方向的,优化后的排序是从两端往中间 同时进行的,一端从小到大排,另一端从大到小排,变量p和q表示本次排
序的范围(p前和q后的数据已经完成排序)。For语句找出本遍排序的最 小数a(iMin)和最大数a(iMax),然后将a(iMin)与a(p)交换,将 a(iMax)与a (q)交换。由于找最小数和最大数时,一开始都假定了p位置上的数是最 小值和最大值,如果本次找到的最大值在p位置,那么当a(p)和a(iMin)交 换以后,最大值a(p)就被换到iMin的位置。因此当iMax=p时,在最小值交 换完毕后,再给iMax赋值iMin。例????(2018稽阳联谊学校联考,16,3分)【加试题】有一组正整数,基于冒 泡排序对其中的数进行升序排序。排序后奇数在前,偶数在后。排序示 例如下:5.奇数偶数分开排序、素数合数分开排序  实现上述功能的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 d(j) > d(i)Then       ’(1)     t=d(j): d(j) =d(j - 1): d(j - 1)=t
    End If
Else              ’(2)
    t=d(j): d(j) =d(j - 1): d(j - 1)=t
   End If
 Next j
 i=i + 1
Loop
’依次输出排序后的数据,代码略
End Sub解析 本题考查冒泡排序的应用。与普通的冒泡排序不同之处在于,本 题把奇数偶数分开从小到大升序排序。(1) If d(j) Mod 2=d(j - 1) Mod 2 表示d(j)和d(j-1)的奇偶性相同,此时如果d(j)1.顺序查找的基本思想
从第一个数据开始,按数据的顺序逐个将数据与给定的值进行比较。若 某个数据和给定值相等,则查找成功,输出所查数据的位置;否则,输出未 找到。
2.顺序查找的程序实现
假定在数组a中有n个数据,查找关键词是key,则顺序查找的代码如下:
For i = 1 To n
 If a(i)=key Then
  Print i:Exit For
 End IfNext i
If i=n+1 Then s=“未找到”
说明:①For语句用于访问整个查找源的数据,一般是从开始位置到结束 位置。
②If语句用于判断当前访问的元素是不是等于关键词。
③一旦某个位置的数据等于关键词,则输出该位置,并且查找任务结束, 通常用语句Exit For退出循环。
④未找到,也应该有输出。能找到的情况下,因为是通过Exit For退出循 环的,因此退出循环时i<=n;找不到的情况下,退出循环时i=n+1。
⑤顺序查找不要求数据源是有序的。3.对分查找的基本思想
在有序的数据列中,首先将要查找的数据与有序数组内处于中间位置的 数据进行比较,如果两者相等,则查找成功;否则根据数组元素的有序性, 就可确定该数据在数组的前半部分还是后半部分,从而继续进行查找。 在新确定的范围内,继续按上述方法进行查找,直到找到要查找的数据, 使查找成功,或直到查找范围不存在,查找不成功。对分查找的条件是 被查找的数据必须是有序的。
如有数据源a(1)到a(n)是有序的(如从小到大排序),查找的关键词是key, 每次查找的范围用变量i和j来表示,则查找过程如下:
(1)确定第一次查找的范围是[1,n],因此i=1,j=n。
(2)计算中间位置m=Fix((i+j)/2)(或m=(i+j)2或m=Int((i+j)/2))。
(3)如果key=a(m),则查找成功,跳到(6)。(4)如果key(5)如果key>a(m),则下一次查找的范围是后半部分,即j不变,i=m+1。转 到(2)。
(6)输出结果m,结束查找。
说明:
①对分查找的前提是被查找的数据必须是有序的。
②对分查找每次访问的是当前查找范围里中间位置上的数据,并根据该 数据与关键词的大小关系,将下一次的查找范围缩小一半。
③规模为n个数的数据源,使用对分查找时,最多经过Int(log2n)+1次查 找。例1 7位学生的身高(单位:cm)从高到低依次为178,177,175,172,170,16 5,162。用对分查找法找到178的过程中,依次访问到的数据是?(  )
A.178  B.172,175,178
C.172,177,178  D.172,175,177,178解析 本题主要考查对对分查找算法基本思想的理解。将7个数据从1 到7顺序进行编号。第一次访问的数据是第4个,即172(中间位置m=Fix ((1+7)/2)=4),178>172,因此下一次查找的范围是前半部分,即第1个到第 3个。因此第二次访问的数据应该是第2个,即177(中间位置m=Fix((1+ 3)/2)=2),178>177,因此下一次查找的范围是前半部分,即第1个。因此第 三次访问的数据是第1个,即178。答案????C4.对分查找的程序实现
对于一组升序的数据列,对分查找的代码如下:①变量i和j记录每一次查找的起始位置和结束位置,变量m记录中间位 置。如果keya(m),则下一次查找的范围是后半部分,因此j不变,i=m+1。
②退出Do循环有两种可能:第一种是f为True,说明已经找到关键词,此时 结束查找;第二种是i>j,查找的起始位置超过结束位置,说明已经找遍数 据源,但是找不到关键词,此时结束查找。例2 下列有关查找的说法,正确的是?(  )
A.顺序查找时,被查找的数据必须有序
B.对分查找时,被查找的数据不一定有序
C.顺序查找总能找到要查找的关键字
D.一般情况下,对分查找的效率较高解析 本题主要考查对两种查找算法的了解。对分查找的前提条件是 被查找的数据源是有序的,而顺序查找对数据源没有要求。两种查找算 法,对分查找的效率较高,这是由对分查找的算法特点决定的,顺序查找 平均需要比较(n+1)/2次,因此时间复杂度是O(n),而对分查找的每一次 查找都将查找范围缩小一半,因此时间复杂度是O(log2n),比顺序查找的 效率高。答案????D5.顺序查找与对分查找的比较考向突破
1.对分查找的几点说明
(1)对分查找的每一次查找,要么找到目标,结束任务;要么通过比较中间 值与关键词,将下一次的查找范围缩小一半,因此对分查找的效率往往 高于顺序查找。对n个数据查找某个值,最多需要查找Int(log2n)+1次。
(2)找不到关键词的情况下,最后一遍查找时,i=j=m,若key>a(m),则i=m+ 1;若key(3)计算中间值位置的式子有多种写法,不同写法,查找过程可能不同。
实例:a(1)到a(10)的值依次为2,7,8, 10, 12, 13, 16, 18, 19, 20。  序号表示第几次找到该数。如果“If(i+j)Mod 2=1 Then m=m+1” 写成“If j Mod 2=0 Then m=m+1”,查找过程可能也不同,要根据实际 情况分析。例1 【加试题】对数组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)22.对分查找中的变量值 If j Mod 2=0 Then m=m+1
 If a(m)= Key Then Exit Do
 If KeyLoop
A.i=5  B.j=4  C.m=3  D.p=2解析 本题主要考查对分查找。变量p是查找次数。第一次查找,i=1,j= 6,m=(i+j)2=3,而j Mod 2=0,因此m=m+1=4,23<44,因此j=m-1=3;第二次 查找,m=(i+j)2=2,23>22因此i=m+1=3;第三次查找,m=(i+j)2=3,23<33, 因此i=m+1=4,此时i=4,m=3,j=3,p=3,i>j,整个查找过程结束,故C正确。答案????C例2 有序(非降序)数组a有n个元素,用对分查找算法在数组a中查找key 值所在的位置,如果有重复的元素,则显示最早出现该key值的位置。相 应的VB程序段如下:
key =Val(Text1.Text)
i=1:j=n
Do While i <= j
 m = (i + j) 2
 If a(m) > key Then
  j = m-1
 ElseIf a(m) < key Then
  i = m + 13.在有相同项的数据源中找关键字 Else
  If     ???? Then
   j =m-1
  Else
   s = Str(key) + “的起始位置是”+Str(m)
   Exit Do
  End If
 End If
Loop
If i > j Then s ="找不到"+ Str(key)
Label2.Caption=s要使程序实现上述算法,划线处的语句是?(  )
A.a(m -1)=key
B.a(m)=key
C.m-1 >=0 And a(m-1) = key
D.m-1 >=0 And a(m) = key解析 本题考查对分查找,根据代码已知If处的条件是判断当a(m)=key 时,是否前面有重复值,同时要保证m-1>=0,所以答案为C。答案????C例3 循环升序数组指的是将一个升序数组循环向右移动若干距离之 后变成的数组。如[1,2,3,4,5]循环右移1位,就成为[5,1,2,3,4],再右移1位, 就成为[4,5,1,2,3],……,其中[5,1,2,3,4]和[4,5,1,2,3]都是循环升序数组。 该数组的特点是:将循环升序数组从中间分开,肯定有一边是有序数组, 另外一边是循环有序数组。小杜研究发现对分查找算法适当优化后也 适用于循环升序数组。在文本框输入被查找的数据key,查找循环升序 数组a中是否有相同的元素存在。编写的VB程序段如下:
i=1: j = n ’数组a下标从1到n
Key = Val(Text1.Text)
Do While i <= j
 m = (i + j) 24.非简单有序序列的对分查找 If a(m) = Key Then Exit Do
 If a(i) < a(m) Then
  If    ????Then j = m -1 Else i = m + 1
 Else
  If Key > a(m) And Key <= a(j) Then i = m + 1 Else j = m - 1
 End If
Loop
If i <= j Then Text2.Text ="查找成功" Else Text2.Text ="查找失败"
要使程序实现对分查找过程,则方框中的语句是?(  )A.Key >= a(i) And Key < a(m)
B.Key <= a(i) And Key > a(m)
C.Key >= a(i) And Key <= a(j)
D.Key > a(i) And Key <= a(m)解析 本题考查对分查找。a(i)=a(i) And Key1.递归算法的基本思想
函数或过程调用它本身,称为递归。递归算法的基本思想是把规模较大 的、较难解决的问题变成规模较小的、容易解决的同一问题,规模较小 的问题又变成规模更小的问题,当问题小到一定程度时,可以直接得出 它的解,从而得到原来问题的解。即采用“大事化小、小事化无”的基 本思想。比如著名的汉诺塔问题、八皇后问题、斐波那契数列、猴子 吃桃问题等。
在自定义函数中调用自己,这样的函数叫递归函数。
2.递归算法的前提条件
(1)每一步解决问题的方法要一致;考点五 递归算法及程序实现(2)在使用递归策略时,必须有一个明确的结束条件(也称边界条件),称 为递归出口。
示例:年龄问题1
有A、B、C、D四个人,问A的年龄,A说:我的年龄是B的两倍;问B的年 龄,B说:我比C大3岁;问C的年龄,C说:我的年龄是D的两倍减15岁;问D的 年龄,D说:我17岁。请问A的年龄是多少?
在这个问题中,虽然有递归出口(D的年龄),但是每一步解决问题的方法 不一致,因此不能使用递归算法。
示例:年龄问题2
有5个人坐在一起,问第5个人,他说比第4个人大2岁,问第4个人,他说比 第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁;问最后一个人,他说10岁。问第5个人多大?
在这个问题中,不但有递归出口(第1个人的年龄),而且每一步解决问题 的方法是相同的(都是后一个人比前一个人大2岁),因此可以用递归算 法。
3.递归算法的程序实现
求阶乘(n!)的代码。
Private Sub Command1_Click()
Dim n As Integer
Dim m As Long
n = Val(Text1.Text)
m = f(n)Text2.Text = Str(m)
End Sub
Function f(a As Integer)
If a = 1 Then ’边界条件
  f = 1 ’递归出口
Else
  f = f(a - 1)*a ’递归调用
End If
End Function
注:递归算法的代码通常比较简洁,但事实上递归算法的运行效率较 低。4.递归算法的设计难点
(1)找到边界条件,设置递归出口。
(2)推导递归公式。如阶乘问题的递归公式是:n!=(n-1)!*n。斐波那契数 列的递归公式是:f(n)=f(n-1)+f(n-2)。例 有以下程序代码:
Dim a(4) As Integer
Private Sub Command1_Click()
 Dim s As String
 a(1)=10:a(2)=30:a(3)=20:a(4)=40
 s = doit(4)
 Label1.Caption = s
End Sub
Function doit(k As Integer) As String
If k = 1 Then
 doit = Str(a(1))5.递归算法的调用过程Else
 doit = doit(k - 1) & Str(a(k))
End If
End Function
程序运行后,标签Label1中显示的内容是?(  )
A.10 20 30 40  B.10 30 20 40
C.40 30 20 10  D.40 20 30 10解析 本题的递归调用过程如下:
? 答案????B考点六 算法在数据管理中的应用考向基础
  本考点要求了解使用ADO对象访问Access数据库的步骤。
在VB程序中使用ADO对象,必须先引用ADO的对象库。方法是点击 “工程”菜单中的 “引用”命令,弹出“引用”对话框,勾选ADO选项, 如图所示。说明:不同环境下ADO的版本号可能不同。
1.通过Connection对象连接数据库的一般过程(右边是对应的代码):
?
说明:
①conn是定义的Connection对象的名字,取名规则同变量名。
②ConnectionString是连接字符串,它主要有两个参数:provider是数据库引擎的名称;data source指定连接的数据库文件, "& App.Path &"表示相 对路径,"mydb.accdb"是数据库文件名。因此该程序连接的是跟工程文 件同一个文件夹下的名为mydb.accdb的一个数据库文件。
③Open和Close是Connection对象的方法,表示打开数据库连接和关闭 数据库连接,使用数据库应该在打开数据库连接后,关闭数据库连接 前。
2.通过Recordset对象获取数据表中的数据,步骤如下(右边是对应的代 码):?
说明:
①rs是定义的Recordset对象的名字。
②SELECT语句是结构化查询语言 SQL 中常见的语句,主要用于从数 据表中查询数据。“SELECT*FROM info”表示从“info”这张表中读取所有的记录(通配符“*”表示所有,即All)。③“info”是表名。
④打开 Recordset 时,若 Recordset 非空,则默认指向第一条记录。
⑤EOF 属性:若当前记录的位置在最后的记录之后,则返回True,否则返 回False。 EOF 相当于读取记录的结束标志。
⑥rs.Fields(“xh”)返回当前记录中“xh”字段的值。 rs.Fields(0)返回 当前记录中第一个字段的值,如果第一个字段名为“xh”,则 rs.Fields (0) 与rs.Fields(“xh”) 返回值相同。依此类推,rs.Fields(1)表示返回第2 个字段的值。
⑦MoveNext 方法:指针移到下一条记录。
⑧本段代码应该在连接数据库后,关闭数据库前。下表是Recordset对象的常用方法和属性3.数据库访问的标准代码如下:
?
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
conn.ConnectionString="provider=Microsoft.ACE.OLEDB.12.0;data source="& App.Path & "computer.accdb "
’数据库文件名为computer.accdb
conn.Openset rs.ActiveConnection=connrs.
Open "SELECT * FROM info" ’数据表名为info
n=0
Do While Not rs.EOF
n=n+1
 a(n)=rs.Fields(“xh”) ’Fields(“xh”)表示读取“xh”字段的值, 此处等同于Fields(0)
 b(n)=rs.Fields(“jg”) ’Fields(“jg”)表示读取“jg”字段的值,此 处等同于Fields(2)rs.MoveNext
Loop
rs.Close
conn.close
set rs=nothing
set conn=nothing考向突破
  数据库考题一般难度不大,需要掌握以下几点:
1.能从连接字符串中分析出数据库文件名(一般后缀名为.accdb)。
2.能从SELECT语句中分析出表名(一般在FROM后面)。
3.Fields属性的两种用法:Fields(“字段名”)、Fields(字段号),注意字段 号不要加双引号,而且字段号从0开始。
4.EOF和BOF两个属性的用法。
5.MoveNext方法的使用。
同课章节目录