百鸡问题用计算机什么法解决,《穷举法解决问题》教学设计

一、教学目标

1、知识与技能

⑴了解穷举法的基本概念及用穷举法设计算法的基本过程。

⑵分析建立正确的数学模型,归纳穷举法穷举技巧。

⑶能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题。

2、过程与方法

⑴经历用穷举法求解问题的基本过程。

⑵能通过实际问题的分析、求解过程,尝试归纳出利用穷举法解决问题的思路和方法。

⑶体验穷举策略在穷举法中的地位和作用,并选择适当的穷举方案解决问题。

3、情感态度与价值观

⑴引导学生关注穷举法在社会生活中的应用,进一步提高利用信息技术解决实际问题的能力。

⑵通过小组讨论与探究活动,提高团队合作能力,促进探究的热情。

⑶在解决问题的过程中进一步培养和提升学生的逻辑思维能力。

二、学情分析

本节内容的教学对象是高一年级学生,他们已经具备了一定的逻辑思维、分析问题、表达思想等能力。同时,通过前几个章节的学习与实践,学生已经历了用计算机解决问题的过程与步骤,学会了对计算机程序进行调试,并掌握了顺序、循环、条件三种程序结构,为本节内容的学习提供了良好的基础。前一节的学习,学生掌握了如何用解析法设计程序,但现实生活中也有很多问题往往无法用解析法找到答案,这时就需要使用计算机来帮助我们逐个列举出可能的情况,从而引出本课内容

—— “穷举法”。

三、教材分析

1、教学内容:

本节内容是广东教育出版社出版的普通高中信息技术(选修1)《算法与程序设计》教材第四章第2节的教学内容,包括:穷举法的基本思路,用穷举法求解问题(第一课时),穷举法中穷举方案的选择等(第二课时)。而本节课是穷举法的第一课时(用穷举法解决问题的基本过程)。

2、重点难点分析:

教学重点:

用穷举法解题的基本思路和过程。

教学难点:

分析问题,建立数学模型,构造算法。

3、课时安排:1课时。

四、教学方法

主要教学方法:讲授法 演示法 任务驱动 情境教学

主要学习方法:小组协作 自主探究

五、教学环境

多媒体网络教室 投影仪 多媒体课件

一、教学目标分析

1.知识技能分析

a.认识穷举法在日常生活中问题解决的应用,并认识到利用计算机用穷举法解决问题的高效。

b.掌握穷举法设计程序的基本思想,并了解穷举法的适用范围及变量定义范围。

c.利用穷举法思想编程设计程序,解决问题,并能对它评论。

2.过程与方法

利用“百钱百鸡”问题的解决过程引导穷举法解决问题的方法与过程,并由此类问题(韩信点兵、水仙花数)引导学生对这一类问题抽象出具体的数学模型,运用穷举法能独立的实现程序。

3.情感态度与价值观

能对生活中穷举类问题利用计算机的高效处理能力形成主动运用编程思想解决,并能动手编写程序,实现问题有解决。

二、教学内容分析

教材选自教科版《算法与程序设计》选修第三章第二节的内容,本章内容是在前面两章对于编程的基本结构的基础上,对于实际生活中有代表性的某一类问题的具体算法的介绍,在本章第一节介绍了解析法之后,对于实际生活中列举类问题运用解析法不是太合适,所以引入第二种代表性的算法穷举法的介绍。

三、学生分析

高二学生对世界的认识正处于由感性到理性,由具体到抽象的认识,学生应掌握VB编程的基本知识(数据类型、基本结构、输入输出语句),并理解掌握解析法解决问题。学生对于列举类的问题用解析法来实现学生感到困惑,利用穷举法,因此对此类问题的归纳求解,学生应该掌握。

四、教学重难点

教学重点穷举法设计程序的基本思路,掌握利用穷举法编程解决问题。

教学难点,哪一类问题适合穷举法,穷举的范围以及评价穷举效率的高低。

五、教学方法

归纳推理,任务驱动法

六、教学过程

1

复习:二元一次方程的编程实现(见程序)

教师观察学生对解析法的掌握情况

2

创设情景,提出:“百钱百鸡”问题让学生思考答案。

百元买百鸡:用一百元钱买一百只鸡。已知公鸡5元/只,母鸡3元/只,小鸡1元/3只。

分析:

这是个不定方程——三元一次方程组问题(三个变量,两个方程)

x+y+z=100

5x+3y+z/3=100

设公鸡为x只,母鸡为y只,小鸡为z只。

请思考这道题目能否只用解析法就能解决?为什么会有不同有解?这些解对不对?是怎么得出这些解的?

学生会回答出不同的解

如公鸡是0,母鸡是25只,小鸡是75只

公鸡是4只,母鸡是18只,小鸡是78只

先将公鸡数目设为0,列出母鸡与小鸡的方程求解

