2020—2021—1学期20202418《网络空间安全导论》第四周学习总结
学习内容:第八章和第九章。
在前两章我们已经从机器语言到汇编语言再到伪代码来表示算法,从使用简单变量的算法到使用数组的算法。
现代我们进一步讨论抽象和抽象容器。
第八章:抽象数据类型与子程序
8.1抽象数据类型
抽象数据类型:属性(数据和操作)明确地与特定实现分离的容器。
数据结构:一种抽象数据类型中复合数据域的实现。
容器:存放和操作其他对象的对象。
8.2栈
1后进先出。(拿罐头)(后进先出)
2插入操作叫Push,弹出为Pop。
8.3队列
1后进后出。(排队)(后进后出)
2插入和删除没有标准的术语。
8.4列表
这里提到了线性的概念:每个项目除了有第一个都有一个独特的组成成分在它之前,除了最后一个也都有一个独特的组成成分在他之后。
1不要把列表误以为时数组。
2列表也可以被形象化为链式结构。
链式结构:一个将数据项和找到下一项位置的信息保存到同一容器的实现方法。
3部分中英对照
操作(Insert)
是否存在(IsThere)
项目数量(GetLength)
允许用户查看序列中的每一项(Reset,GetNext,Moreterms)
8.5树
像列表,栈和队列这样的抽象结构本质上都是线性的,只拟了一种数据关系。如果一个节点下方有多个节点,那么这个东西在计算机领域上叫做树。
8.5.1二叉树
1.二叉树:具有唯一起始节点(根节点)的抽象复合结构,其中每个节点都可以有两个子女节点(且至多有两个),根节点和每个节点之间都有且只有一条路径
。
2.根:树中唯一的开始节点。
3.叶节点:没有子女的树节点。
4.除根节点外,每个节点都只有一个父母点。根节点的每个子女本身又是一个小二叉树或子树的根。如果一个节点是另一个节点的父母或者是另一个节点先辈的父母,那么前者是后者的先辈。
8.5.2二叉检索树
二叉检索树:类似已排序的列表,节点间存在语义排序。具有二叉树的形状属性,节点可以有0个、1个或2个子女。还具有语义属性来刻画树中节点上的值,即任何节点的值都要大于它的左子树中的所有节点的值,并且要小于它的右子树中的所有节点的值。
8.8图
1.图:由一组节点和一组把节点相互连接起来的边构成的数据结构。
2.顶点:图中的节点。
3.边(弧):表示图中两个节点的连接的顶点对。
4.图中的顶点表示对象,边则描述了顶点之间的关系。
5.无向图:其中的边没有方向的图。
6.有向图:其中的边是从一个顶点指向另一个顶点(或同一个顶点)的图。
7.邻顶点:通过边连接起来的两个顶点。
8.路径:连接图中两个顶点的一系列顶点。
9.创建图。
10.图算法:
深度优先搜索。
广度优先搜索。
单源最短路搜索。
8.7子程序
许多子程序都是高级语言或语言附带库的一部分
参数列表:程序中两部分之间的通信机制
形参:列在子程序后的括号中的标识符
实参:子程序调用中列在括号中的标识符
8.7.1参数传递
参数列表是子程序要使用标识符或值的列表,它放置在子程序名后的括号中。由于子程序是在被调用之前定义的,所以它不知道调用单元会传递什么样的变量。为了解决这个问题,在子程序后面的括号中声明了一个变量名的列表。这些标识符称为形参。当子程序被调用时,调用单元将列出子程序名,并在其后的括号中列出一系列标识符。这些标识符叫做实参。实参表示的是调用单元中的真实变量。
参数列表:程序中两部分之间的通信机制。
形参:列在子程序名后的括号中的标识符。
实参:子程序调用中列在括号中的标识符。
8.7.2值参与引用参数
值参:由调用单元传入实参的副本的形参。
引用参数:由调用单元传入实参的地址的形参。
第九章面向对象设计与高级程序设计语言、、
对于不同机器,程序员仍然需要记住不同的机器指令。为方便起见,我们引入伪代码,因为这个东西更符合人类的思维逻辑。而伪代码的实现需要高级编程语言,我们需要翻译程序把高级语言编写的程序翻译成机器码。
9.1面向对象方法
面向对象的设计方法是用叫做对象的独立实体生成解决方案的问题求解方法,对象由数据和处理数据的操作构成。面向对象设计的重点是对象以及它们在问题中的交互。一旦收集到了问题中的所有对象,它们就能构成问题的解决方案。
9.1.1面向对象
对象:在问题背景中相关的食物或实体。
对象类或类:一组具有相似的属性和行为的对象的描述。
字段:表示类的属性。
方法:定义了类的一种行为的特定算法。
9.1.2设计方法
设计方法在书中被分成了以下几个阶段:
1.头脑风暴
2.过滤
3.场景
4.责任算法
5.总结
9.1.3 示例
9.2 翻译过程
用汇编语言编写的程序要输入汇编器,由它把汇编语言指令翻译成机器码,最终执行的是汇编器输出的机器码。
9.2.1 编译器
翻译用高级程序设计语言编写的程序的程序叫做编译器。早期编译器输出的是程序的汇编语言版本,这个版本还要经过汇编器处理才能得到可执行的机器语言程序。但是随着科学家更加深入地了解翻译过程,编译器变得复杂,汇编语言的阶段通常被省略了。
编译器:把用高级语言编写的程序翻译成机器码的程序。
9.2.2解释器
解释器:输入用高级语言编写的程序,指导计算机执行每个语句指定的动作的程序。
字节码:编译Java源代码使用的标准机器语言。
Java的设计中,可移植性是最重要的特征。为了达到最佳可移植性,Java被编译成一种标准机器语言——字节码。一种名为JVM(JVM虚拟机)的软件解释器接受字节码程序,然后执行它。也就是说,字节码不是某个特定硬件处理器的机器语言,任何具有JVM的机器都可以运行编译过的Java程序。
标准化的高级语言实现的可移植性与把Java程序翻译成字节码然后在JVM上解释它所实现的可移植性是不同的。Java编译器输出的程序将被解释,而不是直接被执行。
9.3程序设计语言范型
命令式范型具有顺序执行指令的特征,变量的使用代表了内存地址,而是用赋值语句则改变这些变量的值。
9.3.1命令式范型
1.面向过程的范型
面向过程编程是一种命令式模型。在这里语句被分组成子程序。一个程序是子程序分层次构成的,每一层执行整个问题求解的一个必要的特定任务。
2.面向对象的范型
面向对象视角是与对象交互的一种方式。每个对象负责执行它自己的动作。
在面向过程的范型中,数据被认为是被动并且被程序所操控的;在面向对象的范型中,数据对象是活跃的。每个对象负责控制自己的操作。
9.3.2声明式范型
声明式范型是一个描述结果的模型,但是完成结果的过程则不被描述。在这种范型中的两种基本模型:函数式和逻辑式。
1.函数式模型
基于函数的数学概念。
基本的原理是函数的求值。
2.逻辑编程
基于数理逻辑的原则。
解决潜在问题的算法用逻辑的规则来推演出事实和规则的答案。
9.4高级程序语言
命令式语言的标志就是两种伪代码结构——选择和重复(循环)。
9.4.1布尔表达式
写出语句然后测试是true还是false是程序设计语言提问的方式。这些语句称为断言或条件。编写算法是我们采用自然语言表示断言。翻译成高级程序语言时,这种用自然语言编写的语句就会被重写成布尔表达式。
布尔表达式是一个标识符序列,标识符之间由相容的运算符分隔,求得的值是true或false。
9.4.2数据归类
强类型化:每个变量都有一个类型,只有这种类型的值才有存储到该变量中。
数据类型:一组值以及能够应用这种类型的值的基本操作集合的说明。
大多数高级语言都有四种数据类型:整数、实数、字符和布尔型。
声明是把变量、动作或语言中的其他实体与标识符关联起来的语句,使程序员可以通过名字引用这些项目。
保留字是一种语言中具有特殊意义的字,不能用它作为标识符。
区分大小写:大写字母和小写字母被看作是不同的;两个拼写方法相同但大小写形式不同的标识符被看作是两个不同的标识符。
注意C++、Java、Python和VB.NET是区分大小写的,这意味着大小写不同的同一标识符会被认为是不同的词。
9.4.3输入/输出结构
高级语言
把输入的文本数据看作一个分为多行的字符流。字符的含义由存放值的内存单元的数据类型决定输出与基础所有输入语句都由三部分构成:要存放数据的变量的声明、输入语句和要读入的变量名以及数据流自身。
非强类型语言
输入的格式决定了类型。 输出语句创建字符流。在强类型语言中不管输入输出语句的语法或输入输出流在哪,处理的关键在于数据类型。数据类型确定字符是如何被转换为位模式以及如何被转换为字符。
9.4.4控制结构
控制结构:确定程序中的其他指令的执行顺序的指令。
重复、选择和子程序,这种结构叫做控制结构,因为他们决定了其他指令在程序中被执行的顺序。
1、嵌套逻辑
2、异步处理
异步:不与计算机这种的其他操作同时发生。
9.5面向对象语言的功能性
9.5.1 封装
封装:实施信息隐蔽的语言特性
对象(问题求解阶段):与问题背景相关的事物或实体
类(实现阶段):对象的模式
对象类或类(问题求解阶段):属性和行为相似的一组对象的说明
对象(实现阶段):类的一个实例
9.5.2 类
如果用标识符来代表一个类,那么必须在使用前显式地询问即将被创建的类。也就是需要实例化这个类,以获取符合这种模式的对象。
实例化:创建类的对象。
9.5.3继承
继承:类获取其他类的属性(数据字段和方法)的机制。
9.5.4多态
多态:语言在运行时确定给定调用将执行哪些可能的方法的能力。