2019-2020-1学期20202407钱虹全《网络空间安全专业导论》第三周学习总结

第四部分    程序设计层(第六、七章)

第六章   低级程序设计语言与伪代码

6.1  计算机操作

存储(store)、检索(retrieve)和处理(process)是计算机能够对数据执行的动作。

6.2 机器语言

机器语言(machine language):由计算机直接使用的二进制编码指令构成的语言。

6.2.1 Pep/9:一台虚拟机

虚拟机(virtual computer):为了模拟真实机器的重要特征而设计的假想机器。

1. Pep/9的基本特性

Pep/9有七个寄存器,在这里重点研究三个。
·程序计数器(PC) :其中包含下一条即将被执行的指令的地址。
·指令寄存器(IR):其中包含正在被执行的指令的一个副本。
·累加器(A):用来存储数据和运算的结果。

2.指令格式

一条指令由两部分组成,即八位的指令说明符和十六位的操作数说明符。因此Pep/9的指令在长度上是1字节或3字节,取决于是否需要用操作数说明符。

如果寻址模式是000,那么指令的操作数说明符中存储的就是操作数。这种寻址模式叫立即寻址
如果寻址模式是001,那么操作数说明符中存储的事操作数所在的内存地址名称。这种寻址模式叫直接寻址

3. 一些示例指令

 

6.2.2 Pep/9的输入/输出

虚拟机遵循的设计原理是(内存映射输入/输出memory-mapped I/O)

6.3 一个程序实例

6.3.1 Pep/9模拟器

我们必须使用存储单一字节的存储指令。在机器语言执行之前,它必须被载入存储器。这个任务通过一个叫做装入程序(loader)的软件工具来实现。模拟器在执行时遵守读取-执行周期。

模拟器执行程序遵守:

1.从由程序计数器确定的存储器位置上获取指令;

2.解码指令,更新程序计数器;

3.获得操作数(如果需要);

4.执行指令。

6.3.2  另一个计算机语言实例

 

6.4 汇编语言

汇编语言(assembly language):一种低级语言,用助记码表示特定计算机的机器语言指令。
汇编器(assembler):把汇编语言程序翻译成机器代码的程序。
汇编器指令(assembler directive):翻译程序使用的指令。[也被称伪操作(pseudo-operation)]

注释(comment):为程序读者提供的解释性文字。
由程序员解释的内容。
我们从未直接使用过机器语言编写程序来进行数值计算,因为Pep/9机器语言的输出值被定义为单个字符。
分支(branch):指出执行下一条指令的指令。
标签(label):对内存位置起的名字,可以将这个名字当作操作数。
我们可以重写我们的AddNums程序来使用循环。

6.5 表达算法

算法(algorithm):解决方案的计划或概要,或解决问题的逻辑步骤顺序。
伪代码(pseudocode):一种表达算法的语言。

6.5.1 伪代码的功能

 

6.5.2  执行伪代码算法

布尔表达式(Boolean expression):评价为真或为假的表达式。

6.5.3  写伪代码算法

一个伪代码语句可以被翻译成多种汇编语言语句。
桌面检查(desk checking):在纸上走查整个设计。

6.6 测试

测试计划就是一个文档,说明了要全面测试程序需要运行的次数以及运行程序使用的数据。每套输入的数据值称为测试用例(test case)。
代码覆盖测试法(code-coverage testing):通过执行代码中的所有语句测试程序或子程序的测试方法。
数据覆盖测试法(data-coverage testing):把代码作为一个暗箱,基于所有可能的输入数据测试程序或子程序的测试方法。
测试结果实现(test-plan implementation):用测试计划中规定的测试用例验证程序是否输出了预期的结果。

第7章 问题求解与算法设计

7.1  如何解决问题

理解问题--设计方案--执行方案--回顾

7.1.1  提出问题

7.1.2寻找熟悉的情况

7.1.3分治法

7.1.4算法

算法(algorithm):在有限的时间内用有限的数据解决问题或子问题的明确指令集合。

7.1.5计算机问题求解过程

计算机问题求解包括四个阶段,即分析和说明阶段、算法开发阶段、实现阶段和维护阶段。

7.1.6方法总结

分析问题→列出主要任务→编写其余的模块→根据需要进行重组和改写

7.1.7测试算法

7.2  有简单变量的算法

7.2.1 带有选择的算法

if/elif/else

7.2.2带有循环的算法

1、计数控制循环

