跳转至内容

A-level 计算机科学/OCR/单元 2.2 问题解决与编程

来自维基教科书,开放的书籍,开放的世界

计算机专业人士已经开发出各种技术来解决现实世界中的问题,并创建基于计算机的解决方案。计算思维是指利用这些技术来解决问题,无论是否使用计算机。其原理是将一个复杂的问题转化为可以理解、正式表示和解决的问题。这种思维过程很重要,因为世界上一些最大的问题非常复杂,难以理解。软件编写也具有挑战性,希望从软件开发中吸取的教训可以更广泛地应用于提供解决方案。

编程结构

[编辑 | 编辑源代码]

顺序

按顺序执行一条语句。

迭代

多次执行一组语句。

迭代可以是“计数控制”或“条件控制”。计数将重复该部分 n 次,条件将在满足条件之前停止迭代。

分支/选择

根据条件执行一组指令,例如 If ... Else。

全局变量和局部变量

[编辑 | 编辑源代码]

局部

在模块/函数/子例程中声明,仅在其中可用。子例程结束时被销毁。

全局

在程序顶部,子例程之外声明。可以在程序中的任何位置使用。程序结束时被销毁。

在声明它的子例程中使用时,与全局变量同名的局部变量优先使用。

因此,应尽可能使用局部变量,因为它们使用更少的内存,因为它们是在其子例程中创建和销毁的。

函数和过程

[编辑 | 编辑源代码]

函数和过程接受零个、一个或多个参数,并执行一项特定任务。然后函数返回一个值,而过程不返回任何值。

传递参数

按值:传递将用于函数的值。

按引用:传递将用于函数的值的位置。

按引用传递的变量可能会在处理过程中被程序的另一部分更改。

在考试中,除非另有说明,否则伪代码中的值按值传递。

IDE(集成开发环境)

[编辑 | 编辑源代码]

帮助程序员进行编程的程序。

IDE 可以提供许多功能,例如

  • 调试器
  • 代码编辑器
  • 翻译器
  • 集成运行时环境
  • 自动文档
  • 语法高亮
  • 语法检查
  • 自动代码补全
  • 自动缩进
  • 项目导航面板
  • 错误诊断

递归是指子例程(例如函数)调用自身。

它必须包含一个停止条件,如果没有停止,它必须调用自身,停止条件必须在有限数量的循环中可达。

递归与迭代

  • 递归的内存效率不高
  • 递归发生的地方必须存储在一个堆栈中,以便在满足停止条件后可以“展开”。这可能会占用大量内存,甚至会导致计算机内存不足,并导致程序崩溃。

数学方法

[编辑 | 编辑源代码]

从历史上看,许多问题都是通过应用数学解决的,无论是否已知物理规律。例如,绘制飞往月球的路线,或估计建造一艘船所需的金属。在这些情况下,可以使用计算和收集的数据获得相当准确的解决方案。如果数据的质量很差或应用的数学无法反映现实世界,就会出现问题。

复杂问题

[编辑 | 编辑源代码]

许多必须解决的问题不太可能接受可靠的解决方案。由于对潜在问题理解不正确,数据不足或不正确,或潜在问题过于复杂,并非所有问题都易于描述。当人们认为自己理解了这些问题时,它们就会造成麻烦。这会导致糟糕的解决方案,这些解决方案无法解决问题,甚至可能使情况变得更糟。复杂问题包括生物和生态系统、气候和社会模型。

在所有这些情况下,纯粹的复杂性都克服了正常的科学和数学方法。解决复杂问题的帮助将来自计算思维,并且它已经做到了——使用鸟枪法测序算法拼凑人类基因组的结构就是一个例子。

分解问题

[编辑 | 编辑源代码]

更常见的是,可以通过应用算法来解决难题。这些算法很有帮助,因为教计算机解决问题的方法有助于理解问题。现代计算机系统可以快速执行算法解决方案,并且可以采用试错法。算法思维遵循四个阶段

  1. 理解问题——这可能是一个严重的问题——我们如何判断一个问题是否已被充分理解?
  2. 拟定问题——生成问题的简洁表示。通常涉及抽象和数学解决方案。
  3. 设计算法——一旦获得明确的表示,就可以设计一个算法来应用这种表示。
  4. 实现算法——编写一个可以实现该算法的程序。
  5. 运行并解决问题——运行代码并查看它是否有效。根据要求评估输出。
自顶向下问题解决

自顶向下问题解决

[编辑 | 编辑源代码]

这是一种问题解决方法,它从更大的图景开始。然后将其分解为子问题,这些子问题可以表示为黑盒子——细节留到以后处理。

这是一种将大型程序划分为模块的方法。每个模块解决一个问题,然后将所有模块组合在一起。这种方法得到了以下认识的支持:所有程序都倾向于由序列、迭代和选择组成。

面向对象编程

[编辑 | 编辑源代码]

OOP 是另一种经常使用分解来解决编程问题的途径。对象由包含代码和数据的独立程序单元组成。然后可以将这些单元组合在一起形成完整的解决方案。这些对象是抽象的示例,可以在修改或不修改的情况下使用。

编写算法的目的是产生一个能够解决问题泛化表示的过程,使其能够解决类似的问题。为了生成一个好的算法,必须确定它是正确且有效的。证明算法不正确可能很简单——只需要在一个案例中证明它失败即可。证明它是正确的则要困难得多。有时问题过于复杂,必须接受一个足够好的解决方案。

华夏公益教科书