再将公鸡数目设为1, 列出母鸡与小鸡的方程求解

再将公鸡数目设为2, 列出母鸡与小鸡的方程求解

再将公鸡数目设为3,列出母鸡与小鸡的方程求解

……………………………………

3

归纳导入“穷举法”概念:像上面求解“百钱百鸡”问题时,列出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解答,就叫穷举法,也叫枚举法

穷举法的实现:请思考在计算机中是怎样求解“百钱百鸡”问题的?

1、问题求解时可能的搜索范围(所有鸡的数目是在0-100之间),利用嵌套循环结构实现

2、问题求解满足的条件:所有鸡的数目之和是100

所花钱数是100

4

提出任务:让学生自己动手实践,编程实现“百钱百鸡”问题的求解

教师巡视,个别辅导,观察学生的编程情况

5

穷举法的优化:将两组程序代码演示给学生,(详细代码请见附录:代码一、二,)

缩短了搜索范围,减少程序运行时间,优化程序

(特别提醒:程序的优化不是编写的代码的长短来衡量)

让学生作比较,比较颜色不同的部分请思考为什么?

6

总结经验,拓展学习:请学生求解韩信点兵问题(假设士兵的数目在100到1000之间)

(详细请见附录:代码三)

请同学思考:能否优化该程序的设计?(见代码四)分析问题:三三之数余二,五五之数余三,七七之数余二,因为三七都是余二,所以该数肯定为二十一余二和除五余三。

学生可能在100-1000之间每个数进行列举

反 思:

穷举法在日常生活中有很多应用实例,如果单靠人脑,花费时间比较烦琐,因此应学会利用计算机编程实现。本节内容教材采用的是分组比赛,但程序比较复杂,大部分学生接受可能存在一定的困难,所以采用的是在编程中比较经典的问题。在教学过程中,特别在确定穷举范围时,要联系前面的知识,另外,穷举法的的优化是本节的重点,要让学生在掌握穷举法的基础上,会对程序进行优化。

(注:所有原程序放在vb文件夹内)

附录:

代码一:

Private Sub Command1_Click()

Dim a, b, c As Integer

Print "公鸡", "母鸡", "小鸡"

For a = 0 To 100

For b = 0 To

100

c = 100 - a - b

If a * 5 + b * 3 + c / 3 = 100 Then

Print a, b, c

End If

Next b

Next a

End Sub

代码二:

Private Sub Command1_Click()

Dim a, b, c As Integer

Print "公鸡", "母鸡", "小鸡"

For a = 0 To 20

For b = 0 To

34

c = 100 - a - b

If a * 5 + b * 3 + c / 3 = 100 Then

Print a, b, c

End If

Next b

Next a

End Sub

代码三:

Private Sub Command1_Click()

Dim  i  As

Integer

For i= 100 To

1000

If  i mod 3 =2 and i mod 5 =3

and i mod 7 =3 Then

Print "该队官兵数可能为:" & i

End If

Next i

End Sub

代码四:

Private Sub Command1_Click()

Dim  i  As

Integer

For  i= 100 To  1000

If  i mod 21 =2 and i mod 5

=3 Then

Print "该队官兵数可能为:" & i

End If

Next i

End Sub

问题设计程序,找出所有水仙花数。所谓水仙花数,是指一个3位数,其各位数字的立方和等于该数字本身。例如,153是一个水仙花数,因为153 = 13 + 53 +33。要求将水仙花数三个一行地显示在窗体上,统计出个数,计算平均值。

水仙花数问题。统计所有水仙花数的数量,并打印。所谓水仙花数是指满足如下条件的三位数:个位数的立方、十位数的立方和百位数的立方和等于其自身。例如407为一水仙花数,

分析

找出水仙花数需要使用循环,从100循环到999。

数据要求

问题中的常量:

问题的输入:

无。

问题的输出:

所有的水仙花数。

设计 初始算法

1 从100循环到999。判断某个数是否是水仙花数。

算法细化

判断一个三位数是否为水仙花的关键是,求出其个位数、十位数和百位数。

1) 百位数计算:a=i/100,求此数被100整除后的商。

2) 十位数计算:b=i/10-a*10,求此数被100整除后的余数。

3) 个位数计算:c=i,求此数被10整除后的余数。

例如,123的各位数字的计算如下:

1) 百位数: 123/100=1;

2) 十位数: 123/10-1*10=2;

3) 个位数: 123=3。

接下来判断 的结果是否等于i.

流程图

实现

#include "stdio.h"

#include "math.h"

void main()

{

unsigned int a,b,c, i,n;

n=0;

for(i=100;i<1000;i++)

{

a=i/100;

b=i/10-a*10;

c=i;

if((a*a*a+b*b*b+c*c*c)==i)

{

printf("]",i);

n++;

}

}

}

测试 输出所有的水仙花数,此处略。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值