跳转到内容

A-level 计算机科学/CIE/高级理论/数据表示

来自维基教科书,开放书籍,为开放世界
A-level 计算机科学
数据表示 通信和互联网技术
规范链接

用户定义的数据类型

  • 理解为什么需要用户定义的类型
  • 定义和使用非复合类型:枚举,指针
  • 定义和使用复合数据类型:集合,记录和类/对象
  • 为给定问题选择和设计适当的用户定义的数据类型

文件组织和访问

  • 了解文件组织方法:串行,顺序(使用键字段)和随机(使用记录键)
  • 了解文件访问方法
    • 串行文件和顺序文件的顺序访问
    • 顺序文件和随机文件的直接访问。
  • 为给定问题选择适当的文件组织和文件访问方法

实数和归一化浮点表示

  • 描述二进制浮点实数的格式
  • 将二进制浮点实数转换为十进制,反之亦然
  • 归一化浮点数
  • 了解归一化的原因
  • 了解在浮点表示中改变尾数和指数的位分配的影响
  • 了解下溢和上溢是如何发生的
  • 了解为什么计算机无法表示数学实数,如√2或π,只能表示近似值
  • 了解二进制表示只是它所表示的实数的近似的后果
  • 了解二进制表示会导致舍入误差

用户定义的数据类型

[编辑 | 编辑源代码]

用户定义的数据类型是程序员为在程序中使用而设计的,与内置数据类型不同。非复合类型是在不引用其他数据类型的情况下定义的,而复合数据类型则是从其他数据类型构建的。

枚举数据类型

[编辑 | 编辑源代码]

枚举数据类型是一种非复合数据类型,从一个有序的值列表中定义。变量可以通过此数据类型声明,并分配列表中的一个值

例如,以下伪代码声明了一个月份的枚举数据类型,

TYPE TMonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec) // The TMonth data type is declared

DECLARE ThisMonth : TMonth // A variable is declared with the TMonth enumerated data type.

ThisMonth ← May // The variable ThisMonth

ThisMonth > Feb // This is True, as May is later in the list than Feb

注意:枚举数据类型中的值不是字符串值;不要用引号括起来。

指针数据类型

[编辑 | 编辑源代码]

指针数据类型引用内存位置。因此,它必须与它指向的数据类型相关。

例如,此伪代码声明了一个指针数据类型,一个指针,并使用该指针。

TYPE TMyPointer = ^Integer // This declares TMyPointer as a pointer data type which points to Integers.

DECLARE IntegerPointer : TMyPointer // This declares a variable with the TMyPointer data.

ValuePointedTo  IntegerPointer^ // This accesses the data stored at the address which IntegerPointer points to. This is known as dereferencing.

指针通常用于构建复杂的数据结构,例如链表和二叉树。这些数据结构将在稍后讨论

记录数据类型

[编辑 | 编辑源代码]

记录数据类型存储关于一个共同主题的信息集合,类似于数据库中的记录。它由多个字段构成,每个字段都有自己的数据类型;因此,记录数据类型是一种复合数据类型。

例如,以下伪代码定义了一个学生记录的记录类型

TYPE
TStudentRecord                    // The record consists of several fields
  DECLARE FirstName : STRING      // Each field has its own data type
  DECLARE LastName : STRING
  DECLARE Absences : INTEGER
  DECLARE Class : STRING
ENDTYPE

DECLARE Student1 : TStudentRecord // The variable is declared as a record

Student1.FirstName ← "John"       // Fields can be accessed using dot notation
Student1.LastName ← "Doe"
Student1.Absences ← 0
Student1.Class ← "A2 Level"

集合数据类型

[编辑 | 编辑源代码]

集合数据类型是一种复合数据类型,允许程序员将集合论运算应用于程序中的数据。

这些操作通常包括

  • 并集
  • 差集
  • 交集
  • 包含一个元素
  • 排除一个元素
  • 检查一个元素是否在一个集合中

对象数据类型

[编辑 | 编辑源代码]

对象数据类型是面向对象编程中用来定义类的复合数据类型。

本质上,对象只是包含对它们包含的数据起作用的函数的记录。

数据对象是一个存储区域,包含一个值或一组值。每个值都可以通过其标识符或引用该对象的更复杂的表达式访问。此外,每个对象都有一个唯一的数据类型。

文件组织

[编辑 | 编辑源代码]

文件是记录的集合。每个记录是字段的集合。每个字段都包含一个值。

串行文件

[编辑 | 编辑源代码]

串行文件是记录的集合,没有定义的顺序。记录按时间顺序进入文件。所有记录都有一个定义的格式,以便它们可以被正确地输入和输出。

文本文件可以被认为是串行文件的例子:一系列字符按时间顺序输入,生成一个文件。

