UESTC 软件技术基础 期末复习

目录

Chapter1  绪论

1.1 软件开发六步骤(了解)

1.2 操作系统主要功能(了解)

Chapter2 数据结构与算法

2.1 线性表的逻辑存储结构

2.2 线性表的顺序存储结构

2.3 线性表的链式存储

2.4 两种储存方式的优缺点

2.5 时间复杂度渐近分析(大题)

2.6 分治算法求解排序问题

2.7 树

2.8 二叉树的概念

2.9 二叉树的存储

2.10 二叉树的遍历

2.11 树和二叉树的互换:

2.12 先序和中序遍历恢复二叉树

2.13 图

2.14 图的遍历

2.15 贪心算法

2.16 Dijkstra算法求最短路径

Chapter 3 操作系统

3.1 进程的定义

3.2 进程五状态转换模型

3.3 挂起状态

3.4 进程的构成(了解)

3.5 线程

3.6 进程与线程的区别

3.7竞争临界资源引起的问题

3.8 互斥的条件

3.9 信号量方法

3.10 生产者消费者问题

3.11 进程间的通信

3.12 链接方式

3.13 装入方式(了解)

Chapter 4 编译原理

4.1 编译相关概念:

4.2 数据类型及抽象层次:

4.3 绑定

4.4 语句级控制结构

4.5 定义语言

4.6 文法

4.7 推导与规约

4.8 句型与句子

4.9 文法与语言

4.10 短语和直接短语

4.11 句柄

4.12 语法树

4.13 编译步骤

4.14 词法分析

4.15 语法分析两大类型

4.16 自下而上分析可能遇到的问题

4.17 确定与不确定

4.18 递归下降分析法

4.19 预测分析法

4.20 算符优先分析法

4.21 FIRSTVT集

4.22 LASTVT集

4.23 优先关系表构造方法

Chapter 5  数据库

5.1 数据库基本概念:

5.2 模式的体系结构

5.3 关系模型基本概念

5.4 关系运算

5.5 连接运算

5.6  完整性约束

5.7  函数依赖

5.8 主码与候选码

5.9 模式分解

5.10 范式

5.11 重要例题

5.12 三种数据模型

5.13 E-R模型

5.14 数据库设计阶段




Chapter1  绪论

1.1 软件开发六步骤(了解)

  1. 问题的理解
  2. 算法设计
  3. 数据结构设计
  4. 算法分析
  5. 程序设计
  6. 程序实现

1.2 操作系统主要功能(了解)

UESTC 软件技术基础 期末复习_第1张图片

Chapter2 数据结构与算法

2.1 线性表的逻辑存储结构

在线性结构中,数据元素之间存在着一对一的关系,其特点是数据元素之间按某种规定存在一个顺序关系。(逻辑结构)

线性表: n个同类型数据元素的有限序列,记为:L= (a1a2,...ai,...an)

L为表名;i为数据元素ai 在线性表中的位序;n为线性表的表长;  n=0 时称为空表;ai的数据类型相同

2.2 线性表的顺序存储结构

基本概念:

用一组地址连续的存储单元依次存放线性表中的数据元素,线性表的起始地址s称作线性表的基地址,数据元素ai的存储位置为:LOC(ai) = LOC(a1) + (i-1)×

顺序表的c语言定义:

UESTC 软件技术基础 期末复习_第2张图片

插入操作:

  1.  检查插入位置是否合法,如果合法则继续,否则退出;
  2. 判表是否已占满;因为是事先静态地分配空间,可能存在所分配存储空间全部被占用的情况,此时也不能实现插入。
  3.  若前面检查通过则数据元素依次向后移动一个位置;为避免覆盖原数据,应从最后一个向前依次移动。
  4.  新数据元素放到恰当位置;
  5.  表长加1。
Status  List_Insert(ListPtr L, int pos, ElemType elem){
	Status status = range_error;
	int len = L->length,i;
	if (len = MAXSIZE) status = overflow;
	else if (1<= pos && pos <=len+1){
	   for(i=len;i>=pos;i--)
			L->elem[i+1] = L->elem[i];  /* 数据元素后移一个位置*/
	   L->elem[pos] = elem;
	   L->length ++;  /* 表长加1 */
	   status = success;
	}
	return status;
}

        时间复杂度O(n)

删除操作:

  1. 检查删除位置是否合法;
  2.  若检查通过,数据元素依次向前移动一个位置;
  3.  表长减1

