计算机二级之公共基础
写在前头
二级考试分为40分选择题和60分大题,其中10分出在下面20多页的内容,如果你觉得选择题20分及格线可能够不到,那么下面的内容最好多看看,如果你有信心专业知识过20分,下面只需要稍微了解,避免偶然事件发生。最好不要裸考,毕竟脑子里有东西还是比没东西 的好
相信看了下面的内容做题也会更加得心应手
建议大家主攻数据结构部分,这部分与我们现在学习的内容高度契合,学起来页容易上手。
其次就是计算机系统、程序设计基础和软件工程基础
最后才是数据库(因为难度有点高,对于之前没了解过的人学起来会非常吃力)
C++专业知识部分还要额外学习:成员对象、对象数组、自由存储对象、继承和派生、运算符重载、模板、C++流,专业知识部分是大头,希望大家还能预习预习(总结在另外两个文档中)
左边有书签可以点
希望大家能够取得好成绩!
第1节 计算机系统
1.1 概要

计算机工作的本质:取指令、分析指令和执行指令
CPU执行一条指令的过程中至少占用一个机器周期(机器周期的同步标准:CPU访问存储器一次所需要的时间)
CPU芯片内部连接各元件的总线是内部总线
1.2 EDVAC系统
存储程序控制的计算机结构
(1)组成:运算器(进行算数和逻辑运算) 、控制器(对程序指令进行分析,控制协调输入输出操作和对内存的访问)、存储器、输入设备、输出设备
(2)内部二进制
(3)自动化
1.3 数据
(1)存储:KB、MB、GB、TB
(2)进制:2、8、10、16
(3)无符号数、带符号数
把符号数字化的树称为机器数,有原码、反码、补码(整数通常用这个)、移码
①带符号的定点数中,正数的原码、反码、补码均相同;
②负数的反码是对该数的原码除符号位外各位取反
③补码是在该数的反码的最后(即最右边)一位上加1;
④不管是正数还是负数,其补码的符号位取反即是偏移码。
1.4 操作系统
(1)CPU管理
(2)存储器管理
(3)设备管理
(4)文件管理
(5)提供用户接口
1.5 进程:程序的执行过程
定义: 进程是程序的执行实例,是计算机系统中的基本执行单元。
组成:
- 进程创建: 包括为进程分配资源和初始化数据。
- 进程调度: 决定哪个进程在什么时候执行。
- 同步和通信: 确保多个进程协同工作,共享信息。
(1)存在的唯一标志:数据结构PCB(29)
(2)系统在创建一个进程时需要调用创建进程原语(71)
(3)一个正在运行的进程由于所申请的资源得不到满足,要调用阻塞进程原语(114)
(4)一个进程在运行过程中释放了系统资源后要调用唤醒进程原语(137)
(5)一进程已经获得除CPU之外的所有所需运行资源,经调度分配CPU给他后,进程会进入运行状态(110)
1.6 存储管理
(1)功能
地址变换、内存分配、存储共享保护、存储器扩充
(2)地址重定位
静态:连续存储管理、固定分区存储管理(6)
动态:分页式存储管理、分段式存储管理、段页式存储管理
虚拟存储器管理:可为用户提供比物理内存大得多的逻辑地址空间
要使用外存储器的信息,应先将其调入内存储器
(3)寻址
指找到当前正在执行指令的数据地址以及下一条将要执行指令的地址的方法
分为指令寻址和数据寻址
①指令寻址:顺序寻址、跳跃寻址
②数据寻址:立即寻址(操作数由指令地址码部分直接给出)、直接寻址(指令地址码部分给出操作数在存储器中的地址)、隐含寻址(操作数的地址隐含在指令的操作码或者某个寄存器中)、间接寻址、寄存器寻址、寄存器间接寻址......
1.7 内存管理
任务: 确保程序能够正常运行,有效地管理计算机的内存资源。
功能:
- 内存分配: 为进程分配和释放内存空间。
- 地址转换: 将逻辑地址转换为物理地址。
- 内存保护: 防止程序之间相互干扰。
1.8 文件管理
- 目录管理: 组织和管理文件的层次结构,提供逻辑结构。
- 文件系统: 提供文件的存储、检索和组织。
- 功能: 文件的创建、删除、复制,以及对文件的权限控制。
1.9 I/O设备管理
任务: 管理计算机的输入和输出设备。
功能:
- 提供接口: 为设备和计算机之间建立通信接口。
- 调度设备: 确保设备的有效使用。
- 控制设备: 监控和管理设备的操作。
总线带宽指总线的数据传输率
例题

