其他分享
首页 > 其他分享> > 2019-2020-1学期 自己8位学号 《网络空间安全专业导论》第四周学习总结

2019-2020-1学期 自己8位学号 《网络空间安全专业导论》第四周学习总结

作者:互联网

目录

第八章 抽象数据类型与子程序

第九章 面向对象设计与高级程序设计语言

第八章 抽象数据类型与子程序

8.1抽象数据类型

(1)抽象数据类型是属性(数据和操作明确的与特定实现分离的容器。设计的目标是通过抽象减小复杂度。
(2)在计算领域,可以从应用层、逻辑层和实现层这三个方面观察数据。
(3)应用(或用户)层是特定问题中的数据的视图。逻辑(或抽象)层是数据值(域)和处理他们的操作的抽象视图。实现层明确表示出了存放数据项的结构,并用程序设计语言对数据的操作进行编码。
(4)数据结构:一种抽象数据类型中的复合数据域的实现
(5)容器:存放和操作其他对象的对象。

8.2 栈

(1)栈和队列是一种抽象复合结构,只能从一端访问栈中的元素。可以在第一个位置插入元素,也可以删除最后一个元素。
(2)另一种描述栈的访问行为的说法是删除的项总是在栈中时间最短的项目。插入操作没有任何约束。
(3)插入操作叫做Push(推进),删除操作叫做Pop(弹出)。我们把项目推进栈,从栈中弹出项目。
(4)栈中没有长度属性,所以没有返回栈中项目个数的操作。我们需要的是确定栈是否为空(Is Empty)的操作,因为当栈空的时候再弹出项目会出错。

8.3 队列

(1)队列也是一种抽象结构,队列中的项目从一端入,从另一端出。插入操作在队列的rear(尾部)进行,删除操作在队列的front(头部)进行。
(2)另一种描述队列的访问行为的说法是删除的总是在队列中时间最长的项目。插入操作没有任何约束。但插入和删除操作没有标准的相关术语。

8.4 列表

(1)列表通常提供插入一个项目的操作(Insert)、删除一个项目的操作(Delete)、检索一个项目是否存在(Is There)以及报告列表中项目数量(GetLength)。此外,他们有一些机制允许用户查看序列中的每一项(Reset,GetNext,MoreItems)。
(2)因为项目可以被删除和检索,所以列表中的项目必须能够互相比较。
*不要把列表误认为是数组,数组是内嵌结构,列表是抽象结构。然而列表应用在数组中。
(3)列表也可以被形象化为链式结构。
链式结构:一个将数据项和找到下一项位置的信息保存到同一容器的实现方法。
链式结构以节点的概念为基础,一个节点由两部分组成:用户的数据和指向列表的下一个节点的链接或指针。列表的最后一个结点的指针变量存放的是表示列表结束的符号,通常为null,用“/”表示。
(4)无序列表的顺序并不重要,项目只是随意被放入其中。
有序列表中,项目之间具有语义关系。
除了第一个项目以外所有项目都存在某种排序关系。
除了最后一个项目,所有的项目都有着相同的关系。

8.5 树

即树状图。 但在计算领域,我们所说的通常是二叉树,即每个节点最多有两个子节点的树。

8.5.1 二叉树

(1)二叉树:具有唯一起始节点(根节点)的抽象复合结构,其中每个节点可以有两个后继节点(子女节点),根节点和每个节点之间都有且只有一条路径。
(2)根:树中唯一的开始节点。(在头部)
(3)叶节点:没有子女的树节点。
(4)除了根节点外,每个节点都只有一个父母节点。
(5)根节点的每个子女本身又是一个小二叉树或子树的根。根节点是树中其他所有节点的先辈。

8.5.2 二叉检索树

(1)树就像无序列表,而二叉检索树就像已排序的列表,节点间存在语义排序。
(2)二叉检索树具有二叉树的形状属性,也就是说,二叉检索树中的节点可以具有0个、1个或2个子女。
二叉检索树还具有语义属性来刻画树中节点上的值。
即任何节点的值都要大于它的左子树中的所有结点的值,并且要小于它的右子树中的所有节点的值。
(3)在二叉检索树中搜索的方法与线性结构的二分检索法之间有相似之处。在线性结构中,通过一次比较操作,就排除了很大一部分数据。
(4)我们从树的根节点开始,沿着根的后继字数前进,直到找到了要找的项目或发现一个空子树为止。
该算法的参数是要搜索的项目和树(字数)的根节点,这些都是子算法执行时所需的信息。
(5)可以使用字符串john、phil、lila、kate、becca、judy、june、mari、jim和sue创造一个二叉检索树。按照值和(2)中的语义属性刻画法进行创造二叉检索树。
(6)要输出根的值,必须先输出它的左子树中的所有值,即所有比根的值小的值。再输出所有比根的值大的值,最后再输出左子树和右子树的值。
递归算法的妙处:简短精致。

8.5.3 其他操作

二叉检索树其实是和列表具有同样功能的对象,它们的区别在于操作的有效性,而行为是相同的。
本节以编写计算树中节点数的算法讲解了二叉检索树的其它操作。

8.6 图

(1)图:由一组节点和一组把节点相互连接起来的边构成的数据结构。
顶点:图中的节点。
边:表示图中两个节点的连接的顶点对。
(2)无向图:其中的边没有方向的图。
有向图:其中的便是从一个顶点指向另一个顶点(或同一个顶点)的图。
(3)邻顶点:通过边连接起来的两个顶点。
路径:连接图中两个顶点的一系列顶点。

8.6.1 创建图

(1)列表、栈、队列和树都是可容纳元素的容器。
(2)图可以被简化为一张表,而创建表格需要以下操作:

8.6.2 图算法

(1)深度优先搜索:走向最深的分支。当必须回溯时,选择离你无法走通位置的最近的分支继续搜索。也就是说,相比于更早时候可选的其他分支,你会选择一条尽可能可以走远的路。
(2)广度优先搜索:优先检查所有与起点相邻的顶点,而不是检查与这些顶点相连的其他顶点。
(3)单源最短路检索:检索离当前顶点最近的顶点。即与此顶点相连的边权值最小的顶点。

8.7 子程序

8.7.1 参数传递

(1)参数列表:子程序要使用的标识符或值的列表,即程序中两部分之间的通信机制。
(2)形参:列在子程序名后的括号中的标识符。可看成子程序中使用的临时标识符。
实参:子程序调用中列在括号中的标识符。
(3)替代机制:类似留言板。子程序将在留言板的第一个位置查看它的第一个形参,在第二个位置查看第二个形参。
调用子程序时传递的实参个数必须与子程序定义中的形参个数相同。由于实参和形参是根据位置匹配的,所以他们的名字不必一致。当需要多次调用一个子程序而每次调用的实参又不同时,这点是很有用的。以这种方式传递的形参通常叫做位置形参。

8.7.2 值参与引用参数

值参:由调用单元传入实参的副本(写在留言板上)的形参。
引用参数:由调用单元传入实参的地址(写在留言板上)的形参。

第九章 面向对象设计与高级程序设计语言

9.1面向对象方法

面向对象的设计方法是用叫做对象的的独立实体生成解决方案的问题求解方法,对象由数据和处理数据的操作构成。面向对象设计的重点是对象以及他们在问题中的交互。一旦收集到了问题中的所有对象,他们就能构成问题的解决方案。

9.1.1 面向对象

(1)对象:在问题背景中相关的事物或实体。
(2)对象类(或类):一组具有相似的属性和行为的对象的描述。
类这个词指的是把对象归入相关的组并描述他们共性的思想。
即类描述的是类中的对象表现出的属性和行为。特定的对象只是类的一个具体的例子。
(3)域:类中的特定项,可以是数据或子程序。表示类的属性和行为。
(4)方法:定义了类的一种行为的特定算法。

*一般来说,类是一种模式,说明了对象看起来像什么(数据)以及它的作用(方法)。

9.1.2 设计方法

四个阶段:

9.1.3 一个计算机示例

(1)问题
创建一个包括每个人的姓名、电话号码和电子邮件地址的列表,然后按照字母顺序输出该列表。
(2)集体讨论和过滤
(3)责任算法
有两个责任要分解,即初始化和输出。
*可复用性是面向对象设计的一大优点。为一个问题设计的类还可以用于解决另一个问题。因为每个类都是自约束的,也就是说,每个类只负责自己的行为。

9.2 翻译过程

9.2.1 编译器

(1)编译器:把用高级语言编写的程序翻译成机器码的程序。
任何计算机只要具有一种高级语言的编译器,就能运行用这种语言编写的程序。
*编译器是一种程序。因此,要编译一个程序,就必须具有这个编译器在特定机器上的机器码版本。
想要在多种类型的机器上使用一种高级语言,就要具备这种语言的多个编译器。

9.2.2 解释器

(1)解释器:输入用高级语言编写的程序,指导计算机执行每个语句指定的动作的程序。
与汇编器和编译器只是输出机器码且机器码再单独执行不同的是,解释器在翻译过语句后会立即执行这个语句。
可以把解释器看作理解编写程序所使用的语言的模拟器或虚拟机。
但翻译器(汇编器或编译器)只用适合的机器语言生成等价的程序,这个程序再单独运行。而模拟器则直接执行程序。
(2)由于软件解释器非常复杂,所以用要解释的语言编写的程序通常比要编译的程序的运行速度慢很多。因此,要编译的语言发展成了主流,以致产生了Java。
(3)Java面世于1996年,可移植性是它最重要的特性。
(4)字节码:编译Java源代码使用的标准机器语言。
*标准化的高级语言实现的可移植性与把Java程序翻译成字节码然后在JVM上解释它所实现的可移植性是不同的。Java编译器输出的程序将被解释,而不是直接被执行。
(5)JVM是像Pep/8一样的虚拟机。
本章中虚拟机被定义为用于说明真实计算机的重要特性的假想机。
JVM是为执行字节码程序设计的假想机

9.3 程序设计语言的范型

范型的定义有两条与计算相关,即“用作模式或模型的实体”和“一组假设、概念、值和实践,构成了共享他们的聚合体观察现实的方式,尤其适用于精神学科”。

9.3.1 命令型范型

(1)面向过程的范型
面向过程编程是一种命令式模型,在这里语句被分组为子程序。
一个程序是子程序分层次构成的,每一层执行整个问题求解的一个必要的特定任务。
在面向过程的范型中,数据被认为是被动并且被程序所操控的。
(2)面向对象的范型
面向对象视角是与对象交互的一种方式。每个对象负责执行它自己的动作。
在面向对象的范型中,数据对象是活跃的,对象与操作对象的代码绑定在一起,使得每个对象负责控制自己的操作。
(3)C++和Java是命令式的语言,但就它们的范型而言又是混合的。
尽管Java被认为是面向对象的,但是它还是有一些面向过程的特性。C++被认为是面向过程的,但是他又有面向对象的特征。

9.3.2 声明式范型

(1)声明式范型的一个描述结果的模型,但完成结果的过程则不被描述。
(2)在这种反省中有两种基本模型:

9.4 高级程序设计语言的功能性

(1)两种伪代码结构——选择和重复(循环)是命令式语言的标志。 (2)在高级语言中,选择和迭代操作非常简单,但子程序和参数传递较为复杂。

9.4.1 布尔表达式

(1)布尔表达式:一个标识符序列,标识符之间由相容的运算符分隔,求得的值是true或false。
(2)一个布尔表达式可以是:

(3)布尔变量是内存中的一个地址,由存放true或false的标识符引用。
(4)关系运算符是比较两个值的运算符。

9.4.2 数据归类

(1)当使用汇编语言时,我们为内存分配标识符而不管它所存储的内容。
(2)很多应用广泛的高级语言(包括C++和Java)要求在声明关联标识符时明确存储的内容。如果程序中的一个语句想要把一个值存储到类型不合适的变量中,将会提示错误信息。
这种只能在变量中存储合适的类型的要求叫作强类型化。
(3)强类型化:每个变量都有一个类型,只有这种类型的值才能够存储到该变量中。
(4)数据类型:一组值以及能够应用于这种类型的值的基本操作集合的说明。
每一种数据类型都有特定的操作,使得其可以合法的应用在这种类型的数值上。
*C++、Java、VB.NET是强类型的语言,而Python则不是。
(5)数据是表示信息的物理符号。在计算机内部,数据和指令都是二进制位的组合。
计算机能够执行一条指令,是因为这条指令的地址被载入了程序计数器,而指令被载入了指令寄存器。被执行的位组合同样可以表示整数、实数、字符或布尔值,关键看计算机如何解释位组合。
(6)固有的四种数据类型(称为简单数据类型或原子数据类型,因为每个值都是独立且不可再分的):

(7)字符串:一个字符序列,在某些语言中这个序列通常被看作一个数据值。
*使用单引号圈起字符,使用双引号圈起字符串。
*有些高级语言采用同样的符号圈起字符和字符串,因此一个字符和只包含一个字符的字符串之间没有区别。
(8)声明:把变量、动作和语言中的其他实体与标识符相关联起来的语句,是程序员可以通过名字引用这些项目。
(9)保留字:一种语言中具有特殊意义的字,不能用它作为标识符。
*C++和Java声明变量时不采用保留字。
区分大小写:大写和小写字母被看作是不同的;两个拼写方法相同但大小写形式不同的标识符被看作是两个不同的标识符。
标识符大小写的用法是语言文化的一部分。

9.4.3 输入/输出结构

(1)高级语言把输入的文本数据看做一个分为多行的字符流。字符的含义则由存放值的内存单元的数据类型决定。
(2)所有输入语句都由三部分组成:

(3)在强类型语言中,需要分别声明变量name、age和hourlyWage的数据类型。
(4)数据流可能来自键盘,也可能来自一个数据文件,不过处理过程是一样的:
变量出现在输入语句中的顺序必须与值出现在输入流中的顺序一样。
输入的变量的类型决定了如何解释输入流中的字符。也就是说,输入流只是一系列ASCII(或Unicode)字符。
下一个只要存入的变量的类型决定了如何解释这个字符序列。
(5)在非强类型语言中,输入的格式决定了类型。如果输入出现在引号之间,则它被假定为一个字符串,并以字符串的形式存储。如果输入的是一个数字,它将被存储为数字。
(6)输出语句创建字符流。输出语句中列出的项目可以是文字值或变量名。
文字值是直接在输出语句中写的数字或字符串(或任何语句)。
类型确定了如何解释位模式。如果该类型是字符串,则将字符写入输出流。如果该位模式为数字,则该数字将被转换为表示数字的字符,并将字符输出。
(7)在强类型语言中,处理的关键在于数据类型,数据类型确定字符是如何被转换为位模式(输入)以及如何被转换为字符(输出)。
在非强类型语言中,输入的格式决定了位模式是如何转换的。

9.4.4 控制结构

(1)伪代码提供了三种方法来改变控制算法的流程:重复、选择和子程序。这些结构叫做控制结构。
(2)控制结构:确定程序中的其它指令的执行顺序的指令。
(3)程序中的每个逻辑单元都只能有一个入口和一个出口,程序不应随意地跳入或跳出这些逻辑模块。
高级语言引入的控制结构使得这一规则比较容易遵守。这些控制结构是选择语句、循环语句和子程序语句。无限制的分支语句不再是必需的。
(4)在伪代码算法中,我们用缩进来将if语句和while语句和语句体组合在一起。
(5)嵌套逻辑:
在任何控制语句中被执行或跳过的语句可以是简单的语句或块(一组语句),对于这些语句没有任何限制。
被跳过或重复语句可以包含一个控制结构。
选择语句可以再循环结构中被嵌套,循环结构可以在选择语句中被嵌套。
选择和循环语句可以在子程序中被嵌套,而子程序可以在循环或选择结构中被嵌套。
(6)控制结构中有控制结构,这个控制结构中还有控制结构……理论上,控制结构的嵌套有多深是没有限制的!
然而,如果嵌套结构变得很难去追踪,则需要给嵌套的任务一个名字或者将其做成一个子程序,并在之后去实现它。
(7)异步处理:
对很多应用程序而言,填表和点击按钮已经成为唯一的输入形式。
在传统的流处理中,序列中的一个输入语句只有遇到时才会被执行。
鼠标的点击不会出现在程序的序列中,也就是说,用户可以在程序执行的任何时刻点击鼠标。
程序必须识别用户点击鼠标的行为,处理该点击然后继续运行。这就叫异步处理。
(8)异步:不与计算机中的其它操作同时发生;换句话说,与计算机的动作不同步。
异步处理也叫做事件驱动处理。这样的处理是被程序指令序列与外发生的事件所控制。
*异步处理经常被用在Java和VB.NET中,但是很少被其它语言所使用。

9.5面向对象语言的功能性

9.5.1 封装

(1)封装:有两种说法。

(2)用于提供封装的结构叫类。
在设计和实现阶段都没有标准的相关定义。
对象类或类(设计或问题求解阶段):属性和行为相似的一组对象的说明。
对象(设计或问题求解阶段):与问题背景相关的事物或实体。
对象(实现阶段):类的一个实例。
类(实现阶段):是一种语言结构,这种结构是对象的模式,为封装对象类的属性和动作提供了机制。

9.5.2 类

(1)从语法上来说,类像前面介绍的记录,它们都是异构复合数据类型。
但记录通常被认为是被动结构,只是近年来才采用子程序作为域。
而类是主动结构,一直都把子程序用作域。
操作类的数据域的唯一方式是通过类中定义的方法(子程序)
(2)实例化:创建类的对象。
(3)算法声明类的对象只能通过类的子程序(称为方法)访问类的域。
(4)默认情况下,类中的域是私有的。即除非一个类的某个域被标识为public(公有),否则任何其他对象都不能访问这个类的对象的域。(无论是数据还是方法)。如果一个类想让其它类的对象调用自己的方法,就必须明确地声明这个方法是public的。

9.5.3 继承

(1)继承是面向对象语言的一种属性,即一个类可以继承另一个类的数据和方法。
超类是被继承的类,派生类是继承的类。
类构成了继承的体系结构。所处的层次越低,对象越专门化。
下级的类会继承其父类的所有行为和数据。
(2)继承通过允许应用程序使用已经被测试过的类和从一个类中继承应用所需的属性来促进重用。其他必要的属性和方法可以在之后加入派生类中。

9.5.4 多态

(1)多态:一种语言的继承体系结构中具有两个同名方法且能够根据对象应用合适的方法的能力。
(2)继承和多态结合在一起使程序员能够构造出在不同应用程序中可以重复使用的类的体系结构。
可重用性不仅仅适用于面向对象语言;而面向对象语言的功能却使编写通用的、可重用的代码段变得更容易。

9.6 过程设计与面向对象设计的区别

(1)在面向对象的设计中,列表数据结构和子程序需要在类中绑定在一起。 (2)在面向过程的版本中,列表被呈现为传递给子程序的记录,以便子程序可以对其操作。 操作它的数据结构和子程序是用户程序的一部分。 在面向对象的版本中,类对象的实现通过封装实验对用户的隐藏。

标签:语句,位学,语言,对象,子程序,面向对象,2020,网络空间,节点
来源: https://www.cnblogs.com/Sliver25/p/15417986.html