串行文件的一个常见用途是实时处理。记录可以实时输入,尽可能快地输入,因为它们不需要排序。这使得串行文件效率很高。

顺序文件

[编辑 | 编辑源代码]

顺序文件按键字段的顺序存储记录。为了能够按键字段排序记录,该字段需要是唯一的和顺序的,但不需要是连续的。

在顺序文件中,可以通过读取所有键字段直到找到要查找的字段来找到特定记录。

直接访问文件

[编辑 | 编辑源代码]

直接访问文件是记录的集合,可以直接访问,而无需检查每个记录。这是通过哈希表实现的。

哈希表是一个数据表,它不是按键字段排序,而是按键字段的哈希值排序。因此,可以通过对键字段进行哈希来直接访问数据,而不是逐个检查每个记录。

访问文件

[编辑 | 编辑源代码]

有两种方法可以访问文件中的特定记录:顺序访问和直接访问。串行文件和顺序文件可以使用顺序访问,而直接访问文件可以使用直接访问。

顺序访问是指逐个读取文件中的每个记录,直到找到所需的记录。

直接访问是指使用哈希算法跳到文件中的特定记录。

删除和编辑数据

[编辑 | 编辑源代码]

在顺序访问的文件中,删除和编辑数据需要创建一个新文件。数据从旧文件移动到新文件,直到到达需要编辑记录的部分。

但是,在直接访问文件中,数据可以在原地删除或编辑:不需要新文件。

浮点数

[编辑 | 编辑源代码]

浮点表示法是一种用相同数量的位来表示非常小或非常大的数字的方法。它类似于科学计数法

一个浮点数由三个部分组成:符号位、尾数和指数。要找到数字的值,我们使用 ,其中 ± 由符号位决定,M 是尾数,E 是指数。

A representation of the binary value of 0.15625 in a 32-bit system with 8 bits for the exponent and 23 bits for the mantissa
一个在IEEE 754 中的浮点格式示例

尾数-指数权衡

[编辑 | 编辑源代码]

在创建浮点格式时,设计者必须选择分配给尾数和指数的位数。如果分配给尾数的位数更多,则浮点值将更加精确;而如果分配给指数的位数更多,则浮点系统可以表示更大的值范围。

规范化

[编辑 | 编辑源代码]

规范化是指选择数字的浮点表示,使得浮点系统中可以表示的每个数字都只有一个有效表示。

如果没有规范化,同一个数字可能有多个有效的表示。例如,数字 2.0 可以表示为 0 0010000 01000 0100000 00110 1000000 0010。因此,我们需要一种标准方法来引用给定的数字。

这就是规范化的作用:规范化意味着数字的唯一正确形式是符号位和尾数最高有效位不同的形式。因此,对于 2.0,0 1000000 0010 将是有效的表示。

浮点错误

[编辑 | 编辑源代码]

下溢是指数字太小而无法使用浮点系统表示。

例如,在一个尾数为 8 位、指数为 4 位的系统中,可能的最小指数为 1000,即十进制的 -8。如果系统是规范化的,那么最小的正尾数值为 0 1000000。因此,该系统中最小的正数为 0 1000000 1000,等于 1/512。如果该系统中的计算结果小于 1/512,则会发生下溢错误,因为数字太小而无法存储。

上溢类似于下溢,但它发生在数字太大而无法存储在系统中时。

例如,在一个尾数为 8 位、指数为 4 位的系统中,可以表示的最大值为 0 1111111 0111,等于 127。如果计算结果大于 127,则会发生上溢错误,数字将无法存储。

上溢和下溢都可能发生在太大或太小的负值上。

舍入误差

[编辑 | 编辑源代码]

舍入误差是指数字无法精确表示,需要近似表示的情况。

例如,数字 1/3 只能用二进制表示为循环位(0.0101)。浮点格式不允许循环位,因为系统中只有有限的内存。因此,它需要被舍入,因此它将被表示为 0 1010101 1111

问题

由值列表定义的哪种用户定义的数据类型?

回答

枚举数据类型

由字段集定义的哪种用户定义的数据类型?

回答

记录数据类型

哪种用户定义的数据类型用于创建动态数据结构?

回答

指针数据类型

哪种类型的文件应该用于实时处理?

回答

串行文件

哪种类型的文件将数据存储在哈希表中?

回答

直接访问文件

哪种类型的文件根据记录的键字段存储记录?

回答

顺序文件

直接访问和顺序访问有什么区别?

回答

使用直接访问,您可以直接跳到所需的记录,而使用顺序访问,您需要逐个遍历每个记录。

在尾数为 8 位、指数为 4 位的系统中,找到 +1.625 的规范化浮点值。

回答

尾数:01101000 指数:0001

尾数为 10011100、指数为 0100 的规范化浮点数表示什么值?

回答

-12.5

华夏公益教科书