专题六 算法的程序实现 挖命题 【考情探究】 考点 考试内容 考试要求 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))