答案:D
1.10 分布式计算机系统
由多台分散的计算机经网络连接而成,且可协作统一任务的系统
杂题:
1.指令周期
2.顺序程序特点:顺序性、封闭性、可再现性
第2节 数据结构
2.1算法
(1)定义
(2)特征:可行性、确定性、有穷性、拥有足够的情报。
(3)基本要素:①算法中对数据的运算和操作②算法的控制结构
(4)算法复杂度
时间复杂度:指执行算法所需要的计算工作量。即算法执行过程中所需要的基本运算次数。(注意:不是设计算法所需的工作量以及执行算法所需要的时间!!!)
空间复杂度:执行算法所需的存储空间
【注意】
①常见时间复杂度:O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(n^k) < O(2^n) < O(n!)
②通常情况下,更加关注算法的时间复杂度,甚至可以考虑采用“空间换时间”的策略,如哈希表。
2.2 数据结构
(1)逻辑结构
反应逻辑关系的结构
(2)存储结构(数据的物理结构)
顺序存储、链式存储
(3)图形表示:前后件关系
根结点:无前件
终端(叶子结点):无后件
内部结点:除了根结点、叶子结点之外的结点
(4)线性结构与非线性结构
如果一个非空的数据结构满足下列两个条件:
- 有且只有一个根结点;
- 每一个结点最多有一个前件,也最多有一个后件。
则称该数据结构为线性结构。线性结构又称线性表。
非线性结构:不满足上述2个条件的结构,分为树形、网状结构
空的数据结构视情况而定
(5)线性表
①定义
②特征
③顺序存储
④插入运算
⑤删除运算
(6)栈:后进先出,先进后出
用一维数组S(1∶m)作为栈的顺序存储空间,其中m为最大容量。
在栈的顺序存储空间S(1∶m)中,S(bottom)为栈底元素,S(top)为栈顶元素。top=0表示栈空;top=m表示栈满。
- 定义:只能在一端进行插入与删除的线性表 。
- 特点:栈按照“先进后出”(FILO)或“后进先出”(LIFO)组织数据,栈具有记忆作用。
- 存储方式:顺序存储、链式存储。
- 相关术语
-
栈顶:允许插入与删除的一端,可以用top指针表示;
-
栈底:不允许插入与删除的一端,可以用bottom指针表示;
-
入栈(进栈):栈的插入操作;
-
出栈(退栈):栈的删除操作;
-
空栈:栈中没有数据元素;
- 基本运算
- 入栈(Push):将元素压入栈顶,栈顶指针上移。
- 出栈(Pop):弹出栈顶元素,栈顶指针下移。
- 获取栈顶元素(Top): 返回栈顶元素的值但不弹出。
- 判空(IsEmpty): 判断栈是否为空。
- 判满(IsFull): 判断栈是否已满。
- 计算栈内元素个数:栈底 – 栈顶 +1
(7)队列:先进先出,后进后出
1. 定义
指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。用rear指针指向队尾,用front指针指向队头元素的前一个位置。
2. 特点
队列是“先进先出”(FIFO)或“后进后出”(LILO)的线性表。
3. 相关术语
- 队尾:进行插入的一端
- 队首:进行删除的一端
- 入队(进队):从队尾(rear)插入一个元素(rear表示尾指针)
- 退队(离队):从队头(front)删除一个元素(front表示头指针)
4. 基本运算
- 入队(Enqueue):将元素添加到队列的末尾,队尾指针后移。
- 出队(Dequeue):弹出队列的第一个元素,队头指针后移。
- 获取队头元素(Front):返回队列的第一个元素的值,不对队列做任何修改。
- 判空(IsEmpty):判断队列是否为空。
- 判满(IsFull):判断队列是否已满。

5.循环队列
在循环队列中,队尾指针和队头指针的动态变化决定队列的长度
注意链表长度不是由头指针和尾指针决定的
常考:计算循环队列的元素个数
方法:“尾指针减头指针”,若为负数,再加其容量即可。
具体而言:
①当尾指针-头指针>0 时,尾指针 - 头指针 ;
②当 尾指针-头指针<0时,尾指针 - 头指针 + 容量;
6.带链队列
存储空间不连续,导致指针不会有规律地连续变化
只有两种特殊情况:
①front=rear=NULL时队列为空
②front=rear!=NULL时队列中存在一个元素
其他情况无法判断
例题:
(栈)97.设栈的存储空间为S(1:m),初始状态为top=m+1。经过一系列入栈与退栈操作后,top=1。现又要将一个元素进栈,栈顶指针top值变为( )。
A.2
B.m
C.0
D.发生栈满的错误
解析:
1. 栈的初始状态为top=m+1,表明这是一个从高地址向低地址生长的栈(栈底在m位置,栈空时指针超出栈顶)。
2. 经过操作后top=1,意味着栈中已经存放了m个元素(从S(m)到S(1)),此时栈空间已满。
3. 当尝试再入栈时:
- 正常入栈操作应为:top = top-1
- 但此时top=1已经是栈的最小地址(栈顶指针无法继续减小)
- 因此会触发栈满错误(overflow),无法完成入栈操作
(栈)88.设栈的顺序存储空间为S(1:m),初始状态为top=m+1,则栈中的数据元素个数为( )。
A.m-top
B.top-m
C.top-m+1
D.m-top+1
答案:D
提示:实际上D选项就是0个元素
(栈)166.设栈的存储空间为 S(1:50),初始状态为 top=0。现经过一系列正常的入栈与退栈操作后,top=51,则栈中的元素个数为( )。
A.0
B.1
C.50
D.不可能
解析:
1. 栈的存储空间为S(1:50),说明栈的容量最大为50个元素。
2. 初始状态top=0表示空栈,此时栈内没有元素。
3. 栈的操作规则中,
top指针的范围应在0到50之间
- 每次入栈(push)会使top增加1,当top=50时栈满,无法继续入栈。
- 每次退栈(pop)会使top减少1,当top=0时栈空,无法继续退栈。
4. 题目最终给出的top=51,显然超出了栈的存储空间范围(1:50),因此这是不可能出现的情况。
(带链队列)14.在带链队列中,经过一系列正常的操作后,如果front=rear,则队列中的元素个数为( )。
A.0
B.1
C.0或1
D.队列满
答案:C
队首、队尾指针均为空时队列为空,**二者相等非空就只有一个元素**
(带链队列)82.某带链的队列初始状态为front=rear=NULL。经过一系列正常的入队与退队操作后,front=rear=10。该队列中的元素个数为( )。
A.0
B.1
C.1或0
D.不确定
答案:B
(带链队列)119.某带链的队列初始状态为front=rear=NULL。经过一系列正常的入队与退队操作后,front=10, rear=5。该队列中的元素个数为( )。
A.4
B.5
C.6
D.不确定
答案:D
#### 知识点:循环队列的计算
**当rear大于front时,元素个数为rear-front,反之就是rear-front+m(m为队列长度)**
(循环队列)47.设循环队列的存储空间为Q(1:50),初始状态为front=rear=50。经过一系列正常的操作后,front-1=rear。为了在该队列中寻找值最大的元素,在最坏情况下需要的比较次数为( )。
A.0
B.1
C.48
D.49
(循环队列)59.设循环队列的存储空间为Q(1:50),初始状态为?front=rear=50。经过一系列正常的操作后,front=rear-1。为了在该队列中寻找值最大的元素,在最坏情况下需要的比较次数为( )。
A.0
B.1
C.49
D.50
(循环队列)139.循环队列的存储空间为Q(1:50)。经过一系列正常的入队与退队操作后,front=rear=25。后又成功地将一个元素退队,此时队列中的元素个数为( )。
A.24
B.49
C.26
D.0
答案:CAB
(8)线性链表
-
该数据结构中每一个结点对应于一个存储单元,这种存储单元称为存储结点,简称结点。
-
结点由两部分组成(☆)
① 数据域:用于存储数据元素值
② 指针域:用于存放指针,指向前一个或后一个结点(前驱结点与后继结点)

