流程图与条件表达式
学习使用流程图来可视化程序中的条件表达式和决策过程。
流程图及相关术语
有时,理解复杂决策结构的文本格式会变得困难。流程图是一种通过图形化方式展示程序中指令执行流程的技术。
涉及决策的程序也具有流程的分支。用于编写决策的表达式称为条件表达式或条件。程序的流程取决于条件的结果,该结果要么为真,要么为假。如果条件为真,则要执行的程序部分称为真分支;类似地,如果条件为假,则要执行的部分称为假分支。流程图可以直观地展示这类程序中的流程分支。
注意:术语“语句”和“指令”可互换使用。
流程图中使用了多种形状和符号。我们常用的流程图形状包括:
- 开始/结束:用于表示程序的开始和结束。
- 输入/输出:用于表示程序中的输入和输出操作。
- 判断:用于编写程序中的条件表达式。
- 处理:用于编写除输入/输出和条件之外的其他指令。
- 流程线:表示从一个形状到另一个形状的流程方向。
编程中有两种类型的决策,我们将在接下来的部分中进行探讨。
单向决策
只有一个分支的决策称为单向决策。当条件表达式为真时,该分支被执行,因此也称为真分支。
注意:判断框有两个输出箭头——一个标有“是”,表示真分支的开始;另一个标有“否”。
让我们通过以下示例流程图来学习单向决策。
示例流程图:单向决策
在此示例流程图中,我们希望计算用户输入的两个数值之间的绝对差值。差值通过将一个数值减去另一个数值得到。在计算出差值后,我们使用判断框中的条件来判断其是否为负数。指令 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。
在上述流程图中:
- 前两个判断框的假分支是嵌套决策的例子。
grade根据marks的值进行赋值。- 最后一个框显示
grade中存储的值。