
简介这份资源是粤教版2019信息技术必修1第三章《算法基础》的配套教学课件面向高中信息技术教师备课授课与高一学生同步复习使用也可供初学者梳理算法入门知识。内容围绕算法定义与五大特征展开串联自然语言、流程图、伪代码三种描述方式并以过河问题、鸡兔同笼两个经典案例演示从分析问题、设计算法到编写程序、调试运行的完整流程还附有流程图基本符号与程序三种基本结构的讲解以及用Python实现鸡兔同笼求解的代码示例。资源压缩包内共1个pptx文件约8.46MB页面以目录导航配合分步标题组织便于课堂投屏逐节讲解或课后按模块自学。已有110人学习适合需要快速搭建课堂主线、对照知识点查漏补缺的师生参考借鉴。1. 牧羊人过河与鸡兔同笼算法基础这份课件到底解决什么问题翻到粤教版2019必修1第三章「算法基础」这套PPT第一反应是案例选得很克制一个是牧羊人带羊、狼、白菜过河一个是鸡兔同笼都不需要写复杂代码却把「算法是什么、怎么描述、怎么落地成程序」这条主线串完了。课件主干包含算法定义与五大特征、自然语言/流程图/伪代码三种描述方式、流程图符号与顺序选择循环三种结构以及鸡兔同笼从方程组推导到Python程序、再到调试运行的完整链路。中学信息技术课可以直接拿去上准备信息技术水平考试的人能拿它当复习骨架刚学编程的自学者也可以补上「先想清楚再写代码」这一课。反直觉的一点在于这节课的落点不是会不会写Python而是能不能把解决问题的步骤说清楚。代码只是最后一步的翻译结果。2. 算法五大特征与三种描述方式的边界自然语言、流程图、伪代码怎么选2.1 五大特征当成检查清单用而不是背诵条目课件给的定义是算法是在有限步骤内求解某一问题所使用的一组定义明确的规则通俗说法是能被机械执行的动作或指令的有穷集合。这句话里藏着三个关键词——有限、明确、可机械执行正好对应后面的特征条目。确定性指每一步都有明确的操作。过河问题里「第一步人和羊过河人返回留下羊」是确定的如果写成「想办法先把危险的一方带过去」就没法机械执行。有穷性指步骤数量有限而且能在有限时间内结束写循环时尤其要注意一个 while 条件永远为真的程序不是算法只是没终止的程序。可行性指每一步都能拆成基本操作2a - b/2是四则运算可行「求出所有可能解里最优的那个」在没定义清楚搜索范围之前就不可行。数据输入是算法处理的对象鸡兔同笼里就是头数 a 和脚数 b数据输出是算法给出的结果也就是解出的 x、y。课件里的判断题值得反复用。「算法就是解决问题的方法」判错因为方法可以笼统算法必须是有限、确定、可执行的步骤序列。「每个问题都有固定唯一的算法」也判错鸡兔同笼既可以用二元一次方程组直接解也可以枚举所有可能的鸡数逐个试两种算法在效率上的差距正好是后面讲算法效率的伏笔。提示判断题不要只对答案。让学生说出另外几个选项错在哪里比判对错有效得多。2.2 自然语言描述门槛最低歧义最多鸡兔同笼的自然语言算法是五步输入 a 和 b 的值求 x 2a - b/2求 y b/2 - a输出 x 和 y 的值结束。谁都能看懂这是它最大的优势也是它唯一的优势。局限有三条语句冗长容易产生二义性比如「求 x 2a - b/2」里其实已经混进了数学符号严格说不再是纯自然语言不方便直接翻译成机器语言。还有一个细节值得在课上点一下——第二步和第三步的顺序可以互换因为两者互不依赖但第五步「结束」不能提前这就是顺序结构里「有依赖的步骤不能随意调换」的最小例子。2.3 伪代码描述向机器语言推进一步伪代码用介于自然语言和计算机语言之间的文字和符号描述算法不关心类型声明和语法细节。# 伪代码鸡兔同笼求解用 Python 风格书写但忽略语法细节 input a, b # 输入头数和脚数 x 2 * a - b / 2 # 由方程组消元得到鸡的数量 y b / 2 - a # 得到兔的数量 print x, y # 输出结果逻辑说明伪代码保留了输入、赋值、运算、输出这些语义省掉了类型转换、变量声明这些语言细节。参数说明a 表示头数b 表示脚数x、y 是待求的鸡数和兔数。之所以写成赋值表达式而不是中文句子是为了让每一步都可执行、可核对。写伪代码时最容易踩的坑是把当数学等号。数学里x 2a - b/2描述的是等式关系伪代码里是赋值动作右边先算完再写进左边方向反了语义就错了。2.4 三种描述方式的取舍描述方式优点局限典型使用场景自然语言无学习成本便于口头交流冗长、可能出现歧义课堂分析问题、小组讨论阶段流程图结构清晰分支与循环一目了然符号多复杂算法图形过大讲清控制结构、考试画图题伪代码接近程序便于直接翻译需要约定书写规范从算法设计过渡到编码实际推进顺序一般是先用自然语言把思路讲一遍确认没问题再画流程图检查控制流有没有漏洞最后写伪代码准备落地。反过来做先写代码再补描述边界情况往往就漏掉了。3. 流程图符号体系与顺序、选择、循环三种结构的画法3.1 六个基本图形符号与进出线规则图形符号名称说明进出线约束圆角矩形或椭圆起止框表示算法的开始或结束开始框一流出结束框一流入平行四边形输入/输出框标明输入或输出的内容一流入、一流出矩形处理框标明要执行的处理动作一流入、一流出菱形判定框标明判定条件框外标 T/F 流向一流入、两流出箭头流线表示从一个框到另一个框的流向连接用小圆圈连接圈表示流向的出口或入口连接点跨页或避免线条交叉时使用判定框是唯一允许两条流出线的符号但同一时刻只有一条起作用。这条规则看着简单手绘时标反 T/F 的情况非常普遍。3.2 顺序、选择、循环三种基本结构的代码对照顺序结构从上到下依次执行鸡兔同笼的主流程就是纯顺序结构没有分支也没有重复。选择结构可以拿课件里那个例子讲判定条件是 a b取 a 5、b 7T 分支输出 a、F 分支输出 b最后结果应该是 7。# 选择结构判定框对应 if两条流出线对应两个分支 a 5 b 7 if a b: print(a) # 条件为真走这条 else: print(b) # 条件为假走这条实际输出 7逻辑说明if/else与流程图上的判定框一一对应条件写在判定框内T、F 标在两条流出线上。参数说明a、b 是参与比较的两个值条件 a b 在任何一侧分支执行前先求值只会走其中一条。循环结构在过河问题里其实也出现了——「载货过河、人返回」这套动作重复了多次只是课件把它拆成了四个步骤。鸡兔同笼如果换成枚举法循环就绕不开了。# 循环结构枚举所有可能的鸡数找到脚数匹配的那一组 heads, feet 35, 94 for chickens in range(heads 1): # 鸡的数量从 0 试到头数 rabbits heads - chickens # 兔的数量由头数推出 if 2 * chickens 4 * rabbits feet: print(鸡, chickens, 兔, rabbits)逻辑说明for同时承担了判定和回边两个角色range(heads 1)提供循环变量序列if在循环体内做判定命中就输出。参数说明heads、feet 是题目给定的头数和脚数chickens 是循环变量。这段代码输出鸡 23 只、兔 12 只与方程组直接求解的结果一致。流程图上的关键是那条回边没有从循环体末尾回到判定框的流线图就退化成顺序结构了。3.3 从自然语言步骤到流程图的转换套路我一般按四步走把自然语言算法的每一步编号标出哪些是输入输出、哪些是处理、哪些是判断确定开始和结束先把主干画出来把判断和重复拎出来换成判定框和回边最后逐个检查框的进出线数量。鸡兔同笼的框连接关系可以直接列成表照着连线比空手画快得多。框编号类型内容后继B1起止框开始B2B2输入框输入 a, bB3B3处理框x 2a - b/2B4B4处理框y b/2 - aB5B5输出框输出 x, yB6B6起止框结束无3.4 手绘和检查控制流时最常见的四类错误第一类是判定框只画了一条流出线或者 T/F 标反。第二类是符号用错输入输出用了矩形处理步骤用了平行四边形这种情况在批改作业时一眼能看出来。第三类是循环缺回边或者回边接到了处理框而不是判定框上画出来看着像循环控制流实际是错的。第四类是结束框后面还接了流线或者连接圈被当成普通节点到处乱用。注意检查流程图最快的办法是顺着流线走一遍看每个框是不是都「进得来、出得去」起止框按定义例外。4. 鸡兔同笼的完整求解链路方程组、伪代码到 Python 程序4.1 建模头脚条件怎么变成二元一次方程组设鸡 x 只兔 y 只头数 a脚数 b。每只鸡一个头两只脚每只兔一个头四只脚于是得到两个方程x y a2x 4y b。消元过程要写清楚才不算背公式。第一式两边乘 2 得 2x 2y 2a用第二式减它得 2y b - 2a所以 y b/2 - a代回第一式得 x a - y 2a - b/2。课件里直接给出这两个结果把推导补上学生才不会当成咒语记。代入 a 35、b 94y 94/2 - 35 12x 70 - 47 23。验算一遍23 12 352×23 4×12 46 48 94两组条件都满足。这里还有个隐含条件值得提脚数 b 必须是偶数且解出的 x、y 都不能为负否则题目本身不成立。4.2 算法步骤与流程图的一一对应步骤内容对应符号1输入 a、b输入/输出框平行四边形2x 2a - b/2处理框矩形3y b/2 - a处理框矩形4输出 x、y输入/输出框平行四边形5结束起止框这五步是纯顺序结构所以在图上是一条直线走到底。判断该不该画判定框有个简单标准步骤里出现条件就画菱形没出现就别画。4.3 从伪代码到可运行的 Python# 鸡兔同笼输入头数和脚数输出鸡和兔的数量 a int(input(请输入头数:)) # input 返回字符串int() 转成整数 b int(input(请输入脚数:)) x int(2 * a - b / 2) # 计算鸡的数量 y int(b / 2 - a) # 计算兔的数量 print(鸡的数量为, x) print(兔的数量为, y)逻辑说明前两行完成读入和类型转换中间两行各做一次算术运算最后两行输出。参数说明input()拿到的是字符串必须用int()转换后才能参与算术/在 Python 3 里得到浮点数int()把结果截断成整数35 和 94 这组数据不会出现精度问题。请输入头数:35 请输入脚数:94 鸡的数量为 23 兔的数量为 124.4 输入校验与边界处理上面这段能跑但遇到奇数脚数、负数或者脚数明显不合理的情况会输出负数甚至不存在的解。把它改成带判断的版本def solve(heads, feet): 返回 (鸡数, 兔数)输入不合法时返回 None if feet % 2 ! 0 or feet 2 * heads or feet 4 * heads: return None # 脚数为奇数或超出合理区间 rabbits feet // 2 - heads # 用整除表达这里本就是整数运算 chickens heads - rabbits return chickens, rabbits for h, f in [(35, 94), (35, 95), (10, 20), (10, 45)]: print(h, f, -, solve(h, f))逻辑说明feet % 2 ! 0排除奇数脚数feet 2 * heads排除脚太少feet 4 * heads排除脚太多三种情况统一返回 None。参数说明heads、feet 是形参//是整除运算符比int(... / ...)更能表达「这里本来就是整数」这层意思。35 94 - (23, 12) 35 95 - None 10 20 - (10, 0) 10 45 - None(10, 20)对应 10 只鸡、0 只兔是合法解。这种情况课件里没提但学生一定会问提前用一张边界测试表说清楚更省事。5. 语法错误、逻辑错误与交叉验证把程序验算做扎实5.1 两类错误的分工语法错误交给解释器逻辑错误交给验算课件最后提到了两类错误值得展开。语法错误计算机能直接指出少个右括号、input拼错解释器会给出文件名和行号照着改就行。逻辑错误计算机一句怨言都没有程序照常跑完只是结果是错的——把x 2*a - b/2写成x 2*a - b*2Python 会安静地输出一个荒谬的答案。抓逻辑错误靠手工验算构造几组已知答案的测试数据算一遍再和程序输出比对比对代码本身有用得多。头数 a脚数 b期望鸡 x期望兔 y说明35942312课件原题1401全是兔1210全是鸡1045无解无解脚数为奇数5.2 用枚举法交叉验证公式法更可靠的一条路是让两个独立算法互相对账。枚举法不依赖任何公式按定义逐个试结果天然可信# 用枚举结果校验公式法两者不一致就说明公式实现有问题 def brute_force(heads, feet): for r in range(heads 1): # 兔的数量从 0 试到头数 c heads - r # 鸡由头数反推 if 2 * c 4 * r feet: return c, r return None assert solve(35, 94) brute_force(35, 94) (23, 12)逻辑说明range(heads 1)覆盖 0 到头数的全部可能找到第一组满足脚数条件的就返回。用assert把两种算法的结果绑在一起公式写错会立刻抛 AssertionError而不是等到人工比对时才发现。参数说明heads、feet 与 solve 函数保持一致便于直接对拍。这个对拍过程在课堂上还有第二个用途讲清同一个问题可以有不同的算法。枚举是随头数线性增长的循环公式法是常数次运算头数越大差距越明显。信息技术水平考试和各类信息技术笔试的算法基础题很多时候就是把这层「等价性与效率差异」做成选项来考。日常调试再补一个小习惯——在关键步骤插一句print(x, y)比盯着代码找问题快得多这也是课件里「调试运行程序」这一步最实在的落地方式。本文还有配套的精品资源点击获取