跳至内容
Topos Uranos

摘要

本课开启本课程的第四单元,这一单元专讲流程控制。本课说明这一单元的用途:教人用判断和循环来掌控程序中语句的执行顺序,并对其正确性进行推理,也就是确保每一种情形都得到处理,每一个循环都做它应做的事,并且会终止;介绍本单元的四节课和贯穿它们的线索;回顾本单元假定已经掌握的内容,尤其是第三单元的复合条件;提出本单元要解决的问题,即一个用固定步数计算最大公因数的程序,它会因数据不同而给出错误的回答,或者停在一次除以零上;预先介绍不变式,即本单元用来论证其循环的工具;并说明本单元通向何处,包括后面各单元以及“C++ 程序设计 II”课程。

学习目标

  1. 描述本单元内容的先后顺序,并说明每一节课为紧随其后的那一节课提供了什么。
  2. 回忆第三单元的复合条件(逻辑联结词、短路求值以及按德摩根律取反),必要时加以复习。
  3. 借助一个例子,预先认识作为推理工具的不变式:一种在重复过程中保持不变、并在结束时给出结果的变量之间的关系。
  4. 认清学完本单元时应当会做的事,并把它与后面各单元将要学习的内容区分开来。

入门测评

在学习本单元之前,先测一测自己的起点是有益的。这项测评是自我测评:不计分,唯一的目的是为学习指引方向。前四道题检查本单元假定已经掌握的内容:复合条件的取反、短路求值、第 1.1 课中一个重复过程的跟踪,以及 int 的界限。其后的七道题按课的顺序涉及本单元的核心思想,其中有几道从学校数学出发:最大公因数、求和符号、一个过程的终止性。没有人必须现在就答对,其中有几道题里,“我还不知道”是诚实的回答:每个答案,无论对错,都会解释要点,并指出讲解这一要点的那节课。同样的能力会在单元末尾的总结课中再次测量。

入门测评

开始本单元之前,先测一测你的起点。这是一次简短的自我测评:不计分,结果只保存在你的浏览器中。

  1. 第 1 题来自前面的单元条件 1 <= n && n <= 10 的否定是什么?

  2. 第 2 题来自前面的单元在 int d{0}; 和 int n{5}; 之下,计算 d != 0 && n / d > 2 时会发生什么?

  3. 第 3 题来自前面的单元第 1.1 课的连续减法求商从 q=0q = 0 和 r=ar = a 开始,并重复“当 r≥br \geq b 时,把 bb 从 rr 中减去,并给 qq 加 1”。在 a=20a = 20、b=5b = 5 时,重复过程的循环体执行多少次?

  4. 第 4 题来自前面的单元对于 32 位的 int,标准对 46341 * 46341 的值作出了什么保证?

  5. 第 5 题一个程序包含这样的判断链:if (score >= 50),输出“及格”;else if (score >= 90),输出“优秀”;以及 else,输出“不及格”。当 score 等于 95 时,它输出什么?

  6. 第 6 题下面哪个表达式表示和 1+2+⋯+n1 + 2 + \cdots + n?

  7. 第 7 题在 int total{0}; 之下,执行 for (int i{0}; i < 5; ++i) { total += i; } 之后,std::println("{}", total); 输出什么?

  8. 第 8 题在连续减法求商中(q=0q = 0,r=ar = a;当 r≥br \geq b 时,rr 变为 r−br - b,qq 变为 q+1q + 1),每次计算条件时,变量之间成立的是哪一个关系?

  9. 第 9 题一个过程从任意一个整数 nn(正数、零或负数)出发,重复“当 n>0n > 0 时,从 nn 中减去 2”。它对每个 nn 都会终止吗?

  10. 第 10 题84 和 36 的最大公因数是多少?

  11. 第 11 题要通过试除来判断 101 是否为素数,试到哪个因数就够了?