人人都能学编程
English 开始学习
课程 1 · 零基础入门第 3 课 / 共 10 课免费阅读

捡宝石 · 机器人闯关

目标不止一个时,怎么规划一段更长的程序?

课程目录

为什么需要它

现在小码有了任务:捡起所有宝石,然后站到旗子上。程序经常要同时完成好几件事。把任务拆成一小段一小段(「走到宝石 1、捡起来、走到宝石 2……」),是程序员管理长程序的基本方法。

直觉理解

想想购物清单:走到 3 号货架,拿牛奶,走到 5 号货架,拿面包,去收银台。每一项都是一个小目标。

pick() 捡起小码脚下那一格的宝石。如果那里没有宝石,小码会报错停下,就像你没法从空货架上拿牛奶一样。

只有捡完全部宝石、并且站在旗子上,这一关才算通过。

定义

分解 Decomposition

Decomposition is breaking a problem into smaller parts that are easier to solve one at a time.
分解就是把一个问题拆成几个更小、更容易逐个解决的部分。

示例

路上一颗宝石

在互动课里运行

小码走到宝石那里,捡起来,再继续走到旗子。

move()
move()
pick()
move()
move()
逐步执行
  1. L1第一部分:走到宝石(第一格)。
  2. L2第二格:小码站在宝石上。
  3. L3第二部分:捡起来,宝石计数变成 1/1。
  4. L4第三部分:走向旗子。
  5. L5站在旗子上,宝石也捡完了:通关。

这里的 pick() 早了一行。运行看看报什么错。

move()
pick()
move()
move()
move()
逐步执行
  1. L1小码走了一格,宝石还在前面一格。
  2. L2在空格上 pick():第 2 行出错。把第 2、3 行对调就好了。

常见错误

只到旗子不算通关

如果还有宝石没捡,就算小码站在旗子上也不算通关。

没有宝石时 pick()

在空格上 pick() 会报错。仔细数格子,或者每写完一部分就运行一次。

小测验

1. 会发生什么?

move()
move()
pick()
move()
  1. A通关
  2. B第 3 行出错:这里没有宝石
  3. C到了旗子但宝石没捡
查看答案

答案:B

宝石在第一格。走了两步后小码已经越过它了。

2. 小码站在旗子上,但地图上还剩一颗宝石。算通关吗?

  1. A算
  2. B不算
查看答案

答案:B

两个条件都要满足:宝石全部捡完,并且站在旗子上。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出数宝石

    预测结果。

  2. 改需求多了一颗宝石

    原来只有一颗宝石时这段程序能通关。现在多了第二颗宝石,把缺的补上。

  3. 从零写拐角宝石

    捡起两颗宝石,最后站在旗子上。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
Decomposition分解Breaking a problem into smaller parts that are easier to solve one at a time.
Error错误A problem that stops a program from running, reported with the line where it happened.