计数控制循环可以制定过程重复的次数,这个循环的机制是简单记录过程重复的次数并且在重复再次开始前检测循环是否已经结束。这类循环有三个不同的部分,使用一个特殊的变量叫做循环控制变量。第一部分是初始化:循环控制变量初始化为某个初始值;第二部分是测试:循环控制变量是否已经达到特定值?第三部分是增量:循环控制变量以1递增。
while循环被称为前测试循环,因为在循环开始前就测试了,如果最初条件为假,那么将不进入循环。

2.事件控制循环

循环中重复的次数是由循环体自身内发生的事件控制的循环被称为事件控制循环。当使用while语句来实现事件控制循环时,这一过程仍然分成三部分:事件必须初始化,事件必须被测试,事件必须更新。
计数控制循环是非常简单直接的,而事件控制循环中则不太清楚。
在控制结构中执行或跳过的语句可以是简单的语句或者是复杂的语句。因此跳过或重复的语句中可以包含一个控制结构。
嵌套结构(nested structure):控制结构另一个结构的结构,又称为嵌套逻辑(nested logic)。

3.平方根

抽象步骤(abstract step):细节仍未明确的算法步骤。
具体步骤(concrete step):细节完全明确的算法步骤。

7.3 复杂变量

7.3.1  数组

多数程序设计语言从0开始计数。

数组是同构项目的有名集合,可以通过单个项目在集合中的位置访问它们。项目在集合中的位置叫做索引。

例如:数组为numbers,通过表达式numbers[position]来访问数组中的每个值,position就是索引,是一个从0到9的数。

与数组有关的算法分为三类:搜索、排序和处理
搜索就是搜索数组中的项,排序就是按顺序将元素放在数组中,处理是一种捕捉短语,包含了对数组中的项所做的所有其他计算。

7.3.2  记录

记录是异构项目的有名集合,可以通过名字单独访问其中的项目,所谓异构,就是指集合中的元素可以不必相同。

7.4搜索算法

7.4.1顺序搜索

7.4.2有序数组中的顺序搜索

如果知道数组中的项目是有序的,那么在查找时,如果我们需要的项目在数组中,到了这个数可以在数组中的位置时就可以停止查找了。

7.4.3二分检索

二分检索(binary search):在有序列表中查找项目的操作,通过比较操作排除大部分检索范围。

7.5 排序

7.5.1选择排序

选择排序算法也许是最简单的,因为它与我们手动排序十分相似,但其所占的内存空间较大,复制操作也很费空间。

7.5.2冒泡排序

冒泡排序是一种选择排序法,只是在查找最小值时采用了不同的方法。

7.5.3插入排序

先确定两个元素的顺序,再根据这两个元素与第三个元素比较,将第三个元素放在合适的位置。

7.6 递归算法

当在一个算法使用它自己时,这样的算法被称为递归算法。
递归(recursion):算法调用他本身的能力。

7.6.1子程序语句

我们可以给一段代码一个名称,然后程序另一部分的一个语句使用这个名称。遇到这个名称时,这个进程的其他部分将会终止,等待这个命名代码被执行。命名代码出现的地方被称为调用单元。
子程序的两种形式:1.只执行特定任务的命名代码2.不仅执行任务,还返回给调用单元一个值。

7.6.2递归阶乘

N!=N * (N-1)!

0的阶乘是1。尺寸系数就是要计算阶乘的数。基本情况是

Factorial(O)=1

一般情况是

Factorial(N)=N * Factorial(N-1)

7.6.3递归二分检索

递归算法必须从非递归算法中调用,正如刚才的阶乘算法那样。

7.6.4快速排序

如果数据是随机排列的,那么快速排序是一个很好的排序方法。

7.7几个重要思想

7.7.1信息隐蔽

信息隐蔽(information hiding):隐蔽模块的细节以控制对这些细节的访问的做法。

7.7.2抽象

抽象(abstraction):复杂系统的一种模型,只包括对观察者来说的必须细节。

抽象是人们用来处理复杂事务的强有力的工具。
数据抽象(data abstraction):把数据的逻辑视图和它的现实分离开。
过程抽象(procedural abstraction):把动作的逻辑视图和它的现实分离开。
控制抽象(control abstraction):把控制结构的逻辑视图和它的现实分离开。
控制结构(control structure):用于改变正常的顺序控制流的语句。

7.7.3事物命名

7.7.4测试

分类:白盒测试:基于代码本身;

黑盒测试:基于测试所有可能的输入值。

 

posted @ 2020-10-27 17:10  钱虹全  阅读(170)  评论(0)    收藏  举报