计算机二级vf,是上午考笔试,下午考机试。下面是笔试的公共基础材料。此外,你笔试还需做一套试卷。 机试的题库,你把邮箱号给我,我给你发过去。希望能对你有所帮助。。。公共基础知识第一章 数据结构与算法 (P1—P38) 1.1 算法 1.1.1 算法的基本概念 (P1—P4) 所谓算法是指解题方案的准确完整的描述。 1. 算法的基本特征 (1)可行性(2)确定性(3)有穷性(4)拥有够的情报 2. 算法的基本要素 一个算法通常由两种基本要素组成:一是对数据对象的运算和操作,二是算法的控制结构。 (1) 算法中对数据的运算和操作 (插入、删除) (2) 算法的控制结构 一个算法一般都可以用顺序、选择、循环三种基本控制结构组合而成。 1.1.2 算法复杂度(P4—P6) 算法的复杂度主要包括时间复杂度和空间复杂度。 1. 算法的时间复杂度 所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。 2. 算法的空间复杂度 一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。 1.2数据结构的基本概念 数据结构,主要研究和讨论以下三个方面的问题: ① 数据的逻辑结构; ② 数据的存储结构; ③ 对各种数据结构进行的运算。(插入、删除) 主要目的是为了提高数据处理的效率。所谓提高数据处理的效率,主要包括两个方面:一是提高数据处理的速度,(时间复杂度)二是尽量节省在数据处理过程中所占用的计算机存储空间。(空间复杂度) 1.2.1什么是数据结构 (P6—P11) 1. 数据的逻辑结构 所谓数据的逻辑结构,是指反映数据元素之间逻辑关系的数据结构。 2. 数据的存储结构 数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称为数据的物理结构) 一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等存储结构。而采用不同的存储结构,其数据处理的效率是不同的。 1.2.3线性结构与非线性结构 (P12) 一般将数据分为两大类型:线性结构与非线性结构。 线性结构又称线性表 如果一个数据结构不是线性结构,则称之为非线性结构。1.3线性表及其顺序存储结构 1.3.1线性表的基本概念 (P12—P13) 线性表是由n (n≥0)个数据元素a1,a2,…,an组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且只有一个前件,除了最后一个外,有且只有一个后件。即线性表或是一个空表,或可以表示为。 (a1,a2,…,ai,…,an) 非空线性表有如下一些结构特征: ① 有且只有一个根结点a1,它无前件; ② 有且只有一个终结点an,它无后件; ③ 除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。 1.3.2线性表的顺序存储结构 (P13—P14) 在计算机中存放线性表,一种最简单的方法是顺序存储,也称为顺序分配。 线性表的顺序存储结构具有以下两个基本特点: ① 线性表中所有元素据所占的存储空间是连续的; ② 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 假设线性表中的第一个数据元素的存储地址为ADR(a1),每一个数据元素占K个字节,则线性表中第i 个元素ai在计算机存储空间中的存储地址为 ADR(a1)=ADR(a1)+(i-1)K 1.3.3顺序表的插入运算 (P14—P15) 在平均情况下,要在线性表中插入一个新元素,需要移动表中一半的元素。因此,在线性表顺序存储的情况下,要插入一个新元素,其效率是很低的。 1.3.4顺序表的删除运算 (P15—P16) 在平均情况下,要在线性表中删除一个元素,需要移动表中表中一半的元素。因此,在线性表顺序存储的情况下,要删除一个元素,其效率也是很低的。 由线性表在存储结构下的插入与删除运算可以看出,线性表的顺序存储结构对于小线性表或者其中元素不常变动的线性表来说是合适的,因为顺序存储的结构比较简单。但这种顺序存储的方式对于元素经常需要变动的大线性表就不太合适了,因为插入删除的效率比较低。1.4栈和队列 1.4.1栈及其基本运算 (P16—P18) 1.什么是栈 栈是限定在一端进行插入与删除的另一端称为栈底。即栈是按照“先进后出”(FILO)或“后进先出”(LIFO)的原则组织数据的,因此,栈也被称为“先进后出”表或“后进先出”表。由此可以看出,栈具有记忆作用。 2.栈的顺序存储及其运算(采用顺序存储结构的栈称为顺序栈) 栈的基本运算有三种:入栈、退栈与读栈顶元素。 (1) 入栈运算(2)退栈运算(3)读栈顶元素 1.4.2队列及其基本运算 (P18—P20) 1.什么是队列 队列(queue)是指允许在一端进行插入、而在另一端进行删除的线性表。允许插入的一端称为队尾,通常用一个称为尾指针(rear)的指针指向队尾元素,一端称为排头(也称为队头)通常也用一个排头指针(front)指向排头元素的前一个位置。 队列双称为“先进先出”或“后进后出”的线性表。 3. 循环队列及其运算 在实际应用中,队列的顺序存储结构一般采用循环队列的形式。 所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。 1.5线性链表 1.5.1线性链表的基本概念 (P20—P23) 由于线性表的顺序存储结构存在以上这些缺点,对于大的线性表,特别是元素变动频繁的大线性表不宜采用顺序存储结构,而是采用下面要介绍的链式存储结构。 在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。 在链式存储结构中,存储数据结构的存储空间可以下连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。 链式存储方式既可用于表示线性结构,也可以用于表示非线性结构。 1. 线性链表 线性表的链式存储结构称为线性链表。 2. 带链的栈 栈也是线性表,也可以采用链式存储结构。 3. 带链的队列 与栈类似,队列也是线性表,也可以采用链式存储结构。 1.5.2线性链表的基本运算 (P23—P25) 线性链表在插入过程中不发生数据元素移动的现象,只需改变有关结点的指针即可,从而提高了插入的效率。 从线性链表的删除过程可以看出,在线性链表中删除一个元素后,不需要移动表的数据元素,只需改变被删除元素所在结点的前一个结点的指针域即可。 1.5.3循环链表及其基本运算 (P25—P26) 循环链表具有以下两个特点: (1) 在循环链表中增加了一个表头结点,指针域指向线性表的第一个元素的结点。循环链表的头指针指向表头结点。 (2) 循环链表中最后一个结点的指针域不是空,而是指向表头结点。即在循环链表中,所有结点的指针构成了一个环状链。 1. 6树与二叉树 1.6.1树的基本概念 (P26—P28) 在树结构中,每一个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点,简称为树的根。 在树结构中,每一个结点可以有多个后件,它们都称为该结点的子结点。没有后件的结点称为叶子结点。 在树结构中,一个结点所拥有的后件个数称为该结点的度 在树中,所有结点中的最大的度称为树的度。 根结点在第1层。 树的最大层次称为树的深度。 1.6.2二叉树及其基本性质 (P28—P31) 1. 什么是二叉树 二叉树具有以下两个特点: ① 非空二叉树只有一个根结点; ② 每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。 2. 二叉树的基本性质 性质1在二叉树的第K层上,最多有2K-1(K≥1)个结点。 性质2深度为m的二叉树最多有2m-1个结点。 性质3在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。 3. 满二叉树与完全二叉树 (1)满二叉树 所谓满二叉树是指这样的一种二叉树:除最后一层外,每一层上的所有结点都有两个子结点,这就是说,在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第K层上有2K-1个结点,且深度为m的满二叉树有2m-1个结点。 (2)完全二叉树 所谓完全二叉树是指这样的二叉树:除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边若干结点。 满二叉树也是完全二叉树,而完全二叉树一般不是满二叉树。 性质6设完全二叉树共有n个结点。从根结点开始,按层序用自然数1,2,…,n给结点进行编号,则对于编号为k(k=1,2,…,n)的结点有以下结论: ① 若k=1,则该结点为根结点,它没有父结点;若k>1,则该结点的父结点编号为INT(k/2)。 ② 若2k≤n,则编号为k的结点的左子结点编号为2k;否则该结点无左子结点。 ③ 若2k+1≤n,则编号为k的结点的右子结点编号为2k+1;否则该结点无右子结点。 1.6.3二叉树的存储结构 (P31—P32) 在计算机中,二叉树通常采用链式存储结构。 1.6.4二叉树的遍历 (P32—P33) 二叉树的遍历可以分为三种:前序遍历、中序遍历、后序遍历。 1. 前序遍历(DLR) 2. 中序遍历(LDR) 3. 后序遍历(LRD) 1.7查找技术 1.7.1顺序查找 (P33) 顺序查找又称顺序搜索。 对于大的线性表来说,顺序查找的效率是很低的。虽然顺序查找的效率不高,但在下列两种情况下也只能采用顺序查找: (1) 线性表无序表,则不管是顺序存储结构还是链式存储结构,都只能用顺序查找。 (2) 即使是有序线性表,如果采用链式存储结构,也只能用顺序查找。 1.7.2二分法查找 (P33—P34) 二分法查找只适用于顺序存储的有序表。 显然,当有序线性表为顺序存储时都能采用二分查找,并且,二分查找的效率要比顺序查找高得多。可以证明,对于长度为n的有序线性表,在最坏情况下,二分查找只需要比较log2n次,而顺序查找需要比较n次。1.8排充技术 1.8.1交换类排序法 (P34—P35) 1. 冒泡排序法 冒泡排序法是一种最简单的交换类排序方法。 假设线性表的长度为n,则在最坏情况下,冒泡排序需要的比较次数为n(n-1)/2。 2. 快速排序法 快速排序法也是一种互换类的排序方法,但由于它比冒泡排序法的速度快,因此称之为快速排序法。 1.8.2插入类排序法 (P35—P37) 1. 简单插入排序法 自以为插入排序,是指将无序序列中的各元素依次插入到已经有序的线性表中。 在简单插入排序法中,这种排序方法的效率与冒泡排序法相同。在最坏情况下,证券交易插入排序需要n(n-1)/2次比较。 2. 希尔排序法 希尔排序法属于插入类排序,但它对简单插入排序做了较大的改进。 1.8.3选择类排序法 (P37—P38) 1. 简单选择排序法 从中选出最小的元素,将它交换到表的最前面。 简单选择排序法在最坏情况下需要比较n(n-2)/2次。 2. 堆排序法 堆排序法属于选择类的排序方法。 堆排序的方法对于规模较小的线性表并不合适,但对于较大规模的来说是很有效的。第2章 程序设计基础 (P40—P45)2.1程序设计方法与风格 程序设计的风格总体而言应该强调简单和清晰,程序必须是可以理解的。可以认为,著名的“清晰第一,效率第二”的论点已成为当今主导的程序设计风格。 源程序文档化应考虑如下几点: (1) 符号名的命名:符号名的命名应具有一定的实际含义,以便于对程序功能的理解。 (2) 程序注释:正确的注释能够帮助读者理解程序。注释一般分为序言性注释和功能性注释。 (3) 视觉组织:为使程序的结构一目了然,可以在程序中利用空格、空行、缩进等技巧使程序层次清晰。 2.2结构化程序设计 2.2.1结构化程序设计的原则 (P41—P42) 结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。 2.2.2结构化程序的基本结构与特点 (P42—P43) 1. 顺序结构 2. 选择结构:选择结构又称为分支结构。 3. 重复结构:重复结构又称为循环结构。 2.3面向对象的程序设计 今天面向对象方法已经发展成为主流的软件开发方法。 一些著名的面向对象语言(如C++、Java) 2.3.2面向对象方法的基本概念 (P45—P48) 1. 对象 对象是面向对象方法中最基本的概念。对象可以用来表示客观世界中的任何实体。 面向对象的程序设计方法中涉及的对象由一组表示其静态特征的属性和它可执行的一组操作组成。 (4) 封装性。 2. 类(Class)和实例(Instance) 将属性、操作相似的对象归为类,也就是说,类是具有共同属性、共同方法方法的对象的集合。所以,类是对象的抽象,而一个对象则是其对应类的一个实例。 3. 消息 对象间的这种相互合作需要一个机制协助进行,这样的机制称为“消息”。消息是一个实例与另一个实例之间传递的信息。 4. 继承 继承是面向对象的方法的一个主要特征。 第3章 软件工程基础3.1软件工程基本概念 3.1.1软件定义与软件特点 (P50) 计算机软件是包括程序、数据及相关文档的完整集合。 可见软件由两部分组成:一是机器可执行和程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。 软件的特点: ① 软件是一种逻辑实体,而不是物理实体,具有抽象性。 ② 软件的生产与硬件不同,它没有明显的制作过程。 ③ 软件在运行、使用期间不存在磨损、老化问题。 ④ 软件的开发、运行对计算机系统具有依赖性,受计算机系统的限制,这导致了软件移植的问题。 ⑤ 软件复杂性高,成本昂贵。 ⑥ 软件开发涉及诸多的社会因素。 3.1.2软件危机与软件工程 (P51—P52) 软件工程概念的出现源自软件危机。 20世纪60年代末以后,“软件危机”。所谓软件危机是泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。 1968年在北大西洋公约组织会议(NATO会议)上,讨论摆脱软件危机的办法,软件工程作为一个概念首次被提出。 软件工程包括个要素,即方法、工具和过程。 3.1.3软件工程过程与软件生命周期 (P52—P53) 2.软件生命周期 通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。 3.1.4软件工程的目标与原则(P53—P54) 1. 软件工程的目标 软件工程内容主要包括:软件开发技术和软件工程管理。 3.1.5软件开发工具与软件开发环境 (P54) 1. 软件开发工具 (VB、VC++、VFP) 2. 软件开发环境 软件开发环境或称软件工程环境是全面支持软件开发全过程的软件工具集合。 计算机辅助软件工程(CASE) 3.2结构化分析方法 3.2.1需求分析与需求分析方法 (P53—P59) 1. 需求分析 (1) 需求分析阶段的工作 需求分析阶段的工作,可以概括为四个方面: ① 需求获取 ② 需求分析 ③ 编写需求规格说明书 ④ 需求评审 2. 需求分析方法 常见的需求分析方法有: ① 结构化分析方法。主要包括:面向数据流的结构化分析方法(SA)面向数据结构的Jackson方法(JSD)面向数据结构的结构化数据系统开发方法(DSSD) ② 面向对象的分析方法(OOA) 3.2.2结构化分析方法 (P55—P59) 2.结构化分析的常用工具 (1) 数据流图(DFD) (2) 数据字典(DD) 数据字典是结构化分析方法的核心。 (3) 判定树 (4) 判定表 3.2.3软件需求规格说明书 (P59—P60) 软件规格说明书(SRS)是需求分析阶段的最后成果,是软件开发中的重要文档。 软件需求规格说明书的作用是: ① 便于用户、开发人员进行理解和交流。 ② 反映出用户问题的结构,可以作为软件开发工作的基础和依据 ③ 作为确认测试和验收的依据。3.3结构化设计方法 3.3.1软件设计基本概念 (P60—P62) 1.软件设计的基础 软件设计分两步完成:概要设计和详细设计。 2.软件设计的基本原理 (1) 抽象 (2) 模块化 (3) 信息隐蔽 (4) 模块独立性 模块独立程度是评价设计好坏的重要度量标准。衡量软件的模块独立软件的模块独立性使用耦合性和内聚性两个定性的度量标准。 ① 内聚性:内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量。 ② 耦合性:耦合性是模块间互相连接的紧密程度的度量。 耦合性与内聚性是模块独立性的两个定性标准,耦合与内聚是相互关联的。在程序结构中,各模块的内聚性越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚,低耦合。 3.3.3详细设计 (P67—P71) 几种主要的工具: 1. 程序流程图(PFD) 2. N-S (盒图) 3. PAD图 PAD图是问题分析图(Problem Analysis Diagram)的英文缩写。 4. PDL 过程设计语言(PDL)也称为结构化的英语和伪码。3.4软件测试 软件测试的投入,通常其工作量、成本占软件开发总工作量、总成本的40%以上。 软件测试是保证软件质量的重要手段,其主要过程涵盖了整个软件生命期的过程。 3.4.1软件测试的目的 (P71) 关于软件测试的目的,软件测试是为了发现错误而执行程序的过程。 3.4.3软件测试技术与方法综述(P71—P77) 可以分为静态测试和动态测试方法。若按照功能划分可以分为白盒测试和黑盒测试方法。 1. 静态测试与动态测试 (1) 静态测试 静态测试可以由人工进行,充分发挥人的逻辑思维优势。 (2) 动态测试 静态测试不实际运行软件,主要通过人工进行。动态测试是基于计算机的测试,是为了发现错误而执行程序的过程。 2. 白盒测试 白盒测试方法也称结构测试或逻辑驱动测试。 3. 黑盒测试方法 黑盒测试方法也称功能测试或数据驱动测试。黑盒测试是对软件已经实现的功能是否满足需求进行测试和验证。黑盒测试完全不考虑程序内部和逻辑结构和内部特性。 3.4.4软件测试的实施(P77—P80) 软件测试是保证软件质量的重要手段。 软件测试过程一般按4个步骤进行, 1. 单元测试 单元测试是对软件设计的最小单位——模块(程序单元)进行正确性检验的测试。 2. 集成测试 集成测试是测试和组装软件的过程。 3. 确认测试 4. 系统测试 3.5程序的调试 3.5.1基本概念 (P80—P81) 程序调试的任务是诊断和改正程序中的错误。它与软件测试不同,软件测试是尽可能多地发现软件中的错误。 软件测试贯穿整个软件生命期,调试主要在开发阶段。 3.5.2软件调试方法 (P81—P82) 1. 强行排错法 2. 回溯法 3.原因排除法 第4章 数据库设计基础 (P84—P111) 4.1数据库系统的基本概念 4.1.1数据、数据库、数据库管理系统 (P84—P87) 1. 数据 数据(Data)实际上就是描述事物的符号记录。 2. 数据库 数据库(简称DB)是数据的集合。 3. 数据库管理系统 数据库管理系统(简称DBMS)它是一种软件。 数据库管理系统是数据库系统的核心。 目前流行的DBMS均为关系数据库系统,如微软的Visual FoxPro和Access等。 4. 数据库管理员(简称DBA) 5. 数据库系统 数据库系统(简称DBS)由如下几部分组成:数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、系统平台之一____硬件平台(硬件)、系统平台之二——软件平台(软件)这五个部分构成了一个以数据库为核心的完整的运行实体,称为数据库系统。 4.1.2数据库系统的发展 (P87—P88) 数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。 1. 关系数据库系统阶段 4.1.3数据库系统的基本特点 (P88—P890) 数据库系统具有以下特点: 1. 数据的集成性 2. 数据的高共享性与低冗余性 3. 数据独立性 数据独立性是数据与程序间的互不依赖性,数据独立性一般分为物理独立性与逻辑独立性两级。 (1) 物理独立性:物理独立性即是数据的物理结构的改变,从而不致引起应用程序的变化。 (2) 逻辑独立性:数据库总体逻辑结构的改变,不需要相应修改应用程序,这就是数据 的逻辑独立性。 4. 数据统一管理与控制 4.1.4数据库系统的内部结构体系 (P89—P91) 1. 数据库系统的三级模式 (1) 概念模式。概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户(应用)公共数据视图。 (2) 外模式。外模式也称子模式或用户模式。它是用户的数据视图。 (3) 内模式。内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法。 2. 数据库系统的两级映射 (1) 概念模式到内模式的映射。 (2) 外模式到概念模式的映射。 4.2数据模型 4.2.1数据模型的基本概念 (P91) 数据模型按不同的应用层次分成三种类型,它们是概念数据模型、逻辑模型、物理数据模型, 概念模型有E-R模型、逻辑数据模型又称数据模型, 层次模型、网状模型、关系模型, 物理数据模型又称物理模型。 1.2.2 E-R模型 (P91—P95) 概念模型是E-R模型(或实体联系模型) 1.E-R模型的基本概念 (1)实体 现实世界中的事物可以抽象成为实体 (2)属性 现实世界均有一些特性,这些特性可以用属性来表示。属性刻画了实体的特征。 (3)联系 一对一的联系,简记为1:1。 一对多或多对一联系,简记为1:M(1:m)或M:1(m:1)。 多对多联系,简高为M:N或m:n。 3.E-R模型的图示法 在E-R图中用椭圆形表示属性。 在E-R图中用菱形表示联系。 4.2.3层次模型的基本结构是树形结构 (P95) 4.2.4网状模型 (P95—P96) 网状模型是一个不加任何条件限制的无向图。 4.2.5关系模型 (P96—P98) 1.关系的数据结构 关系模型采用二维表来表示。4.3关系代数 (4)查询 ① 投影运算 ② 选择运算 ③ 笛卡尔积运算 则关系R与S经笛卡尔积记为R×S。 3.关系代数中的扩充运算 (1)交运算 (还有并和差) 关系R与S经交运算后所得到的关系是由那些既在R内又在S内的有序组成,记为R∩S。 (2)除运算 如果将笛卡尔积运算看作乘运算的话,那么除运算就是它的运算。 T÷R=S或R/R=S 4.4数据库设计与管理 数据库设计是数据库应用核心。 4.4.1数据库设计概述 (P104) 整个数据库应用系统的开发成目标独立的若干阶段。它们是:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段。 4.4.2数据库设计的需求分析 (P104—P105) 4.4.3数据库概念设计 (画E-R图) (P105—P108) 4.4.4数据库的逻辑设计 (P108—P109) 1. 从E-R图向关系模式转换。 4.4.5数据库的物理设计 (P110)
主要思想把阶数较高的某一个过程,转化为阶数较低相同类型的过程,称为递归算法。采用递归编写程序能使程序变得非常简单而清晰。递归的主要思想包括三个方面:a) 定义形式是递归定义的。b) 数据之间的关系(即数据结构)按递归定义。c) 问题本身没有明显的递归结构,但用递归求解比用迭代求解更简单。? 例题分析阶乘函数定义(n!)描述如下: fac(n)= 1 (当n=0时);n×fac(n-1)(当n>0时),请编程实现从键盘输入n值,通过调用函数求f(n)的值.[参考程序]program digui1;var n:integer;function fac(n:integer):real;beginif n=0then fac:=1else fac:=n*fac(n-1) ;end;beginwrite(‘n=’);readln(n);writeln(‘fac(‘,n,’)=’,fac(n):6:2);end.小结采用递归算法来编程,程序结构清晰简洁,它能使一个蕴涵递归关系且结构复杂的程序简洁精练,增加可读性。但递归过程的实现决定了递归算法的效率往往很低,费时和费内存空间。在实际编程中,如果能使用递推法解决的,应考虑用递推法,其效率更高些。用递推法求解阶乘函数的思路是:先求fac(1),再求fac(2),…,直到求出fac(n),参考程序如下:program digui2;var n:integer;function fac(n:integer):realll;var I:integer;m:real;beginm:=1;for I:=1 to n do m:=m*I;fac:=m;end;beginwrite(‘n=’);readln(n);writeln(‘fac(’,n,’)=’,fac(n):6:2);end.说实话 如果真的想理解好递归我建议把八皇后问题看透彻。 八皇后就是非常经典的递归加回朔 program eightqueens; var x:array[1..8] of integer; {当前8个皇后所摆的方案} a,b,c:array[-7..16] of boolean; {分别是列,对角线,反对角线} i:integer; procere print; {打印本次方案} var k:integer; begin for k:=1 to 8 do write(x[k]:4); writeln; end; procere try(i:integer); {使用回溯法递归求解,试遍所有的情况,是一种递归枚举} var j:integer; begin for j:=1 to 8 do if a[j] and b[i+j] and c[i-j] {若(i,j) 可放} then begin x[i]:=j; {则第i行就放在第j列} a[j]:=false; {做上相应位置不能放的标志} b[i+j]:=false; c[i-j]:=false; if i<8 then try(i+1){8个没放完,则继续放} else print; {放完去打印方案} a[j]:=true;{回溯回来后,撤去不能放的标志} b[i+j]:=true; c[i-j]:=true end end; begin for i:=-7 to 16 do{初始化为每个位置均可放} begin a[i]:=true; b[i]:=true; c[i]:=true end; try(1);{从第一行开始} end. 现在循环从 i=1 ,j:=1 to 8 do 开始 此时 计算机检测到 i=1 j=1 (简化为(1,1))为空,占用该位置并令该位置对应的斜线和水平方向的位置为 false ,然后程序就开始去执行try(2),注意此时计算机在i=1 这层仅仅走了一个循环(j=1)就跳到了i=2 ,第2层里此时计算机从j:=1 to 8 do 又开始循环,排除 j=1,j=2 得到 (2,3)注意计算机第2层里也只是走了3(j=3)个循环然后又跳到了i=3 这层依次类推得到(3,5),(4,2)(5,4)而在i=6 这层里计算机从j:= 1 to 8 do 都没有找到合适的位置,此时注意在i=6 这层里计算机计算机将返回到i=5 这层里,(因为用了递归)并且释放(5,4)该位置,为什么要释放呢?因为原因很简单如果不释放的话 该位置对应的斜线和水平方向会对以后的几层造成影响,让计算机误认为false。此时的在i=5这层里 j=4没有循环结束,然后计算机又会从j=5到 8 开始去找合适的位置 ,如果找不到又会返回到上一层依次类推直到计算机找到一组解 输出,假设在(8,3)这个位置是计算机找到的一组解,此时计算机又会从j=4到8 开始循环,如果找不到 计算机就会返回上一层的即i=7这层接着上一次的跳出位置走完以后的循环,依次类推不断的返回,跳出, 求解,(即令前几个位置不变,从第8个位置变换,没有空位置的。接会返回上一层)最后返回到i=1这层里,注意此时在这层里也只是走了j=1个循环然后计算机就又开始从j= 2 去试着找….大家有没有算过求出所有的解要走过多少个循环?我想估计也不下1000个吧。其实整个过程就是一个重复的过程(即递归)倒着想在i=7 这层里的j=1 位置即(7,1) 计算机会去试从(8,1)到(8,8)这8 个位置,而在(7,2)也同样会去试这8 个位置 等等在(6,1)会试(7,1)到(7,8) 等。 这是正着考虑(1,1)这里计算机会试着从(2,1)到(2,8)这8个位置而在这8 个位置里并没有试完就有空位置 (2,3)此时计算机会在这个位置对下一层里开始试(3,1)..(3,8)依次类推,试不通的返回,接着走完上一层直到试完所有的位置!
1.数据元素:是数据的基本单位,它在计算机处理和程序设计中通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成。2.栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。 栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。 栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。3.线性表是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列。4.队列的操作原则是先进先出5.并发进程间的关系:并发进程相互之间可能是 无关的 ,也可能是 交往的 .如果一个进程的执行不影响其他进程的执行,且与其他进程的进展情况无关,即它们是各自独立的,则这些并发进程相互之间是无关的。如果一个进程的执行依赖其他进程的执行,则这些并发进程之间是有交往的。6.算法设计的基本方法:列举法 枚举归纳法 递推法 递归法 减半递推技术 回溯法 数值法7.数据结构分为哪几大类:通常有下列四类基本的结构: ⑴集合结构。该结构的数据元素间的关系是“属于同一个集合”。 ⑵线性结构。该结构的数据元素之间存在着一对一的关系。 ⑶树型结构。该结构的数据元素之间存在着一对多的关系。 ⑷图形结构。该结构的数据元素之间存在着多对多的关系,也称网状结构。8.对于一个顺寻战来说,战空 战满的条件:栈空的条件是st->top=0,栈满的条件是st->top==maxlen9.N/210.进程死锁的4个表要条件(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。11.操作系统的典型类型 3个:批处理操作系统 分时操作系统实时操作系统12.进程的3中基本:就绪,阻塞,运行 13.算法的概念和特征:算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。 一个算法应该具有以下五个重要的特征: 1、有穷性2、确切性3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件; 4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 5、可行性14.数据结构的概念:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。15.什么是数据的存储结构:存储结构是指一个数据集合在计算机内存里是怎么样存储的.或者说在内存里怎么给一群数据分配内存. 16.查找的概念以及典型的算法:给定一个值K,在含有n个结点的表中找出关键字等于给定值K的结点。若找到,则查找成功,返回该结点的信息或该结点在表中的位置;否则查找失败,返回相关的指示信息。顺序查找 二分查找 分块查找 哈希表查找17.操作系统的功能:作业管理(Job Management)进程管理(Process Management)存储管理(Memory Management)设备管理(Device Management)文件管理(File Management)18.递归算法思路:一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。19.数据的逻辑结构:简单说,数据的逻辑结构就是数据之间关系,如顺序关系,隶属关系等.20.队列的概念:队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表21.进程的概念:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。22.二叉树的先序、中序和后续:NLR:前序遍历(PreorderTraversal亦称(先序遍历))访问结点的操作发生在遍历其左右子树之前。② LNR:中序遍历(InorderTraversal)访问结点的操作发生在遍历其左右子树之中(间)。③ LRN:后序遍历(PostorderTraversal)访问结点的操作发生在遍历其左右子树之后。23.快速排序:快速排序对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
要参加软件设计师的考试,务必购买两本书:《软件设计师教程》《教程》建议买教育部指定的教材,《软件设计师历年试题解析》。《解析》倒也无所谓,张友生老师的分析似乎更全面、更有针对性。另外还有《软件设计师大纲》,在复习过程中阶段性地查一查,梳理一下知识结构体系,可以查缺补漏。1、具体学习每门课程的方法(1)软件工程。软件工程是复习的重点,不但上午题当中占10左右,而且下午题里也有2道软件设计分析方面的题目,一定要熟练的掌握书本中说到的各种软件分析设计方法及有关的分析用图,对各种图的功能作用和制作方法(特别是各种图的组成元素)以及各种图之间的转换及联系(如果有的话),UML面向对象的软件设计方法及面象过程的软件设计方法完全理解,软件测试要达到理解的程度,其它的内容只有去强记了,因为基本是都是上午题,而且每年的题都不定,但与CMM有关的一定会有。(2)数据库。数据库部分也很重要,上午有5分左右,下午至少有一道数据库的题目,而且也一定是考关系型数据库,E-R模式也要搞懂,可由它导出关系,一定要弄懂关系数据库的几个范式及关系的建立方法。因此,就要对关系数据库的基础概念非常清楚,如键的定义,函数依赖,范式的定义、作用及转换是建立关系的基础。数据的并发控制,要熟练掌握SQL常用的几个语句,最好是用笔将每个语句写上几遍,对语句的各种形式加深记忆,数据库的学习还是不太难的。因为考试不会考数据的物理存储及数据安全,感觉这方面的知识更难,交叉学科更多。(3)学习数据结构和算法。数据结构和算法是考试的重点内容,它的复习以普通的教材为主,对数组、链表、队列、栈、树及堆等基本的数据组织方式要非常熟悉(要做到看见算法就知道要用什么数据组织方式更高效),排序、索引及图的各种算法要了然于心(算法的分析过程及代码要非常清楚),算法的分析方法达到理解应用的水平。对C语言要非常熟练(要会应用C语言语句的一些技巧,如可以利用函数的返回值做为判定条件,在循环中对数组的处理可使用a[i++]来提高编写代码的效率,这类的小技巧只有通过大量的阅读代码才能提高),如果是初学面向对象方面的高级语言,建议还是先学C++,感觉它更象一种语言规范,而Java是一种编程的工具并且由于它的跨平台特性所以它有很多自己独有的功能和特点,有时间一定要看一本C++语言的数据结构,它能使你更全面和深刻的理解类及对象的编程方法。算法的学习不是一朝一夕就能提高的,一定要静下心来学习一些经典算法,比如:穷举法、贪婪法、分治法、迭代法、递推法、递归法、回溯法;找一些有名的算法程序来分析,比如:背包问题、组合问题、斐波那契数列、马踏棋盘问题、货朗担问题、八皇后问题、迷宫问题、汉诺塔问题、约琴夫环问题等。有了这些算法思想在你的头脑中扎根后,当看到问题,就自然的想起用什么方法来求最优解了。(4)程序设计语言。程序设计语言包括C语言、编译原理和面向对象的程序设计语言(通常以C++为例)。编译原理一定会考词法分析,它是后面编译过程的基础。主要考的内容是NFA与DFA的转换、正规式与有穷自动机的转换等。文法分析有一年考过下午题,这科对初学者比较难,比较抽象,理论性也比较强,反正我是学了4个来月才学通一点,这课复习没什么技巧,听听希赛的“编译原理视频教程”,学起来更快一些。C语言要掌握好三种基本结构、数组、链表、结构体、共用体、参数传递、指针及指针数组、指针函数等等。面向对象的程序设计语言要对基本概念及初步应用要了解,考得不深。(5)面向对象方法学。面向对象方法学不但是上午的考试重点,也是下午的考试重点。上午平均有12分左右,而下午有30分,一道与UML图形有关的题目,一道面向对象程序设计的选做题。所以要好好掌握这一块。UML当中的类图、用例图、状态图、协作图要掌握好,考试中会常出现。(老师多次强调这个要学习的知识点,我通过做题,认为老师抓的很准。)(6)操作系统。操作系统没什么说得了,把它的几个功能模块搞清楚及相关的算法搞清楚就好了,如处理器的管理、存储管理、设备管理、文件管理及系统安全,其中我认为比较难理解的是PV操作(在并发进程中它的应用非常灵活)和中断(反正这个对我比较难),一定要把相关内容所讲到的算法及分析过程搞懂。当然还要注意进程死锁的问题,段页式存储的问题。其它课程的复习就按考试大纲进行,把里面的概念搞清楚,因为它大部分都是上午题。2、看书与练习相结合“看书时要有目的性,带着任务走,;看后做题进行巩固,所以看了书以后,要找一两个相关的题来做一做。
选择排序法:PROCEDURE selectsort; VAR i,j,k,temp:integer; BEGIN FOR i:=1 to n-1 DO BEGIN k:=i; FOR j:=i+1 to n DO IF a[k]>a[j] THEN k:=j; IF k<>i THEN BEGIN temp:=a[k]; a[k]:=a[i]; a[i]:=temp; END; END; END; 快速排列法: procere qsort(L,R:longint); var i,j,mid,temp:longint; begin i:=L; j:=R; mid:=a[L+random(R-L+1)]; {随机选择一个数组中的数作为对比数} repeat while a[i]< mid do inc(i); {在左半部分寻找比中间数大的数} while mid< a[j] do dec(j); {在右半部分寻找比中间数小的数} if i< =j then {若找到一组与排序目标不一致的数对则交换它们} begin temp:=a[i]; a[i]):=a[j]; a[j]:=temp; inc(i);dec(j); {继续找} end; until i >j; if L< j then qsort(L,j); {若未到两个数的边界,则递归搜索左右区间} if i< R then qsort(i,R); end; 注意:主程序中必须加randomize语句。 摘自pascal教程
本书可以作为大专院校数据结构课程的教材,也可以作为从事计算机应用开发的科技人员的参考书。本书以清华大学电子系数据结构讲义为蓝本,主要针对高等院校非计算机专业开设“数据结构”课程的需要而编写的。全书从应用的角度,重点介绍数据处理中常用的数据结构——线性表、树与二叉树、图,以及基本的数据处理技术——查找和排序方法,同时通过实例把回溯法、分治法、贪心法、动态规划法等常用的算法设计思想的应用融入其中,把数据结构的介绍和常用算法设计的讨论紧密结合,并且辅之以充足的练习题,从而使读者更具体、更深刻地理解各种常用的数据结构,及它们与算法之间的关系,以达到学以致用的目的。