Logo
Section 1 / 3

流程图与条件表达式

学习使用流程图来可视化程序中的条件表达式和决策过程。

导入

流程图与条件表达式

学习使用流程图来可视化程序中的条件表达式和决策过程。

流程图及相关术语

有时,理解复杂决策结构的文本格式会变得困难。流程图是一种通过图形化方式展示程序中指令执行流程的技术。

涉及决策的程序也具有流程的分支。用于编写决策的表达式称为条件表达式或条件。程序的流程取决于条件的结果,该结果要么为真,要么为假。如果条件为真,则要执行的程序部分称为真分支;类似地,如果条件为假,则要执行的部分称为假分支。流程图可以直观地展示这类程序中的流程分支。

注意:术语“语句”和“指令”可互换使用。

流程图中使用了多种形状和符号。我们常用的流程图形状包括:

  • 开始/结束:用于表示程序的开始和结束。
  • 输入/输出:用于表示程序中的输入和输出操作。
  • 判断:用于编写程序中的条件表达式。
  • 处理:用于编写除输入/输出和条件之外的其他指令。
  • 流程线:表示从一个形状到另一个形状的流程方向。
...
流程图符号

编程中有两种类型的决策,我们将在接下来的部分中进行探讨。

单向决策

只有一个分支的决策称为单向决策。当条件表达式为真时,该分支被执行,因此也称为真分支。

注意:判断框有两个输出箭头——一个标有“是”,表示真分支的开始;另一个标有“否”。

让我们通过以下示例流程图来学习单向决策。

示例流程图:单向决策

在此示例流程图中,我们希望计算用户输入的两个数值之间的绝对差值。差值通过将一个数值减去另一个数值得到。在计算出差值后,我们使用判断框中的条件来判断其是否为负数。指令 diff < 0 使用了一个新运算符 <,称为小于,当 diff 为负数时返回 true。因此,我们通过 diff = - diff 改变其符号。如果 diff 不为负数,则不采取额外步骤。最后,我们显示 diff 的值。

...
计算两个数值之间绝对差值的流程图

在上述流程图中:

  • 第一个框是输入/输出框,包含两条输入指令。
  • 第二个框是处理框,用于计算两个变量之间的差值,并将其存储在变量 diff 中。
  • 第三个框是判断框,包含条件表达式。
  • 右侧箭头用于真分支,仅当 diff 为负数时执行。
  • 最后一个框是输入/输出框,包含 print 语句,用于显示带标签的绝对差值。

单向决策练习

让我们通过几个简单示例来练习绘制单向决策的流程图。

工作日转换

假设我们要开发一个程序,将数字(1 到 7)转换为对应的星期名称(如 1 对应“星期日”,2 对应“星期一”等)。以下流程图接收一个表示星期几的整数作为输入,并输出对应的星期名称。

...
根据数字显示星期名称的流程图

我们使用新的符号 == 来测试相等性,表示表达式左右两边相等。

在上述流程图中:

  • dayName 变量的值根据 day 数字的值进行赋值。
  • 最后一个框显示 dayName 中存储的值。

月份名称转换

现在让我们创建一个将月份编号转换为月份名称的程序。以下流程图接收一个表示年中月份的整数(1 到 12)作为输入,并输出对应的月份名称(如“一月”、“二月”……“十二月”)。

...
根据月份编号显示月份名称的流程图

在上述流程图中:

  • monthName 变量的值根据 month 数字的值进行赋值。
  • 最后一个框显示 monthName 中存储的值。

成绩等级转换

接下来,我们创建一个将百分制成绩转换为字母等级的程序。以下流程图接收一个表示百分制成绩的数值作为输入,并使用单向决策输出对应的字母等级。

如果成绩 ≥ 85,则显示 A;如果成绩 ≥ 70 且 < 85,则显示 B;如果成绩 ≥ 55 且 < 70,则显示 C;否则显示 F。

...
使用单向决策显示字母等级的流程图

新符号 >= 称为大于等于,当 marks >= 85 且 marks 值为 85 或以上时返回 true。记住,and 运算符只有在两个条件都为真时才返回 true。

在上述流程图中:

  • grade 根据 marks 的值进行赋值。
  • 最后一个框显示 grade 中存储的值。

双向决策

