学习笔记:主题 4 - 算法与流程图 (9626 AS Level)
你好,未来的 IT 专家!在这一章里,我们将学习解决问题的语言。无论你是在构建庞大的企业系统,还是仅仅决定晚餐吃什么,你都在遵循一系列的步骤。在计算领域,这些步骤被称为算法。
理解算法和流程图是基础中的基础。它们是每一款软件的蓝图。掌握了这一点,你就掌握了编程的核心逻辑!
快速回顾:为什么我们需要算法?
- 为了提供清晰、无歧义的步骤序列来解决特定问题。
- 允许程序员在编写代码之前设计好逻辑(节省时间和金钱)。
- 确保解决方案逻辑严密,并且易于被他人理解和维护。
4.1 算法:指令手册
算法(Algorithm)是为完成某项任务而编写的一系列有限、定义明确且按步骤进行的程序。可以把它想象成电脑的烹饪食谱。
在考试中,你需要使用被称为伪代码(Pseudocode)的结构化英语来编写算法。
4.1.1 基本输入与输出
这些命令用于处理数据如何进入和离开系统。
-
INPUT/READ(输入/读取): 从用户或文件中获取数据。
示例:
INPUT UserName -
WRITE/PRINT(写入/打印): 显示或输出数据(到屏幕、打印机或文件)。
示例:
WRITE "Welcome, " & UserName
4.1.2 算术运算
算法使用标准的算术运算符来进行计算:
- 加法:\(+\)
- 减法:\(-\)
- 乘法:\(*\)
- 除法:\(/ \)
示例:
TotalCost = Quantity * Price
4.1.3 选择(决策)
选择允许算法根据某个条件在不同的路径之间进行切换。这被称为条件分支(conditional branching)。
IF...ELSE...ENDIF 结构
当有两条可能的路径时使用。
结构:
IF (条件为真) THEN
// 执行此操作
ELSE
// 执行另一项操作
ENDIF
示例(检查年龄):
INPUT Age
IF Age >= 18 THEN
WRITE "Access granted"
ELSE
WRITE "Access denied"
ENDIF
比较运算符对条件判断至关重要:
\(>\)(大于), \(<\)(小于), \(=\)(等于), \(\neq\)(不等于), \(\ge\)(大于等于), \(\le\)(小于等于)。
CASE...ENDCASE 结构
当变量有多种取值选择时使用。这比嵌套大量的 IF 语句更简洁。
结构:
CASE OF 变量
值 1: // 值 1 对应的操作
值 2: // 值 2 对应的操作
OTHERWISE: // 若均不匹配则执行的操作
ENDCASE
4.1.4 迭代(循环)
迭代,也就是循环(looping),是将一段代码重复执行多次的过程。
FOR...NEXT 循环
当你确切知道循环需要运行多少次(确定的迭代次数)时使用。
结构:
FOR 计数器 = 开始值 TO 结束值 [STEP 步长]
// 循环操作
NEXT 计数器
示例(倒计时):
FOR i = 10 TO 1 STEP -1
WRITE i
NEXT i
你知道吗? 如果省略 STEP 步长,步长默认为 1。
WHILE...ENDWHILE 循环
这是一个前置条件(pre-condition)循环:在循环第一次运行之前会检查条件。如果条件初始即为假,循环将永远不会执行。
结构:
WHILE (条件为真)
// 循环操作
ENDWHILE
类比: 你出门前会先查看天气(条件)。如果是晴天,你就不会带伞(循环操作)。
REPEAT...UNTIL 循环
这是一个后置条件(post-condition)循环:循环操作至少执行一次,且在执行之后才检查条件。只要条件不为真,循环就会一直持续。
结构:
REPEAT
// 循环操作(至少运行一次)
UNTIL (条件为真)
类比: 你尝试拧开一个难开的罐子(循环操作),并反复尝试(重复),直到盖子被拧下来(条件为真)。
嵌套循环
嵌套循环(nested loop)是指循环内部还有一个循环。这对于处理表格数据(行和列)等任务非常重要。
关键提示: 内层循环必须完成其所有迭代,外层循环才能进行下一次迭代。始终使用不同的计数器变量(例如,外层循环用 i,内层循环用 j)。
4.1.5 过程与子程序
过程(procedure)(或子程序(subroutine))是一个独立的程序块,旨在执行特定任务。
- 它们有助于将复杂的程序拆解为更小、更易于管理的部分(模块化)。
- 它们允许代码被轻松复用,无需重复编写。
在伪代码中,你需要定义或声明该子程序,然后在稍后调用(call)它:
示例:
PROCEDURE Calculate_Tax (Salary)
Tax = Salary * 0.20
WRITE Tax
ENDPROCEDURE
调用子程序:
CALL Calculate_Tax (50000)
快速回顾:伪代码结构
- 选择: 选择路径(IF/ELSE 或 CASE)。
- 迭代: 重复操作(FOR, WHILE, REPEAT)。
- 过程: 组织并复用代码块。
记忆小贴士: 根据检查时机记忆循环类型:WHILE 在整个期间(Whole time)检查(前置条件),REPEAT 在后方(Rear)检查(后置条件)。
4.2 流程图:视觉地图
流程图(Flowchart)是算法的图形化表示。它使用标准符号来说明为了获得解决方案所需执行的操作顺序。
对于学习有困难的同学来说,流程图非常棒,因为它们提供了一种直观的方式来跟踪程序的逻辑并轻松识别潜在错误。
4.2.1 标准流程图符号
你必须掌握这些标准符号(课程大纲中提供的)的形状、名称和功能:
| 符号名称 | 形状(描述) | 功能/用途 |
|---|---|---|
| 终端符(开始/结束) | 椭圆 / 圆角矩形 | 指示程序或算法的开始或结束。 |
| 输入/输出 | 平行四边形 | 用于任何数据输入(READ, INPUT)或数据输出(WRITE, PRINT)。 |
| 处理框 | 矩形 | 表示任何处理或计算步骤(如赋值、算术运算)。 |
| 决策/判断 | 菱形 | 表示决策或条件测试(IF...THEN)。必须有一个入口流线和两个出口流线(通常标记为 YES/NO 或 TRUE/FALSE)。 |
| 子程序 | 两侧带有垂直线的矩形 | 表示调用一个单独的、已定义的过程或子程序。 |
| 连接符 | 圆形(通常包含字母或数字) | 用于指示流程图在同一页的其他位置继续。避免流线交叉。 |
| 流线 | 箭头 | 显示流程图中控制的方向和序列。 |
4.2.2 绘制流程图:分步指南
让我们以检查用户年龄的条件分支结构(IF...ELSE...ENDIF)为例:
- 开始: 以终端符开始,标记为 START。
- 输入: 使用输入/输出平行四边形来获取年龄:INPUT Age。
- 决策: 使用决策菱形来检查条件:Age >= 18?
- 处理路径:
- 如果为 YES (True):沿流线走向输入/输出平行四边形:WRITE "Access granted"。
- 如果为 NO (False):沿另一条流线走向输入/输出平行四边形:WRITE "Access denied"。
- 合并与结束: 如有必要,使用连接符将两条流线重新汇合,或者在流向最终的终端符(标记为 STOP)之前简单地合并它们。
(注:由于此 HTML 格式无法直接渲染图像,请参照以上步骤在脑海中勾勒形状!)
4.2.3 在流程图中表示循环
所有的迭代结构(FOR, WHILE, REPEAT)主要都是使用决策菱形和流回图表上方的流线来表示的。
- WHILE 循环: 决策菱形必须出现在处理框之前,用以控制是否进入循环体。
- REPEAT 循环: 决策菱形出现在处理框之后,确保循环在检查条件前至少执行一次。
编辑与识别错误
关键技能之一是能够发现错误,无论是在伪代码中还是在流程图中。
4.3.1 需要避免的常见算法错误
-
死循环(Infinite Loops): 当循环的终止条件永远无法满足时发生。
错误: 一个从未更新其判断条件所需变量的 WHILE 循环(例如:
WHILE Count < 10,但Count从未被增加)。 -
错误的循环边界: 使用
<代替<=,或者当计数器应该从 1 开始时却从 0 开始。务必检查循环是否运行了正确的次数。 -
错误的逻辑分支: 使用了错误的比较运算符(例如:当你本意是
>=时却用了>),这会导致算法在边界情况下走错路径。 -
伪代码中的语法错误: 关键字不匹配(例如:以
IF开始却以NEXT结束,或者遗漏了ENDIF)。
4.3.2 识别流程图中的错误
在检查流程图时,寻找:
- 不相连的符号: 每个符号是否都由流线连接?
- 无效的决策输出: 决策菱形是否恰好有两个标记清晰的退出路径(如 T/F 或 Y/N)?
- 符号使用不当: 是否把处理框用于输入,或者把输入/输出框用于计算?
- 循环方向: 对于重复执行,流线是否正确地循环回了决策点?
如果起初觉得识别错误很棘手,不用担心!这项技能会随着练习而提高。最好的检查方法是使用简单的测试数据来追踪算法,看看它的表现是否符合预期。
关键总结
算法是书写在伪代码中的描述性步骤,重点在于清晰度和结构化逻辑(选择、迭代、过程)。流程图是视觉图表,使用标准符号来映射算法的流程和顺序。两者都必须准确反映正在解决的问题。