# 问题解决流程

> 计算机科学 · CIE A-Level 9618
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u9-problem-solving-process/

本模块介绍计算机科学中使用的结构化、行业标准问题解决流程，从初始问题定义到最终解决方案评估。你将学习如何分解复杂问题，并根据需求验证解决方案。

**先修:** [对算法的基本概念有基础了解](https://www.owlsprep.com/zh/study/cie-9618-u9-what-is-an-algorithm/)

## 学习目标

- 描述计算机科学中标准问题解决流程的结构化步骤
- 区分给定问题的需求与约束
- 运用分解和抽象拆分复杂问题
- 根据原始问题标准评估最终解决方案

## 步骤1：问题定义与需求分析

任何问题解决流程的第一步都是明确定义问题本身，而非直接开始编写代码。很多代价高昂的错误都是因为开发者跳过了这个关键步骤，最终解决了错误的问题。

**需求分析** — 提取解决方案要解决问题必须满足的所有功能性和非功能性需求的过程

*例:* 购物应用的一个需求可以是 *"用户必须能够保存支付方式，方便后续结账"*

需求分为两类：功能性需求（解决方案*要做什么*）和非功能性需求（解决方案的性能要求，例如页面加载时间 < 2 秒）。在此步骤还需要确定约束：约束是对解决方案的限制，例如可用内存、预算或开发截止日期。

**例题:** 本地一家面包店想要一个程序来追踪每日定制蛋糕订单。请列出该问题的2个功能性需求和1个有效约束。

1. 首先，确定核心功能性需求，即描述程序必须提供的功能：
2. 1. 程序必须记录每个订单的客户姓名和取货日期
2. 程序必须根据蛋糕尺寸和装饰计算订单总价
3. 接下来，确定一个限制解决方案的相关约束：
4. 一个有效约束：*该程序必须能在面包店现有8GB平板上运行，因此内存占用不能超过1GB*

> **考试提示:** 必须明确区分需求（解决方案必须做什么）和约束（对解决方案的限制）——CIE考官经常考察这个区分点。

## 步骤2：分解与抽象

问题明确定义后，下一步就是通过将其拆分为更小、可管理的部分来降低复杂度。这个过程称为分解，几乎总是和抽象结合使用以去除不必要的细节。

**分解** — 将大型复杂问题拆分为更小的独立子问题，可单独解决，通常可由不同团队成员分工完成

*例:* 将学校管理系统分解为：考勤追踪、成绩记录、课程表生成

抽象通过隐藏不影响最终解决方案的无关细节来简化问题。例如，设计公交路线追踪系统时，你不需要知道每辆公交车的颜色或内饰设计——只需要知道它的路线编号和当前位置。

**例题:** 将构建学生考勤应用的问题分解为4个合适的独立子问题。

1. 将问题拆分为逻辑上独立的子问题，每个子问题只有一个明确职责：
2. 1. 用户身份验证：仅允许验证通过的教师和管理员登录系统
2. 考勤记录：允许教师为每个排定课程标记学生出勤/缺勤
3. 安全数据存储：将考勤记录保存到每日备份的数据库中
4. 报表生成：为学校管理部门生成每周缺勤汇总报表

> **tip**
>
> 分解时，目标是得到松耦合的子问题：修改一个子问题不需要重写另一个。

## 步骤3：解决方案设计与实现

分解完成后，每个子问题都先通过设计算法单独解决。在编写任何代码之前，算法可以用伪代码、流程图或结构化英语表示。

所有单个算法都经过测试和优化后，它们会被集成（合并）以创建完整的可用解决方案，然后用目标编程语言实现。

**例题:** 考勤应用的一个子问题是计算学生的缺勤天数百分比。为这个子问题编写一个简单算法。

1. 步骤1：定义算法的输入：总上学天数、学生缺勤天数
2. 步骤2：使用以下公式计算缺勤百分比：
3. $$\text{Absence Percentage} = \bigg(\frac{\text{absent days}}{\text{total days}}\bigg) \times 100$$
4. 步骤3：将结果四舍五入到1位小数，输出最终百分比

## 步骤4：测试与评估

问题解决流程的最后一步是测试完整解决方案是否存在漏洞，然后评估它是否真的解决了原始问题。测试找出代码中的错误，而评估则检查解决方案是否满足所有需求和约束。

评估还会考虑未来改进的空间，以及该解决方案后续是否可适配类似问题。

**例题:** 构建完面包店订单追踪程序后，面包店反馈该程序在现有平板上加载过慢。这是不满足需求还是不满足约束？解释你的答案。

1. 步骤1：回顾定义：需求是解决方案必须做的事，约束是对解决方案的限制。
2. 步骤2：原始问题要求程序必须能在面包店现有平板上运行，这是约束，而非功能性需求。
3. 结论：这不符合在面包店现有硬件上运行的约束。必须调整解决方案以减少内存占用，提高加载速度。

> **考试提示:** 考试中被要求评估解决方案时，一定要回到题目中给出的原始需求和约束，这样才能拿到满分。

## 常见错误

- **错误做法:** 在明确定义问题之前直接开始编写代码。
  - 原因: 这会导致构建出的解决方案解决的是错误的问题，浪费时间，还会在考试中丢分。
  - 正确做法: 在设计任何算法或编写代码之前，一定要先列出所有需求和约束。
- **错误做法:** 在考试答案中混淆需求和约束。
  - 原因: 考官专门考察这个区分点，混淆会导致本可避免的丢分。
  - 正确做法: 记住：需求是解决方案必须做什么，约束是对构建解决方案方式的限制。
- **错误做法:** 将问题分解为功能重叠的子问题。
  - 原因: 这会导致代码重复，让调试更困难，还会在子问题之间产生依赖。
  - 正确做法: 确保每个子问题只有一个明确职责，和其他子问题没有功能重叠。
- **错误做法:** 测试完漏洞就结束流程，跳过评估步骤。
  - 原因: 一个没有漏洞的解决方案仍然可能不满足原始问题的需求和约束。
  - 正确做法: 一定要将最终解决方案和所有原始需求、约束进行对比，评估其适用性。

## 速查表

| 步骤 | 核心活动 | 检查问题 |
| --- | --- | --- |
| 1. 问题定义 | 整理需求和约束 | 我理解这个问题吗？ |
| 2. 分解与抽象 | 拆分为子问题，去除多余细节 | 子问题是独立的吗？ |
| 3. 设计与实现 | 编写算法、集成、编码 | 每个子问题都能正常工作吗？ |
| 4. 测试与评估 | 测试漏洞，对照需求检查 | 它解决了原始问题吗？ |

## 下一步

结构化问题解决流程是CIE A-Level计算机科学中所有算法设计和软件开发的基础。从排序算法到完整软件开发项目，每个主题都遵循这些步骤来避免错误，交付满足需求的解决方案。掌握这个流程能帮助你应对考试中最长的15分设计题，将其拆解为清晰、能拿到分数的步骤。接下来，你将在此基础上学习核心问题解决技巧和算法表示方法。

- [算法分类](https://www.owlsprep.com/zh/study/cie-9618-u9-algorithm-classification/)
- [标准查找算法](https://www.owlsprep.com/zh/study/cie-9618-u9-standard-searching-algorithms/)
- [标准排序算法](https://www.owlsprep.com/zh/study/cie-9618-u9-standard-sorting-algorithms/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u9-problem-solving-process/