Status List_Remove(ListPtr L,int pos){
	Status status = range_error;
	int len = L->length, i;
	if(1<= pos && pos<=len){
	   for(i=pos;ielem[i] = L->elem[i+1]; /* 数据元素前移一个位置*/
	   L->length --;  /* 表长减1 */
	   status = success;
	 }
	return status;
}

2.3 线性表的链式存储

用一组地址任意的存储单元存放线性表中的数据元素。

数据域 (数据元素) + 指针域 (指示后继元素存储位置结点,以“结点的序列”表示线性表 ¾¾ 称作链表

UESTC 软件技术基础 期末复习_第3张图片

以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针。有时为了操作方便,在第一个结点之前虚加一个“头结点”,并用链表的头指针指向头结点,称为带头结点的单链表

带或不带头结点的区别:

不带:链表指针存放链表第一个数据元素结点的地址,空链表时该指针域为NULL

带:一个专门的结点,称为头结点,该头结点永远存在,该头结点指针域存放第一个数据元素结点的地址,空链表时L.next= NULL

单链表的定义:

typedef struct node{

  ElemType  data;   /* 数据域 */

  struct node *next;   /* 指针域 */

} ListNode,*ListNodePtr;

typedef ListNodePtr List, * ListPtr;

变量定义和使用

  • ListNode    n1, n2;  /* 定义2个结点变量*/
  • ListNodePtr  p = &n1; /* 定义一个指向结点的指针变量p, 并存放n1的地址(指针) */
  • n1.next=&n2;  /* 结点n1的指针域存放结点n2的地址 */
  • List  L; //定义一个单链表L

插入操作:

UESTC 软件技术基础 期末复习_第4张图片

步骤:找到ai-1的位置,构造一个数据域为elem的新结点,将其挂在单链链表上

s->data=elem;

s->next=pre->next;

 pre->next=s;

Status  List_Insert(ListPtr L, int pos, ElemType elem){
	Status status;
	ListNodePtr pre,s;
	status = List_SetPosition(L,pos-1,&pre);  /*找插入位置的前驱*/
	if (status ==success){
		 s=(ListNodePtr)malloc(sizeof(ListNode));
		 if (s){
			s->data=elem;
			s->next=pre->next;
			pre->next=s;
		 }
       else 
			status =fatal;
	}
	return status;
}

删除操作:

UESTC 软件技术基础 期末复习_第5张图片

步骤:首先求得第i-1个结点的指针p, 修改第i-1个结点的后继域为第i+1个结点的地址,再释放第pos个结点所占的存储空间

q=ptr->next;

ptr->next=q->next;

free(q);

Status  List_Remove(ListPtr L, int pos){
	Status status;
	ListNodePtr ptr,q;
	status =List_SetPosition(L, pos-1, &ptr); /*找插入位置的前驱*/
	if(status ==success){
		 q=ptr->next;
		 ptr->next=q->next;
		 free(q);
	}
	return status;
}

2.4 两种储存方式的优缺点

顺序表:

优点:空间利用率高,数据是连续存放,命中率比较高 ;存取速度高效,通过下标来直接访问。

缺点:插入删除效率低;需要预分配空间

时间复杂度:查找操作为O(1) ,插入和删除操作为O(n)。

链表:

优点:插入删除速度快;没用空间限制,储存元素无上限;动态分配内存

缺点:占用额外空间以存储指针;查找速度慢

时间复杂度:查找操作为O(n) ,插入和删除操作为O(1)或O(n)

链表插入删除是读操作的O(n),而顺序表是写操作的O(n),两者速度不同

2.5 时间复杂度渐近分析(大题)

三种渐进符号:

渐近上界记号O,渐近下界记号Ω,紧渐近界记号

logn

常用关系式(重点):

UESTC 软件技术基础 期末复习_第6张图片

例题:

UESTC 软件技术基础 期末复习_第7张图片

解:首先得知道渐进关系O的定义:

O(g(n)) = { f(n) | 存在正常数cn0使得对所有 n≧n有:0 ≦ f(n) ≦ cg(n) }

即:若 f(n)=O(g(n)),则f(n)≦ g(n)

主要利用上面的指数和对数两个式子:

UESTC 软件技术基础 期末复习_第8张图片

2.6 分治算法求解排序问题

UESTC 软件技术基础 期末复习_第9张图片

基本思想:

将待排序元素分成大小大致相同的2个子集合.递归的分别对2个子集合进行排序.最终将排好序的子集合并成为所要求的排好序的集合.

UESTC 软件技术基础 期末复习_第10张图片

 public static void mergeSort(Comparable a[], int left, int right){
     if (left

2.7 树

定义:

由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根root),n>1时,其余的结点分为m(m≥0)互不相交的有限集合T1,T2Tm。每个集合本身又是棵树,被称作这个根的子树

基本概念:

结点:

根结点:

叶子:度为0的结点

结点的度:拥有所有的子树的个数称为结点的度

树的度:所有结点度中的最大值

树的深度/高:所有结点中的最大的层数

2.8 二叉树的概念

定义:

nn≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成(递归定义)

基本特征:

每个结点最多有两棵子树;左右子树的次序不能颠倒

满二叉树:

深度为k,且有2^k-1个结点的二叉树。

结点层序编号方法:从根结点起,从上到下逐层(层内从左到右)对二叉树的结点进行连续编号

完全二叉树

深度为k,结点数为n的二叉树,当且仅当每个结点的编号都与相同深度的满二叉树中从1n的结点一一对应时,称为完全二叉树。

2.9 二叉树的存储

顺序存储结构:

按二叉树的结点 自上而下、从左至右 编号,用一组连续的存储单元存储。
若是完全二叉树或满二叉树,可以做到唯一复原,有规律: 下标值为 i 的双亲,其左孩子的下标值必为 2i ,其右孩子的下标值必为 2i +1;
若不是完全二叉树,一律转为完全二叉树,通过补空节点完成,但是会浪费空间,插入删除不方便
链式存储结构:
二叉链表:2个链分别存放左孩子和右孩子
三叉链表:2个链分别存放左孩子和右孩子,1个指向双亲

2.10 二叉树的遍历

UESTC 软件技术基础 期末复习_第11张图片

先序遍历结果:ABCDEFGHIJK

中序遍历结果:CDBEFAHGJIK

后序遍历结果:DCFEBHJKIGA

对应递归遍历算法:

UESTC 软件技术基础 期末复习_第12张图片UESTC 软件技术基础 期末复习_第13张图片

UESTC 软件技术基础 期末复习_第14张图片
层序遍历:利用队列,结点出队时将其左右孩子入队
UESTC 软件技术基础 期末复习_第15张图片

2.11 树和二叉树的互换:

UESTC 软件技术基础 期末复习_第16张图片

2.12 先序和中序遍历恢复二叉树

UESTC 软件技术基础 期末复习_第17张图片

2.13 图

定义(了解):

图G由顶点集V和关系集E组成,记为 G=(V,E),V是顶点(元素)的有穷非空集,记为V(G).E是V中两个顶点对(称为边)的有穷集合。记为E(G).

存储结构:

1. 邻接矩阵

2. 邻接表

UESTC 软件技术基础 期末复习_第18张图片

UESTC 软件技术基础 期末复习_第19张图片

UESTC 软件技术基础 期末复习_第20张图片

2.14 图的遍历

深度优先搜索:

关键:递归、栈

思想:选定一个出发点后进行遍历,如果有邻接的未被访问过的节点则继续前进。若不能继续前进,则回退一步再前进,若回退一步仍然不能前进,则连续回退至可以前进的位置为止。重复此过程,直到所有与选定点相通的所有顶点都被遍历。

广度优先搜索:

关键:队列、类似层次遍历

思想:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

2.15 贪心算法

思想:

在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解

活动安排问题:

UESTC 软件技术基础 期末复习_第21张图片

2.16 Dijkstra算法求最短路径

UESTC 软件技术基础 期末复习_第22张图片


Chapter 3 操作系统

3.1 进程的定义

  • 一个正在执行中的程序。
  • 一个正在计算机上执行的程序实例。
  • 能分配给处理器并由处理器执行实体
  • 个具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集
  • 可并发执行的程序在一个数据集合上的运行过程

3.2 进程五状态转换模型

3.3 挂起状态

定义:

使执行程序暂停执行,静止下来,不再参与CPU的竞争

进程挂起的原因:

  • 进程全部阻塞,处理机空闲
  • 系统负荷过重,内存空间紧张
  • 操作系统的需要,操作系统可能需要挂起后台进程或一些服务进程,或某些可能导致系统故障的进程。
  • 终端用户的请求
  • 父进程请求

挂起与阻塞的区别:

挂起时主动行为,阻塞是被动行为;

阻塞会释放CPU,挂起不释放;

挂起时进程在外存而不在主存

3.4 进程的构成(了解)

构成:

程序段+数据段+进程控制块(PCB)

进程控制块PCB的作用:

进程存在的唯一标志;PCB常驻内存

PCB中的信息:

标识、处理机状态、进程调度信息、进程控制信息

3.5 线程

定义:

线程是进程中的一个实体,是独立调度和分派的基本单位

三类线程:

分类依据:依据线程是否对内核透明

1. 用户级线程:

       线程的创建等操作全由应用进程完成,操作系统内核不知道线程的存在,仍以进程为调度单位

2. 内核级线程

        线程的创建等操作全由系统内核完成,以线程为调度单位

3. 混合线程

        线程的操作在用户级应用程序中完成,多个用户级线程为影射到一个或较少的某些内核级线程

3.6 进程与线程的区别

1. 定义不一样,进程执行中的一段程序,而一个进程中执行的每个任务即为一个线程

2. 一个线程只可以属于一个进程,但一个进程能包含多个线程

3. 线程无地址空间,他被包括在进程的地址空间中

4. 线程的开销比进程小

3.7竞争临界资源引起的问题

UESTC 软件技术基础 期末复习_第23张图片

3.8 互斥的条件

空闲让进,忙则等待,有限等待,让权等待

3.9 信号量方法

信号量的两个原子操作wait(s)signal(s),有时也称作P(s)V(s)

P:先将信号量-1,判断信号量是否>=0,若是,执行程序

V:使信号量+1,释放信号量

互斥信号量:

用于申请获释放资源的使用权,通常初始化为1

资源信号量:

用于申请或归还资源,可以初始化为大于1的正整数,表示系统中某类资源的可用个数。

3.10 生产者消费者问题

缓冲区:固定长度

生产者:满则等待,空则填充

消费者:空则等待,满则获取

例题:

1. 图书馆有N个座位,一张登记表,要求(1)阅读者进入时登记,取得座位号;(2)出来时注销。请用PV操作描述一个读者的使用过程。

semaphore empty = N; //记录空闲座位数量
semaphore mutex = 1;// 作为互斥的登记和注销操作
void reader(){
    P(empty);
    P(mutex);
    //登记
    V(mutex);
    //阅读
    P(mutex);
    //注销
    V(empty);
    V(mutex);
}

2. 3个进程PAPBPC合作解决文件打印问题:(1)PA将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录;(2)PB将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;(3)PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录大小。请用PV操作来保证文件的正确打印。

int empty1=1;//记录缓冲区 1 是否为空
int empty2=1; //记录缓冲区 2 是否为空
int full1 = 0; //记录缓冲区 1 是否有数据
int full2 = 0; //记录缓冲区 2 是否有数据
int mutex1 = 1;//对缓冲区 1 的访问互斥
int mutex2 = 1;//对缓冲区 2 的访问互斥
int main(){
    cobegin
    PA();
    PB();
    PC();
    coend
}
void PA(){
    //从磁盘读数据
    P(empty1);
    P(mutex1);
    //将数据存入缓冲区 1
    V(mutex1);
    V(full1);
}
void PB(){
    P(full1);
    P(mutex1);
    //从缓冲区 1 读数据
    V(mutex1);
    V(empty1);
    P(empty2);
    P(mutex2);
    //将数据写入缓冲区 2
    V(mutex2);
    V(full2);
}

void PC(){
    P(full2);
    P(mutex2);
    //读取缓冲区 2 的数据并打印
    V(mutex2);
    V(empty2)
}

3.11 进程间的通信

低级通信:

以信号、信号量作为通信工具,由于其所交换的信息量少而被归结为低级通信

高级通信:

用户可直接利用操作系统所提供的一组通信命令,     高效地传送大量数据的一种通信方式

消息传递的同步:

当发送进程调用Send原语发送消息时,若没有空闲的消息缓冲区,则发送进程塞阻;

当接收进程调用Receive原语接收消息时,如果没有消息可接收,则接收进程阻塞,直到一条消息到达。 

三种同步方式:

阻塞发送,阻塞接收

不阻塞发送,阻塞接收

不阻塞发送,不阻塞接收

如何利用消息传递实现互斥:

  • 多个并发执行的发送进程和接收进程共享一个邮箱box,且box的初始状态为仅包含一条空消息
  • 采用“不阻塞发送阻塞接收方式传递消息;
  • 邮箱中存在一条消息,则允许一个进程进入临界区。
  • 若邮箱为,则表明有一个进程位于临界区,其它试图进入临界区的进程必须阻塞。
  • 只要保证邮箱中最多只有一条消息,就能保证只允许一个进程进入临界区,从而实现进程互斥使用临界资源。

3.12 链接方式

静态链接:

不利于代码共享;不利于模块的独立升级;可能链接一些不会执行的模块,浪费空间和处理时间

装入时链接:

便于各模块的独立升级;便于实现模块的共享。

可能链接一些不会执行的模块,浪费空间和处理时间;装入后不能移动位置

运行时动态链接:

不会装入未被用到的目标模块

三者的区别:

分别在运行之前链接个模块和所需库函数,边装入边链接,执行时链接

3.13 装入方式(了解)

绝对装入方式:

实现简单。

每次必须装入同一内存区,需要提前知道内存使用情况;不适于多道程序系统。

可重定位装入方式:

容易实现。

装入后不能移动;存储空间只能连续分配;难于共享


Chapter 4 编译原理

4.1 编译相关概念:

翻译:

将一种语言编写的程序转换成完全等效的另 一种语言编写的程序的过程称为翻译;在计算机中,翻译由一个程序来实现,称为 翻译程序;

编译:

将高级语言程序翻译为低级语言的程序称为编译。

三种语言:

源语言、工具语言、目标语言

三种程序:

源程序、编译程序、目标程序

4.2 数据类型及抽象层次:

数据类型实质上是对存储器中所存储的数据进行的抽象。 数据类型包含了一组值的集合和一组操作。

抽象层次:

内部类型;用户定义类型;抽象数据类型。

4.3 绑定

概念:

静态绑定:方法在程序编译期进行绑定
动态绑定:方法在程序运行时根据具体对象的类型进行绑定
大部分的名字到位置的绑定和位置到值的绑定都是动态绑定。

4.4 语句级控制结构

定义:

用来构造各种语句执行顺序的机制。

分类:

顺序:语言可用的、最简单的控制结构。语句结束标记 “ ;”

选择(分支):if 、select、case,switch

重复(循环):for、whlie

4.5 定义语言

语言=语法(规则)+语义(规则)

如何定义一门语言:

生成(文法);识别(语法图)

注:文法和语法图是语言语法的等价表示 ,文法从产生的观点来定义语言的语法, 更通用、更准确。 语法图以识别的观点定义语言的语法, 更直观、更清晰。采用生成的方法还是采用识别的方 法来定义语言由语言的设计者确定

4.6 文法

定义:

文法是描述语言的语法结构的形式规则,

文法G定义成一个四元式: G=(VT ,VN, S, P) 其中 VT是终结符的有限集合; VN是非终结符的有限集合; S是开始符号,S∈VN ; P是产生式的非空有限集

0型文法:

又称短语文法,能力相当于图灵机;

产生式形如:α→β             α∈(VN∪VT) *且至少含有一个非终结符 ,β∈(VN∪VT) *

产生式左边至少有一个大写字母(非终结符),右边随意。

1型文法:

上下文有关文法,对非终结符进行替换时必须考虑上下文

对于其产生式:α→β 要求 |α|≦|β| (S→ε例外) 或产生式形如 αAβ→αωβ,ω属于V +

产生式右边的字母个数必须大 于等于左边的字母个数。

2型文法:

上下文无关文法,简称文法

A→α 即产生式左边必须完全都是大写字母。

3型文法:

正则文法,右线性文法

A→α 或 A→αB 其中 A、B ∈ VN ,α ∈ VT * 。

通俗的解释:所有产生式右边要么没有大写字母,如果有,必须全部在小写字母同一边,也就是要保持线性一致。

4.7 推导与规约

推导:由产生式右边替换产生式左边

规约:推导的逆过程

若存在v =w0\Rightarrow w1 \Rightarrow ...\Rightarrow wn=w, (n>0)称v推导出(产生)w(推导长度为n), w规约到v,           记作v \Rightarrow ^{+} w

若有 v \Rightarrow ^{+} w或v=w,则记为v\Rightarrow ^{*}w

\Rightarrow ^{*}包含左右相等即推导长度等于0的情况而\Rightarrow ^{+}不包括

最左推导过程:

UESTC 软件技术基础 期末复习_第24张图片

最右推导过程(规范推导)

4.8 句型与句子

UESTC 软件技术基础 期末复习_第25张图片

两者的关系:

句子是只含终结符的句型,特殊情况

UESTC 软件技术基础 期末复习_第26张图片

注意s本身也是一个句型

4.9 文法与语言

文法 G=(VT,VN,S,P) 产生的所有句子的集合, 称为由文法G产生的语言记为L(G)

例:

UESTC 软件技术基础 期末复习_第27张图片

若两个文法G和G2有L(G)=L(G2), 则称两文法等价

4.10 短语和直接短语

令G是一个文法,S是文法的开始符号,假定 αβδ是文法G的一个句型

如果有S\Rightarrow ^{*}αAδ且 A \Rightarrow ^{+}β,则此时称β是相对于非终结符A的, 句型αβδ的短语

如果有 S\Rightarrow ^{*}αAδ且 A \Rightarrow{\color{Red} }{\color{Red} } β,则此时称β是相对于非终结符A的, 句型αβδ的直接短语

区别在于A是不是一步推导出β,注意不是αAδ的短语

补充:素短语:含有终结符的短语,并且它的真子 串不具有这个特性。

4.11 句柄

定义:

一个句型最左直接短语称为该句型的句柄。

特征:

直接短语,所以,它是某规则右部;

它是最左边的直接短语;

一个句型的直接短语可能不止一个,但是其最左直接短语则是唯一的。

UESTC 软件技术基础 期末复习_第28张图片

4.12 语法树

语法树的构造过程是从文法的开始符号出发, 构造一个推导的过程。

UESTC 软件技术基础 期末复习_第29张图片

文法的二义性:

一个句子有两棵不同的推导树

依据语法树求:

1. n个内部节点(根结点也算)则有n棵子树,每棵子树的叶结点从左至右排列组成一个短语

2. 只有父子两代的为直接子树,其叶节点从左至右排列为直接短语

3. 由最左端的直接子树求得句柄

UESTC 软件技术基础 期末复习_第30张图片

4.13 编译步骤

UESTC 软件技术基础 期末复习_第31张图片

1. 词法分析:

输入字符串,根据词法规则识别出单词符号。也会识别出错误信息

2. 语法分析:

根据语法规则,将单词符号构成各类语法单位,并进行语法检查。

3. 语义分析:

根据语义规则,进行初步编译。

4. 优化:

对中间代码进行等价变换,以使代码更有效

5. 目标代码生成:

生成机器语言程序或汇编语言程序。

说明:

实用的编译程序不一定总是分成5个阶段 ;

目标程序不一定能立即执行,可能还要经过链接、装入等阶段 ;

编译的各阶段均需要和符号表管理程序、 出错处理程序打交道。

符号表管理:完成符号表的建立、查找、更新

出错处理:发现、指出、限制

4.14 词法分析

单词种类:

标识符:用来命名程序中出现的变量、数组、函 数、过程、标号等

基本字:也可称关键字或保留字, 如if、while、 for、do、goto等

常数:各种类型的常数, 如216、3.14159、TRUE 等

运算符:如+  -   *   /等

界符:如;   :   /*   */等

流程:

UESTC 软件技术基础 期末复习_第32张图片

1. 输入缓冲区:源程序 =>输入缓冲区

2. 预处理程序:取消注解,剔除无用的空白、跳格、回车、换行等

3. 扫描缓冲区:输入固定长度字符串,双缓冲区结构:左缓冲区读完后新读入的字符存入右缓冲区

4. 词法分析:直接在扫描缓冲区进行符号识别

方法:超前搜索

为了判定一个单词符号的类别,必须扫描到某 一地方,而该单词符号并没有这么长,这种扫描方式 叫做“超前搜索”。

起点指针(lexeme Begin):用来指示正在扫描的单词的起点;

搜索指针(forward):用于向前搜索,寻找单词的结束;

4.15 语法分析两大类型

自上而下:

从文法开始符出发,能否找到一个最左推导 序列, 使得S=>*w ?

或者从根结点S开始,能否构造一棵语法树, 使得该语法树的叶结点自左至右的连接正好是w?

自下而上:

从w出发,能否找到一个最左规约(最右推导的逆过程)序列,逐步向上规约,直至文法的开始符S?或者对生成w的语法树,按最左规约对语法 树进行剪枝,能否最后只剩下根结点S?4.

基本方法:采用栈,移进--规约,将输入串符号依次入栈,若栈顶(一个或多个符号)形成某个非终结符的候选式(注意此时在栈中从下往上读),则将其替换,最后只剩下开始符号S则合法

UESTC 软件技术基础 期末复习_第33张图片

4.16 自下而上分析可能遇到的问题

关键问题:如何判断栈顶符号串是否形成可归约串?如何进行归约?

两种冲突: 移进与归约的冲突 ; 归约与归约的冲突

4.17 确定与不确定

自上而下的语法分析分为不确定和确定的两类。

回溯分析法是不确定的分析方法。

递归下降分析法和预测分析法属于确定的分析方法。

4.18 递归下降分析法

1. 公共左因子:

是指在文法的产生式集合中,某个非 终结符的多个候选式具有相同的前缀。如:a\rightarrow \alpha\beta _{1}| \alpha\beta _{2}

解决办法:提取公共左因子

UESTC 软件技术基础 期末复习_第34张图片

例:

UESTC 软件技术基础 期末复习_第35张图片UESTC 软件技术基础 期末复习_第36张图片

2. 左递归:

可能产生无限循环

形式为:A\Rightarrow^{+} A\beta或者直接A\Rightarrow A\beta

解决办法:

1. 直接左递归的消除,改写为右递归

UESTC 软件技术基础 期末复习_第37张图片

2. 间接左递归的消除,先把候选式转为直接左递归

UESTC 软件技术基础 期末复习_第38张图片

4.19 预测分析法

组成:

预测分析是一种表驱动的方法,它由下推栈、 预测分析表和控制程序组成

三种情况的判断:

1. 若x = a = #,则符号串和栈均已为空; 则输入串ω是该文法的一个合法 句子分析过程结束。

2. 若x = a ≠ #, 栈顶符号与输入符号匹配,则x出栈,输入指针指向下一个符号,这一次匹配成功,继续下一次匹配。

3. 若x为非终结符,则查分析表:若M[x,a]中存放 x→α, 则x出栈α串逆序入栈(α的前缀处于栈顶位置);若M[x,a]中为出错标志,则调用出错处理程序 error( )。

过程:

UESTC 软件技术基础 期末复习_第39张图片

4.20 算符优先分析法

优先关系:

UESTC 软件技术基础 期末复习_第40张图片

相同终结符的优先关系未必是=,有a>b,不一定a

分析过程:

UESTC 软件技术基础 期末复习_第41张图片

4.21 FIRSTVT集

概念:

FIRSTVT(P)是由P的所有可能推导的 第一个终结符组成的集合。

求法:

UESTC 软件技术基础 期末复习_第42张图片

4.22 LASTVT集

概念:

LASTVT(P)是由P的所有可能推导的最后一个终结符组成的集合。  

求法:

UESTC 软件技术基础 期末复习_第43张图片

例:

UESTC 软件技术基础 期末复习_第44张图片

可以先求优先级低的F,再利用公式反推

4.23 优先关系表构造方法

UESTC 软件技术基础 期末复习_第45张图片


Chapter 5  数据库

5.1 数据库基本概念:

数据库定义:

数据库(Database,简称DB)是长期储存在计算机内、 有组织的、可共享的大量数据集合

数据:

数据是一种符号序列,它的内容是事物特性的反映。数据是对现实世界的事物采用计算机能够识 别、存储和处理的方式进行描述,或者说是 计算机化的信息。

DBMS数据库管理系统:

一个能够让用户定义、创建和维护数据库以及控制对数据库访问的软件系统。由查询处理器和存储管理器组成

数据库系统:

数据库系统(Database System,简称DBS)是指在计算机系统中引入数据库后的系统构成。

5.2 模式的体系结构

模式的定义:

数据库逻辑结构和特征的描述;是型的描述;反映的是数据的结构及其联系;模式是相对稳定的

三种模式:

1. 内模式:是数据物理结构和存储方式的描述 ,是数据在数据库内部的表示方法

2. 概念模式(也称模式):数据库中全体数据的逻辑结构和特征的描述

3. 外模式:数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述;

独立性:

逻辑数据独立性;物理数据独立性

5.3 关系模型基本概念

关系:是笛卡尔积的一个有意义的子集,是一张二维表

元组:表中的一行,表示一个实体,关系是由元组组成的。

属性:表中的每一列在关系中称为属性

域:属性的取值范围称为域

分量:元组中的一个属性值

UESTC 软件技术基础 期末复习_第46张图片

5.4 关系运算

1. 并:

2. 交:

3. 差:

4. 笛卡尔积运算:

两个分别为n目和m目的关系R和S的笛卡尔积是一个 (n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。

UESTC 软件技术基础 期末复习_第47张图片

5. 选择运算:

从关系中找出满足给定条件的所有元组称为选择

UESTC 软件技术基础 期末复习_第48张图片

6. 投影运算:

UESTC 软件技术基础 期末复习_第49张图片

7.条件连接(θ连接):

在两个关系的笛卡尔积上进行的选择运算。

UESTC 软件技术基础 期末复习_第50张图片

8.  自然连接

从两个关系的广义笛卡儿积中选取在相同属性列B上取值相等的元组,并去掉重复的行。

如果两个关系没有公共属性,自然连接就是笛卡尔积

UESTC 软件技术基础 期末复习_第51张图片

5.5 连接运算

1.  等值连接

θ为“=”的条件连接

2. 自然连接

3. 左连接

R左连接S:所有来自R的元组和那些连接字段相等处的S的元组。

4. 右连接

R右连接S:所有来自S的元组和那些连接字段相等处 的R的元组。

UESTC 软件技术基础 期末复习_第52张图片

5.6  完整性约束

定义:

关系模型的完整性规则是对关系的某种约束 条件,保证数据库中数据的正确性和一致性

实体完整性:主码不能取空值

参照完整性:通过外码实现,避免孤子记录 

用户定义的完整性:各类商业规则

实体完整性和参照完整性是关系模型必须满 足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。

5.7  函数依赖

定义:

UESTC 软件技术基础 期末复习_第53张图片

符号说明:

t[X]表示元组t在属性X上的取值。例如 t[Dname] = ‘杨勋

UESTC 软件技术基础 期末复习_第54张图片

平凡函数依赖:如果Y⊆X,显然XY成立

完全函数依赖:X、Y是某关系不同属性集;不存在X’⊂X,使得 X’Y成立

部分函数依赖:XY是某关系不同属性集;存在X’⊂X,使得 X’Y成立

传递函数依赖:X、YZ是某关系不同属性集,如果XY YZ,且不存在Y → X(说明X和Y                             不是一一对应),则X→Z。

                  在就诊关系R中,存在函数依赖Dname→DlevelDlevelDsal,所以Dname Dsal

5.8 主码与候选码

UESTC 软件技术基础 期末复习_第55张图片包含在任何候选码中的属性称为主属性(Prime Attribute。不包含在任何候选码中的属性称为非主属性(Non-Key Attribute。最简单的情况,单个属性是码。最极端的情况,整个属性组是码,称为全码(All-key

5.9 模式分解

定义:

UESTC 软件技术基础 期末复习_第56张图片

无损分解:

无损中的损是指信息丢失。如果一个分解不是无损分解, 则所得结果的元组数总比原来的多(增加了噪声,但把原来的信息丢失了)。所谓“有损”就损在出现多余的元组上。

UESTC 软件技术基础 期末复习_第57张图片

5.10 范式

定义:

范式(Normal FormaNF)是一种关系的状态,是衡量关系模式的标准。

1NF:每个属性值都是不可再分的原子值,不允许出现表中有表的现象

2NF:关系模式R1NF,且每个非主属性(不是组成候选码的属性)完全函数依赖于候选码

3NF:关系模式R1NF,且不存在部分依赖和传递依赖

如何区分:若存在部分依赖则必是1NF,不存在部分依赖和传递依赖则必是3NF

如何判断是否部分依赖于主码:找出一个属性只依赖于主码中的一个(主码本身有多个属性)

5.11 重要例题

寻找依赖关系、确定候选码、判断范式类型、模式分解

【转载】(3条消息) 数据库关系模式的函数依赖习题讲解_WS的小屋-CSDN博客_数据库函数依赖例题

5.12 三种数据模型

关系、网状、层状数据模型

5.13 E-R模型

概念:

面向问题的概念模型;用简单的图形方式(E-R图)描述显示世界中的数据;E-R图不涉及数据在数据库中的表示和存取方法;非常接近人的思维方式

结构:

实体用方框,属性用椭圆框,关系用菱形框

UESTC 软件技术基础 期末复习_第58张图片

构造数据库的方法:

在需求分析的基础上,用E-R图构造一个反映现实世界实体之间联系的企业模式转换成基于某一特定的DBMS的概念模式。

5.14 数据库设计阶段

1. 需求分析阶段:

2. 概念设计阶段:将用户的需求抽象为用户与开发人员都能接受的概念模型,

3. 逻辑设计阶段:把抽象的概念结构进一步转换为可以被具体的DBMS产品所能支持的数据模型

4. 物理设计阶段:确定的物理存储结构

5. 实现阶段:开发和调试,以及现实数据的录入和试运行等基本工作。

6. 运行与维护阶段:保证数据库系统的效率,以及根据实际运行情况和用户的需求变动进行调整

你可能感兴趣的:(课程笔记,软件开发,数据库,操作系统,编译器)