人人都能学编程
English 开始学习
课程 0 · 编程之前第 8 课 / 共 8 课免费阅读

伪代码与找 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")
逐步执行
  1. L1在下雨吗?是。raining = True
  2. L2检查条件:成立。true
  3. L3所以执行 if 下面缩进的那一步。Take an umbrella
  4. L6else 部分被跳过。这一行没有缩进,所以总会执行。Go outside

重复:倒数

动手试试

一个 while 循环:条件成立就一直重复。改成从 5 或 10 开始试试。

count = 3   # change me 改这里
while count > 0:
    print(count)
    count = count - 1
print("Lift off!")
逐步执行
  1. L1从 3 开始。count = 3
  2. L2count 大于 0 吗?是,执行缩进的步骤。3 > 0
  3. L3说出这个数。3
  4. L4减一,然后回到上面再检查。count = 2
  5. L2说完 3、2、1,count 变成 0,条件不成立了。0 > 0 is false
  6. L5循环结束。Lift off!

步骤一个不少,但有两步顺序反了:盖子还没拧开,怎么挤牙膏?把前两行对调一下(剪下一行,粘到另一行下面),再运行。

print("Put toothpaste on the brush")
print("Take the cap off the toothpaste")
print("Brush for two minutes")
print("Rinse your mouth")
逐步执行
  1. L1计算机照样先做这一步,盖子还没开。Put toothpaste on the brush
  2. L2太晚了:这一步本该在最前面。Take the cap off the toothpaste
  3. L3其余的没问题。Brush for two minutes

常见错误

缩进决定哪些步骤会重复

在「重复 3 次」里,只有缩进的行会重复。多缩进一行,那一步就做三遍;少缩进一行,就只做一遍。Python 也是同样的规则。

人会自动补上的,计算机不会

对人说一句「去刷牙」就够了,人会自己补上那些理所当然的步骤。计算机却每一步都要你写:拿起牙刷、拧开盖子、挤牙膏……漏掉步骤,是最常见的 bug。

出 bug 很正常

不管是谁,程序第一次就跑对的情况都很少。bug 是一道谜题,不说明你不适合学这个。一步一步 trace,找到出错的那一步,改好,再试一次。

小测验

1. 这段会说出什么?

temperature = 30
if temperature is above 25
    say "Shorts"
otherwise
    say "Jeans"
  1. AShorts
  2. BJeans
  3. C先 Shorts,再 Jeans
查看答案

答案:A

30 大于 25,条件成立,所以只执行 if 那部分,otherwise(否则)那部分被跳过。

2. 依次说出了什么?

repeat 2 times
    say "hip"
say "hooray"
  1. Ahip hip hooray
  2. Bhip hooray hip hooray
  3. Chip hooray
查看答案

答案:A

只有缩进的那一行会重复:hip、hip。say "hooray" 没有缩进,所以在循环之后只说一次。

3. 菜谱里写着「盐适量」。对计算机来说,问题在哪里?

  1. A不够精确:计算机没法判断「适量」是多少
  2. B太短了
  3. C没有问题
查看答案

答案:A

人可以凭经验判断,计算机需要准确的量,比如「加 2 克盐」。

要点

  • 程序由三种步骤组成:顺序、判断(如果 / 否则)和重复(循环)。
  • 缩进说明哪些步骤属于某个「如果」或某个循环。
  • 出 bug 很正常。一步一步 trace,就能找到它。

计算机入门学完了!下一门课机器人闯关,会把这些积木变成指挥小机器人的真正 Python 指令。

动手练习

3 道小练习:先想一想,再动手改一改看看结果,最后自己来一次。提交马上告诉你对不对。

  1. 想一想跟着买贴纸

    一步一步 trace 这段伪代码:

    money = 5
    当 money 大于 0
        花 2 块买一张贴纸
        money 减少 2

    它一共买了几张贴纸?

  2. 改一改拍、拍、拍、鞠躬

    目标是拍手 3 次,然后鞠躬一次。可是这台机器每拍一次手就鞠一次躬。先运行看看。

    修好这个 bug,让它打印:

    clap
    clap
    clap
    bow
  3. 自己来给机器人指路

    为一个机器人写出你自己的算法。机器人 ^ 面朝上,# 是墙,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.