(共98张PPT) 考点一????解析算法及程序实现 考向基础 1.解析算法的基本思想 用解析的方法找出表示问题的前提条件与所求结果之间关系的数学表达 式,并通过数学表达式的计算来实现问题的求解。 如:已知圆的半径为r,求圆的面积s,则可通过公式s=3.14*r*r计算得到。 2.解析算法的程序实现 (1)分析问题,建立正确的数学模型,找到数学计算式或数学算法。要注意 的是,有些问题能找到一个明确的公式,但是有些问题可能是一个运算过 程,比如除二倒取余法求二进制,辗转相除法求最大公约数等问题。 考点清单 (2)将数学计算或数学算法转化为VB运算过程。 考向突破 解析算法一般难度不大,重点题型是各种进制之间的相互转换。 例1 将十进制数转化为二进制数的VB 程序段如下: Dim y As Integer, s As String, r As Integer y=Val(Text1.Text) ’输入十进制数 s="" ???? Do While y <> 0 Loop Text2.Text=s ’显示二进制数 方框中的代码由以下三部分组成: ①s=Str(r)+s ②y=y\2 ③r=y Mod 2 代码顺序正确的选项是?( ) A.②③① B.②①③ C.①③② D.③②① 解析 本题采用“除2取余法”将十进制转换成二进制,先求余数(Mod运 算)并保存,再求商(整除 \),商用来下一次求余数。重复执行该过程直到商 为0。 答案????D 例2 辗转相除法是数学史中著名的算法,用于计算两个正整数a和b的最 大公约数。步骤如下: 现编写程序,在文本框Text1和Text2中输入a和b,在文本框Text3中输出 两数的最大公约数。代码如下: Private Sub Command1_Click() Dim a As Integer, b As Integer, r As Integer 变量 a b 余数 初始值 24 15 9 第一次辗转 15 9 6 第二次辗转 9 6 3 第三次辗转 6 3 0 余数为0时终止,最大公约数为3 a=Val(Text1.Text) b=Val(Text2.Text) r=a Mod b Do While ①???? a=b b=r r=a Mod b Loop Text3.Text= ②???? End Sub 解析 ①循环结束条件是r=0,因此循环条件是r>0 或 r<>0。②退出循环 后,结果存在变量b中。 答案 ①r>0 ②str(b) 考点二????枚举算法及程序实现 考向基础 1.枚举算法的基本思想 将问题的可能解一一列举,逐个判断,找到所有符合条件的解。即使中途找 到符合的解也要继续找下去,要将所有可能解找完才结束。设计枚举算法 时要尽量减小罗列范围(提高算法的效率),不能遗漏,也不能重复。 2.枚举算法的程序实现 根据枚举算法的主要思想:一一列举,逐个判断。因此一般情况下枚举算法 的代码具有以下特点: (1)用循环语句在一定范围内列举所有可能的解。 (2)用选择语句判断和选择真正的解。 枚举算法的一般格式: For(列举所有可能的解) If 可能解是正确解 Then 输出该解或计数 Next 注意:循环语句不一定用For语句,也可用Do语句。 3.多变量列举 某些枚举算法的问题比较复杂,可能有多个变量需要列举,此时就需要多重 循环,也即循环嵌套。格式如下: For(列举变量1所有可能的解) For(列举变量2所有可能的解) ????…… If 该组解是正确解 Then 输出该组解或计数 ????…… Next Next 如鸡兔同笼问题、百鸡百钱问题等。在设定多个变量的列举范围时,可以 利用验证条件,尽可能缩小列举范围,减少列举变量,从而减少循环的嵌 套。如百鸡百钱问题:100元钱买100只鸡,公鸡5元一只,母鸡3元一只,小鸡1 元3只。则代码如下: For x=1 To 100 For y=1 To 100 For z=1 To 100 If x+y+z=100 And 5*x+3*y+z/3=100 Then 输出该组解或计数 Next z Next y Next x 利用验证条件,代码可优化为: For x=1 To 20 ’公鸡最多不超过20只 For y=1 To 33 ’母鸡最多不超过33只 z=100-x-y If 5*x+3*y+z/3=100 Then 输出该组解或计数 Next y Next x 例 寻找3位的水仙花数。什么是水仙花数?水仙花数是指一个 n 位数(n ≥3),它的每一位上的数字的 n 次幂之和等于它本身。例如153是水仙花 数,因为13+53+33=153。 解决此问题的Visual Basic程序如下,程序界面如图所示,在列表框List1中 输出结果。 ? 在(1)和(2)划线处,填入合适的语句或表达式,把程序补充完整。 Private Sub Command1_Click() Dim i As Integer Dim a,b,c As Integer For (1)???? a=i\100 b=i\10 Mod 10 c=i Mod 10 If (2) ???? Then List1.AddItem Str(i) Next End Sub (1)程序中划线处(1)应填入 ????。 (2)程序中划线处(2)应填入 ????。 解析 (1)枚举算法在列举的过程中,不能遗漏任何一个可能的解,寻找3位 的水仙花数,100到999都是可能解。因此列举所有可能解的语句应该是 For i=100 To 999。 (2)If语句用于检验当前列举的可能解i是不是正确解。水仙花数的验证条 件:它的每一位上的数字的n次幂之和等于它本身,本程序要求找出3位的水 仙花数,因此n=3,变量a、b、c是i的百位、十位和个位上的数字,因此验证 条件是a^3+b^3+c^3=i。 答案 (1)i=100 To 999 (2)a^3+b^3+c^3=i
考向突破 从目前出现的真题看,直接考枚举算法的不多,常考字符串的处理,一般题 型为:输入一串字符串,字符串中有一些特殊字符做为间隔符号,利用该间 隔符号,将字符串中的字符提取,并作进一步的数据分析或处理。从代码特 点和思想方法上分析,该类问题也利用了枚举算法的思想。 一、字符串问题相关知识 1.字符大小的比较 字符(包括字符串)在计算机中存储的是每个字符的内码值。字符比大小 实际上是比较字符的ASCII码值。如“a”<“b”,“ab”<“abc”, “abc”<“abd”,“acde”<“ad”,比较方法是先比较第一个字符,如果相 同,则比较第二个字符,依次类推。几个常用字符的内码值: 字符 “0” “9” “A” “Z” “a” “z” “0”~ “9”按顺 序编码。 “A”~ “Z”、 “a”~ “z”按字 母顺序编 码 十进制值 48 57 65 90 97 122 十六进制 值 30 39 41 5A 61 7A 2.字符相加 (1)用“+”号:运算符两边必须都是字符串型,如“1”+“2”=“12”,而1 +“2”则出错。 (2)用“&”号:会自动将两边的数据转成字符串型再拼接。如“1”& “2”=“12”,1&“2”=“12”。 注意:字符相加前后位置对调,结果不一样,“1”+“2” =“12”,而“2”+ “1” =“21”。利用这一点,可达到字符反串的效果,比如在除二倒取余 法中的应用。 3.不同类型字符的判断 功能 表达式 小写字母 ch>=“a” And ch<=“z” 大写字母 ch>=“A” And ch<=“Z” 数字字符 ch>=“0” And ch<=“9” 字母 ch>=“A” And ch<=“Z” Or ch>=“a” And ch<=“z” 非字母 Not(ch>=“A” And ch<=“Z” Or ch>=“a” And ch<=“z”) 4.字符转换 二、字符串基本操作 1.判断是否对称 f=true n=Len(s) For i=1 To n\2 If Mid(s,i,1)<>Mid(s,n-i+1,1) Then 功能 表达式 大写转小写 Chr(Asc(ch)+32) 小写转大写 Chr(Asc(ch)-32) 求字母的字母序 小写字母:Asc(ch)-96或Asc(ch)- Asc(“a”)+1 大写字母:Asc(ch)-64或 Asc(ch)- Asc(“A”)+1 f=false:Exit For End If Next i 最后判断f的值,如果是true,则对称,否则不对称。 2.字符串反转 n=Len(s) For i=1 To n s1=Mid(s,i,1)+s1 Next i 得到的字符串s1是s的反串。 3.插入字符串 在字符串s中,在第n个位置插入字符串c: s1=Mid(s,1,n-1)+c+Mid(s,n,Len(s)-n+1) 如s=“hppynewyear”,n=2,c=“aa”,则s1=“haappynewyear”。 4.删除字符串 在字符串s中,删除子串s1: i=1 Do While i<= Len(s)-Len(s1)+1 If Mid(s,i,Len(s1))=s1 Then s=Mid(s,1,i-1)+Mid(s,i+Len(s1),Len(s)-i-Len(s1)+1) Else i=i+1 End If Loop 5. 删除重复字符 删除字符串s中重复的字符。 s1=Mid(s,1,1) For i=2 To Len(s) f=0 For j= 1 To Len(s1) If Mid(s,i,1)=Mid(s1,j,1) Then f=1:Exit For Next j If f=0 Then s1=s1+Mid(s,i,1) Next i 6. 单词个数统计 f=0 For i=1 To Len(s) ch=Mid(s,i,1) If ch>="A" And ch<="Z" Or ch>="a" And ch<="z" ’ch是字母 If f=0 Then c=c+1:f=1 Else f=0 End If Next 例 用VB编写一个“加减法运算”程序,实现如下功能:在文本框Text1中 输入多个正整数加减算式(只包含数字和“+ ”“-”字符,以“=”为结束 符),单击“计算”按钮Command1,计算结果在标签Label1上显示。程序运 行界面如图所示。 ? (1)程序运行时清空Label1上的内容,则可在Form_Load事件过程中添加语 句 ????(单选,填字母:A.Form1.Caption= “”/ B.Form1.Text=“”/C.La- bel1.Caption=“”/D.Label1. Text=“”)。 (2)实现上述功能的VB程序如下,请在划线处填入合适的代码。 Private Sub Command1_Click() Dim s As String, t As Integer s = Text1.Text t = 0: p = 0: flag = 1 For i = 1 To Len(s) ch = Mid(s, i, 1) If ch >="0" And ch <= "9" Then p = ① ???? Else t= ② ???? p = 0 If ch = "-" Then flag = -1 Else If ch = "+" Then flag = 1 End If End If Next i Label1.Caption = Str(t) End Sub (3)若文本框Text1中输入内容的结束符“=”缺失(即输入内容为12+28-15 +50),单击“计算”按钮后, 标签Label1上显示的内容是 ????。 解析 本题的解题关键在于理解非数字字符的操作。For语句遍历字符串 值,If语句判断字符类型。(1)略。(2)①分析判断条件可知,要执行数字相 连。原值p乘10加新出现的值Val(ch)组成新值。②非数字符号出现,要把 前值放入累加器t中,flag存放前值符号,因此要累加flag*p。(3)由于“=” 缺失,造成最后一个数50没有被累加。 答案 (1)C (2)①p*10 + Val(ch) ②t + flag*p (3)25 考点三????排序算法及程序实现 考向基础 1.冒泡排序的基本思想 把待排序的n个元素的数组看成是垂直堆放的一列数据,从最下面的一个 元素起,自下而上地比较相邻的两个元素中的数据,将较小的数据换到上 面。重复这一过程,直到处理完最后两个元素中的数据,称为一遍加工。第 一遍加工完成后,最小的数据已经上升到第一个元素的位置。然后对余下 的n-1个元素重复上述处理过程,直至最后进行余下两个数据的比较和交 换。n个数需要n-1遍排序。 以数据130,20,98,15,67,3为例,从小到大冒泡排序的操作过程如下: 原始数据 130 20 98 15 67 3 第1遍排序 后 3 130 20 98 15 67 第2遍排序 后 3 15 130 20 98 67 第3遍排序 后 3 15 20 130 67 98 第4遍排序 后 3 15 20 67 130 98 第5遍排序 后 3 15 20 67 98 130 2.冒泡排序的程序实现 For i=1 To n-1 ’n个数需要n-1遍排序 For j=n To i+1 Step -1 ’从后往前,两两比较,直到a(i+1)和a(i)比较完 If a(j) temp=a(j-1):a(j-1)=a(j):a(j)=temp ’小的数在后面,则交换 End If Next j Next i ①外循环“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)(降序),If语句中条件表达式为:a(j)>a(j-1)。 例1 有如下程序段: For i=1 To 2 For j=5 To i+1 Step -1 If a(j) Next j Next i 数组元素a(1)到a(5)的值依次为“95,88,66,80,75”,经过该程序段“加工” 后,数组元素a(1)到a(5)的值依次为?( ) A.66,75,95,88,80 B.66,75,80,95,88 C.95,88,66,80,75 D.95,88,80,75,66 解析 此题为冒泡排序,升序排序,排序两遍。答案为A。 答案????A 3.选择排序的基本思想 在所有的元素中选出最小(大)的数据,把它与第一个数据交换,然后在其余 的元素中再选出最小(大)的数据与第二个数据交换。以此类推,直至所有 数据排序完成。n个数需要n-1遍排序。 以数据130,20,98,15,67,3为例,从小到大选择排序的操作过程如下: 原始数据 130 20 98 15 67 3 第1遍排序 后 3 20 98 15 67 130 第2遍排序 后 3 15 98 20 67 130 第3遍排序 后 3 15 20 98 67 130 第4遍排序 后 3 15 20 67 98 130 第5遍排序 后 3 15 20 67 98 130 4.选择排序的程序实现 选择排序的代码如下: For i=1 To n-1 k=i For j=i+1 To n If a(j)Next j 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遍排序。