公共基础知识
算法
内容提要
算法
算法的基本概念、算法复杂度
数据结构
什么是数据结构、数据结构的图形表示、线性结构和非线性结构
线性表
基本概念、顺序储存结构、插入运算、删除运算
栈和队列
栈及其队列的基本概念及其基本运算
树和二叉树
树的基本概念、二叉树及其基本性质、二叉树的存储结构、、二叉树的遍历
查找技术
顺序查找、二分法查找
排序技术
交换类排序法、插入类排序法、选择类排序法
1.1算法
算法=解题方案
1.基本特征
可行性
考虑到计算机有效位数或者不能分母为0或者开负数平方根
确定性
不能一会为0一会为1
有穷性
有限的时间内要结束
拥有足够的情报
(输入决定输出)
2.基本要素
对数据进行运算
算术运算
逻辑运算(或、与、非)
关系运算
数据传输 赋值、输入、输出
算法控制结构
顺序、分支、循环
3.算法基本设计方法
1.列举法
将所以可能列举出来
2.归纳法
猜
3.递推法
4.递归法
5.减半递推技术
6.回溯法
4.算法复杂度
1.算法时间复杂度
1.计算量
语言、代码质量、机器执行速度、问题规模
2.问题规模
f(n)
T(n)=O(f(n))
O读大O
矩阵=数组
3.分析算法工作量
平均线态
最坏情况复杂性
2.算法空间复杂度
所需最大存储空间
1.三部分
程序所占空间
初始数据所占空间
执行过程所要额外空间
1.2数据结构
1.主要内容
数据的逻辑结构
数据的存储结构
对各种数据结构进行的运算
2.研究数据结构的目的
提高数据处理的速度(时间)
尽量节省在数据处理过程中所占用的计算机存储空间(空间)
3.数据结构的定义
相互有关联的数据元素的集合
数据元素之间的关系可以用前后件关系来描述
一个数据结构应该包含两方面
数据元素的信息
各个数据元素的前后件关系
4.数据的逻辑结构
对数据元素之间的逻辑关系的描述
抽象的反映逻辑关系,与存储无关
两个要素:
数据元素的集合,记为D
前后件关系,记为R
B = (D,R)
5.数据的存储结构
数据的逻辑结构再计算机存储空间中的存放形式
常用的存储结构:
不同的存储结构,数据处理的效率不同
1.3数据结构的图形表示
数据结点用方框表示
前后件关系用有向线段表示
基本运算
插入、删除、查找、分类、合并、分解、复制、修改…
1.4线性结构和非线性结构
空的数据类型
一个数据元素都没有
线性结构
两个条件
有且只有一个根结点
每个结点最多有一个前件,也最多有一个后件
非线性结构
有至少一个结点有多个前件或者后件
常见的非线性结构
树、二叉树、图
1.5线性表
1.基本概念
由n个相同类型数据元素构成的有限序列
n定义为线性表的表长;n=0时的线性表被称为空表。
称i为在线性表中的位序。
2.结构特征
相对位置为线性
有且只有一个根结点,无前件,有且只有一个后结点,无后件
除头结点和后结点外,其他所有结点均有且只有一个前件和后件
3.存储结构
顺序存储
链式存储
两个基本特点
线性表中所有元素所占的存储空间是连续的。
线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
4.顺序表插入运算
1.从大的位置向下移动
2.移动开目标位置
3.插入新值
5.删除运算
6.插入删除分析
1.6栈和队列
1.栈及其基本运算
- 一种只允许在表的一端进行插入或删除操作的特殊的线性表
- 栈顶:允许进行插入和删除的一端
- 栈底:不允许插入与删除操作的另一端
- FILO First In Last Out 先进后出
2.栈的储存与运算
-
先出后进
-
栈空时 top=0 bot=1
-
栈满时 top=m bot=1
-
进栈 top+1 压入数据
-
进栈 top-1 吐出数据
-
读栈顶元素 top-> x
-
1.7队列
1.队列的定义
- 限定只能在表的一端进行插入和在另一端进行删除操作的线性表
- 队尾:允许插入的一端
- 队头:允许删除的一端
- FIFO First In First Out 先进先出 后进后出
- 基本运算:
- 入队运算:往队列的队尾插入一个元素,队尾指针rear的变化
- 出队运算:从队列的排头删除一个元素,队头指针front的变化
2.循环队列及其运算
- 队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间供队列循环使用
- 入队运算:队尾指针加1,并当rear=m+1时置rear=1
- 出队运算:队头指针加1,并当front=m+1时置front=1
1.8树和二叉树
1.树的定义
- 有且仅有一个根结点(Root)
- 其余的结点可分为m个互不相交的子集T1,T2,T3,…,Tm,其中每个子集又是一颗树,并称其为子树。
2.树的基本概念
- 根结点没有前件
- 其他结点都有前件
- 子结点:有前件、,且有后件
- 叶子结点:有前件,但是没有后件
- 结点的度:所拥有的后件个数
- 树的度:各个结点度数的最大值
- 层:树结构是一种层次结构,根结点为第一层,根的子结点为第二层,依此类推。
- 深度:一棵树中结点的最大层数
3.树的特点
- 树中只有根结点没有前件
- 除根外,其余结点都有且仅一个前件
- 树的结点,可以有零个或多个后件
- 除根外的其他结点,都存在唯一条从根到该结点的路径
总结:树是一种分支结构(除根的结点外)每个元素都有且仅有一个直接前件,有且仅有零个成多个直接后件。(重要)
- 树的存储:用多重链表来表示
4.二叉树
1.定义
- 二叉树是n个结点的有限集合
- 由一个根结点及两棵互不相交的、分别称为左子树和右子树的二又树组成,并且左右子树都是二叉树。
- 度:2
- 深度:数层数
2.特点
- 非空二叉树只有一个根结点
- 每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。
3.性质
4.满二叉树和完全二叉树
1.满二叉树
除最后一层外,每一层上的所有结点都有两个子结点
2.完全二叉树
除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。
性质:
3.二叉树的存储结构
普通二叉树
- 采用链式存储结构
- 存储结点由两部分组成:数据域(data)与指针域(Lnext and Rnext)
- 两个指针域:左指针域 and 右指针域
满二叉树和完全二叉树
- 采用顺序存储结构
4.二叉树的遍历
二叉树的遍历:不重复地访问二又树中的所有结点
- 前序遍历(DLR)根左右
- 首先访问根结点,然后遍历左子树,最后遍历右子树;并且,在遍历左右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
- 中序遍历(LDR)左根右
- 首先遍历左子树,然后访问根结点,最后遍历右子树;并且,在遍历左右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
- 后序遍历(LRD)左右根
- 首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。
- 超级重要
例题
1.9查找技术
-
查找(Searching):根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。
-
查找结果:成功->找到->第几个->下标为几
-
查找结果:不成功->没找到->NULL->-1
-
平均查找长度: 查找过程中关键字和给定值比较的平均次数
1.顺序查找
-
从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。否则就是表中没有要找的元素,查找不成功。
-
平均要与表中一半以上元素进行比较,最坏情况下需要比较n次。
-
如果线性表是无序的。不管是顺序存储结构还是链式存储结构,都只能用顺序查找
-
即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。
2.二分查找法
- 先确定待查找记录所在的范围,然后逐步缩小范围,直到找到或确认找不到该记录为止。
- 前提:顺序存储结构,有序表
- 查找过程
- 若中间项的值等于x,则说明已查到。
- 若x小于中间项的值,则在线性表的前半部分查找
- 若x大于中间项的值,则在线性表的后半部分查找。
特点:
实例:
2.0排序技术
1.交换类排序
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换直到没有反序的记录为止。
2.冒泡排序
对存放原始数据的数组,按从后往前的方向进行多次扫描当发现相邻两个数据的次序与排序要求的“递增次序”不符合时,即将这两个数据进行互换。这样,较小的数据就会逐单元向前移动,好象气泡向上浮起一样。
性能分析:
假设线性表的长度n,则在最坏情况下,需要的比较次数为n(n-1)/2
例题:
3.快速排序
任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。
平均时间复杂度
例题
4.插入类排序
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
5.简单插入排序
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较将它插入到有序表中的适当位置,使之成为新的有序表。
最坏情况 需求进行n(n-1)/2次比较
例题
6.希尔排序
例子
7.选择类排序
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子序列的最后,直到全部记录排序完毕。
方法:简单选择排序、堆排序
1.简单选择排序
基本思想:
扫描整个线性表,从中选出最小的元素,将它交换到表的最前面;然后对剩下的子表采用同样的方法,直到子表空为止。
最坏情况下,需要比较n(n-1)/2次。
在待排序里找最小的放在第一位,依此类推
2.堆排序
- 大根堆
- 小根堆
建堆
在建堆的过程中,总是将根结点值与左、右子树的根结点值进行比较若不满足堆的条件,则将左、右子树根结点值中的大者与根结点值进行交换。这个调整过程一直做到所有子树均为堆为止
- 首先将一个无序序列建成堆。
- 然后将堆顶元素(序列中的最大项)与堆中最后一个元素交换(最大项应该在序列的最后)。不考虑已经换到最后的那个元素,只考虑前n-1个元素构成的子序列,将该子序列调整为堆。
8.各种排序法比较
程序设计基础
- 程序设计方法与风格
- 结构化程序设计
- 面向对象的程序设计方法,对象、方法、属性以及继承与多态性
1.程序设计方法与风格
1.结构化设计方法
模块内部程序各部分要按照自顶向下的结构划分
各程序部分应按功能组合
各程序之间的联系尽量通过调用子程序来实现,不用或少用GOTO方式
2.面向对象设计方法
3.程序设计风格
原则:
清晰第一
效率第二
1.源程序中的内部文档
- 符号名的命名:有一定实际含义
- 程序的注释: 序言性注释 功能性注释
- 程序的视觉组织:层次清晰 or 对齐
2.数据说明
- 数据说明的次序规范化
- 说明语句中变量安排有序化
- 使用注释来说明复杂的数据结构
3.语句结构
-
在一行内只写一条语句
-
程序编写应优先考虑清晰性
-
清晰第一,效率第二
-
在保证程序正确的基础上再要求提高效率
-
避免使用临时变量前使程序的可读性下降
-
避免使用临时变量使程序的可读性下降
-
避免不必要的转移
-
尽量使用库函数
-
尽量减少使用“否定”条件语句
-
数据结构要有利于程序的简化
-
要模块化,使模块功能尽可能单化
-
利用信息隐蔽,确保每一个模块的独立性
-
从数据出发去构造程序
4.输入输出
- 对输入数据检验数据的合法性
- 检查输入项的各种重要组合的合理性
- 输入格式要简单,使得输入的步骤和操作尽可能简单
- 输入数据时,应允许使用自由格式
- 应允许缺省值
- 输入一批数据时,最好使用输入结束标志
- 在以交互式输入/输出方式进行输人时,要在屏幕上使用提示符明确提示输入的请求,同时在数据输入过程中和输入结束时,应在屏幕上给出状态信息
- 当程序设计语言对输入格式有严格要求时,应保持输入格式与输入语句的一致性;给所有的输出加注释,并设计输出报表格式
2.结构化程序设计
1.基本思想
- 关于GOTO语句
- 工程思想
- 结构化思想
- 自顶向下,逐步求精,模块化,限制使用GOTO语句
2.原则
- 自顶而下
- 逐步求精
- 模块化
- 限制使用GOTO语句
3.三种基本结构
- 顺序结构
- 选择结构
- 重复结构
1.顺序结构
2.选择结构
- 简单分支结构
- 多分支选择结构
3.重复结构
- 又称循环结构
- 当型
- 直到型
- 用有限的控制结构
- 一个入口一个出口
- 使用嵌套
- 前后一致
- 避免使用GOTO语句
4.面向对象的程序设计
- 对系统的复杂性进行概括、抽象和分类,使软件的设计与现实形成一由抽象到具体、由简单到复杂这样一个循序渐进的过程从而解决大型软件研制中存在的效率低、质量难以保证、调试复杂、维护困难等问题。
- 结构化的分解突出过程,即如何做(How to do)?它强调代码的功能是如何实现的;面向对象的分解突出现实世界和抽象的对象,即做什么(What to do)?
- 主要优点:
- 与人类习惯的思维方法一致
- 稳定性好
- 可重用性好
- 易于开发大型软件产品
- 可维护性好
1.对象
- 对象是基本的运行时认得实体,他既包括数据(属性),也包括作用于数据的操作(行为)。
- 一个对象把属性和行为封装为一个整体
- 一个对象通常可由对象名、属性和操作3部分组成
2.对象特点
- 标识唯一性
- 分类性
- 多态性
- 封装性
- 模块独立性好
3.类和实例
- 类是具有共同属性、共同操作方法的对象的集合,是对象的抽象
- 对象是其对应类的一个实例
4.消息
- 对象之间进行通信的机制
- 三部分组成
- 接收消息的对象的名称
- 消息标识符(消息名)
- 零个或多个参数
5.继承
- 继承是父类和子类之间共享数据的方法的机制
- 一个子类可以继承它的父类(或祖先类)中的属性和操作
- 子类中可以定义自己的属性和操作
- 单重继承、多重继承
6。多态性
- 不同的对象收到同一消息可以产生完全不同的结构,这一现象叫做多态性
- 优点: 灵活性、可重用性、可扩充性
软件工程基础
1.内容提要
- 软件工程基本概念,软件生命周期概念,软件工具与软件开发环境。
- 结构化分析方法,数据流图,数据字典,软件需求规格说明书
- 结构化设计方法,总体设计与详细设计。
- 软件测试的方法,白盒测试与黑盒测试,测试用例设计,软件测试的实施,单元测试、集成测试和系统测试。
- 程序的调试
2.基本概念
1.定义
- 计算机软件(Software)是计算机系统中与硬件相互依赖的另一部分。
- 组成: 程序 数据 文档
- 国标(GB)定义
- 与计算机系统的操作有关的计算机程序、规程、规则,以及可能有的文件、文档及数据。
2.软件的特点
- 软件是一种逻辑实体,而不是具体的物理实体,具有抽象性。
- 软件没有明显的制造过程。对软件的质量控制,必须在软件开发方面下功夫。
- 软件不存在老化问题,但存在退化问题,必须要修改和维护。
- 对计算机系统有着依赖性——软件移植的问题
- 软件复杂性高,开发和维护成本高
- 软件开发涉及诸多社会因素
3.软件的分类
-
应用软件
-
系统软件
- 操作系统
- 数据库管理系统
- 设备驱动系统
- ….
-
支撑软件
4.软件危机
-
软件工程源自软件危机
-
主要表现
- 软件需求的增长得不到满足
- 软件开发成本和进度无法控制
- 软件质量难以保证
- 软件不可维护或维护程度非常低
- 软件成本不断提高
- 软件开发生产效率的提高赶不上硬件的发展和应用需求的增长
- 归结为成本、质量和生产率等问题
1.软件工程的产生和定义
- ——工程学的新兴领域
- 定义:
- 国标(GB):应用于计算机软件的定义、开发和维护的一整套方法、工具、文档实践标准和工序。
- 德国人Fritz Baver:软件工程是建立并使用完善的工程化原则,以较经济的手段获取能在实际机器上有效运行的可靠软件的一系统方法。
- IEEE:将系统的、规范的、可度量的方法应用于软件开发、运行和维护的过程,即将工程应用于软件中。
主要思想:
在软件开发过程中需要应用工程化原则的重要性
- 三个要素
- 方法
- 工具
- 过程
2.软件过程及生命周期
1.软件工程过程
- P( Plan)——软件规格说明
- D(Do)——软件开发
- C(Check)——软件确认
- A(Action)——软件演进
2.具体阶段
- 软件产品从提出、实现、使用维护、停止使用到退役的过程
- 3个阶段
- 6个阶段工作
-
开发阶段
- 制定计划
- 需求分析
-
开发阶段
- 软件设计
- 软件实现
- 软件测试
-
运行维护阶段
- 使用,不断维护
3.软件工程的目标
-
成功的项目
- 成本
- 功能
- 移植
- 维护费用
- 按时
- 及时交付
-
目标
- 在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品。
4.总结
5.软件工程原则
- 抽象
- 信息隐蔽
- 模块化
- 局部化
- 确定性
- 一致性
- 完备性
- 可验证性
6.软件开发工具
1.软件开发工具
- 协助开发人员进行软件开发活动所使用的软件或环境。
- 需求分析工具、设计工具、编码工具、排错工具、测试工具等。
2.软件开发环境
- 全面支持软件开发全过程的软件工具的集合
- 计算机辅助软件工程:CASE
3.结构化分析方法
1.需求分析
定义:
- 任务:导出目标系统的逻辑模型,解决“做什么”的问题
- 全面理解用户的各项要求
主要工作:
- 需求获取
- 需求分析
- 编写需求规格说明书
- 需求审评
2.需求分析方法
-
结构化分析方法
- 面向数据流的结构化分析方法(SA)
- 面向数据结构的Jackson方法(JSD)
- 面向数据结构的结构化数据系统开发方法(DSSD)
-
面向对象分享方法(OOA)
- 静态分析方法
- 动态分享方法
3.结构化分析方法
-
结构化程序设计理论在需求分析阶段的运用
-
面向数据流进行需求分析的方法
-
自顶向下、逐层分解
-
主要工具:数据流图、数据字典
常用工具
- 数据流图(DFD)
- 数据字典
- 判定树
- 判定表
数据流图
- 基本图形元素
- 分层数据流图
数据字典
- 结构化分析方法的核心
- 对数据流图中出现的被命名的图形元素的确切解释判定树
- 判定树
- 判定表
需求规格说明书
-
需求分析阶段的最后成果
-
作用:
- 便于用户、开发人员进行理解和交流
- 反映出用户问题的结构,可以作为软件开发工作的基础和依据
- 作为确认测试和验收的依据
-
主要内容:
- 概述、数据描述、功能描述、性能描述、参考文献、附录
-
特点:
- 正确性、无歧义性、完整性、可验证性、一致性、可理解性、可修改性、可追踪性
4.结构化设计方法
软件设计的基础
- 开发阶段:设计、实现(编码)和测试
- 需求分析:主要解决“做什么”问题
- 软件设计:主要解决“怎么做”问题
重要性
主要内容
- 结构设计、数据设计、接口设计、过程设计
步骤
- 概要设计、详细设计
原则
-
抽象
- 一种思维工具
- 抽出事物本质的共同特点,不考虑细节
-
模块化
- 模块
- 模块化
-
信息隐蔽
- 每个模块的实现细节对于其它模块来说是隐蔽的
-
模块独立性
- 每个模块只涉及软件要求的具体的子功能和软件系统中其它的模块的接口是简单的
- 衡量指标:耦合性、内聚性
-
内聚性
- 度量一个模块功能强度的一个相对指标。
- 一个模块只做一件事情
- 7中类型
- 耦合性
- 度量模块之间的相互联系程度
- 取决于接口的复杂程度、调用方式、哪些信息通过接口
- 7种类型
概要设计
基本任务
-
系统结构设计
- 主要任务:划分模块
-
数据结构和数据库的设计
- 实现需求定义和规格说明过程中提出的数据对象的逻辑表示
-
编写概要设计文档、
- 概要设计说明书、数据库设计说明书、用户手册和集成测试计划
-
概要设计的评审
- 对概要设计文档中给出的设计方案可行性、正确性、有效性、一致性等进行审核
软件结构图
结构图
- 用来表示软件结构
- 基本图符
- 两个附加符号
- 系统结构图(SC)中的模块
- 原子模块
- 4种类型的模块
结构图的形态特征
- 深度
- 宽度
- 扇出
- 扇入
总结
- 数据流图(DFD):需求分析工具
- 系统结构图(SC):概要设计工作
- 主要任务:数据流图变换成结构图
- 数据流的类型
- 变换流
- 事务流
变换流
- 数据流图:取得数据、变换数据、给出数据
事务流
- 系统的结构图:输入、中心变换、输出
实施要点与设计过程
- 分析、确认数据流图的类型,区分是事务型还是变换型
- 说明数据流的边界
- 数据流图映射为程序结构
- 根据设计准则把数据流转换成程序结构图
变换分形
- 确定数据流图是否具有变换特性
- 确定输入流和输出流的边界,划分出输入、变换和输出,独立出变换中心
- 第一级分解
- 按上述步骤如出现事务流的映射方式对各个子流进行逐级分解,直至分解到基本功能;
事务分析
- 与变换分析类似
- 主要差别:映射方法不同
设计准则
- 提高模块独立性
- 深度、宽度、扇度和扇出适度
- 使模块的作用域在该模块的控制域内
- 应减少模块的接口和界面的复杂性
- 设计成单入口、单出口的模块
- 设计功能可预测的模块
详细设计
- 详细任务
- 确定实现算法和局部数据结构
- 不同于编码或编程
- 常用工具
- 程序流程图、N-S、PAD和HIPO(重要)
- 表格工具:判定表
- 语言工具:PDL(伪码)
程序流程图
实例
N-S图
- 流程图:随意性与灵活性
- N-S图:限制了随意的控制转移,保证了程序的良好结构
实例
特点:
- 每个构件具有明确的功能域
- 控制转移必须遵守结构化设计要求
- 易于确定局部数据和(或)全局数据的作用域
PAD图
- PAD——问题分析图,Problem Analysis Diagram
- 表现程序逻辑结构的图形工具
- 5中基本控制结构
实例
特征:
- 结构清晰,结构化程度高
- 易于阅读
- 程序的纵线数等于程序的层次数
- 程序执行从PAD图最左主千线上端结点开始,自上而下、自左向右依次执行,程序终止于最左主干线
PDL(伪码)
-
PDL——过程设计语言,Program Design Language
-
混合语言,类似编程语言
-
常用词汇
- 顺序
- 条件:IF/THEN/ELSE/ENDIF
- 循环:DOWHILE/ENDDO
- 循环:REPEAT UNTIL/ENDREPEAT
- 分支:CASE OF/WHEN/SELECT/ENDCASE
-
PDL特征:
- 有为结构化构成元素、数据说明和模块化特征提供的关键词语法。
- 处理部分的描述采用自然语言语法
- 可以说明简单和复杂的数据结构
- 支持各种接口描述的子程序定义和调用技术
5.软件测试
1.软件测试目的
- 检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别
- Grenford J.Myers的观点:
- 测试是程序的执行过程,目的在于发现错误
- 一个好的测试用例在于能发现至今未发现的错误
- 一个成功的测试是发现了至今未发现的错误的测试
2.软件测试准则
- 所以测试都应追溯到需求
- 严格执行测试计划,排除测试的随意性
- 充分注意测试中的群集现象
- 程序员应避免检测自己的程序
- 穷举测试不可能
- 妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便
3.软件测试技术
静态测试与动态测试
-
静态测试
- 人工评审软件文档或程序,借以发现其中的错误
- 主要方法:代码检查、静态结构分析、代码质量度量
-
动态测试
- 上机测试
- 关键:设计高效、合理的测试用例
- 分两类:白盒测试方法和黑盒测试方法
白盒测试
-
也称结构测试或逻辑驱动测试
-
测试用例是根据程序的内部逻辑来设计
-
主要用于单元测试
-
基本原则
- 保证所测模块中每一个独立路径至少执行一次
- 保证所测模块所有判断的每一个分支至少执行一次
- 保证所测模块每一个循环都在边界条件和一般条件至少执行一次
- 验证所有内部数据结构的有效性
-
主要方法
- 逻辑覆盖
- 基本路径测试
逻辑覆盖测试
-
程序中的逻辑:判断、分支、条件
-
语句覆盖:每一个语句都能执行一次
-
路径覆盖:所有的可能路径都至少经历一次
-
判定覆盖:每个判定至少都获得一次“真值”和“假值”的机会
-
条件覆盖:每个判定中每个条件都获得一次“真”和“假”的机会
-
判断-条件覆盖:判定中的每个条件都能取得各种可能的“真”和“假”值,并且使每个判定都能取到“真”和“假”两种结果
-
强度顺序
- 语句<路径<判定<条件<判定-条件
基本路径测试
- 把覆盖的路径数压缩到一定限度内
- 思想和步骤:
- 根据软件过程性描述中的控制流程确定程序的环路复杂性度量,用此度量定义基本路径集合,并由此导出一组测试用例对每一条独立执行路径进行测试
黑盒测试
- 功能测试或数据驱动测试
- 对软件已经实现的功能是否满足需求进行测试和验证
- 根据程序的功能说明来设计测试用例
- 主要用于确认测试
- 主要方法
- 等价类划分法
- 边界值分析法
- 错误推测法
等价类划分
- 有效等价类
- 无效等价类
边界值分析法
- 大量的错误是发生在输入或输出范围的边界上
错误推测法
- 根据经验或直觉推测程序易出错的地方
软件测试的实施
单元测试
- 对象:针对程序模块,进行正确性检验的测试
- 目的:发现各模块内部可能存在的各种差错
- 依据:从程序的内部结构出发设计测试用例,其依据是详细的设计说明书和源程序
内容:
- 模块接口测试
- 局部数据结构测试
- 路径测试
- 错误处理测试
- 边界测试
步骤:
- 在编码阶段进行
- 源程序代码编制完成,经过评审和验证,确认没有语法错误之后
- 利用设计文档,设计可以验证程序功能、找出程序错误的多个测试用例
- 驱动模块、桩模块
集成测试
-
任务:把模块在按照设计要求组装起来的同时进行测试
-
目的:发现与接口有关的错误
-
依据:集成测试的依据是概要设计说明书
-
内容:软件单元的接口测试、全局数据结构测试、边界条件和非法输入的测试
-
方式:非增量方式组装与增量方式组装
-
非增量方式组装
- 也称一次性组装方式
-
增量方式组装
- 也称渐增式集成方式
- 三种方式:
- 自顶向下
- 自底向上
- 自顶向与自底向上相结合
-
-
自顶向下
- 自底向上
确认测试
- 又称有效性测试
- 目的:验证软件的功能和性能及其它特性是否与用户的要求一致
- 依据:软件需求规格说明书
- 方法:黑盒测试法
系统测试
- 任务:在实际运行(使用)环境下,对计算机系统进行一系列的组装测试和确认测试
- 目的:在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方
依据:
- 需求分析规格说明来设计
内容:
- 功能测试、性能测试、操作测试、配置测试、外部接口测试、安全性测试
6.程序的调试
任务:诊断和改正程序中的错误
1.基本步骤
- 错误定位、纠正错误、回归测试
2.调试原则
-
确定错误的性质和位置的原则
- 用头脑去分析思考与错误征兆有关的信息
- 避开死胡同
- 只把调试工具当作辅助手段来使用
- 避免使用试探法,最多只能把它当作最后手段
-
修改错误的原则
- 在出现错误的地方,很可能还有别的错误
- 只修改了这个错误的征兆或这个错误的表现,而没有修改错误的本身。
- 当心修正一个错误的同时有可能会引入新的错误
- 修改错误的过程将迫使人们暂时回答程序设计阶段
- 修改源代码,确保功能一致
3.强行排错法
- 通过内存来全部打印来排错(Memory Dump)
- 在程序特定部位设置打印语句
- 自动调试工具
4.回溯法
- 小规模排错
- 通过表现来回溯
5.原因排错法
- 演绎法
- 归纳法
- 二分法
数据库设计基础
内容提要:
- 数据库的基本概念:数据库,数据库管理系统,数据库系统。
- 数据模型,实体联系模型及E-R图,从E-R图导出关系数据模型。
- 关系代数运算,包括集合运算及选择、投影、连接运算。
- 数据库设计方法和步骤:需求分析、概念设计、逻辑设计和物理设计的相关策略
1.数据
数据
- 描述事物的符号记录,用物理符号记录下来的可以鉴别的信息
- 物理符号:数字、文字、图形、图像声音及其他特殊符号
- 多种表现形式:数字化
计算机中的数据分为两部分:
- 临时性数据
- 持久性数据
数据有型(Type)与值(Value)之分
- 型:数据表示的类型,如整型、实型、字符型等
- 值:给出了符合给定型的值
数据库
-
数据库——DataBase,简称DB
-
数据的集合,具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。
-
按数据所提供的数据模式存放
-
特点:
- 较小的冗余度
- 较高的数据独立性
- 易扩展性
- 为多个用户共享
数据库管理系统
- 数据库管理系统——DataBase Management System,简称DBMS
- 数据库的管理机构,职能是有效地组织、存储、获取和管理数据,接受及完成用户提出的访问数据的各种请求
- 数据库系统的核心
- DBMS的功能
- 数据模式定义
- 数据存取的物理构建
- 数据的操纵
- 数据的完整性、完全性定义于检测
数据库语言
- 数据定义语言DDL
- 数据操纵语言DML
- 数据控制语言DCL
数据语言的使用
- 交互式命令语言
- 宿主型语言
常见的DBMS
- ORACLE、Sybase的PowerBuilder、IBM的DB2、微软的SQL Swever
- 微软的Visual FoxPro、Acess,功能简单
数据库管理员
- 数据库管理员——DataBase Administrator,简称DBA
- 对数据库的规划、设计、维护、监视等的人员
- 其主要工作有:
- 数据库设计
- 数据库维护
- 改善系统性能,提供系统效率
数据库系统
- 数据库系统——DataBase System,简称DBS
- 拥有数据库技术支持的计算机系统
- 实现有组织地、动态地存储大量相关数据,提供数据处理和资源共享服(重要)
- 组成
- 数据库(数据)
- 数据库管理系统(软件)
- 数据库管理员(人员)
- 硬件平台:计算机和网络
- 软件平台:操作系统、数据库系统开发工具、接口软件
数据库应用系统
- 数据库应用系统——DataBase Application System,简称DBAS
- 组成:
- 数据库系统+应用软件+应用界面
文件系统阶段
数据库系统阶段
基本特点
-
数据的集成性
-
数据的高共享性与低冗余性
-
数据的独立性
- 物理独立性
- 逻辑独立性
-
数据统一管理与控制
- 数据的完整性检查
- 数据的安全性保护
- 并发控制
数据库的内部结构
-
三级模式
- 概念级模式
- 内部级模式
- 外部级模式
-
二级映射
- 概念级到内部级的映射
- 外部级到概念级的映射
数据库系统的三级模式
-
概念级模式
- 数据库中全体数据逻辑结构和特征的描述,是所有用户的公共数据视图
- 一个数据库只有一个概念模式
-
内部级模式
- 又称物理模式
- 数据库物理存储结构与物理存取方法
- 对一般用户是透明的,直接影响数据库的性能
- 一个数据库只有一个内模式。
-
外部级模式
- 也称子模式或用户模式
- 数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述
- 用户的数据视图
- 一个数据库可以有多个外模式,只能有一个内模式和概率模式
数据库系统的两级映射
-
概率模式/内模式的映射
- 存在于概念级和内部级之间
- 实现了概念模式到内模式之间的相互转换
- 保证数据具有很高的物理独立性
-
外模式/概念模式的映射
- 存在于外部级和概念级之间
关系代数
1.基本操作
-
四种基本操作
- 插入、删除、修改、查询
-
进一步分解成六种基本操作
- 关系的属性指定
- 关系的元组的选择
- 两个关系的合并
- 关系的查询
- 关系元组的插件
- 关系元组的删除
2.传统的集合运算
- 关系代数是以对关系的集合运算为基础,分为传统的集合运算和专门的关系运算,其运算对象是关系,运算结果也是关系。
- 传统的集合运算包括并、交、差、广义笛卡尔积四种运算。其中并、交差要求参与运算的两个关系的属性个数相同,且相应的属性出自同一个域;广义笛卡尔积则无此限制。
关系代数类型
4.专门的关系运算
- 选择:在关系中选择满足某些条件的元组,即消去某些行
- 投影:在关系中选择某些属性列,即消去某些列
连接
除运算
数据库设计与管理
概述
-
设计一个能满足用户要求,性能良好的数据库
-
基本任务:根据用户对象的信息需求、处理需求和数据库的支持环境设计出数据模式
-
两种方法
- 以信息需求为主,兼顾处理需求(面向数据的方法)
- 以处理需求为主,兼顾信息需求(面向过程的方法)
-
一般采用生命周期法,分若干阶段
- 需求分析阶段
- 概念设计阶段
- 逻辑设计阶段
- 物理设计阶段
- 编码阶段
- 测试阶段
- 运行阶段
-
在数据库设计中采用前四个阶段并且重点以数据结构与模型的设计为主线
需求分析
- 任务:通过详细调查现实世界要处理的对象,充分了解原系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能
- 重点:是“数据”和“处理”
- 方法:结构化分享方法,和面向对象的方法
- 对数据库设计来讲数据字典是进行详细的数据收集和数据分析所获得的主要结果
- 数据字典是在需求分析阶段建立,在数据库设计过程中不断修改充实、完善的
概念设计
-
方法:
- 集中式模式设计法
- 视图集成设计法
-
过程
-
选择局部应用
-
视图设计:
- 三种方法:自顶向下、自底向上、自内向外
-
视图集成:解决局部设计中的冲突
-
命名冲突
-
概念冲突
-
域冲突
-
约束冲突
-
逻辑设计
任务:
概念模型进一步转化成相应的数据模型
主要步骤:
从E-R图向关系模式转换
逻辑模式规范化及调整、实现
关系视图设计
物理设计
主要目标:
对数据库内部物理结构作调整并选择合理的存取路径,提高数据库访问速度及有效利用存储空间。
内容:
索引设计、集簇设计、分区设计
数据库管理
-
数据库的建立
- 数据模式建立
- 数据加载
-
数据库的调整
-
数据库的重组
-
数据库安全性控制与完整性控制
-
数据库的故障恢复
-
数据库监控
数据库可以有多个外模式,只能有一个内模式和概率模式
数据库系统的两级映射
-
概率模式/内模式的映射
- 存在于概念级和内部级之间
- 实现了概念模式到内模式之间的相互转换
- 保证数据具有很高的物理独立性
-
外模式/概念模式的映射
- 存在于外部级和概念级之间
关系代数
1.基本操作
-
四种基本操作
- 插入、删除、修改、查询
-
进一步分解成六种基本操作
- 关系的属性指定
- 关系的元组的选择
- 两个关系的合并
- 关系的查询
- 关系元组的插件
- 关系元组的删除
2.传统的集合运算
- 关系代数是以对关系的集合运算为基础,分为传统的集合运算和专门的关系运算,其运算对象是关系,运算结果也是关系。
- 传统的集合运算包括并、交、差、广义笛卡尔积四种运算。其中并、交差要求参与运算的两个关系的属性个数相同,且相应的属性出自同一个域;广义笛卡尔积则无此限制。
关系代数类型
4.专门的关系运算
- 选择:在关系中选择满足某些条件的元组,即消去某些行
- 投影:在关系中选择某些属性列,即消去某些列
连接
除运算
数据库设计与管理
概述
-
设计一个能满足用户要求,性能良好的数据库
-
基本任务:根据用户对象的信息需求、处理需求和数据库的支持环境设计出数据模式
-
两种方法
- 以信息需求为主,兼顾处理需求(面向数据的方法)
- 以处理需求为主,兼顾信息需求(面向过程的方法)
-
一般采用生命周期法,分若干阶段
- 需求分析阶段
- 概念设计阶段
- 逻辑设计阶段
- 物理设计阶段
- 编码阶段
- 测试阶段
- 运行阶段
-
在数据库设计中采用前四个阶段并且重点以数据结构与模型的设计为主线
需求分析
- 任务:通过详细调查现实世界要处理的对象,充分了解原系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能
- 重点:是“数据”和“处理”
- 方法:结构化分享方法,和面向对象的方法
- 对数据库设计来讲数据字典是进行详细的数据收集和数据分析所获得的主要结果
- 数据字典是在需求分析阶段建立,在数据库设计过程中不断修改充实、完善的
概念设计
-
方法:
- 集中式模式设计法
- 视图集成设计法
-
过程
-
选择局部应用
-
视图设计:
- 三种方法:自顶向下、自底向上、自内向外
-
视图集成:解决局部设计中的冲突
-
命名冲突
-
概念冲突
-
域冲突
-
约束冲突
-
逻辑设计
任务:
概念模型进一步转化成相应的数据模型
主要步骤:
从E-R图向关系模式转换
逻辑模式规范化及调整、实现
关系视图设计
物理设计
主要目标:
对数据库内部物理结构作调整并选择合理的存取路径,提高数据库访问速度及有效利用存储空间。
内容:
索引设计、集簇设计、分区设计
数据库管理
-
数据库的建立
- 数据模式建立
- 数据加载
-
数据库的调整
-
数据库的重组
-
数据库安全性控制与完整性控制
-
数据库的故障恢复
-
数据库监控