20212307孙以诺
学习收获第六章 低级程序设计语言与伪代码
计算机操作
计算机是能够存储、检索和处理数据的可编程电子设备
Pep/9虚拟机
内存单元每个字节由8位组成,Pep/9的字长是2字节,或者16位。这样的算术/逻辑单元流入的数据或从算术/逻辑单元流出的数据;在长度上就是16位;
Pep/9有7个寄存器
16位可以表示的十六进制值数的范围约为-7FFF到+7FFF,相当于十进制数的-32767到+32767;
Pep/9虚拟机可用的位数决定了我们可以使用的内存大小;
一条指令由两部分组成,即8位的指令说明符和16位的操作说明符;
3位的寻址模式说明符表示了怎样解析指令中的操作数部分。000存储的就是操作数,立即寻址。001是操作数所在的内存地址名称,直接寻址;
没有操作数的指令称为一元指令,这些指令没有操作数说明符。也就是说,一元指令的长度是1字节,而不是3字节;
Pep/9的输入/输出
Pep/9使用ASCII字符集来表示字符;
对于每一个二进制指令,第一行展示了8位指令说明符,第二行展示了16位操作数说明符;
Pep/9模拟器
程序代码每个字节之间用空格隔开,以zz结束程序;
遵守读取-执行周期:从由程序计数器确定的存储器位置上获取指令
解码指令,更新程序计数器
获得操作数
执行指令
汇编语言
汇编语言给每条机器语言指令分配了一个助记指令码,程序员可以用这些指令码代替二进制和十六进制数字,也就使得效率得到提高,编程过程中也会有较少的错误;
因为每种类型的计算机都有自己的机器语言,所以有多少种机器,就有多少种汇编语言和翻译程序
“构建”>“运行”菜单选项,这些选项会将源代码汇编成目标代码,并自动执行它;
Pep/9机器语言的输出值被定义为单个字符;
DECI指令不支持立即寻址,STRO指令被用来打印完整的一串字符串,BRLT和BREQ指令只在满足特定情况时导致程序分支,BRLT在累加器小于零的时候满足,BREQ在累加器等于零的时候满足;
标签和它们对应的地址会在代码清单后以符号表的形式进行展示
表达算法
变量sum可以用来表示一个集合中其它值的和;
当变量用于to或者←右边时,就能访问变量的值。当变量用于Set后或←的左边时,就会向其中存入一个值,存入变量的值可以是单个的值,也可以是由变量或操作符构成的表达式(如sum+sum);
WHILE和IF旁边的括号里的表达式是布尔表达式
执行伪代码算法
我们用指定的方框来描述这些数据项,方框中是它们的值。对于内容未知的方框,其中放置的是问号;
桌面检查:在纸上走查整个设计。这种方法虽然简单,但却极其有效
翻译伪代码算法
一个伪代码语句需要几个Pep/9语句
测试
代码覆盖测试法(明箱操作法) 数据覆盖测试法(暗箱操作法)
第七章 问题求解与算法设计
如何解决问题
算法:在有限的时间内用有限的数据解决问题或子问题的明确指令集合
计算机问题求解过程包括四个阶段,即分析和说明阶段、算法开发阶段、实现阶段和维护阶段
方法总结
1.分析问题
2.列出主要任务
3.编写其余的模块
4.根据需要进行重组和改写
带有循环的算法
有两种基本的循环,分别为计数控制和事件控制;
计数控制循环可以指定过程重复的计数,循环控制变量的初始值和布尔表达式中的关系运算符共同确定了循环执行的次数;
循环中重复的次数是由循环体自身内发生的事件控制的循环被称为事件控制循环;
我们把计数的变量叫作POSCount;
嵌套结构:控制结构嵌入另一个控制结构的结构,又称为嵌套逻辑;
我们用旧的猜测数和平方数除以旧的猜测数之间的平均数作为新的猜测数;
抽象步骤:细节仍未明确的算法步骤
具体步骤:细节完全明确的算法步骤
复杂变量
字符串不是不可分割的,因为其中包含了不止一个值。但无论如何,我们倾向于认为字符串是不可分割的部分;
项目在集合中的位置叫索引;
排序是按顺序将元素放入数组中,如果项是数字,将以数字顺序排列;如果项是字符或字符串,将以字母顺序排序;
布尔操作符包括特殊操作符AND、OR和NOT。AND操作符只有在表达式都为真时返回值才是TRUE,否则返回FALSE。OR操作符只有在表达式都为假时返回FALSE,否则返回TRUE。NOT操作符改变表达式的值;
二分检索
当要找的项目找到了,或可能出现这个项目的数组为空的情况,整个过程将终止;
为了计算中间项的索引,每个比较操作都需要更多的计算。此外,数组必须是有序的。如果数组是有序的已经排好,且其中的项目不超过20个,那么使用二分检索算法更好。
选择排序
这个算法中只有三个抽象步骤,即确定数组是否已经排好序了、找到最小元素的索引和互换两者位置;
这个过程总是记住迄今为止见过的最小的项目,直到扫描达到列表结尾。
冒泡排序
每次迭代都会把未排序的最小元素放到它的正确位置,同时会改变数组中其他元素的位置;
比较排序算法的方法通常是看它们对数组排序的迭代次数。冒泡排序中还有大量的交换操作;
如果一次迭代中不必交换任何数据值,那么这个数组就是有序的;
选择排序算法不能确定数组是否是有序的;
如果数组中只有一个元素,那么它就是有序的;
选择排序的每次迭代后,一个元素被放置到它的永久位置。而插入排序的每次迭代后,一个元素将被放在相对于其他元素来说适当的位置上
递归算法
每个递归算法至少有两种情况:基本情况和一般情况;
与每个递归问题相关的是如何衡量问题的大小。所有递归解决方案的第一步都是确定尺寸系数。
子程序语句
命名代码出现的地方被称为调用单元;
子程序有两种形式,一种是只执行特定任务的命名代码,一种是不仅执行任务,还返回给调用单元一个值。如果子程序返回一个值给调用单元,它在将要返回的数据名称后面使用单词RETURN;
如果参数是负数,子程序将不断地调用自身,直到运行时间支持系统耗尽了内存为止。这种情况叫作无限递归,与无限循环等价。
递归二分检索
当要检测的片段只有一个项目时,就不必在继续了。
测试
有两种基本的测试分类:白盒测试和黑盒测试
遇到的问题对指令格式和寻址模式不能很好理解
循环算法和递归算法
解决方法反复看书,试着去思考其中的过程及定义