第四部分 程序设计层
第六章 低级程序设计语言和伪代码
机器语言是最低级的编程语言,它被内置在机器中。在汇编语言中能用一些字母的组合来表示机器语言指令。伪代码能够表示算法。
6.1计算机操作
我们所用的程序设计语言都必须反映出计算机能够执行的操作类型。
计算机是能够存储、检索和处理数据的可编程电子设备。
这个定义中的操作字包括可编程的、存储、检索和处理。
处理、检索和处理是计算机能够对数据执行的动作。也就是说,控制单元执行的指令能够把数据存储到机器的内存中,在机器内存中检索数据,在算术逻辑单元中以某种方式处理数据。词语“处理”非常通用。处理涉及在数据值上执行算术和逻辑操作。
6.2机器语言
机器语言:由计算机直接使用的二进制编码指令构成的语言。
机器代码因机器不同而不同,每一种机器有一个特定的能够被执行的操作集合,称为这种计算机的机器语言。
虚拟机:为了模拟真实机器的重要特征而设计的假想机器。
一个字节能够表示的最大十进制数是255,用二进制表示是11111111,用十六进制表示是FF。一个字(16位)能够表示的最大十进制数是65535,用二进制表示是1111111111111111,用十六进制表示是FFFF。如果既要表示正数,又要表示负数,那么在量级上就会少一位,因此可以表示的十六进制数的范围是-7FFF到+7FFF,相当于十进制数的-32767到+32767.
一条指令由两部分组成,即8位的指令说明符和(可选的)16位的操作数说明符。指令说明符(指令的第一个字节)说明了要执行什么操作(如把一个数加到一个已经存储在寄存器中的值上)和如何解释操作数的位置。操作数说明符(指令的第二和第三个字节)存放的是操作数本身或者操作数的地址。
指令说明符的格式根据表示一个具体操作所用的比特数的不同而不同。在Pep/8中,操作码的长度从4比特到8比特不等,我们在这里所用的操作码长度是4比特或5比特,4比特操作码的第五位用来指定使用哪个寄存器。3比特的寻址模式说明符表示了怎样解析指令中的操作数部分。
没有操作数(要处理的数据)的指令称为一元指令,这些指令没有操作数说明符。也就是说一元指令的长度是1个字节,而不是3个字节。
6.3一个程序实例
我们用双引号来指一组字符,使用单引号指单个字符
6.3.1手工模拟
6.3.2Pep/8模拟程序
装入程序:软件用于读取机器语言并把它载入内存的部分。
6.4汇编语言
汇编语言给每条机器语言指令分配了一个助记指令码,程序员可以用这些指令码代替二进制数字。
- 汇编语言(assembly language):一种低级语言,用助记码表示特定计算机的机器语言指令
- 汇编器(assembler):把汇编语言程序翻译成机器代码的程序
6.4.1Pep/8汇编语言
6.4.2汇编器指令
汇编器指令(assembler directive):翻译程序使用的指令。
从汇编语言开始,大多数程序设计语言都有两种类型的指令,即要翻译的指令和翻译程序使用的指令。
6.4.3Hello程序的汇编语言版本
注释(comment):为程序读者提供的解释性文字。
汇编语言通过将指令抽象为单词,从而删除了机器语言编程的很多细节。
6.4.4一个新程序
6.4.5具有分支的程序
6.4.6具有循环的程序
6.5表达算法
- 算法(algorithm):解决方案的计划或概要,或解决问题的逻辑步骤顺序。
- 伪代码(pseudocode):一种表达算法的语言。
6.5.1伪代码的功能
- 变量
- 赋值
- 输入/输出
- 选择
- 重复
布尔表达式(boolean expression):评价为真或假的表达式。
6.5.2执行伪代码算法
6.5.3写伪代码算法
桌面检查(desk checking):在纸上走查整个设计。
6.5.4翻译伪代码算法
6.6测试
- 测试计划:说明如何测试程序的文档。
- 代码覆盖(明箱)测试法:通过执行代码中的所用语句测试程序或子程序的测试方法。
- 数据覆盖(暗箱)测试法:把代码作为一个暗箱,基于所有可能的输入数据测试程序或子程序的测试方法。
- 测试计划实现:用测试计划中规定的测试用例验证程序是否输出了预期的结果。
小结
- 计算机能够存储、检索和处理数据。
- 计算机的机器语言是一套机器的硬件能够识别并执行的指令。
- Pep/8汇编语言是一种使用助记忆码而不是二进制数表示的指令。
- 伪代码是人们为了表示算法而使用的一种便捷形式的语言。
- 与算法一样,程序也需要测试。
第七章 问题求解与算法设计
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带有选择的算法
7.2.2带有循环的算法
- 计数控制循环
- 事件控制循环
嵌套结构:控制结构嵌入另一个控制结构的结构,又称为嵌套逻辑。
- 平方根
抽象步骤:细节仍未明确的算法步骤。
具体步骤:细节完全明确的算法步骤。
7.3复杂变量
7.3.1数组
7.3.2记录
7.4搜索算法
7.4.1搜索顺序
7.4.2有序数组中的顺序搜索
7.4.3二分检索
二分检索:在有序列表中查找项目的操作,通过比较操作排除大部分检索范围。
7.5排序
7.5.1选择排序
7.5.2冒泡排序
7.5.3插入排序
7.6递归算法
递归:算法调用它本身的能力。
7.6.1子程序语言
7.6.2递归阶乘
7.6.3递归二分检索
7.6.4快速排序
7.7几个重要思想
7.7.1信息隐蔽
信息隐蔽:隐蔽模块的细节以控制对这些细节的访问的做法。
7.7.2抽象
抽象:复杂系统的一种模型,只包括对观察者来说必需的细节。
- 数据抽象:把数据的逻辑视图和它的实现分离开。
- 过程抽象:把动作的逻辑视图和它的实现分离开。
- 控制抽象:把控制结构的逻辑视图和它的实现分离开。
- 控制结构:用于改变正常的顺序控制流的语句。
7.7.3事物命名
7.7.4测试
小结:
- Polya在他的经典著作《如何解决它》中列出了数学问题的求解策略。
- 循环分为计数控制循环与事件控制循环。
- 数据有两种形式:不可分割的和复合的。
- 搜索是指在数组中寻找一个特定值的行为。
- 递归算法是指可以在子程序自身中出现子程序名的算法。