伪代码与找 bug · 计算机入门
还不会任何编程语言的时候,怎样把指令写得精确到计算机都能照做?
课程目录为什么需要它
程序员常常先用大白话把计划写下来,再把计划变成代码。这个大白话版本叫伪代码 Pseudocode。
它只由三种步骤组成:按顺序做、用「如果」做判断、重复做。下一门机器人课要写的就是这三种,以后学任何编程语言也都是它们。在这里学,不用操心任何符号规则。
直觉理解
伪代码就是用日常语言写的指令,但写得像代码一样仔细。几乎所有程序都由三种步骤组成。
1. 顺序 Sequence:一步接一步。
把面包放进烤面包机
按下拉杆
等它弹起来2. 判断 Decision:如果某件事成立就做这个,否则做那个。
如果 在下雨
带伞
否则
戴墨镜3. 重复 Repetition:一遍又一遍地做。
重复 3 次
拍手或者,事先不知道要做几次的时候:
当 杯子还没满
再倒一点水缩进的行(往右推进去的行)属于它上面那个「如果」或「重复」。没有缩进的行只做一次,在它们之后。
还可以给一组步骤起个名字:「泡茶:烧水,把茶包放进杯子,倒水,等 3 分钟」。从此以后,「泡茶」就是一个新的步骤,在哪里都能用。这叫函数 Function。
Bug。某一步写错了、漏了或者放错了位置,结果就会错,这就是 Bug;把它找出来、改好,叫调试 Debugging。每个程序员每天都会写出 bug,厉害的程序员靠 trace(追踪)找到它们:像计算机那样,一步一步地照着走。
右边的机器,就是把上面的伪代码写成了 Python。Python 读起来和伪代码差不多,你很快就会学到。
定义
伪代码 Pseudocode
Pseudocode describes the steps of an algorithm in plain language, structured like code but not meant to be run by a computer.伪代码用普通语言描述算法的步骤,结构像代码,但不是给计算机直接运行的。
循环 Loop
A loop repeats a group of steps, either a set number of times or for as long as a condition is true.循环让一组步骤重复执行:要么重复固定的次数,要么在某个条件成立时一直重复。
程序错误 Bug
A bug is a mistake in a program that makes it behave differently from what was intended.Bug 是程序里的错误,让程序的表现和本来想要的不一样。
找出并改好 bug,叫调试 Debugging。
示例
判断:带伞还是戴墨镜
动手试试上面那个判断,写成了 Python。True 表示是,False 表示否。改一改再运行:两行缩进的只会执行一行,而 Go outside 每次都会执行,因为它没有缩进。
raining = True # change me 改这里: True or False
if raining:
print("Take an umbrella")
else:
print("Wear sunglasses")
print("Go outside")- L1在下雨吗?是。
raining = True - L2检查条件:成立。
true - L3所以执行 if 下面缩进的那一步。
Take an umbrella - L6else 部分被跳过。这一行没有缩进,所以总会执行。
Go outside
重复:倒数
动手试试一个 while 循环:条件成立就一直重复。改成从 5 或 10 开始试试。
count = 3 # change me 改这里
while count > 0:
print(count)
count = count - 1
print("Lift off!")- L1从 3 开始。
count = 3 - L2count 大于 0 吗?是,执行缩进的步骤。
3 > 0 - L3说出这个数。
3 - L4减一,然后回到上面再检查。
count = 2 - L2说完 3、2、1,count 变成 0,条件不成立了。
0 > 0 is false - L5循环结束。
Lift off!
找 bug
动手试试步骤一个不少,但有两步顺序反了:盖子还没拧开,怎么挤牙膏?把前两行对调一下(剪下一行,粘到另一行下面),再运行。
print("Put toothpaste on the brush")
print("Take the cap off the toothpaste")
print("Brush for two minutes")
print("Rinse your mouth")- L1计算机照样先做这一步,盖子还没开。
Put toothpaste on the brush - L2太晚了:这一步本该在最前面。
Take the cap off the toothpaste - L3其余的没问题。
Brush for two minutes
常见错误
缩进决定哪些步骤会重复
在「重复 3 次」里,只有缩进的行会重复。多缩进一行,那一步就做三遍;少缩进一行,就只做一遍。Python 也是同样的规则。
人会自动补上的,计算机不会
对人说一句「去刷牙」就够了,人会自己补上那些理所当然的步骤。计算机却每一步都要你写:拿起牙刷、拧开盖子、挤牙膏……漏掉步骤,是最常见的 bug。
出 bug 很正常
不管是谁,程序第一次就跑对的情况都很少。bug 是一道谜题,不说明你不适合学这个。一步一步 trace,找到出错的那一步,改好,再试一次。
小测验
1. 这段会说出什么?
temperature = 30
if temperature is above 25
say "Shorts"
otherwise
say "Jeans"查看答案
答案:A
30 大于 25,条件成立,所以只执行 if 那部分,otherwise(否则)那部分被跳过。
2. 依次说出了什么?
repeat 2 times
say "hip"
say "hooray"查看答案
答案:A
只有缩进的那一行会重复:hip、hip。say "hooray" 没有缩进,所以在循环之后只说一次。
3. 菜谱里写着「盐适量」。对计算机来说,问题在哪里?
查看答案
答案:A
人可以凭经验判断,计算机需要准确的量,比如「加 2 克盐」。
要点
- 程序由三种步骤组成:顺序、判断(如果 / 否则)和重复(循环)。
- 缩进说明哪些步骤属于某个「如果」或某个循环。
- 出 bug 很正常。一步一步 trace,就能找到它。
计算机入门学完了!下一门课机器人闯关,会把这些积木变成指挥小机器人的真正 Python 指令。
动手练习
3 道小练习:先想一想,再动手改一改看看结果,最后自己来一次。提交马上告诉你对不对。
- 想一想跟着买贴纸
一步一步 trace 这段伪代码:
money = 5 当 money 大于 0 花 2 块买一张贴纸 money 减少 2它一共买了几张贴纸?
- 改一改拍、拍、拍、鞠躬
目标是拍手 3 次,然后鞠躬一次。可是这台机器每拍一次手就鞠一次躬。先运行看看。
修好这个 bug,让它打印:
clap clap clap bow - 自己来给机器人指路
为一个机器人写出你自己的算法。机器人
^面朝上,#是墙,F是旗子:# # # # # . F # # . # # # ^ # # # # # #它只听得懂三个指令:M = 向前走一格,L = 向左转,R = 向右转(转身不会移动)。
写出让机器人走到旗子上的最短指令序列,例如
MLMR。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Pseudocode | 伪代码 | Steps written in plain language but structured like code. |
| Sequence | 顺序 | Steps carried out one after another, in order. |
| Condition | 条件 | A question with a yes-or-no answer that decides which steps run. |
| Loop | 循环 | A group of steps repeated a set number of times or while a condition is true. |
| Function | 函数 | A named group of steps you can use again and again by its name. |
| Bug | 程序错误 | A mistake in a program that makes it do something unintended. |
| Debugging | 调试 | Finding and fixing bugs, often by tracing the steps one at a time. |