A0的指针域存放A1的地址
-
△:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
-
优点:插入和删除操作不需要移动大量元素,对于动态表长具有灵活性。
-
缺点:访问速度相对较慢,需要额外的空间存储指针。
-
链式存储方式即可用于表示线性结构(线性表、队列、栈),也可用于表示非线性结构(树、图)。栈也是线性表,也可以采用链式存储结构。带链的栈可以用来收集计算机存储空间中所有空闲的存储结点,这种带链的栈称为可利用栈。
-
链表的基本运算:插入、删除、查找;
扩展:双向链表、循环链表、带链队列
【注意】
①在单链表中,增加头结点的目的是便于运算的实现;
②用链表作为线性表的优点:便于插入与删除操作,时间复杂度为O(1)。(也就是说,如果在一种应用场景中需要频繁插入或删除,那么可以选择链式存储结构。)
③用顺序表作为线性表的优点:便于随机访问,时间复杂度为O(1)。(也就是说,如果在一种应用场景中需要频繁访问元素,那么可以选择顺序存储结构。)
【以下是重要的区分环节】
Question1:顺序存储结构和链式存储结构有啥区别呢? (☆☆☆)
答:前者需要开辟一片连续的内存空间,对内存的要求比较高,因此该存储空间中的元素是连续的;而后者每个结点(而非所有)占用一片地址连续的存储空间,结点之间用指针相连接,即使内存空间存在碎片,只要碎片的大小足够存储一个链表节点的数据,该碎片的空间都有可能被分配,因此该存储空间中各数据结点的存储序号是不连续的。
(说白了,就是存储空间中元素是否连续的区别~~)
Question2:线性单链表、双向链表与循环链表的结构的区别是什么?(☆☆☆)
(1)单链表 vs 双向链表
- 单链表节点只有一个指针,只能向一个方向遍历。
- 双向链表节点有两个指针,可以双向遍历,但占用更多空间。
(2)单链表 vs 循环链表
- 单链表最后一个节点指向 NULL,形成线性结构。
- 循环链表最后一个节点指向头节点,形成环状结构。
(3)双向链表 vs 循环链表
- 双向链表具有前后指针,可以双向遍历。
- 循环链表最后一个节点指向头节点,形成环状结构,也可双向遍历。
(9)树
①父结点(根)
每一个结点只有一个前件,叫做父结点
没有前件的结点只有一个,叫做树的根
②子结点:结点的后件
③叶子结点:没有后件的结点
④度
结点的度:一个结点拥有的后件个数
树的度:所有结点中最大的度
⑤深度
根结点为1,其他依次加1
树的深度:数的最大层次
⑥子树
树中以某结点的一个子结点为根构成的树
⑦总结点数
树中所有结点的度之和加1
(10)二叉树
一个有限的结点集合,或为空或由一个根结点及两棵互不相交的左、右二叉子树组成
注意:①二叉树可为空②每个结点最多有2棵子树③子树有左右之分
①满二叉树
除了最后一层每一层上所有结点都有2个子结点
②完全二叉树
相对于满二叉树在最后一层缺几个结点

③二叉树的性质
1.在二叉树的第k层上最多有2^(k-1)个结点
2.深度为k的二叉树最多有2^k-1个结点
3.对任何一棵二叉树,度为0的结点(叶子结点)总是比度为2的结点多一个
例题:75.某二叉树有49个度为2的结点,4个度为1的结点,30个叶子结点,则( )。
A该二叉树只能有83个结点
B这样的二叉树不惟一
C该二叉树共有103个结点
D不可能有这样的二叉树
80.某二叉树有49个度为2的结点,4个度为1的结点,则( )。
A该二叉树共有103个结点
B该二叉树的结点数不确定
C该二叉树共有101个结点
D不可能有这样的二叉树
答案:DA
(4)具有n个结点的二叉树,其深度至少为
$$
[\log_2 n] +1
$$
其中[]为取整符号
(5)具有n个结点的完全二叉树,其深度为上面那个
(6)总结点数=所有结点度数和+1
(7)叶子结点树=总结点数-[总结点数/2]
例题:2、4、63、109
④二叉树的存储:链式存储
⑤二叉树的遍历
前序遍历(DLR):根左右
中序遍历(LDR):左根右
后序遍历(LRD):左右根
层次遍历:从上到下逐一遍历。
一般先左子树后右子树



