1、软件技术基础复习终结版2007-2008(第一套)1、简述软件工程中几个阶段,分别描述各阶段的主要工作。2、程序设计中时空性经常出现矛盾,这种矛盾是如何体现的,你认为解决和优化时间与空间的方法是什么?3、设计程序,求二叉树的叶结点的个数。4、修改Dijkstra的求最短路径的算法,使其能求出图中任意两点之间的最短距离和最短距离所在的路径。5、设计一种数据结构用于存储一组人的姓名、年龄及月收入,要求在该结构上能方便的查找同龄人,计算同龄人的月平均收入,给出查找同龄人和计算月平均收入的两个算法。6、给出利用堆栈模拟队列的方法,即假设已知堆栈的运算,如压栈、出栈、栈空判断,模拟实现队列的入队,出队及
2、队空算法。2009-2010(第二套)1、在一个算法中,时间与空间往往构成一对矛盾体,论述并举例说明解决时间的有效方法。(15分)答:(1)论述解决时间的有效方法。(10分)增加存储空间是解决问题的一种方法;(3分)有效的算法是解决问题的有效方法。(7分)(2)举例:任何例子,能反映算法有效性都可以。(5分)2、论述并举例说明软件工程中的测试与调试之间的相同点和不同点。(10分)答:答题要点及分数软件调试是编码过程中校正代码的过程软件测试是软件工程中一个评价软件的过程相同点在于试图考证程序的正确与否(4分)从组织方式、实施方法、结果处理三个方面论述不同点(6分)1组织方式:调试工作由程序员完成
3、,测试需要独立的小组2实施方法:调试基于代码级,测试可以白盒子也可以是黑盒子3结果处理:调试中发现的错误要改正,测试中只记录测试结果3、阐述图与二叉树的相同点和不同点,在此基础上,阐述二叉树的前序遍历算法与图的深度优先遍历算法的相同点和不同点。(15分)答:答题要点及分数1.图与二叉树的比较相同点:图与二叉树都是非线性结构;(3分)不同点:二叉树中不同点的后继集合不相交,而图则不然;(4分)2.二叉树的前序遍历算法与图的深度优先遍历算法的比较相同点:访问当前结点,然后访问该结点的后继结点(邻结点);(4分)不同点:对于图的访问,访问结点时需要记录已访问标志,访问结点的邻结点时需要判断是否已访问
4、;对于二叉树而言,访问邻结点时,不需要记录与判断。(4分)4、假设在数组AN中存贮N个整数,设计算法change(int *A,int *B,int N),其中N为数组A中元素的个数,该算法将数组A中整数移动到数组B中,使得数组B中的元素呈现小、大、小、大间隔的形式,即B0B2,B2B4,.,而且相邻两元素值之间的差的绝对值随下标值的增加呈现不增加趋势,例如|B0-B1|B1-B2|B2-B3|。(20分)答:排序:用冒泡排序法对数组A排序,数组A的元素两两比较,大的放在后面(即若前面的大于后面的,交换两元素),循环执行直到不交换为止。移动:定义两个变量i,j。初始i=0;j=N-1;变量m=
5、0。循环执行以下操作:Bm=Ai;Bm+1=Aj;m+=2;i+;j-;直到i=j 最后 if(i=j)Bm=Ai;算法的核心是对数组A实现从小到大的排序,然后从A数组的左右两端分别去数据,顺序放入B数组。分数安排如下:1排序算法:任何排序算法都能得分。(10分)如果没有给出排序算法,只说明要排 序,得5分2移动数据到B:任意的移动,只要结果正确便得分。(10分)五、假设每个人的信息仅包括姓名、年龄和性别,在某信息管理系统中,经常需要查找同龄人的姓名,设计物理存贮结构,使得查找的过程方便快速,并给出相应的查找年龄的算法,分析该算法的性能。(20分)答:存储结构(5分)画图,类C描述,文字描述都
6、可以,以年龄age作为关键字,哈希散列函数为H=age-1,冲突解决方法为链表,如下图所示:查找算法(10分):函数原型描述(即假设的已知条件),算法描述(包括根据年龄访问数组,单向链表的访问)LPFIND(int age,CString name)H(age)=age-1;P=H(age);If(P=NULL) Return NULL;While(P!=NULL)If(P-name=name)Return P;P=P-next;算法分析(5分):给出平均比较次数的概念根据age查找同龄人的姓名(由哈希查找的特点),不需要比较直接由哈希散列函数求 出。1假设某年龄age的人数为n,即有n人同龄
7、2那么查找第i个人需要比较的次数为i次3又假设查找每个人的概率相同,均为1/n4那么平均比较次数为:=(1+n)/2,i=1,2,.,n;6、假定二叉树存贮对象是整数,修改二叉树非递归前序遍历算法,使其能求得二叉树中最大元素。(20分)答:写出算法:包括函数原型,算法内容(10分)将遍历算法中访问结点的语句改为求最大值的比较语句(10分)int max(Btree T) /btree 结构体名称int temp;Btree stackm,p;int top=-1;if(T!=NULL)temp=T-data;p=T;while(p!=NULL|top!=-1)while(p!=NULL)if(
8、p-datatemp)temp=p-temp;if(p-rchild!=NULL)stack+top=p-rchild;p=p-lchild;p=stacktop-;return temp;补充:二叉树四则运算(3*2+1*4-5)(中序遍历)2010-2011(第三套)一、调试与测试的相同点与不同点。(5分)调试测试前提条件完成代码调试完成工作内容查找错误,修正错误检测模块、系统的功能及性能工作目的排查错误对软件进行评价二、软件开发的前提是清晰的描述问题,论述描述问题的核心点。(5分)答:核心点:第一,输入、运算及输出(4分);第二,与此同时说明输入的前提条件、可能出现的附加效应,以及必要的
9、数据字典(1分)。三、比较二叉树的层次遍历算法与图的广度优先遍历算法,论述其中的相同点和不同点。(10分)答:相同点:访问当前结点,然后将相邻的结点入队。(4分)不同点:1访问二叉树相邻结点只涉及左右子树,不涉及双亲,所以只需要将左右子树入队,访问图的相邻结点时,由于存在不确定个数的邻结点,所以采用循环调用入队;(3分)2二叉树访问中将访问点移动已访问的点上,图的访问可能出现这种情况,所以设置标志位,标识已访问点,对已访问的点不入队。(3分)4、假设以链表方式存储二叉树,设计算法,判断二叉树root是否为二叉排序树。(20分)答:算法的核心:遍历二叉树(10分);正确判断(10分)。例如:先中
10、序遍历,形成一个数组,然后判断数据是否有序。5、假设由整数组成的线性表age(a1,a2,.,an)给出了一个种群中个体的年龄,即ai表示第i个个体的年龄,i=1,2,.n。设计算法,求该种群间出生的最小间隔时间长和最大间隔时间长(间隔时间长为两个相邻兄弟间的年龄差),并对该算法进行时间复杂性分析。(15分)答:算法核心:1先对线性表进行排序(任何排序算法都可以);(6分)2对排序后的相邻点分别计算差,结果是差中绝对值最大值和绝对值最小值;(4分)3时间复杂性:就是排序的时间复杂性。(5分)6、假设对整数位关键字的记录构造了Hash表A,Hash函数为H(int x),采用链地址法处理冲突。试
11、:(1)画示意图Hash存贮A的结构;(2)给出对应于(1)中存贮结构的类C数据结构描述;(3)给出在Hash表A中查找key元素的算法。(15分)答:1示意图(5分) 2结构概述是两个结构体描述(4分,两个结构分别为2分)Struct Struct linknodeInt index;Struct linknode * next;Struct graphInt data;Struct linknode * link;3核心:先用H()函数求值,如果有冲突,查找过程加一个遍历单向链表假设所有的数据存贮于数组G中。(1分)Int look(int key)Location=H(key);If(g
12、lacation.data=key)Return key; 直接查找到2分Struct linknode *p=glocation.link;While(p!=NULL) 遍历单向表2分If(p-data=key)Return key;P=p-next;Return NULL; 查找不成功1分2011-2012(第四套)1、评价程序的方法。2、软件设计中,需求分析阶段所用方法。3、设计算法实现哈希排序。4、设计算法输出图中结点的入度和出度。5、设计算法将十进制数以八进制数输出。6、求二叉树的叶结点数。2013-2014(第五套)1、论述题(共20分)1.按照软件工程的要求,举例并描述在需求分析
13、阶段中,对软件功能描述中所采用的方法。(10分)2.软件业中对程序优劣评价可以从多个方面进行,给出三个或三个以上方面的评价内容、评价方法。(10分)二、假设以链表方式存贮二叉树,试编写算法求给定二叉树的叶结点个数。(15分)3、改造Dijkstra求一点到其他点最短路径的算法,使其能同时给出一点到其他各点的路径(给出详细的数据存贮结构)。(20分)四、在本体论领域的程序设计中,需要存贮同义词。假设以图的方式表示同义词,试给出邻接表方式存储同义词的类C语言描述,并给出查找给定词word所有同义词的算法。(15分)2015(第六套)1、论述软件测试与调试的异同点。(10分)2、说明软件模块化的思想
14、和优劣点。(10分)答:1基本思想:在系统建立之前信息就能被充分理解。它要求严格划分开发阶段,用规范的方法与图表工具有步骤地来完成各阶段的工作,每个阶段都以规范的文档资料作为其成果,最终得到满足用户需要的系统。2优点逻辑设计与物理设计分开开发过程中形成一套规范化的文档,便于后期的修改和维护3缺点开发周期长系统难以适应环境的变化开发过程复杂繁琐三、设计算法,对链表方式存储的二叉树T,判断该树T是否为排序二叉树。(15分)4、设计算法,找到无向图中度最大的结点。(20分)5、在同义词词典程序的设计中,需要存贮同义词。根据功能设计存储机构,以类C语言描述存储结构并给出注释说明,并给出查找给定词wor
15、d所有同义词的算法。(15分)复习题()-名词解释一、数据结构:数据结构就是数据的组织形式,也可看成是包含数据结构的数据表,说明数据之间存在着一定的相互关系或约束。二、逻辑结构:我们把只表现元素之间的逻辑关系,而不涉及它们在计算机中的表示,只是理论的、反映在纸面上的东西,这种抽象的数据结构称为逻辑结构。三、物理结构:抽象的数据结构在计算机内的表示,也就是映射在存储空间上的、具体的数据机构在计算机内表示,也就是映射在存储空间上的、具体的数据结构。复习题()-简答题一、简述“软件工程”的工程化的思想。答:软件工程就是应用一些科学理论和工程上的技术来指导软件开发软件工程将研制软件的全过程分为六个阶段
16、: 问题说明、 需求分析、 系统设计、编写程序、测试工作、运行与维护。软件工程的基本原则是:划分软件生命期,运行计划评审,编制软件文档。2、说明对程序进行评价时,“时间”与“空间”之间的关系。答:时间性和空间性是程序的效率问题。时间效率决定于:源程序转换为目标程序的时间和目标程序执行的时间。时间效率与编译质量有关,与算法的简化程度有关,还与用户对语言的熟练程度有关,其中,算法的效率起主要作用。空间效率一般指程序花费的内存空间的问题。对于同等复杂程度的程序:一般时间效率越高的程序,占用的内存就越大,空间效率就越低;一般时间效率越低的程序,占用的内存就越小,空间效率就越高。两者具有一定的矛盾性。但
17、随着内存容量的不断增大,往往会牺牲空间性来提高时间性。3、依照“软件工程”的思想,叙述软件生命周期的不同阶段及各阶段的主要工作内容。答:在软件工程中,把从软件的计划开始,经历问题的说明(定义),需求分析,设计代码,测试与维护,直到软件报废为止的整个期间,称为软件的生命周期。在软件生命周期中,除了最后的运行与维护属于运行期,其他都是开发期。1问题说明:对研究的问题进行完整而且适当的说明;2需求分析:根据问题说明,确定软件必须具有的功能;不是具体解决问题,而是明确必须“做什么”;3系统设计:将反映用户要求的逻辑模型转换为一个具体的设计方案,使用伪码来描述算法;4编写程序:将伪码转换为高级语言的形式
18、;5测试工作:检查程序和系统的其他部分是否满足设计要求;6运行于维护:将验收后的软件交付用户使用,通过实际运行环境的检验,对不适应的部分进行修改和扩充。4、拓扑排序中使用了哪些数据结构?答:共使用了数组、链表、图和堆栈四种数据结构。5、算法、数据结构和程序有什么关系?6、什么是软件工程,它有什么特性?复习题()-算法设计(程序编写)1、四则运算(无括号)#include stdafx.h#include stack.h#include charstack.hint pre(char s) if(s=*|s=/) return 1; if(s=+|s=-) return 2; if(s=0) r
19、eturn 3;int _tmain(int argc, _TCHAR* argv) char m100; int i; stack num; charstack sign; int x,y; int t=0; char a,b; int z; printf(请输入一个四则运算表达式:n); scanf(%s,m); printf(%s,m); for(i=0;mi!=0;i+) if(mi47&mi47&mi58&mi!=0) t=(int)mi+-48+t*10; num.push(t); t=0; if(mi=0) break; b=sign.pop(); if(pre(mi)=pre(
20、b) sign.push(b); x=num.pop(); y=num.pop(); a=sign.pop(); switch(a) case +:z=y+x;break; case -:z=y-x;break; case *:z=y*x;break; case /:z=y/x;break; b=sign.pop(); num.push(z); if(b!=0) sign.push(b); sign.push(mi); while(!sign.empty() x=num.pop(); y=num.pop(); a=sign.pop(); switch(a) case +:z=y+x;break
21、; case -:z=y-x;break; case *:z=y*x;break; case /:z=y/x;break; num.push(z); printf(=%d,num.pop(); return 0;2、银行排队叫号机#include stdafx.h#include duilie.hint _tmain(int argc, _TCHAR* argv) int t,i=0; int a=0; duilie bank; while(1) printf(取号按1,叫号按2n); printf(请输入:); scanf(%d,&t); if(t=1) bank.ADDQ(+i); pri
22、ntf(您的号码为:%d,i); printf(n); else a=bank.DELQ(); printf(n下面请%d号到窗口办理业务n,a); return 0;3、二叉树前、中、后序及层次遍历#include stdafx.h#include stdlib.h#include queue.hstruct node int data; struct node *left,*right;struct node *createTree(int x)/中序生成树 int t; if(x=0) return 0; struct node *temp; temp=(struct node *)ma
23、lloc(sizeof(struct node); printf(请输入%d的左结点:,x); scanf(%d,&t); temp-left=createTree(t); temp-data=x; printf(请输入%d的右结点:,x); scanf(%d,&t); temp-right=createTree(t); return temp;void pre(struct node *t)/前序遍历 if(t=NULL) return; printf(%5d,t-data); pre(t-left); pre(t-right);void mid(struct node *t)/中序遍历 i
24、f(t=NULL) return; mid(t-left); printf(%5d,t-data); mid(t-right);void suc(struct node *t)/后序遍历 if(t=NULL) return; suc(t-left); suc(t-right); printf(%5d,t-data);int _tmain(int argc, _TCHAR* argv) struct node *root; root=createTree(1); printf(n); printf(前序遍历的结果为:); pre(root); printf(n); printf(中序遍历的结果为
25、:); mid(root); printf(n); printf(后序遍历的结果为:); suc(root); printf(n); printf(层次遍历的结果为:); struct node *temp; queue Tree; Tree.ADDQ(root); while(!Tree.empty() temp=Tree.DELQ(); printf(%5d,temp-data); if(temp-left!=NULL) Tree.ADDQ(temp-left); if(temp-right!=NULL) Tree.ADDQ(temp-right); return 0;4、任意树/左手链孩
26、子,右手链兄弟#include stdafx.h#include stdlib.hstruct node int data; struct node *left,*right;struct node *createTree(int x)/中序生成树 int t; if(x=0) return 0; struct node *temp; temp=(struct node *)malloc(sizeof(struct node); printf(请输入%d的左结点:,x); scanf(%d,&t); temp-left =createTree(t); temp-data=x; printf(请
27、输入%d的右结点:,x); scanf(%d,&t); temp-right =createTree(t); return temp;struct node *pre(struct node *root,int m)/前序遍历找与输入结点相同的节点 if(root=NULL) return NULL; struct node *temp; if(root-data=m) temp=root; else temp=pre(root-left,m); if(temp=NULL) temp=pre(root-right,m); return temp;void children(struct node *temp)/找孩子子程序 if(temp=NULL) printf(该结点不存在); else temp=temp-left; printf(该结点的孩子为:); if(temp=NULL) printf(无); while(temp!=NULL) printf(%d,temp-data); temp=temp-right; void brothers(struct node *temp)/找兄弟子程序 if(temp=NULL) printf(该结点不存在); else
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1