【计算机类职业资格】软件设计师-常用算法设计及答案解析.doc
《【计算机类职业资格】软件设计师-常用算法设计及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】软件设计师-常用算法设计及答案解析.doc(31页珍藏版)》请在麦多课文档分享上搜索。
1、软件设计师-常用算法设计及答案解析(总分:255.00,做题时间:90 分钟)阅读下列函数说明和 C 代码,将应填入 (n) 处的字句写在对应栏内。说明函数 int Toplogical(LinkedWDigraph G)的功能是对图 G 中的顶点进行拓扑排序,并返回关键路径的长度。其中图 G 表示一个具有 n 个顶点的 AOE 网,图中顶点从 1n 依次编号,图 G 的存储结构采用邻接表表示,其数据类型定义如下:typedef struct Gnode /*邻接表的表结点类型*/int adjvex; /*邻接顶点编号*/int weight; /*弧上的权值*/struct Gnode*n
2、extarc;/*指示下一个弧的结点*/Gnode;typedef struct Adj list /*邻接表的头结点类型*/char vdata; /*顶点的数据信息*/struct Gnode *Firstadj;/*指向邻接表的第一个表结点*/Adjulist;typedef struct LinkedWDigraph/*图的类型*/int n,e; /*图中顶点个数和边数*/struct Adjlist *head; /*指向图中第一个顶点的邻接表的头结点*/LinkedWDigraph;例如,某 AOE 网如图 21-1 所示,其邻接表存储结构如图 21-2 所示。(分数:15.00
3、)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明和 C 程序,将应填入 (n) 处的字句写在对应栏内。说明假设需要将 N 个任务分配给 N 个工人同时去完成,每个人都能承担这 N 个任务,但费用不同。下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配 1 个不同的任务。程序中,N 个任务从 0 开始依次编号,N 个工人也从 0 开始依次编号,主要的变量说明如下:cii:将任务 i 分配给工人 j 的费用。taski:值为 0 表示任务 i 未分配;值为 j 表示任务 i 分配给工人 j。workerk:值为 0 表示工人 k 未分配
4、任务;值为 1 表示工人 k 已分配任务。mincost:最小总费用。程序#includestdio.h#define N 8 /*N 表示任务数和工人数*/int cNN;unsigned int mincost=65535; /*设置 min 的初始值,大于可能的总费用*/int taskN,tempN,workerN;void plan(int k,unsigned int cost)int i;if( (1) costmincost)mincost=cost;for(i=0;iN;i+)tempi=taski;eisefor(i=0;iN;i+) /*分配任务 k*/if(worker
5、i=0 (2) )workeri=1;taskk= (3) ;plan( (4) ,cost+cki);(5) ;taskk=0;/*if*/*plan*/void main()int i,j;for(i=0;iN;i+)/*设置每个任务由不同工人承担时的费用及全局数组的初值*/workeri=0;taski=0;tempi=0;for(j=0;jN;j+)scanf(“%d“,cij);plan(0,0); /*从任务 0 开始分配*/printf(“/n 最小费用=%d/n“,mincost);for(i=0;iN;i+)printf(“Task%d is assigned to Work
6、er%d/n“,i,tempi);/*main*/(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下函数说明、图和 C 代码,将应填入 (n) 处的字句写在对应栏内。说明散列文件的存储单位称为桶(Bucket)。假如一个桶能存放 m 个记录,当桶中已有 m 个同义词(散列函数值相同)的记录时,存放第 m+1 个同义词会发生“溢出”。此时需要将第 m+1 个同义词存放到另一个称为“溢出桶”的桶中。相对地,称存放前 m 个同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回;否则沿指针到溢出
7、桶中进行查找。例如: 设散列函数为 Hash(Key)=Key mod 7,记录的关键字序列为15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图 21-3 所示。(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读下列说明、图和 C 代码,将应填入 (n) 处的字句写在对应栏内。说明 1B 树是一种多叉平衡查找树。一棵 m 阶的 B 树,或为空树,或为满足下列特性的 m 叉树。树中每个结点至多有 m 棵子树;若根结点不是叶
8、子结点,则它至少有两棵子树:除根之外的所有非叶子结点至少有m/2棵子树:所有的非叶子结点中包含下列数据信息:(n,A 0,K 1,A 1,K 2,A 2,K 11,A 11)其中,K(i=1,2,n)为关键字,且 KK i+1(i=1,2,n-1);A i(i=0,1,n)为指向子树根结点的指针,且指针 Ai-1所指子树中所有结点的关键字均小于 Ki,A i+1所指子树中所有结点的关键字均大于Ki,n 为结点中关键字的数目。所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。例如,一棵 4 阶 B 树如图 21-4
9、 所示(结点中关键字的数目省略)。B 树的阶 m、Bool 类型、关键字类型及 B 树结点的定义如下。#define M 4 /*B 树的阶数*/typedef enumFALSE=0,TRUE=1bool;typedef int E1emKeyType;typedef struct BTreeNodeint numkeys; /*结点中关键字的数目*/struct BTreeNode *parent;/*指向父结点的指针,树根的父结点指针为空*/Struct BTreeNode *AM; /*指向子树结点的指针数组*/ElemKeyType KM; /*存储关键字的数组,K0闲置不用*/BT
10、reeNode;函数 SearchBtree(BTreeNode *root,ElemKeyType akey,BTreeNode *ptr)的功能是:在给定的一棵 m阶 B 树中查找关键字 akey 所在结点,若找到则返回 TRUE,否则返回 FALSE。其中,root 是指向该 m 阶 B树根结点的指针,参数 ptr 返回 akey 所在结点的指针,若 akey 不在该 B 树中,则 ptr 返回查找失败时空指针所在结点的指针。例如,在如图 21-4 所示的 4 阶 B 树中查找关键字 akey 时,ptr 返回指向结点 e 的指针。注:在结点中查找关键字 akey 时采用二分法。本题函数
11、bool SearchBtree(BTreeNode *root,ElemKeyType akey,BTreeNode *ptr)int lw,hik mid;BTreeNode *P=root;*ptr=NULL;while(p)lw=1;hi= (1) ;while(lw=hi)mid=(lw+hi)/2;if(p-Kmid=akey)*ptr=p;return TRUE;elseif( (2) )hi=mid-1;elselw=mid+1;*ptr=p;p= (3) ;return FALSE;说明 2在 m 阶 B 树中插入一个关键字时,首先在最接近外部结点的某个非叶子结点中增加一个关
12、键字,若该结点中关键字的个数不超过 m-1,则完成插入;否则,要进行结点的“分裂”处理。所谓“分裂”,就是把结点中处于中间位置上的关键字取出来并插入其父结点中,然后以该关键字为分界线,把原结点分成两个结点。“分裂”过程可能会一直持续到树根,若树根结点也需要分裂,则整棵树的高度增 1。例如,在如图 21-4 所示的 B 树中插入关键字 25 时,需将其插入结点 e 中,由于 e 中已经有 3 个关键字,因此将关键字 24 插入结点 e 的父结点 b 中,并以 24 为分界线将结点 e 分裂为 e1 和 e2 两个结点,结果如图 21-5 所示。(分数:15.00)填空项 1:_填空项 1:_填空
13、项 1:_填空项 1:_填空项 1:_阅读以下说明、图和 C 代码,将应填入 (n) 处的字句写在对应栏内。说明一般的树结构常采用孩子一兄弟表示法表示,即用二叉链表作为树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。例如,如图 21-6(a)所示的树的孩子一兄弟表示如图21-6(b)所示。(分数:14.98)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明和 C 语言函数,将应填入 (n) 处的字句写在对应栏内。说明在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,
14、资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树形结构,如图21-7 所示。信号源是树根,树中的每个结点(除了根)表示一个可以放置放大器的子结点,其中某些结点同时也是信号消耗点,信号从一个结点流向其子结点。每个结点有一个 d 值,表示从其父结点到该结点的信号衰减量。例如,在图 21-7 中,结点 w、p、q 的 d值分别为 2、1、3,树根结点表示信号源,其 d 值为 0。每个结点有一个 M 值,表示从该结点出发到其所有叶子结点的信号衰减量的最大值。显然,叶子结
15、点的 M值为 0。对于非叶子结点 j,Mj)=maxM(k)+d(k)k 是 j 的孩子结点)。在此公式中,要计算结点的 M 值,必须先算出其所有子结点的 M 值。在计算 M 值的过程中,对于某个结点 i,其有一个子结点 k 满足 d(k)+M(k)大于容忍值,则应在 k 处放置放大器;否则,从结点 i 到某叶子结点的信号衰减量会超过容忍值,使得到达该叶子结点时信号不可用,而在结点 i 处放置放大器并不能解决到达叶子结点的信号衰减问题。例如,在图 21-7 中,从结点 p 到其所有叶子结点的最大衰减值为 4。若容忍值为 3,则必须在 s 处放置信号放大器,这样可使得结点 p 的 M 值为 2。
16、同样,需要在结点 q、v 处放置信号放大器,如图 21-8 中阴影结点所示。若在某结点放置了信号放大器,则从该结点输出的信号与信号源输出的信号等价。(分数:15.00)填空项 1:_填空项 1:_填空项 1:_填空项 1:_填空项 1:_阅读以下说明和 C 代码,将应填入 (n) 处的字句写在对应栏内。说明在一个简化的绘图程序中,支持的图形种类有点(point)和圆(ckcle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型 shape_t、point_t 和 circle_t 分别表示基本图形、点和圆,并且点和圆具有基本图形的所有特征。C 代码typ
17、edef enumpoint,circle)shape_type; /*程序中的两种图形:点和圆*/typedef struct /*基本的图形类型*/shape_type type; /*图形种类标识:点或者圆*/void(*destroy)(); /*销毁图形操作的函数指针*/void(*draw)(); /*绘制图形操作的函数指针*/shape_t;typedef struct(shape_t common;int x;int y;)point_t;/*定义点类型,x、y 为点坐标*/void destroyPoint(point_t* this) free(this);printf(“
18、Point destoryed!/n“);/*销毁点对象*/void drawPoint(point_t* this) printf(“P(%d,%d)“,this-x,this-y); /*绘制点对象*/shape_t* createPoint(va_list* ap)/*创建点对象,并设置其属性*/point_t* p_point;if(p_point=(point_t*)malloc(sizeof(point_t)=NULL)return NULL;p_point-common.type=point;p_point-common.destroy=destroyPoint;p_point-
19、common.draw=drawPoint;p_point-x=va_arg(*ap,int); /*设置点的横坐标*/p_point-y=va_arg(*ap,int); /*设置点的纵坐标*/return(shape_t*)p_point; /*返回点对象指针*/typedef struct/*定义圆类型*/shape_t common;point_t*center; /*圆心点*/int radius; /*圆半径*/circle_t;void destroyCircle(Circle_t* this)free( (1) );free(this);printf(“Circle desto
20、ryed!/n“);void drawCircle(Circle_t* this)printf“C“;(2) .draw(this-center); /*绘制圆心*/printf(“.%d)“,this-radius);shape_t* createCircle(va_list* ap) /*创建一个圆,并设置其属性*/Circle_t* p_circle;if(p_circle=(circle_t*)malloc(Sizeof(circle_t)=NULL)return NULL;p_circle-common.type=circle;p_circle-common.destroy=dest
21、royCircle;p_circle-common.draw=drawCircle;(3) =createPoint(ap); /*设置圆心*/p_circle-radius=va_arg(*ap,int); /*设置圆半径*/return p_circle;shape_t* createShape(shape_type st,)/*创建某一种具体的图形*/va_list ap; /*可变参数列表*/shape_t* p_shape=NULL;(4) (ap,st);if(st=point)p_shape=createPoint(ap); /*创建点对象*/if(st=circle) p_sh
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 软件 设计师 常用 算法 设计 答案 解析 DOC
