枚举算法教学设计教案《枚举法》
教学目标:
1、知识和技能----理解枚举法的概念和注意点,能用枚举法来解决实际问题。
2、方法和过程----通过对知识的探究和实际问题的解决,自学探究能力、解决问题能力和归纳概括能力得以提高。
3、情感态度和价值观----创设情境,激发学生兴趣,培养学生学习的主动性和积极性;构建研究的环境,培养学生良好的学习习惯和探索研究的科学态度。
知识点:计数器的概念、伪代码、多重For循环、List1box控件的使用、枚举算法
教学重点:用枚举法解决问题、培养学生自主学习探索知识的能力
教学难点:多重For循环的理解、培养学生自主学习、探索获取知识的学习方法
教学方法:启发式
教学过程:
一、理解枚举概念
A.将一箱苹果中烂的苹果挑出来。
B.工厂检验每件产品质量
枚举算法的基本思想:把问题所有的可能解,逐一罗列出来并加以验证,若是问题的真正解,就予以采纳,否则就抛弃它。
关键点:列举、检验
难点:多重For 循环的理解
(1)从最内层开始运行,
(2)从循环次数角度理解
注意点:不遗漏、不重复
二、案例讨论(进一步理解枚举的概念)
在前1000个奇自然数中,计算恰好有三位为1的二进制数的个数(例如,19对应的二进制数10011,是一个符合题目要求的数字,而23对应的二进制数10111,则不符合本题目要求)代码:(穿插伪代码、计数器的概念)
Private Sub Form_Load()
Dim K(1 To 11) As Integer '定义数组下标最大为11, 2^11=2048>1999
Dim a, b, c As Integer
Dim i, j, w As Integer
Form1.Show
c = 0
For i = 1 To 1000
a = 0 '采用除2取余法将十进制数化二进制数,结果存放在数组K中
j = i * 2 - 1
Do While j > 0
a = a + 1
K(a) = j Mod 2
j = j \ 2
Loop
w = 0 '统计数组K中1的个数,结果存放在变量w中
For b = a To 1 Step -1
If K(b) = 1 Then w = w + 1
Next b
If w = 3 Then c = c + 1 ‘统计二进制数中恰好有三位1的个数
Next i
Print "在前1000个奇自然数中,恰好有三位为1的二进制数的个数有"; c; "个。
"
End Sub
三、案例——推算被涂抹单据上的数字
题目:一张单据上有一个5位数的编号,其百位数和十位数处已经变得模糊不清(如下)。
但知道这个5位数是37或67的倍数。
现设计下列算法,找出所有满足这些条件的5位数,并统计出这些5位数的个数。
对照流程图在程序的空白行填写合适的语句:
NO. 25□□6
代码1:
Private Sub Command1_Click()
Dim j, n, c As Integer
c = 0
List1.Clear
For j = 0 To 99
n = 25006 + j * 10 ‘产生出25006、25016、25026…25996这100个自然数 If n Mod 37 = 0 Or n Mod 67 = 0 Then
List1.AddItem Str(n)
c = c + 1
End If
Next j
List1.AddItem "总计有" + Str(c) + "个五位数"
End Sub
四、练习1
如果一个三位正整数等于它的每个数字的立方和,则此数称为“水仙花”数(如:153=1^3+5^3+3^3 )。
下列程序用于求出100—999之间的所有“水仙花”数,则程序中①②划线处应添入的语句:—— ——
代码1:
Private Sub Command1_Click()
Dim m as Integer , n as Integer
Dim a as Integer, b as Integer , c as Integer
For m=100 to 999
a=Int(m/100)
b=Int((m-100*a)/10)
n=
①
if ② Str(m)
Next m
End Sub
其中a b c 的值还可以用另外的方式表示吗?(能)
a = m \ 100 ‘求得百位上的数字
b =m \ 10 Mod 10 ‘求得十位上的数字
c =m Mo
d 10 ‘求得个位上的数字
玩具工厂要包装600个变形金刚,要求是:
(1)包装的规格分别是:小盒(每盒2个),中盒(每盒5个),大盒(盒8个);
(2 )每种规格的盒数都不能为0。
设计一个算法,输出所有可能的包装方案,并输出包装方案的个数。
解题思路:假设小盒、中盒、大盒的数量分别为X ,Y , Z,那么可推导出2*X+5*Y+8*Z=600, 并且X=<293 Y=<118 Z=<74;只要满足这两个条件的X ,Y , Z值,都是是符合要求的方案。
本题可通过枚举的方法,通过多重循环,逐一的检验每一个可能的X ,Y , Z值,最终得出所有可能的包装方案。
主要代码:
Private Sub Command1_Click()
Dim c,x,y,z as integer
C=0
For x = 1 To 293
For y = 1 To 118
For z = 1 To 74
If 2 * x + 5 * y + 8 * z = 600 Then
List1.AddItem (“x=”+str(x)+””+”y=”+str(y)+””+”z=”+str(z))
c = c + 1
End If
Next z
Next y
Next x
Label1.Caption = "个数:" + Str(c)
End Sub
“百钱买百鸡”问题。
中国古代数学家张丘建在《张丘建算经》中提出一个问题。
“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。
百钱买百鸡。
问鸡翁、母、雏各几何?”。
代码:
Private Sub Command1_Click()
Dim sum As Integer
Dim i, a, b, c As Integer
List1.Clear
For a = 0 To 20 ‘公鸡五钱一只,可取范围[0,20]
For b = 0 To 33 ‘母鸡三钱一只,可取范围[0,33]
c = 100 - a –b ‘小鸡的数量可直接计算得到,共有100只鸡
If a * 5 + b * 3 + c / 3 = 100 Then ‘判断是否满足条件,刚好100钱
List1.AddItem (Str(a) + Str(b) + Str(c))
sum = sum + 1 ‘统计组数
End If
Next b
Next a
Label1.Caption = "组数:" + Str(sum)
End Sub。