具有两个可能分支的决策称为双向决策。这两个分支——真分支和假分支——基于条件表达式的判断结果而确定。判断框的右分支启动真分支,左分支启动假分支。为更清晰起见,我们分别标注为“是”和“否”。

注意:双向决策的判断框有两个分支——“是”表示真分支,“否”表示假分支。

上述所有示例均展示了单向决策。然而,这些问题都可以用更优雅的方式通过双向决策解决。

让我们通过以下示例流程图来学习双向决策。

示例流程图:双向决策

在此双向决策的示例流程图中,我们希望计算用户输入的两个数值之间的差值。差值通过将较小的数值从较大的数值中减去得到。首先,我们使用 if 语句比较用户的两个输入。语句 a > b 使用了一个新运算符 >,称为大于,当 a 大于 b 时返回 true,此时我们计算 a - b 并将差值存入 diff。当 a 不大于 b 时,我们计算 b - a 并将差值存入 diff。最后,我们显示 diff 的值。

现在考虑使用上一节中单向决策解决方案的情况。在那种方案中,当条件为真时可能会产生额外的计算。而在此方案中,无论哪种情况,我们都只进行一次计算。

...
显示两个数值之间差值的流程图

在上述流程图中:

  • 第一个框是输入/输出框,包含两条输入指令。
  • 第二个框是判断框,包含条件表达式。
  • 右侧箭头用于真分支,当 a > b 时执行。
  • 左侧箭头用于假分支,当 a ≤ b 时执行。
  • 最后一个框是输入/输出框,包含 print 语句,用于显示带标签的差值。

双向决策练习

让我们通过几个简单示例来练习绘制双向决策的流程图。

正负数判断

假设我们要判断一个数的符号。以下流程图接收一个整数作为输入,并显示该数是正数还是负数。

...
判断给定数字是正数还是负数的流程图

在上述流程图中:

  • msg 根据 a 的符号进行赋值。
  • 最后一个框显示 msg 中存储的值。

两数较大值判断

假设我们要找出两个数中的较大值。以下流程图接收两个整数作为输入,并显示其中较大的那个数。

...
显示两个数中较大值的流程图

在上述流程图中:

  • max 变量被赋予 a 和 b 中的最大值。
  • 最后一个框显示 max 中存储的值。

奇偶数判断

假设我们要判断一个数是奇数还是偶数。以下流程图接收一个整数作为输入,并显示该数是奇数还是偶数。我们使用取模运算符 %,它返回除法后的余数。也可以通过整数除法实现此操作,如下所示:

...
判断给定数字是奇数还是偶数的流程图

在上述流程图中:

  • msg 根据 a % 2 == 0 的结果进行赋值。如果 a 是偶数,则 a % 2 返回 0;否则返回 1。
  • 最后一个框显示 msg 中存储的值。

三数最大值判断

嵌套决策允许程序按层次顺序决定执行路径。

以下流程图接收三个不同的整数作为输入,并显示其中的最大值。

...
判断三个数中最大值的流程图

让我们分析上述流程图中的嵌套决策:

  • 第一个判断框的真分支中包含另一个判断框,这称为嵌套决策。
  • 第一个判断框的假分支也是嵌套决策的一个例子。
  • 如果 a > b,则比较 a 和 c;否则比较 b 和 c。
  • 由于所有值互不相同,max 变量被赋予 a、b、c 中的最大值。
  • 最后一个框显示 max 中存储的值。

成绩等级转换(双向 if)

假设我们要编写一个程序,将百分制成绩转换为字母等级。以下流程图使用双向 if 结构接收百分制成绩输入,并显示对应的字母等级。

如果成绩 ≥ 85,则显示 A;如果成绩 ≥ 70 且 < 85,则显示 B;如果成绩 ≥ 55 且 < 70,则显示 C;否则显示 F。

之前我们使用单向决策解决了相同问题,但该方案存在重复测试条件的问题。例如,若成绩低于 55,第一次条件判断后即可得出正确等级,但由于单向决策结构,仍需继续测试其他条件。

另一个值得注意的是,我们可以从 F 到 A 或从 A 到 F 开始测试。在此方案中,测试顺序是从 A 到 F。

...
使用双向 if 显示字母等级的流程图

在上述流程图中:

  • 前两个判断框的假分支是嵌套决策的例子。
  • grade 根据 marks 的值进行赋值。
  • 最后一个框显示 grade 中存储的值。

通过简单程序解决问题

将流程图转换为执行表