试一试:
前序遍历:FCADBEHGM
中序遍历:ACBDFHEMG
后序遍历:ABDCHMGEF
层次遍历:FCEADHGBM
小技巧:在二叉树的遍历中,无论是前序遍历,中序遍历还是后序遍历,二叉树的叶子结点的先后顺序都是不变的。
(11)查找技术
①顺序查找
线性表无序or有序但是链式存储时只能用顺序
②二分法查找
二分法只适用于顺序存储的,按非递减排列的有序表(即从小到大,但允许相邻元素值相等)
对长n的有序线性表,查找x
将x与线性表的中间项比较
若x=中间值,则查找成功
若x<中间值,则在前半部分继续查找
若x>中间值,则在后半部分继续查找
$$
最坏只需比较\log_2 n次
$$
(12)排序
①交换排序
1.冒泡排序
通过两两相邻数据元素间比较和交换不断消去逆序,直到所有数据元素有序
最坏情况比较n(n-1)/2次
均执行时间是O(n2)

2.快速排序
在所有元素中取一个元素k,把比k大的移到k后,使表分割为2个,随后继续重复
每经过一次排序会产生新的逆序
最坏情况比较n(n-1)/2次
平均执行时间是O(nlog2n)

最坏情况下时间复杂度最低的是在循环链表中寻找最大值(21)
②插入排序
1.简单插入排序
分成两个表,一个有序一个无序
最坏情况比较n(n-1)/2次
2.希尔排序
取一个增量d,把数据分成d1个组后进行简单插入排序
然后取d2<d1,重复,直到di=1
一般取d1=n/2,d(i+1)=di/2
最坏比较n^1.5次

③选择排序
1.简单选择排序
一直选择最小的元素
最坏情况比较n(n-1)/2次

2.堆排序(高级内容慎入)
堆:当有n个元素序列,将元素按顺序组成完全二叉树

注意不能破坏堆结构
堆排序:多次进行堆的调整直到有序
$$
最坏只需比较n\log_2 n次
$$
小结:
| 算法类型 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|---|
| 直接插入排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
| 折半插入排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
| 希尔排序 | - | O(n^2) | O(n^1.5) | O(1) | 不稳定 |
| 简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
| 堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
| 冒泡排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
| 快速排序 | O(nlogn) | O(n^2) | O(nlogn) | O(logn) | 不稳定 |
(这个考的贼多,建议记一下)
第3节 程序设计基础
3.1程序设计规范

3.2结构化程序
①原则:
自顶向下(考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标)
逐步求精
模块化
不用goto语句
②基本结构特点:顺序、选择、重复结构
结构化程序设计的一个特点:只有一个入口和出口,这是为了保持程序的清晰性和可维护性。
3.3面向对象程序设计

(1)对象的基本特点
- 标识唯一性: 每个对象都有唯一的标识,使得系统能够准确地区分不同的实体。
- 分类性: 对象可以根据其共同的属性和操作被归类到某个类别中,提高了代码的组织和理解。
- 多态性: 同一消息被不同的对象接受时,可能导致完全不同的行为,增加了代码的灵活性和可扩展性。
- 封装性: 对象将数据和方法封装在内部,隐藏了内部实现细节,提供了良好的抽象屏障。
- 模块独立性好: 每个对象都是独立的模块,降低了系统的耦合度,提高了模块的独立性和可维护性。
(2)相关术语与概念
类
类是对象的集合,具有共同的属性和方法。它是对对象性质的描述,是对象的抽象。消息是对象间传递的信息,请求对象执行某一处理或回答某一要求的信息,是数据流和控制流的统一。
继承
继承是通过使用已有类的定义作为基础,建立新类的定义的技术。具有传递性,一个类实际上继承了其上层全部基类的特性。继承有单继承和多重继承两种形式。
多态性
多态性是指同样的消息被不同的对象接受时,可能导致完全不同的行为。这使得程序更加灵活,同一操作可以适用于不同类型的对象,提高了代码的可扩展性和复用性。
面向对象的优点(带英文的记一下):
- 封装性(Encapsulation): 将数据和方法封装在对象内部,隐藏了对象的实现细节,提供了良好的抽象屏障。这使得对象的内部变化对外部是不可见的,提高了模块性和可维护性。
- 继承性(Inheritance): 允许一个类继承另一个类的属性和方法,通过建立类之间的层次关系,实现了代码的重用性。子类可以继承父类的特征,并且可以根据需要进行扩展或修改。
- 多态性(Polymorphism): 允许不同类的对象对同一消息做出不同的响应。多态性通过接口和抽象类实现,提高了代码的灵活性和可扩展性。
- 抽象性(Abstraction): 提供了对现实世界问题的抽象建模,将复杂的系统简化为对象和类的表示,使得程序设计更贴近问题领域,降低了认知复杂度。
- 灵活性和可维护性: 面向对象方法提供了一种灵活的设计方式,使得系统更容易适应变化。由于封装、继承和多态性的支持,代码更易于理解、修改和扩展,提高了系统的可维护性。
- 可重用性(Reusability): 通过继承和组合,可以重用已存在的类和对象,减少了代码的冗余,提高了开发效率。
- 模块化(Modularity): 将系统分解成相互独立的模块,每个模块代表一个对象或一组相关的对象。这种模块化的设计使得系统更易于理解、测试和维护。
第4节 软件工程基础
4.1 软件
软件包含程序、数据、文档,是与计算机系统操作有关的计算机程序、规程、规则以及可能有的文件、文档和数据
①特点
1.是一种逻辑实体,具有抽象性
2.没有明显的制作过程
3.使用期间不存在磨损老化
4.对硬件、环境具有依赖性
5.复杂性高,成本高
6.开发设计诸多社会因素
②分类
应用软件、支撑软件(用于开发的工具软件,如IDE)、系统软件
③软件危机(bug)
软件开发生产率低、软件质量难以控制、软件成本不断提高...
4.2软件工程
应用于计算机软件的定义开发和维护的一整套实践标准和工序
①分类
分为方法、工具、过程
②目标
开发出产品(前提、具有。。。)
③软件工程理论和技术性研究
1.软件开发技术:软件开发方法学、开发过程、开发工具、软件工程环境
2.软件工程管理:软件管理学、软件工程经济学、软件心理学
④原则
抽象、信息隐蔽(黑箱)、模块化、局部化、确定性、一致性、完备性、可验证性
例题:25
模块划分应遵循高内聚低耦合(18)
⑤过程
软件规格说明、软件开发、软件确认、软件演进
⑥软件的生命周期
软件定义期:问题定义——可行性研究、计划制定——需求分析(决定软件‘做什么’)
软件开发期:软件设计(概要设计、详细设计)——实现——测试(代码编写时可进行单元测试)
软件维护期:使用、维护和退役

