拓冰建站拓冰建站
首页 / 资讯中心 / 正文

算法基础怎么讲透:流程图伪代码到Python可验证代码

简介粤教版2019信息技术必修1第三章的配套课件面向高中信息技术学习者及备考教师围绕算法基础作系统梳理。内容从算法定义、确定性与有穷性等特征切入延伸到自然语言、流程图、伪代码三种描述方式并借助过河问题、鸡兔同笼等经典案例演示问题分析、算法设计、编写程序与调试运行的全过程。包内共1个pptx文件压缩包约8.46MB可直接用于课堂演示或课后复习。该课件目前已有110人学习章节结构完整涵盖计算机解决问题的一般流程、程序三种基本结构及Python实现示例适合作为章节知识清单、备课素材与会考复习提纲使用便于快速把握重点、梳理易错环节。1. 算法基础不是背定义而是能被验证的一串步骤我带过几轮信息技术必修1的课也帮同事改过粤教版2019配套的课件最常听到的一句话是「算法基础这一章不好讲」。不好讲的地方不在于概念多而在于它同时压着两件事一边是「算法是什么、有哪些特征」这种偏描述的内容另一边是「用程序把算法跑出来」这种偏动手的内容。课件上画着流程图底下学生写不出对应代码或者代码抄对了问一句「这里为什么是 21 不是 20」就卡住。这份课件真正要解决的问题是让学生把一段自然语言描述的步骤翻译成机器能执行、自己能验证的代码。它适合刚接触编程的初学者也适合需要把算法基础讲清楚的老师和技术培训者。判断有没有讲透标准只有一个随便给一个边界输入能不能说清结果为什么是它。2. 算法基础的三层描述从自然语言、流程图到伪代码算法基础里最常见的三段式是自然语言、流程图、伪代码。很多人把这三样当成三种并列的写法其实它们是一条逐步消歧的链路自然语言负责说清意图流程图负责说清控制流伪代码负责把控制流压到离代码只差一层。2.1 自然语言描述算法时必须补齐的三个要素用自然语言写一个算法初学者最容易漏掉三样东西输入的范围、循环的终止条件、输出到底是什么。比如「求 1 到 100 的和」这句话听起来完整实际缺了边界——是包含 100 还是不包含是从 1 开始还是从 0 开始。补全后的写法应该是输入为一个正整数 n从 1 开始逐个累加累加到 n 为止输出累加结果。这三要素补齐了后面翻译成流程图和代码才不会各写各的。提示让学生写自然语言描述时强制要求写出「输入」「处理」「输出」三行能挡掉大部分后续的翻译错误。2.2 流程图符号与 Python 语句的对应关系流程图是算法基础里视觉信息量最大的一层。符号本身不多但要和代码对上得有一张对照表。我一般会给学生下面这张表让他们照着把课件上的图形逐个落到语句上。流程图形状含义对应的 Python 语句圆角矩形 / 椭圆起止程序入口、return、函数定义平行四边形输入 / 输出input()、print()矩形处理赋值、算术运算菱形判断if/elif/while条件箭头流向语句的先后顺序这张表的价值在于它把「画图」和「写码」这两个动作绑成了一条线。学生画完流程图只要逐个图形往上套代码骨架基本就出来了剩下的只是语法细节。2.3 伪代码到可运行代码的转换约定伪代码没有统一标准粤教版2019里常见的写法是「输入」「输出」「当……时」这类中文关键字配数学符号。转成 Python 时需要先约定一套固定映射避免每次翻译都靠感觉。# 伪代码输入 ns ← 0i ← 1当 i ≤ n 时s ← s ii ← i 1输出 s n int(input(请输入 n)) # 输入转成整型 s 0 # 初始化累加器 i 1 # 初始化计数器 while i n: # 当 i n 时 s s i # 累加 i i 1 # 计数器自增 print(s) # 输出结果逻辑上这段代码严格照着伪代码逐句翻译输入、初始化、条件循环、累加、自增、输出。参数上要注意两个点一是input()返回字符串必须用int()转成整数否则i n会直接抛类型错误二是i i 1不能漏漏了就是死循环。把这两点当成翻译规则固定下来学生后面写任何循环都会先检查「有没有自增」。3. 三种基本控制结构的最小可运行代码算法基础的另一条主线是顺序、选择、循环三种基本结构。课件上讲特征和区别落到代码上就是几个最小例子。我一般要求每个结构都能手写出来并且能说清每个参数为什么这么设。3.1 顺序结构输入、处理、输出的固定骨架顺序结构听着简单实际最容易在输入输出上翻车。a input(输入第一个数) # 拿到的是字符串 b input(输入第二个数) a, b b, a # 交换两个变量的值 print(交换后, a, b)这段代码演示的是变量交换Python 里用元组解包一步完成不需要中间变量。参数上的关键点是input()的类型这里不参与算术所以不转整型也没关系但只要后面要做加减就必须int()或float()。很多初学者写顺序结构出错问题不在逻辑而在忘了处理输入类型。3.2 选择结构if-elif-else 的判断顺序不能乱选择结构的核心是分支互斥Python 用缩进表达归属这点和流程图里的菱形出口一一对应。score float(input(请输入成绩)) if score 90: # 第一个条件先卡最高档 grade A elif score 75: # 落在 75~89 grade B elif score 60: # 落在 60~74 grade C else: # 低于 60 grade D print(等级, grade)这段的关键在于判断顺序必须从高到低。如果把score 60写在最前面那 95 分也会先命中第一个条件被判成 C。参数上elif是「否则如果」它自带互斥含义写了elif就不需要再写score 90这类范围上限。嵌套选择里我还见过学生把else缩进错位导致分支挂到了内层if上结果和预期完全相反——这类问题靠肉眼很难发现用后面第 5 章提到的边界测试法一测就现形。3.3 循环结构for 和 while 的选型与终止条件循环结构在算法基础里是重头课件会强调「已知次数用 for条件驱动用 while」。这个说法对但要落到代码上才看得出差别。# for 版本循环次数已知range 左闭右开 total 0 for i in range(1, 101): # 1 到 100不含 101 total i print(total) # while 版本靠条件退出 total 0 i 1 while i 100: # 条件为真就继续 total i i 1 # 别忘了改条件变量 print(total)两段代码结果都是 5050但风险点不同。range(1, 101)最容易错的是右边界写成range(1, 100)就少加了一个 100而且不报错只给你一个错误结果。while版本的风险在终止条件i 1漏写就是死循环i 100写成i 100同样少算。我通常建议初学者先用 for 写等能说清「循环变量最终停在哪个值」再改用 while。4. 算法基础里几个经典案例的代码与参数粤教版2019这一章后面会带几个典型案例枚举、递推、解析都有。案例本身不难难的是循环边界和数位拆分这些参数怎么定。4.1 枚举法百钱百鸡的循环上界该怎么算百钱百鸡是枚举法的标准例子公鸡 5 钱一只母鸡 3 钱一只小鸡 1 钱三只100 钱买 100 只问各买几只。暴力三重循环能出结果但上界可以靠约束推出来少算很多无效组合。for rooster in range(0, 21): # 公鸡最多 100//5 20 只 for hen in range(0, 34): # 母鸡最多 100//3 ≈ 33 只 chick 100 - rooster - hen # 小鸡由总数倒推省掉一层循环 if chick % 3 0 and 5 * rooster 3 * hen chick // 3 100: print(公鸡, rooster, 母鸡, hen, 小鸡, chick)逻辑上有两个优化点。一是公鸡上界取 21因为range右开实际取到 20母鸡取 34实际到 33。这两个数是用钱数除以单价推出来的不是拍的。二是小鸡不枚举用100 - 公鸡 - 母鸡直接算出来循环从三层降到两层。参数上chick % 3 0这个判断不能省因为小鸡是三只一钱只数必须是 3 的倍数否则chick // 3会引入取整误差。4.2 质数判断循环上界为什么是根号 n判断质数是最常见的枚举案例性能差别全在循环上界。n int(input(请输入一个大于 1 的整数)) is_prime True for i in range(2, int(n ** 0.5) 1): # 上界取根号 n右开所以 1 if n % i 0: is_prime False break # 找到因子就可以提前退出 print(n, 是质数 if is_prime else 不是质数)逻辑上如果 n 有一个大于根号 n 的因子那它必然对应一个小于根号 n 的因子所以只需要试到根号 n。参数上int(n ** 0.5) 1里的1是为了把上界本身包括进去因为range右开漏了这个1像 49 这种完全平方数会被误判成质数。另外这段代码假设输入大于 1如果输入 1 或负数range直接为空is_prime保持True结果是错的——这正是校验输入边界的必要之处。4.3 递推法斐波那契数列的两种写法对比斐波那契是递推的代表递归写法直观但慢递推写法快得多。def fib(n): if n 1: return None # 处理非法输入 a, b 1, 1 # 前两项都为 1 for _ in range(n - 1): # 迭代 n-1 次 a, b b, a b # 同时更新a 是当前项 return a print([fib(i) for i in range(1, 11)])逻辑上a, b b, a b用元组解包一次性完成更新等价于「先算新值再赋值」避免了先用中间变量暂存的麻烦。参数上range(n - 1)是因为第一项已经由初始值给出后面只需要推 n-1 次。这个写法时间复杂度 O(n)、空间 O(1)而递归版本的重复计算会让 n 稍大就跑不动学生跑一次就能直观感受到「同一个算法基础问题不同描述方式代价差多少」。4.4 解析法水仙花数里的数位拆分水仙花数是解析法的典型三位数各位数字的立方和等于自身。for num in range(100, 1000): hundreds num // 100 # 百位 tens num // 10 % 10 # 十位先去掉个位再取最后一位 ones num % 10 # 个位 if hundreds ** 3 tens ** 3 ones ** 3 num: print(num)数位拆分靠整除和取余组合。num // 100把后两位丢掉得到百位num // 10 % 10先把个位切掉再对 10 取余拿到十位num % 10直接取个位。参数上range(100, 1000)覆盖所有三位数右开所以到 999。这套拆分方法可以推广到任意位数是算法基础里为数不多「一旦理解就能复用」的技巧。案例方法关键参数常见错误百钱百鸡枚举公鸡 21、母鸡 34 上界小鸡未判 3 的倍数质数判断枚举上界int(n**0.5)1漏 1完全平方数误判斐波那契递推range(n-1)用递归导致重复计算水仙花数解析整除加取余拆分位数拆分顺序写反5. 把算法基础落到可验证边界测试与断言技巧课件讲完、代码写完最后一步是验证。很多人以为输出对了就算过但算法基础的坑几乎都藏在边界上。我的习惯是先列出输入的边界集合再逐个跑看结果是不是和手算一致。拿质数判断来说边界集合至少包括 1、2、3、4、9、49、97。1 应该在输入校验阶段就被拦下2 是唯一被range(2, 2)跳过的偶数质数循环体一次都不执行直接返回True49 是 7 的平方专门用来验证上界的1有没有漏。把这几个数写成一个断言列表跑一次就能覆盖掉大部分隐蔽 bug。# 用断言批量验证质数判断的边界 def is_prime(n): if n 2: return False # 小于 2 一律不是质数 for i in range(2, int(n ** 0.5) 1): if n % i 0: return False return True for n, expect in [(1, False), (2, True), (3, True), (4, False), (49, False), (97, True)]: assert is_prime(n) expect, fn{n} 判定错误 # 不符就报错指出是哪个输入 print(全部通过)断言的价值在于它把「我以为对了」变成「跑过才知道」。expect是手算出来的期望值assert一旦不成立就抛出具体是哪个n出错比盯着一堆print输出找问题快得多。对循环类算法另一个技巧是在循环里打印循环变量的轨迹而不是只看最终结果。比如百钱百鸡把rooster和hen每轮的值打出来能直接看出上界有没有提前截断解。课件上的流程图是静态的而循环变量的轨迹是动态的两者对不上多半是流程图里某个箭头方向被理解反了。把轨迹打印和断言结合起来算法基础里那几个案例的边界问题基本都能在十分钟内定位清楚。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门