例题:
答案:A
⑦需求分析
1.结构化分析方法:面向数据流的结构化、面向数据结构(Jackson、结构化)
2.面向对象分析
结构化分析工具:数据流图DFD、数据字典DD

⑧判定表
基本条件、条件项、基本动作、动作项
⑨软件需求规格说明书(SRS)
正确性、无歧义性、完整、可验证、一致、可理解、可修改、可追踪
包括软件的主要功能、软件的性能、运行环境等
作用包括软件验收的依据、软件设计的依据、用户与开发人员对软件“做什么”的共同理解等
例题:54、94
4.3结构化设计方法
①软件设计
1.划分
按工程管理角度:概要设计、详细设计
- 概要设计将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式;
- 详细设计确立每个模块的实现算法和局部数据结构,用适当方法表示算法和数据结构的细节。
按技术观点划分:结构设计、数据设计、接口设计、过程设计
- 结构设计定义软件系统各主要部件之间的关系;
- 数据设计将分析时创建的模型转化为数据结构的定义;
- 接口设计是描述软件内部、软件和协作系统之间以及软件与人之间如何通信;
- 过程设计则是把系统结构部件转换为软件的过程性描述。
2.基本原理和原则
模块化、抽象、信息隐藏、模块独立性
- 抽象:软件设计中考虑模块化解决方案时,可以定出多个抽象级别。抽象的层次从概要设计到详细设计逐步降低。
- 模块化:模块是指把一个待开发的软件分解成若干小的简单的部分。模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。
- 信息隐蔽:信息隐蔽是指在一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说是不能访问的。
- 模块独立性:模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。模块的独立程度是评价设计好坏的重要度量标准。衡量软件的模块独立性使用耦合性和内聚性两个定性的度量标准。内聚性是信息隐蔽和局部化概念的自然扩展。
一般要求模块之间耦合尽可能弱(模块尽可能独立),模块的内聚程度尽可能高
②概要设计
1.任务
设计软件系统结构、数据结构及数据库设计、编写概要设计文档、概要设计文档评审
2.结构图

3.面向数据流的设计方法
数据流图分为变换流、事务流
③详细设计
- 图形工具:程序流程图,N-S,PAD,HIPO。
- 表格工具:判定表。
- 语言工具:PDL(伪代码)。
N-S图

PAD图

4.4软件测试
①目的
- 软件测试是为了发现错误而执行程序的过程;
- 一个好的测试用例是能够发现至今尚未发现的错误的用例;
- 一个成功的测试是发现了至今尚未发现的错误的测试。
②准则
追溯到用户需求,制定测试计划,注意测试中群集现象
③测试方法
1.按软件是否被执行:静态测试、动态测试
静态测试:代码检查、静态结构分析、代码质量度量
动态测试:上机测试,设置测试用例(测试用例的设计方法分为白盒测试和黑盒测试)
2.按功能:白盒测试和黑盒测试
白盒测试:根据程序内部逻辑设置测试用例
逻辑覆盖测试(语句覆盖、路径覆盖、判定覆盖、条件覆盖、判断-条件覆盖)
基本路径测试
黑盒测试:根据规格说明书设置测试用例
等价类划分法、边界值分析法、错误推测法、因果图法
④软件测试的实施
单元测试、集成测试、确认(验收)测试、系统测试
单元测试是对软件设计的最小单位--模块(程序单元)进行正确性检验测试。单元测试的技术可以采用静态分析和动态测试。
集成测试是测试和组装软件的过程,主要目的是发现与接口有关的错误,主要依据是概要设计说明书。集成测试所设计的内容包括:软件单元的接口测试、全局数据结构测试、边界条件和非法输入的测试等。集成测试时将模块组装成程序,通常采用两种方式:非增量方式组装和增量方式组装。
确认测试的任务是验证软件的功能和性能,以及其他特性是否满足了需求规格说明中确定的各种需求,包括软件配置是否完全、正确。确认测试的实施首先运用黑盒测试方法,对软件进行有效性测试,即验证被测软件是否满足需求规格说明确认的标准。
系统测试是通过测试确认软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、支撑软件、数据和人员等其他系统元素组合在一起,在实际运行(使用)环境下对计算机系统进行一系列的集成测试和确认测试。
4.5程序的调试
调试方法:强行排错、回溯、原因排除
误区警示:
程序经调试改错后还应进行再测试,因为经调试后有可能产生新的错误,而且测试是贯穿生命周期的整个过程。
在对程序进行了成功的测试之后将进入程序调试(通常称Debug,即排错)。程序的调试任务是诊断和改正程序中的错误。调试主要在开发阶段进行。
疑难解答:软件测试与软件调试有何不同?
软件测试是尽可能多地发现软件中的错误,而软件调试的任务是诊断和改正程序中的错误。软件测试贯穿整个软件生命周期,调试主要在开发阶段。
第5节 数据库设计基础
5.1 数据库、数据库管理系统、数据库系统
①数据:有型(类型)和值两个概念
②数据库:
长期储存在计算机内、有组织的、可共享的大量数据的集合
特点是集成和共享
③数据库管理系统(DBMS)
1.属于系统软件
2.数据语言
数据定义语言
数据操纵语言(查询、插入、修改、删除)
数据控制语言
上述语言有两种结构形式:交互式命令语言、宿主型语言
④数据库管理员
主要工作:数据库设计、数据库维护、改善系统性能,提高系统效率。
⑤数据库系统
包含数据库、数据库管理系统、数据库管理员、硬件平台、软件平台
加上可视化工具就形成数据库应用系统(DBAS)
1.数据库系统特点
数据集成性、数据共享性高、冗余性低、数据独立性高、数据统一控制和管理
数据独立性:不会因为系统数据存储结构与数据逻辑结构的变化而影响应用程序
数据的独立性一般分为物理独立性与逻辑独立性两种。
- 物理独立性:指用户的应用程序与存储在磁盘上的数据库中数据是相互独立的。当数据的物理结构(包括存储结构、存取方式等)改变时,如存储设备的更换、物理存储的更换、存取方式改变等,应用程序都不用改变。
- 逻辑独立性:指用户的应用程序与数据库的逻辑结构是相互独立的。数据的逻辑结构改变了,如修改数据模式、增加新的数据类型、改变数据间联系等,用户程序都可以不变。
⑥数据库系统的三级模式结构
外模式(多个):数据库用户的数据视图
概念模式(一个):也称逻辑模式,是对数据库系统中全局数据逻辑结构的描述
内模式(一个):数据库物理存储结构与物理存取方法
内模式处于最底层,它反映了数据在计算机物理结构中的实际存储形式,概念模式处于中间层,它反映了设计者的数据全局逻辑要求,而外模式处于最外层,它反映了用户对数据的要求。
⑦数据库系统的两级映射结构
外模式/概念模式的映射
概念模式/内模式的映射
数据库系统内部采用三级模式和模式间的二级映射,是为了提高数据库的物理独立性和逻辑独立性
5.2 数据模型
①三要素
数据结构、数据操作、数据约束
②分类
概念数据模型:面向用户
逻辑数据模型:面向数据库
物理数据模型:面向计算机
按传统数据模型分类可分为层次、网状、关系模型
③E-R(实体联系)模型
实体、联系、属性
- 实体:现实世界中的事物可以抽象成为实体,实体是概念世界中的基本单位,它们是客观存在的且又能相互区别的事物。
- 属性:现实世界中事物均有一些特性,这些特性可以用属性来表示。
- 码:唯一标识实体的属性集称为码。
- 域:属性的取值范围称为该属性的域。
- 联系:在现实世界中事物间的关联称为联系。
实体间联系有一对一、一对多和多对多
1.E-R图
矩形表示实体集
椭圆形表示属性
菱形表示联系
连接线表示连接关系

2.层次模型(树)
- 有且只有一个结点没有双亲结点,这个结点称为根结点;
- 除根结点以外的其他结点有且仅有一个双亲结点。
3.网状模型
④关系模型
关系:一个二维表
属性:二维表中的一列
值域:每个属性的取值范围
元组:二维表中的一行
同一个关系模型的任意两个元组值不能全相同
基数:元组的个数
候选码:二维表中能唯一标识元组的最小属性集
主键/主码:二维表有多个候选码时选定一个作为主键(二维表中一定要有键)
外键/外码:表M中某属性集是表N的候选键或主键,那么该属性集是表M的外键/外码
关系的性质:元组个数有限性、元组唯一性、元组次序无关性、元组分量原子性、属性名唯一性、属性次序无关性、分量值域同一性
- 二维表中元组个数是有限的--元组个数有限性;
- 二维表中元组均不相同--元组的唯一性;
- 二维表中元组的次序可以任意交换--元组的次序无关性;
- 二维表中元组的分量是不可分割的基本数据项--元组分量的原子性;
- 二维表中属性名各不相同--属性名唯一性;
- 二维表中属性与次序无关,可任意交换--属性的次序无关性;
- 二维表属性的分量具有与该属性相同的值域--分量值域的统一性。
满足这7个性质的二维表称为关系,以这个二维表建立的模型叫做关系模型
一个关系就是一个二维表,但是一个二维表不一定是一个关系。
例题:42/324、定义学生选修课程的关系模式如下:SC (S#,Sn,C#,Cn,G)(其属性分别为学号、姓名、课程号、课程名、成绩)则该关系的主键为( )。
A.S#
B.C#
C.S#,C#
D.S#,C#,G
问的是学生选修课程的关系模式,那么重点放在学生、课程上,因此主键就是S#和C#
1.关系模型的数据操作
查询、删除、插入、修改
2.完整性约束
实体完整性约束、参照完整性约束、用户定义的完整性约束
下图违反了实体完整性约束(B为键)

5.3 关系代数
①投影
从关系模式中指定若干属性组成新的关系,结果记作πA(R),其中A为R的属性列
$$
\pi_{A}(R)={t[A] | t∈R}
$$
示例:
假设有一个关系表 R,包含以下数据:
| 学号 (SID) | 姓名 (Name) | 年龄 (Age) | 专业 (Major) |
|---|---|---|---|
| 001 | 张三 | 20 | 计算机 |
| 002 | 李四 | 21 | 数学 |
| 003 | 王五 | 19 | 物理 |
我们想要对 $R$ 进行投影操作,只保留 姓名 和 专业 两列。投影操作可以表示为:
$$
\pi_{\text{Name, Major}}(R)
$$
投影后的结果如下:
| 姓名 (Name) | 专业 (Major) |
|---|---|
| 张三 | 计算机 |
| 李四 | 数学 |
| 王五 | 物理 |
②选择运算
$$
\sigma_{F}(R)={t | t∈R且F(t)为真}
$$
假设有一个关系表 $R$,包含以下数据:
| 学号 (SID) | 姓名 (Name) | 年龄 (Age) | 专业 (Major) |
|---|---|---|---|
| 001 | 张三 | 20 | 计算机 |
| 002 | 李四 | 21 | 数学 |
| 003 | 王五 | 19 | 物理 |
我们想要对 $R$ 进行选择操作,选择 年龄大于 20 的元组。选择操作可以表示为:
$$
\sigma_{\text{Age} > 20}(R)
$$
选择后的结果如下:
| 学号 (SID) | 姓名 (Name) | 年龄 (Age) | 专业 (Major) |
|---|---|---|---|
| 002 | 李四 | 21 | 数学 |
注意这里的>号表示比较运算符,所有的比较运算符都可以用
③笛卡尔积
R x S
设有n元关系R及m元关系S,它们分别有p、q个元组,则关系R与S经笛卡尔积记为R×S,该关系是一个n+m元关系,元组个数是p×q,由R与S的有序组组合而成。
小提示:当关系模式进行笛卡尔积运算时,读者应该注意运算后的结果是n+m元关系,元组个数是p×q,这是经常混淆的。(反正我看不懂)
④交
交集
关系R与S经交运算后所得到的关系是由那些既在R内又在S内的有序组所组成
⑤连接与自然连接(基于笛卡尔积)
假设有两个关系表 $R$ 和 $S$:
表 $R$
| 学号 (SID) | 姓名 (Name) | 年龄 (Age) |
|---|---|---|
| 001 | 张三 | 20 |
| 002 | 李四 | 21 |
| 003 | 王五 | 19 |
表 $S$
| 学号 (SID) | 专业 (Major) |
|---|---|
| 001 | 计算机 |
| 002 | 数学 |
| 004 | 物理 |
我们想要对 $R$ 和 $S$ 进行自然连接,基于 学号 (SID)。连接操作可以表示为:
$$
R \bowtie S
$$
连接后的结果如下:
| 学号 (SID) | 姓名 (Name) | 年龄 (Age) | 专业 (Major) |
|---|---|---|---|
| 001 | 张三 | 20 | 计算机 |
| 002 | 李四 | 21 | 数学 |
疑难解答:连接与自然连接的不同之处在什么?
一般的连接操作是从行的角度进行运算,但自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
⑥除
如果将笛卡尔积运算看作乘运算的话,除运算就是它的逆运算。当关系T=R×S时,则可将除运算写成:T÷R=S或T/R=S
S称为T除以R的商。
假设有两个关系 R 和 S:
表 R
| 学号 (SID) | 课程 (Course) |
|---|---|
| 001 | 数学 |
| 001 | 物理 |
| 002 | 数学 |
| 003 | 物理 |
表 S
| 课程 (Course) |
|---|
| 数学 |
| 物理 |
我们想要查询 选修了所有课程 的学生。除运算可以表示为:
R÷S
结果如下:
| 学号 (SID) |
|---|
| 001 |
解释:只有学号为 001 的学生选修了所有课程(数学和物理)。
⑦小技巧
1.直接看条件找数字是最快的,没有数字就不对

比如这种题,B和D都缺其中一个数字,正确可能性就来到了50%(虽然我还是蒙错了qaq)
2.这样的建议直接跳了(如果你是大佬就当我没说www)

5.4 数据库设计与管理
①方法
面向数据、面向过程
面向数据的方法是以信息需求为主,兼顾处理需求;面向过程的方法是以处理需求为主,兼顾信息需求。由于数据在系统中稳定性高,数据已成为系统的核心,因此面向数据的设计方法已成为主流。
②步骤
需求分析(得到需求说明书)、概念设计(得到概念数据模型)、逻辑设计(得到逻辑数据模型)、物理设计(得到数据库内模型)
③需求分析
结构化分析方法、面向对象分析方法(见前面)
④概念设计
集中式模型设计法、视图集成设计法
过程:选择局部应用、视图设计、视图集成
在关系数据库中,描述全局数据逻辑结构的是概念模式
⑤逻辑设计
1.E-R图向关系模式
实体——元组
属性——属性
实体集——关系
联系——关系
2.关系视图设计
3.逻辑模式规范化
4.范式(难度较高)
关系数据库中的模式设计要满足一定的规范,引入了范式这一概念。
不管做哪种范式的设计,最终要的思想是“one fact in one place”,也就是“一事一地”。
1NF
定义:关系中每一分量不可再分。即不能以集合、序列等作为属性。(也就是不能表中套表,要保证数据的原子性。)
举例
| 学生编号 | 课程编号 |
|---|---|
| S01 | |
| S02 |
它就不满足1NF,因为{C1,C2,C3}和{C1,C4}是集合。
修改为符合1NF:
| 学生编号 | 课程编号 |
|---|---|
| S01 | C1 |
| S01 | C2 |
| S01 | C3 |
| S02 | C1 |
| S02 | C4 |
例题:SC(S#,Sn,C#,Cn,G,Cr,T#)(其属性分别为学号、姓名、课程号、课程名、成绩、学分、授课教师号),假定学生和课程都会有重名,则关系最高是( )。答案:1NF
2NF
定义:在1NF基础上,消除非主属性对键的部分依赖,则称它符合2NF。
根据上面对部分依赖的分析,对于Student表:
| 学生编号 | 学生姓名 | 班级编号 | 院系 | 课程编号 | 成绩 |
|---|---|---|---|---|---|
| S01 | 杨明 | D01 | 思齐 | C01 | 90 |
| S02 | 李婉 | D01 | 思齐 | C01 | 87 |
| S01 | 杨明 | D01 | 思齐 | C02 | 92 |
| S03 | 刘海 | D02 | 述圣 | C01 | 95 |
| S04 | 安然 | D02 | 述圣 | C02 | 78 |
| S05 | 乐天 | D03 | 省身 | C01 | 82 |
对于学生姓名、学生所属的班级编号、院系,这三个属性可以直接通过学生编号来确定,在这里课程编号#显得很多余。也就是,学生姓名、班级编号、院系对(学生编号#、课程编号#)部分函数依赖。把Student表进行拆分,可以消除部分依赖。
其中,学生表Student如下:
| 学生编号 | 学生姓名 | 班级编号 | 院系 |
|---|---|---|---|
| S01 | 杨明 | D01 | 思齐 |
| S02 | 李婉 | D01 | 思齐 |
| S01 | 杨明 | D01 | 思齐 |
| S03 | 刘海 | D02 | 述圣 |
| S04 | 安然 | D02 | 述圣 |
| S05 | 乐天 | D03 | 省身 |
学生-课程表如下:
| 学生编号 | 课程编号 | 成绩 |
|---|---|---|
| S01 | C01 | 90 |
| S02 | C01 | 87 |
| S01 | C02 | 92 |
| S03 | C01 | 95 |
| S04 | C02 | 78 |
| S05 | C01 | 82 |
符合2NF。
3NF
定义:在2NF基础上,消除非主属性对键的传递依赖,则称它符合3NF。
根据上面对传递依赖的分析,对于Student表,学生编号可以唯一确定他所在的院系,但是注意到这中间存在传递过程,即学生编号唯一确定该学生所对应的班级编号,班级编号对应唯一的院系。我们称,院系对学生编号传递函数依赖。
把Student表继续进行拆分,可以消除传递依赖。
其中,学生表Student如下:
| 学生编号 | 学生姓名 | 班级编号 |
|---|---|---|
| S01 | 杨明 | D01 |
| S02 | 李婉 | D01 |
| S01 | 杨明 | D01 |
| S03 | 刘海 | D02 |
| S04 | 安然 | D02 |
| S05 | 乐天 | D03 |
班级-院系表如下:
| 班级编号 | 院系 |
|---|---|
| D01 | 思齐 |
| D02 | 述圣 |
| D03 | 省身 |
符合2NF。
BCNF

换言之,对于关系模式R,如果每一个函数依赖的决定因素都包含键,则R属于BCNF范式。
现在举例,现有关系模式:通讯(城市名,街道名,邮政编码)
函数依赖关系集为:
F={(城市名,街道名)-> 邮政编码,邮政编码 -> 城市名}
也就是一个城市名和一个街道名,对应一个邮政编码;一个邮政编码对应一个城市名。
此时,候选键(城市名,街道名)非主属性邮政编码完全依赖于候选键,且无传递依赖,属于3NF。
那么它是否属于BCNF呢?我们按照下面的定义来看一下,
换言之,对于关系模式R,如果每一个函数依赖的决定因素都包含键,则R属于BCNF范式。
对于决定因素(城市名,街道名),它包含键(城市名,街道名),其实它本身就是键了,没问题;
对于决定因素邮政编码,它不包含键(城市名,街道名)
所以它不属于BCNF。在关系模式R中,如果每一个决定因素都包含码,则R属于BCNF。
例题:定义课程的关系模式如下:
Course(C#,Cn, Cr,prC1#,prC2#)(其属性分别为课程号、课程名、学分、先修课程号1和先修课程号2),并且不同课程可以同名,则该关系最高是( )。
A.1NF
B.2NF
C.3NF
D.BCNF
答案:D
部分依赖、完全依赖、传递依赖
部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
比如说:C可以通过AB得到,并且C也可以仅通过A得到,仅通过B得到,
那么就说C部分依赖AB。
12
完全函数依赖:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
比如说:C可以通过AB得到,并且C不可以仅通过A得到,也不可以仅通过B得到,
那么就说C完全依赖AB。
12
传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
比如说:B可以通过A得到,C可以通过B得到,那么就称C传递依赖A。
⑥物理设计
⑦数据库管理
补充
1.系统结构图
①系统结构图宽度
结构图中横向最大模块数的控制跨度,比如下图宽度为5
②扇出
由一个模块直接调用的其他模块个数。如下图最大扇出数为3





浙公网安备 33010602011771号