首页
试卷库
试题库
当前位置:
X题卡
>
所有题目
>
题目详情
Putnam提出的模型,是一种( )模型。它是假定在软件开发的整个生存期中工作量有特定的分布。
查看本题答案
包含此试题的试卷
中级软件设计师《单项选择》真题及答案
点击查看
你可能感兴趣的试题
软件项目开发成本的估算依据通常是开发成本估算模型常用的模型主要有①IBM模型②Putnam模型③基本
①②
②④⑤
①③
③④⑤
成本估算模型中Putnam估算模型是一种【2】模型
软件开发模型大体上可以分为三种类型第一种是以完全确定软件需求为前提的第二种是在软件开发初始阶段
协同模型
瀑布模型
交互式模型
迭代式模型
软件开发模型是对软件开发过程的一种规范描述用于表示软件开发过程的整体框架和软件开发活动各阶段间的关系
仅Ⅰ和Ⅱ
仅Ⅰ、Ⅲ和Ⅳ
仅Ⅱ和Ⅲ
Ⅰ、Ⅱ、Ⅲ和Ⅳ
软件过程是
特定的开发模型
一种软件求解的计算逻辑
活动的集合
软件生存周期模型
软件成本估算模型是一种静态单变量模型用于对整个软件系统进行估算
Putnam
基本COCOMO
中级COCOMO
详细COCOMO
软件项目开发成本的估算依据通常是开发成本估算模型常用的静态模型是36
中级COCOMO模型
高级COCOMO模型
Putnam模型
IBM模型
将关系模型与面向对象模型的优点相结合而构成的新的模型称为数据模型它是一种逻辑数据模型
计算机软件工程描述工具数据流图是SA方法中用于表示系统逻辑模型的一种工具它以图形的方式描绘数据在系统
瀑布模型
是一种软件开发方法学
给出了软件求解的计算逻辑
是一种特定的喷泉模型
给出了软件开发中包含的活动
软件开发模型是对软件开发过程的一种规范描述用于表示软件开发过程的整体框架和软件开发活动各阶段间的关系
仅Ⅰ和Ⅱ
仅Ⅰ、Ⅲ和Ⅳ
仅Ⅱ和Ⅲ
Ⅰ、Ⅱ、Ⅲ和Ⅳ
软件项目开发成本的估算依据通常是开发成本估算模型常用的模型主要有 ①IBM模型 ②PUtnam模型
①②
②④⑤
①③
③④⑤
成本估算模型中Putnam估算模型是一种________模型
软件项目开发成本的估算依据通常是开发成本估算模型常用的静态模型是
中级COCOMO模型
高级COCOMO模型
Putnam模型
IBM模型
软件项目开发成本的估算依据通常是开发成本估算模型常用的模型主要有 ①IBM模型 ②Putnam模型
①②
②④⑤
①③
③④⑤
软件开发模型是对软件开发过程的一种规范描述用于表示软件开发过程的整体框架和软件开发活动各阶段间的关系
仅Ⅰ和Ⅱ
仅Ⅰ、Ⅲ和Ⅳ
仅Ⅱ和Ⅲ
Ⅰ、Ⅱ、Ⅲ和Ⅳ
下面说法错误的是
信息系统中的软件开发强调文档化和规范化
对软件开发过程的规定和描述就是软件开发模型
瀑布模型是Bohem于1976年提出的,它是最早的软件开发模型
严格定义是一种确定软件系统需求的策略,在任何的设计、实现或使用系统之前,不需要预先指出所有的要求
软件开发螺旋模型是经常使用的一种模型它是的结合 强调软件开发过程中的风险分析特别适合于大型复杂的系统
敏捷模型和原型模型
瀑布模型和增量模型
瀑布模型和快速原型模型
迭代模型和快速原型模型
极限编程eXtremeProgramming是一种轻量级软件开发方法它是以为规则
文档驱动
数据驱动
代码驱动
模型驱动
极限编程extremeProgramming是一种轻量级软件开发方法它是以______的规则
文档驱动
数据驱动
模型驱动
代码驱动
热门试题
更多
阅读下列函数说明和C代码将应填入n处的字句写在对应栏内 [说明] 函数intToplogicalLinkedWDigraphG的功能是对图G中的顶点进行拓扑排序并返回关键路径的长度其中图G表示一个具有n个顶点的AOE网图中顶点从1~n依次编号图G的存储结构采用邻接表表示其数据类型定义如下 typedefstructGnode/*邻接表的表结点类型*/ intadjvex/*邻接顶点编号*/ intweight/*弧上的权值*/ structGnode*nextarc/*指示下一个弧的结点*/ Gnode typedefstructAdjlist/*邻接表的头结点类型*/ charvdata/*顶点的数据信息*/ structGnode*Firstadj/*指向邻接表的第一个表结点*/ Adjulist typedefstructLinkedWDigraph/*图的类型*/ intne/*图中顶点个数和边数*/ structAdjlist*head/*指向图中第一个顶点的邻接表的头结点*/ LinkedWDigraph 例如某AOE网如图21-1所示其邻接表存储结构如图21-2所示 [本题函数] intToplogicalLinkedWDigraphG Gnode*p intjWtop=0 int*Stack*ve*indegree ve=int*mallocG.n+1*sizeofint indegree=int*maZZocG.n+1*sizeofint/*存储网中各顶点的入度*/ Stack=int*mallocG.n+1*sizeofint/*存储入度为0的顶点的编号*/ if!ve||!indegree||!Stackexit0 forj=1j<=G.nj++ ve[j]=0indegree[j]=0 /*for*/ forj=1j<=G.nj++/*求网中各顶点的入度*/ p=G.head[j].Firstadj whilep 1p=p->nextarc /*while*/ /*for*/ forj=1j<=G.nj++/*求网中入度为0的顶点并保存其编号*/ if!indegree[j]stack[++top]=j whiletop>0 w=2 printf"%c"G.head[w].vdata p=G.head[w].Firstadj whilep 3 if!indegree[p->adjvex] Stack[++top]=p->adjvex if4 ve[p->adjvex]=ve[w]+p->weight p=p->nextarc /*while*/ /*while*/ return5 /*Toplogical*/ 5
在软件设计和编码过程中采取的做法将使软件更加容易理解和维护
阅读以下说明图和C代码将应填入n处的字句写在对应栏内 [说明] 一般的树结构常采用孩子一兄弟表示法表示即用二叉链表作为树的存储结构链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点例如如图21-6a所示的树的孩子一兄弟表示如图21-6b所示 函数LevelTraverse0的功能是对给定树进行层序遍历例如对如图21-6a所示的树进行层序遍历时结点的访问次序为DBAEFPC 对树进行层序遍历时使用了队列结构实现队列基本操作的函数原型如表21-1所示 表21-1实现队列基本操作的函数原型表 函数原型 说明 VoidInitQueueQueue*Q 初始化队列 BoolIsEmptyQueueQ 判断队列是否为空若是则返回TRUE否则返回FALSE VoidEnQueueQueue*QTreeNodep 元素入队列 VoidDeQueueQueue*QTreeNode*p 元素出队列 BoolStatus类型定义如下 typedefenumFALSE=0TRUE=1Bool typedefenumOVERFLOW=-2UNDERFLOW=-1ERROR=0OK=1Status树的二叉链表结点定义如下 typedefstructNode chardata structNode*fimstchild*nextbrother Node*TreeNode [本题函数] StatusLeveiTraverseTreeNoderoot /*层序遍历树树采用孩子一兄弟表示法root是树根结点的指针*/ QueuetemQ TreeNodeptrbrotherptr if!root returnERROR InitQueue&tempQ 1 brotherptr=root->nextbrother whilebrotherptr EnQueue&tempQbrotherptr 2 /-end-while*/ while3 4 printf"%c/t"ptr->data if5continue 6 brotherptr=ptr->firstchild->nextbrother whilebrotherptr EnQueue&tempQbrotherptr 7 /*end-while*/ /*end-while*/ returnOK /*LevelTraverse*/ 6
阅读下列说明图和C代码将应填入n处的字句写在对应栏内 [说明1] B树是一种多叉平衡查找树一棵m阶的B树或为空树或为满足下列特性的m叉树 ①树中每个结点至多有m棵子树 ②若根结点不是叶子结点则它至少有两棵子树 ③除根之外的所有非叶子结点至少有[m/2]棵子树 ④所有的非叶子结点中包含下列数据信息 nA0K1A1K2A2…K11A11 其中Ki=12…n为关键字且K<Ki+1i=12…n-1Aii=01…n为指向子树根结点的指针且指针Ai-1所指子树中所有结点的关键字均小于KiAi+1所指子树中所有结点的关键字均大于Kin为结点中关键字的数目 ⑤所有的叶子结点都出现在同一层次上并且不带信息可以看作是外部结点或查找失败的结点实际上这些结点不存在指向这些结点的指针为空 例如一棵4阶B树如图21-4所示结点中关键字的数目省略 B树的阶mBool类型关键字类型及B树结点的定义如下 #defineM4/*B树的阶数*/ typedefenumFALSE=0TRUE=1bool typedefintE1emKeyType typedefstructBTreeNode intnumkeys/*结点中关键字的数目*/ structBTreeNode*parent/*指向父结点的指针树根的父结点指针为空*/ StructBTreeNode*A[M]/*指向子树结点的指针数组*/ ElemKeyTypeK[M]/*存储关键字的数组K[0]闲置不用*/ BTreeNode 函数SearchBtreeBTreeNode*rootElemKeyTypeakeyBTreeNode**ptr的功能是在给定的一棵m阶B树中查找关键字akey所在结点若找到则返回TRUE否则返回FALSE其中root是指向该m阶B树根结点的指针参数ptr返回akey所在结点的指针若akey不在该B树中则ptr返回查找失败时空指针所在结点的指针例如在如图21-4所示的4阶B树中查找关键字akey时ptr返回指向结点e的指针 注在结点中查找关键字akey时采用二分法 [本题函数] boolSearchBtreeBTreeNode*rootElemKeyTypeakeyBTreeNode**ptr intlwhikmid BTreeNode*P=root *ptr=NULL whilep lw=1hi=1 whilelw<=hi mid=lw+hi/2 ifp->K[mid]==akey *ptr=p returnTRUE else if2 hi=mid-1 else lw=mid+1 *ptr=p p=3 returnFALSE [说明2] 在m阶B树中插入一个关键字时首先在最接近外部结点的某个非叶子结点中增加一个关键字若该结点中关键字的个数不超过m-1则完成插入否则要进行结点的“分裂”处理所谓“分裂”就是把结点中处于中间位置上的关键字取出来并插入其父结点中然后以该关键字为分界线把原结点分成两个结点“分裂”过程可能会一直持续到树根若树根结点也需要分裂则整棵树的高度增1 例如在如图21-4所示的B树中插入关键字25时需将其插入结点e中由于e中已经有3个关键字因此将关键字24插入结点e的父结点b中并以24为分界线将结点e分裂为e1和e2两个结点结果如图21-5所示 函数IsgrowingBTreeNode*rootElemKeyTypeakey的功能是判断在给定的m阶B树中插入关键字akey后该B树的高度是否增加若增加则返回TRUE否则返回FALSE其中root是指向该m阶B树根结点的指针 在函数Isgrowing中首先调用函数SearchBtree查找关键字akey是否在给定的m阶B树中若在则返回FALSE表明无须插入关键字akey树的高度不会增加否则通过判断结点中关键字的数目考察插入关键字akey后该B树的高度是否增加 [本题函数] boolIsgrowingBTreeNode*rootElenlKeyTypeakey BTreeNode*t*f if!SearchBtree4 t=f while5 t=t->parent if!t returnTRUE:// returnFALSE:// 3
阅读下列说明和C代码将应填入n处的字句写在对应栏内 [说明] 栈Stack结构是计算机语言实现中的一种重要数据结构对于任意栈进行插入和删除操作的一端称为栈顶StackTop而另一端称为栈底StackBottom栈的基本操作包括创建栈NewStack判断栈是否为空IsEmpty判断栈是否已满IsFull获取栈顶数据Top压栈/入栈Push弹栈/出栈Pop 当设计栈的存储结构时可以采取多种方式其中采用链式存储结构实现的栈中各数据项不必连续存储如图21-9所示 以下C代码采用链式存储结构实现一个整数栈操作 [C代码] typedefstructList intdata//栈数据 structList*next//上次入栈的数据地址 List typedefstructStack List*pTop//当前栈顶指针 Stack Stack*NewStackreturnStack*calloc1sizeofStack intIsEmptyStack*S//判断栈S是否为空栈 if1return1 return0 intTopStack*S//获取栈顶数据若栈为空则返回机器可表示的最小整数 ifIsEmptySreturnINT_MIN return2 voidPushStack*SinttheData//将数据theData压栈 List*newNode newNode=List*calloc1sizeofList newNode->data=theData newNode->next=S->pTop S->pTop=3 voidPopStack*S//弹栈 List*lastTop ifIsEmptySreturn lastTop=S->pTop S->pTop=4 freelastTop #defineMDaa<<2 intmain inti Stack*myStack myStack=NewStack PushmyStackMD1 PushmyStackMD2 PopmyStack PushmyStackMD3+1 while!IsEmptymyStack printf"%d"TopmyStack PopmyStack return0 以上程序运行时的输出结果为5 1
阅读下列说明和C代码将应填入n处的字句写在对应栏内 [说明] 栈Stack结构是计算机语言实现中的一种重要数据结构对于任意栈进行插入和删除操作的一端称为栈顶StackTop而另一端称为栈底StackBottom栈的基本操作包括创建栈NewStack判断栈是否为空IsEmpty判断栈是否已满IsFull获取栈顶数据Top压栈/入栈Push弹栈/出栈Pop 当设计栈的存储结构时可以采取多种方式其中采用链式存储结构实现的栈中各数据项不必连续存储如图21-9所示 以下C代码采用链式存储结构实现一个整数栈操作 [C代码] typedefstructList intdata//栈数据 structList*next//上次入栈的数据地址 List typedefstructStack List*pTop//当前栈顶指针 Stack Stack*NewStackreturnStack*calloc1sizeofStack intIsEmptyStack*S//判断栈S是否为空栈 if1return1 return0 intTopStack*S//获取栈顶数据若栈为空则返回机器可表示的最小整数 ifIsEmptySreturnINT_MIN return2 voidPushStack*SinttheData//将数据theData压栈 List*newNode newNode=List*calloc1sizeofList newNode->data=theData newNode->next=S->pTop S->pTop=3 voidPopStack*S//弹栈 List*lastTop ifIsEmptySreturn lastTop=S->pTop S->pTop=4 freelastTop #defineMDaa<<2 intmain inti Stack*myStack myStack=NewStack PushmyStackMD1 PushmyStackMD2 PopmyStack PushmyStackMD3+1 while!IsEmptymyStack printf"%d"TopmyStack PopmyStack return0 以上程序运行时的输出结果为5 3
阅读下列说明和C代码将应填入n处的字句写在对应栏内 [说明] 栈Stack结构是计算机语言实现中的一种重要数据结构对于任意栈进行插入和删除操作的一端称为栈顶StackTop而另一端称为栈底StackBottom栈的基本操作包括创建栈NewStack判断栈是否为空IsEmpty判断栈是否已满IsFull获取栈顶数据Top压栈/入栈Push弹栈/出栈Pop 当设计栈的存储结构时可以采取多种方式其中采用链式存储结构实现的栈中各数据项不必连续存储如图21-9所示 以下C代码采用链式存储结构实现一个整数栈操作 [C代码] typedefstructList intdata//栈数据 structList*next//上次入栈的数据地址 List typedefstructStack List*pTop//当前栈顶指针 Stack Stack*NewStackreturnStack*calloc1sizeofStack intIsEmptyStack*S//判断栈S是否为空栈 if1return1 return0 intTopStack*S//获取栈顶数据若栈为空则返回机器可表示的最小整数 ifIsEmptySreturnINT_MIN return2 voidPushStack*SinttheData//将数据theData压栈 List*newNode newNode=List*calloc1sizeofList newNode->data=theData newNode->next=S->pTop S->pTop=3 voidPopStack*S//弹栈 List*lastTop ifIsEmptySreturn lastTop=S->pTop S->pTop=4 freelastTop #defineMDaa<<2 intmain inti Stack*myStack myStack=NewStack PushmyStackMD1 PushmyStackMD2 PopmyStack PushmyStackMD3+1 while!IsEmptymyStack printf"%d"TopmyStack PopmyStack return0 以上程序运行时的输出结果为5 5
阅读下列函数说明和C代码将应填入n处的字句写在对应栏内 [说明] 函数intToplogicalLinkedWDigraphG的功能是对图G中的顶点进行拓扑排序并返回关键路径的长度其中图G表示一个具有n个顶点的AOE网图中顶点从1~n依次编号图G的存储结构采用邻接表表示其数据类型定义如下 typedefstructGnode/*邻接表的表结点类型*/ intadjvex/*邻接顶点编号*/ intweight/*弧上的权值*/ structGnode*nextarc/*指示下一个弧的结点*/ Gnode typedefstructAdjlist/*邻接表的头结点类型*/ charvdata/*顶点的数据信息*/ structGnode*Firstadj/*指向邻接表的第一个表结点*/ Adjulist typedefstructLinkedWDigraph/*图的类型*/ intne/*图中顶点个数和边数*/ structAdjlist*head/*指向图中第一个顶点的邻接表的头结点*/ LinkedWDigraph 例如某AOE网如图21-1所示其邻接表存储结构如图21-2所示 [本题函数] intToplogicalLinkedWDigraphG Gnode*p intjWtop=0 int*Stack*ve*indegree ve=int*mallocG.n+1*sizeofint indegree=int*maZZocG.n+1*sizeofint/*存储网中各顶点的入度*/ Stack=int*mallocG.n+1*sizeofint/*存储入度为0的顶点的编号*/ if!ve||!indegree||!Stackexit0 forj=1j<=G.nj++ ve[j]=0indegree[j]=0 /*for*/ forj=1j<=G.nj++/*求网中各顶点的入度*/ p=G.head[j].Firstadj whilep 1p=p->nextarc /*while*/ /*for*/ forj=1j<=G.nj++/*求网中入度为0的顶点并保存其编号*/ if!indegree[j]stack[++top]=j whiletop>0 w=2 printf"%c"G.head[w].vdata p=G.head[w].Firstadj whilep 3 if!indegree[p->adjvex] Stack[++top]=p->adjvex if4 ve[p->adjvex]=ve[w]+p->weight p=p->nextarc /*while*/ /*while*/ return5 /*Toplogical*/ 3
阅读以下说明和C程序将应填入n处的字句写在对应栏内[说明]假设需要将N个任务分配给N个工人同时去完成每个人都能承担这N个任务但费用不同下面的程序用回溯法计算总费用最小的一种工作分配方案在该方案中为每个人分配1个不同的任务程序中N个任务从0开始依次编号N个工人也从0开始依次编号主要的变量说明如下c[i][i]将任务i分配给工人j的费用task[i]值为0表示任务i未分配值为j表示任务i分配给工人jworker[k]值为0表示工人k未分配任务值为1表示工人k已分配任务mincost最小总费用[程序]#include<stdio.h>#defineN8/*N表示任务数和工人数*/intc[N][N]unsignedintmincost=65535/*设置min的初始值大于可能的总费用*/inttask[N]temp[N]worker[N]voidplanintkunsignedintcostintiif1&&cost<mincostmincost=costfori=0i<Ni++temp[i]=task[i]eisefori=0i<Ni++/*分配任务k*/ifworker[i]==0&&2worker[i]=1task[k]=3plan4cost+c[k][i]5task[k]=0/*if*//*plan*/voidmainintijfori=0i<Ni++/*设置每个任务由不同工人承担时的费用及全局数组的初值*/worker[i]=0task[i]=0temp[i]=0forj=0j<Nj++scanf%d&c[i][j]plan00/*从任务0开始分配*/printf/n最小费用=%d/nmincostfori=0i<Ni++printfTask%disassignedtoWorker%d/nitemp[i]/*main*/
阅读以下说明和C语言函数将应填入n处的字句写在对应栏内 [说明] 在一个分布网络中资源石油天然气电力等可从生产地送往其他地方在传输过程中资源会有损耗例如天然气的气压会减少电压会降低我们将需要输送的资源信息称为信号在信号从信源地送往消耗地的过程中仅能容忍一定范围的信号衰减称为容忍值分布网络可表示为一个树形结构如图21-7所示信号源是树根树中的每个结点除了根表示一个可以放置放大器的子结点其中某些结点同时也是信号消耗点信号从一个结点流向其子结点 每个结点有一个d值表示从其父结点到该结点的信号衰减量例如在图21-7中结点wpq的d值分别为213树根结点表示信号源其d值为0 每个结点有一个M值表示从该结点出发到其所有叶子结点的信号衰减量的最大值显然叶子结点的M值为0对于非叶子结点jM[j=maxMk+dkk是j的孩子结点在此公式中要计算结点的M值必须先算出其所有子结点的M值 在计算M值的过程中对于某个结点i其有一个子结点k满足dk+Mk大于容忍值则应在k处放置放大器否则从结点i到某叶子结点的信号衰减量会超过容忍值使得到达该叶子结点时信号不可用而在结点i处放置放大器并不能解决到达叶子结点的信号衰减问题 例如在图21-7中从结点p到其所有叶子结点的最大衰减值为4若容忍值为3则必须在s处放置信号放大器这样可使得结点p的M值为2同样需要在结点qv处放置信号放大器如图21-8中阴影结点所示若在某结点放置了信号放大器则从该结点输出的信号与信号源输出的信号等价 函数placeBoostersTreeNode*root的功能是对于给定树形分布网络中各个结点计算其信号衰减量的最大值并确定应在树中的哪些结点放置信号放大器 全局变量Tolerance保存信号衰减容忍值 树的结点类型定义如下 typedefstructTreeNDde intid/*当前结点的识别号*/ intchildNum/*当前结点的子结点数目*/ intd/*父结点到当前结点的信号衰减值*/ structTreeNde**childptr/*向量存放当前结点到其所有子结点的指针*/ intM/*当前结点到其所有子结点的信号衰减值中的最大值*/ boolboost/*是否在当前结点放置信号放大器的标志*/ TreeNode [C语言函数] voidplaceB00stersTreeNode*root /*计算root所指结点处的衰减量如果衰减量超出了容忍值则放置放大器*/ TreeNode*p intidegradation if1 degradation=0root->M=0 i=0 ifi>=root->ChildNum return p=2 fori<root->ChildNum&&pi++p=3 p->M=0 4 ifp->d+p->M>Tolerance/*在p所指结点中放置信号放大器*/ p->Doost=true p->M=0 ifp->d+p->M>degradation degradation=p->d+p->M root->M=5 1
软件风险一般包含两个特性
某项目制定的开发计划中定义了3个任务其中任务A首先开始且需要3周完成任务B必须在任务A启动1周后开始且需要2周完成任务C必须在任务A完成后才能开始且需要2周完成该项目的进度安排可用下面的甘特图来描述
阅读下列说明图和C代码将应填入n处的字句写在对应栏内 [说明1] B树是一种多叉平衡查找树一棵m阶的B树或为空树或为满足下列特性的m叉树 ①树中每个结点至多有m棵子树 ②若根结点不是叶子结点则它至少有两棵子树 ③除根之外的所有非叶子结点至少有[m/2]棵子树 ④所有的非叶子结点中包含下列数据信息 nA0K1A1K2A2…K11A11 其中Ki=12…n为关键字且K<Ki+1i=12…n-1Aii=01…n为指向子树根结点的指针且指针Ai-1所指子树中所有结点的关键字均小于KiAi+1所指子树中所有结点的关键字均大于Kin为结点中关键字的数目 ⑤所有的叶子结点都出现在同一层次上并且不带信息可以看作是外部结点或查找失败的结点实际上这些结点不存在指向这些结点的指针为空 例如一棵4阶B树如图21-4所示结点中关键字的数目省略 B树的阶mBool类型关键字类型及B树结点的定义如下 #defineM4/*B树的阶数*/ typedefenumFALSE=0TRUE=1bool typedefintE1emKeyType typedefstructBTreeNode intnumkeys/*结点中关键字的数目*/ structBTreeNode*parent/*指向父结点的指针树根的父结点指针为空*/ StructBTreeNode*A[M]/*指向子树结点的指针数组*/ ElemKeyTypeK[M]/*存储关键字的数组K[0]闲置不用*/ BTreeNode 函数SearchBtreeBTreeNode*rootElemKeyTypeakeyBTreeNode**ptr的功能是在给定的一棵m阶B树中查找关键字akey所在结点若找到则返回TRUE否则返回FALSE其中root是指向该m阶B树根结点的指针参数ptr返回akey所在结点的指针若akey不在该B树中则ptr返回查找失败时空指针所在结点的指针例如在如图21-4所示的4阶B树中查找关键字akey时ptr返回指向结点e的指针 注在结点中查找关键字akey时采用二分法 [本题函数] boolSearchBtreeBTreeNode*rootElemKeyTypeakeyBTreeNode**ptr intlwhikmid BTreeNode*P=root *ptr=NULL whilep lw=1hi=1 whilelw<=hi mid=lw+hi/2 ifp->K[mid]==akey *ptr=p returnTRUE else if2 hi=mid-1 else lw=mid+1 *ptr=p p=3 returnFALSE [说明2] 在m阶B树中插入一个关键字时首先在最接近外部结点的某个非叶子结点中增加一个关键字若该结点中关键字的个数不超过m-1则完成插入否则要进行结点的“分裂”处理所谓“分裂”就是把结点中处于中间位置上的关键字取出来并插入其父结点中然后以该关键字为分界线把原结点分成两个结点“分裂”过程可能会一直持续到树根若树根结点也需要分裂则整棵树的高度增1 例如在如图21-4所示的B树中插入关键字25时需将其插入结点e中由于e中已经有3个关键字因此将关键字24插入结点e的父结点b中并以24为分界线将结点e分裂为e1和e2两个结点结果如图21-5所示 函数IsgrowingBTreeNode*rootElemKeyTypeakey的功能是判断在给定的m阶B树中插入关键字akey后该B树的高度是否增加若增加则返回TRUE否则返回FALSE其中root是指向该m阶B树根结点的指针 在函数Isgrowing中首先调用函数SearchBtree查找关键字akey是否在给定的m阶B树中若在则返回FALSE表明无须插入关键字akey树的高度不会增加否则通过判断结点中关键字的数目考察插入关键字akey后该B树的高度是否增加 [本题函数] boolIsgrowingBTreeNode*rootElenlKeyTypeakey BTreeNode*t*f if!SearchBtree4 t=f while5 t=t->parent if!t returnTRUE:// returnFALSE:// 5
阅读以下说明和C代码将应填入n处的字句写在对应栏内[说明]在一个简化的绘图程序中支持的图形种类有点point和圆ckcle在设计过程中采用面向对象思想认为所有的点和圆都是一种图形shape并定义了类型shape_tpoint_t和circle_t分别表示基本图形点和圆并且点和圆具有基本图形的所有特征[C代码]typedefenumpointcircleshape_type/*程序中的两种图形点和圆*/typedefstruct/*基本的图形类型*/shape_typetype/*图形种类标识点或者圆*/void*destroy/*销毁图形操作的函数指针*/void*draw/*绘制图形操作的函数指针*/shape_ttypedefstructshape_tcommonintxintypoint_t/*定义点类型xy为点坐标*/voiddestroyPointpoint_t*thisfreethisprintfPointdestoryed!/n/*销毁点对象*/voiddrawPointpoint_t*thisprintfP%d%dthis->xthis->y/*绘制点对象*/shape_t*createPointva_list*ap/*创建点对象并设置其属性*/point_t*p_pointifp_point=point_t*mallocsizeofpoint_t==NULLreturnNULLp_point->common.type=pointp_point->common.destroy=destroyPointp_point->common.draw=drawPointp_point->x=va_arg*apint/*设置点的横坐标*/p_point->y=va_arg*apint/*设置点的纵坐标*/returnshape_t*p_point/*返回点对象指针*/typedefstruct/*定义圆类型*/shape_tcommonpoint_t*center/*圆心点*/intradius/*圆半径*/circle_tvoiddestroyCircleCircle_t*thisfree1freethisprintfCircledestoryed!/nvoiddrawCircleCircle_t*thisprintf<C<>2.drawthis->center/*绘制圆心*/printf.%dthis->radiusshape_t*createCircleva_list*ap/*创建一个圆并设置其属性*/Circle_t*p_circleifp_circle=circle_t*mallocSizeofcircle_t==NULLreturnNULLp_circle->common.type=circlep_circle->common.destroy=destroyCirclep_circle->common.draw=drawCircle3=createPointap/*设置圆心*/p_circle->radius=va_arg*apint/*设置圆半径*/returnp_circleshape_t*createShapeshape_typest/*创建某一种具体的图形*/va_listap/*可变参数列表*/shape_t*p_shape=NULL4apstifst==pointp_shape=createPoint&ap/*创建点对象*/ifst==circlep_shape=createCircle&ap/*创建圆对象*/va_endapreturnp_shapeintmaininti/*循环控制变量用于循环计数*/shape_t*shapes[2]/*图形指针数组存储图形的地址*/shapes[0]=createShapepoint23/*横坐标为2纵坐标为3*/shapes[1]=createShapeCircle204010/*圆心坐标为2040半径为10*/fori=0i<2i++shapes[i]->drawshapes[i]printf/n/*绘制数组中图形*/fori=1i>=0i--shapes[i]->destroyshapes[i]/*销毁数组中图形*/return0[运行结果]P235Circledestoryed!Pointdestoryed!
阅读下列说明图和C代码将应填入n处的字句写在对应栏内 [说明1] B树是一种多叉平衡查找树一棵m阶的B树或为空树或为满足下列特性的m叉树 ①树中每个结点至多有m棵子树 ②若根结点不是叶子结点则它至少有两棵子树 ③除根之外的所有非叶子结点至少有[m/2]棵子树 ④所有的非叶子结点中包含下列数据信息 nA0K1A1K2A2…K11A11 其中Ki=12…n为关键字且K<Ki+1i=12…n-1Aii=01…n为指向子树根结点的指针且指针Ai-1所指子树中所有结点的关键字均小于KiAi+1所指子树中所有结点的关键字均大于Kin为结点中关键字的数目 ⑤所有的叶子结点都出现在同一层次上并且不带信息可以看作是外部结点或查找失败的结点实际上这些结点不存在指向这些结点的指针为空 例如一棵4阶B树如图21-4所示结点中关键字的数目省略 B树的阶mBool类型关键字类型及B树结点的定义如下 #defineM4/*B树的阶数*/ typedefenumFALSE=0TRUE=1bool typedefintE1emKeyType typedefstructBTreeNode intnumkeys/*结点中关键字的数目*/ structBTreeNode*parent/*指向父结点的指针树根的父结点指针为空*/ StructBTreeNode*A[M]/*指向子树结点的指针数组*/ ElemKeyTypeK[M]/*存储关键字的数组K[0]闲置不用*/ BTreeNode 函数SearchBtreeBTreeNode*rootElemKeyTypeakeyBTreeNode**ptr的功能是在给定的一棵m阶B树中查找关键字akey所在结点若找到则返回TRUE否则返回FALSE其中root是指向该m阶B树根结点的指针参数ptr返回akey所在结点的指针若akey不在该B树中则ptr返回查找失败时空指针所在结点的指针例如在如图21-4所示的4阶B树中查找关键字akey时ptr返回指向结点e的指针 注在结点中查找关键字akey时采用二分法 [本题函数] boolSearchBtreeBTreeNode*rootElemKeyTypeakeyBTreeNode**ptr intlwhikmid BTreeNode*P=root *ptr=NULL whilep lw=1hi=1 whilelw<=hi mid=lw+hi/2 ifp->K[mid]==akey *ptr=p returnTRUE else if2 hi=mid-1 else lw=mid+1 *ptr=p p=3 returnFALSE [说明2] 在m阶B树中插入一个关键字时首先在最接近外部结点的某个非叶子结点中增加一个关键字若该结点中关键字的个数不超过m-1则完成插入否则要进行结点的“分裂”处理所谓“分裂”就是把结点中处于中间位置上的关键字取出来并插入其父结点中然后以该关键字为分界线把原结点分成两个结点“分裂”过程可能会一直持续到树根若树根结点也需要分裂则整棵树的高度增1 例如在如图21-4所示的B树中插入关键字25时需将其插入结点e中由于e中已经有3个关键字因此将关键字24插入结点e的父结点b中并以24为分界线将结点e分裂为e1和e2两个结点结果如图21-5所示 函数IsgrowingBTreeNode*rootElemKeyTypeakey的功能是判断在给定的m阶B树中插入关键字akey后该B树的高度是否增加若增加则返回TRUE否则返回FALSE其中root是指向该m阶B树根结点的指针 在函数Isgrowing中首先调用函数SearchBtree查找关键字akey是否在给定的m阶B树中若在则返回FALSE表明无须插入关键字akey树的高度不会增加否则通过判断结点中关键字的数目考察插入关键字akey后该B树的高度是否增加 [本题函数] boolIsgrowingBTreeNode*rootElenlKeyTypeakey BTreeNode*t*f if!SearchBtree4 t=f while5 t=t->parent if!t returnTRUE:// returnFALSE:// 1
阅读以下说明图和C代码将应填入n处的字句写在对应栏内 [说明] 一般的树结构常采用孩子一兄弟表示法表示即用二叉链表作为树的存储结构链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点例如如图21-6a所示的树的孩子一兄弟表示如图21-6b所示 函数LevelTraverse0的功能是对给定树进行层序遍历例如对如图21-6a所示的树进行层序遍历时结点的访问次序为DBAEFPC 对树进行层序遍历时使用了队列结构实现队列基本操作的函数原型如表21-1所示 表21-1实现队列基本操作的函数原型表 函数原型 说明 VoidInitQueueQueue*Q 初始化队列 BoolIsEmptyQueueQ 判断队列是否为空若是则返回TRUE否则返回FALSE VoidEnQueueQueue*QTreeNodep 元素入队列 VoidDeQueueQueue*QTreeNode*p 元素出队列 BoolStatus类型定义如下 typedefenumFALSE=0TRUE=1Bool typedefenumOVERFLOW=-2UNDERFLOW=-1ERROR=0OK=1Status树的二叉链表结点定义如下 typedefstructNode chardata structNode*fimstchild*nextbrother Node*TreeNode [本题函数] StatusLeveiTraverseTreeNoderoot /*层序遍历树树采用孩子一兄弟表示法root是树根结点的指针*/ QueuetemQ TreeNodeptrbrotherptr if!root returnERROR InitQueue&tempQ 1 brotherptr=root->nextbrother whilebrotherptr EnQueue&tempQbrotherptr 2 /-end-while*/ while3 4 printf"%c/t"ptr->data if5continue 6 brotherptr=ptr->firstchild->nextbrother whilebrotherptr EnQueue&tempQbrotherptr 7 /*end-while*/ /*end-while*/ returnOK /*LevelTraverse*/ 2
阅读以下说明和C代码将应填入n处的字句写在对应栏内[说明]在一个简化的绘图程序中支持的图形种类有点point和圆ckcle在设计过程中采用面向对象思想认为所有的点和圆都是一种图形shape并定义了类型shape_tpoint_t和circle_t分别表示基本图形点和圆并且点和圆具有基本图形的所有特征[C代码]typedefenumpointcircleshape_type/*程序中的两种图形点和圆*/typedefstruct/*基本的图形类型*/shape_typetype/*图形种类标识点或者圆*/void*destroy/*销毁图形操作的函数指针*/void*draw/*绘制图形操作的函数指针*/shape_ttypedefstructshape_tcommonintxintypoint_t/*定义点类型xy为点坐标*/voiddestroyPointpoint_t*thisfreethisprintfPointdestoryed!/n/*销毁点对象*/voiddrawPointpoint_t*thisprintfP%d%dthis->xthis->y/*绘制点对象*/shape_t*createPointva_list*ap/*创建点对象并设置其属性*/point_t*p_pointifp_point=point_t*mallocsizeofpoint_t==NULLreturnNULLp_point->common.type=pointp_point->common.destroy=destroyPointp_point->common.draw=drawPointp_point->x=va_arg*apint/*设置点的横坐标*/p_point->y=va_arg*apint/*设置点的纵坐标*/returnshape_t*p_point/*返回点对象指针*/typedefstruct/*定义圆类型*/shape_tcommonpoint_t*center/*圆心点*/intradius/*圆半径*/circle_tvoiddestroyCircleCircle_t*thisfree1freethisprintfCircledestoryed!/nvoiddrawCircleCircle_t*thisprintf<C<>2.drawthis->center/*绘制圆心*/printf.%dthis->radiusshape_t*createCircleva_list*ap/*创建一个圆并设置其属性*/Circle_t*p_circleifp_circle=circle_t*mallocSizeofcircle_t==NULLreturnNULLp_circle->common.type=circlep_circle->common.destroy=destroyCirclep_circle->common.draw=drawCircle3=createPointap/*设置圆心*/p_circle->radius=va_arg*apint/*设置圆半径*/returnp_circleshape_t*createShapeshape_typest/*创建某一种具体的图形*/va_listap/*可变参数列表*/shape_t*p_shape=NULL4apstifst==pointp_shape=createPoint&ap/*创建点对象*/ifst==circlep_shape=createCircle&ap/*创建圆对象*/va_endapreturnp_shapeintmaininti/*循环控制变量用于循环计数*/shape_t*shapes[2]/*图形指针数组存储图形的地址*/shapes[0]=createShapepoint23/*横坐标为2纵坐标为3*/shapes[1]=createShapeCircle204010/*圆心坐标为2040半径为10*/fori=0i<2i++shapes[i]->drawshapes[i]printf/n/*绘制数组中图形*/fori=1i>=0i--shapes[i]->destroyshapes[i]/*销毁数组中图形*/return0[运行结果]P235Circledestoryed!Pointdestoryed!
阅读以下函数说明图和C代码将应填入n处的字句写在对应栏内 [说明] 散列文件的存储单位称为桶Bucket假如一个桶能存放m个记录当桶中已有m个同义词散列函数值相同的记录时存放第m+1个同义词会发生“溢出”此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中相对地称存放前m个同义词的桶为“基桶”溢出桶和基桶大小相同用指针链接查找指定元素记录时首先在基桶中查找若找到则成功返回否则沿指针到溢出桶中进行查找 例如设散列函数为HashKey=Keymod7记录的关键字序列为151421879629335241491963161037751531453565168705453建立的散列文件内容如图21-3所示 为简化起见散列文件的存储单位以内存单元表示 函数InsertToHashTableintNewElemKey的功能是若新元素NewElemKey正确插入散列文件中则返回值1否则返回值0 采用的散列函数为HashNewElemKey=NewElemKey%P其中P为设定的基桶数目 函数中使用的预定义符号如下 #defineNULLKey-1/*散列桶的空闲单元标识*/ #defineP7/*散列文件中基桶的数目*/ #defineITEMS3/*基桶和溢出桶的容量*/ typedefstructBucketNode/*基桶和溢出桶的类型定义*/ intKeyData[ITEMS] structBucketNode*Link BUCKET BUCKETBucket[P]/*基桶空间定义*/ [本题函数] intInsertToHashTableintNewElemKey /*将元素NewElemKey插入散列桶中若插入成功则返回0否则返回-1*/ /*设插入第一个元素前基桶的所有KeyData[]Link域已分别初始化为NULLKEYNULL*/ intIndex/*基桶编号*/ intik BUCKET*s*front*t 1 fori=0i<ITEMSi++/*在基桶查找空闲单元若找到则将元素存入*/ ifBucket[Index].KeyData[i]==NULLKEY Bucket[Index].KeyData[i]=NewElemKeybreak if2return0 /*若基桶己满则在溢出桶中查找空闲单元若找不到则申请新的溢出桶*/ 3t=Bucket[Index].Link ift!=NULL/*有溢出桶*/ whilet!=NULL fork=0k<ITEMSk++ ift->KeyData[k]==NULLKEY/*在溢出桶链表中找到空闲单元*/ t->KeyData[k]=NewElemKeybreak /*if*/ if4t=t->Link elsebreak /*while*/ /*if*/ if5/*申请新溢出桶并将元素存入*/ s=BUCKET*mallOCsizeofBUCKET if!sreturn-1 s->Link=NULL fork=0k<ITEMSk++ s->KeyData[k]=NULLKEY s->KeyData[0]=NewElemKey 6 /*if*/ return0 /*InsertToHashTable*/ 3
阅读以下说明和C语言函数将应填入n处的字句写在对应栏内 [说明] 在一个分布网络中资源石油天然气电力等可从生产地送往其他地方在传输过程中资源会有损耗例如天然气的气压会减少电压会降低我们将需要输送的资源信息称为信号在信号从信源地送往消耗地的过程中仅能容忍一定范围的信号衰减称为容忍值分布网络可表示为一个树形结构如图21-7所示信号源是树根树中的每个结点除了根表示一个可以放置放大器的子结点其中某些结点同时也是信号消耗点信号从一个结点流向其子结点 每个结点有一个d值表示从其父结点到该结点的信号衰减量例如在图21-7中结点wpq的d值分别为213树根结点表示信号源其d值为0 每个结点有一个M值表示从该结点出发到其所有叶子结点的信号衰减量的最大值显然叶子结点的M值为0对于非叶子结点jM[j=maxMk+dkk是j的孩子结点在此公式中要计算结点的M值必须先算出其所有子结点的M值 在计算M值的过程中对于某个结点i其有一个子结点k满足dk+Mk大于容忍值则应在k处放置放大器否则从结点i到某叶子结点的信号衰减量会超过容忍值使得到达该叶子结点时信号不可用而在结点i处放置放大器并不能解决到达叶子结点的信号衰减问题 例如在图21-7中从结点p到其所有叶子结点的最大衰减值为4若容忍值为3则必须在s处放置信号放大器这样可使得结点p的M值为2同样需要在结点qv处放置信号放大器如图21-8中阴影结点所示若在某结点放置了信号放大器则从该结点输出的信号与信号源输出的信号等价 函数placeBoostersTreeNode*root的功能是对于给定树形分布网络中各个结点计算其信号衰减量的最大值并确定应在树中的哪些结点放置信号放大器 全局变量Tolerance保存信号衰减容忍值 树的结点类型定义如下 typedefstructTreeNDde intid/*当前结点的识别号*/ intchildNum/*当前结点的子结点数目*/ intd/*父结点到当前结点的信号衰减值*/ structTreeNde**childptr/*向量存放当前结点到其所有子结点的指针*/ intM/*当前结点到其所有子结点的信号衰减值中的最大值*/ boolboost/*是否在当前结点放置信号放大器的标志*/ TreeNode [C语言函数] voidplaceB00stersTreeNode*root /*计算root所指结点处的衰减量如果衰减量超出了容忍值则放置放大器*/ TreeNode*p intidegradation if1 degradation=0root->M=0 i=0 ifi>=root->ChildNum return p=2 fori<root->ChildNum&&pi++p=3 p->M=0 4 ifp->d+p->M>Tolerance/*在p所指结点中放置信号放大器*/ p->Doost=true p->M=0 ifp->d+p->M>degradation degradation=p->d+p->M root->M=5 3
RUP在每个阶段都有主要目标并在结束时产生一些制品在结束时产生在适当的平台上集成的软件产品
软件复杂性度量的参数不包括
在模拟环境下常采用黑盒测试检验所开发的软件是否与需求规格说明书一致其中有效性模测试属于中的一个步骤
阅读以下说明和C语言函数将应填入n处的字句写在对应栏内 [说明] 在一个分布网络中资源石油天然气电力等可从生产地送往其他地方在传输过程中资源会有损耗例如天然气的气压会减少电压会降低我们将需要输送的资源信息称为信号在信号从信源地送往消耗地的过程中仅能容忍一定范围的信号衰减称为容忍值分布网络可表示为一个树形结构如图21-7所示信号源是树根树中的每个结点除了根表示一个可以放置放大器的子结点其中某些结点同时也是信号消耗点信号从一个结点流向其子结点 每个结点有一个d值表示从其父结点到该结点的信号衰减量例如在图21-7中结点wpq的d值分别为213树根结点表示信号源其d值为0 每个结点有一个M值表示从该结点出发到其所有叶子结点的信号衰减量的最大值显然叶子结点的M值为0对于非叶子结点jM[j=maxMk+dkk是j的孩子结点在此公式中要计算结点的M值必须先算出其所有子结点的M值 在计算M值的过程中对于某个结点i其有一个子结点k满足dk+Mk大于容忍值则应在k处放置放大器否则从结点i到某叶子结点的信号衰减量会超过容忍值使得到达该叶子结点时信号不可用而在结点i处放置放大器并不能解决到达叶子结点的信号衰减问题 例如在图21-7中从结点p到其所有叶子结点的最大衰减值为4若容忍值为3则必须在s处放置信号放大器这样可使得结点p的M值为2同样需要在结点qv处放置信号放大器如图21-8中阴影结点所示若在某结点放置了信号放大器则从该结点输出的信号与信号源输出的信号等价 函数placeBoostersTreeNode*root的功能是对于给定树形分布网络中各个结点计算其信号衰减量的最大值并确定应在树中的哪些结点放置信号放大器 全局变量Tolerance保存信号衰减容忍值 树的结点类型定义如下 typedefstructTreeNDde intid/*当前结点的识别号*/ intchildNum/*当前结点的子结点数目*/ intd/*父结点到当前结点的信号衰减值*/ structTreeNde**childptr/*向量存放当前结点到其所有子结点的指针*/ intM/*当前结点到其所有子结点的信号衰减值中的最大值*/ boolboost/*是否在当前结点放置信号放大器的标志*/ TreeNode [C语言函数] voidplaceB00stersTreeNode*root /*计算root所指结点处的衰减量如果衰减量超出了容忍值则放置放大器*/ TreeNode*p intidegradation if1 degradation=0root->M=0 i=0 ifi>=root->ChildNum return p=2 fori<root->ChildNum&&pi++p=3 p->M=0 4 ifp->d+p->M>Tolerance/*在p所指结点中放置信号放大器*/ p->Doost=true p->M=0 ifp->d+p->M>degradation degradation=p->d+p->M root->M=5 5
软件文档按照其产生和使用的范围可分为开发文档管理文档和用户文档其中开发文档不包括
在软件开发过程中进行风险分析时活动目的是辅助项目组建立处理风险的策略有效的策略应考虑风险避免风险监控风险管理及意外事件计划
阅读以下说明图和C代码将应填入n处的字句写在对应栏内 [说明] 一般的树结构常采用孩子一兄弟表示法表示即用二叉链表作为树的存储结构链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点例如如图21-6a所示的树的孩子一兄弟表示如图21-6b所示 函数LevelTraverse0的功能是对给定树进行层序遍历例如对如图21-6a所示的树进行层序遍历时结点的访问次序为DBAEFPC 对树进行层序遍历时使用了队列结构实现队列基本操作的函数原型如表21-1所示 表21-1实现队列基本操作的函数原型表 函数原型 说明 VoidInitQueueQueue*Q 初始化队列 BoolIsEmptyQueueQ 判断队列是否为空若是则返回TRUE否则返回FALSE VoidEnQueueQueue*QTreeNodep 元素入队列 VoidDeQueueQueue*QTreeNode*p 元素出队列 BoolStatus类型定义如下 typedefenumFALSE=0TRUE=1Bool typedefenumOVERFLOW=-2UNDERFLOW=-1ERROR=0OK=1Status树的二叉链表结点定义如下 typedefstructNode chardata structNode*fimstchild*nextbrother Node*TreeNode [本题函数] StatusLeveiTraverseTreeNoderoot /*层序遍历树树采用孩子一兄弟表示法root是树根结点的指针*/ QueuetemQ TreeNodeptrbrotherptr if!root returnERROR InitQueue&tempQ 1 brotherptr=root->nextbrother whilebrotherptr EnQueue&tempQbrotherptr 2 /-end-while*/ while3 4 printf"%c/t"ptr->data if5continue 6 brotherptr=ptr->firstchild->nextbrother whilebrotherptr EnQueue&tempQbrotherptr 7 /*end-while*/ /*end-while*/ returnOK /*LevelTraverse*/ 4
某项目组拟开发一个大规模系统且具备了相关领域及类似规模系统的开发经验下列过程模型中最适合开发此项目
阅读以下函数说明图和C代码将应填入n处的字句写在对应栏内 [说明] 散列文件的存储单位称为桶Bucket假如一个桶能存放m个记录当桶中已有m个同义词散列函数值相同的记录时存放第m+1个同义词会发生“溢出”此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中相对地称存放前m个同义词的桶为“基桶”溢出桶和基桶大小相同用指针链接查找指定元素记录时首先在基桶中查找若找到则成功返回否则沿指针到溢出桶中进行查找 例如设散列函数为HashKey=Keymod7记录的关键字序列为151421879629335241491963161037751531453565168705453建立的散列文件内容如图21-3所示 为简化起见散列文件的存储单位以内存单元表示 函数InsertToHashTableintNewElemKey的功能是若新元素NewElemKey正确插入散列文件中则返回值1否则返回值0 采用的散列函数为HashNewElemKey=NewElemKey%P其中P为设定的基桶数目 函数中使用的预定义符号如下 #defineNULLKey-1/*散列桶的空闲单元标识*/ #defineP7/*散列文件中基桶的数目*/ #defineITEMS3/*基桶和溢出桶的容量*/ typedefstructBucketNode/*基桶和溢出桶的类型定义*/ intKeyData[ITEMS] structBucketNode*Link BUCKET BUCKETBucket[P]/*基桶空间定义*/ [本题函数] intInsertToHashTableintNewElemKey /*将元素NewElemKey插入散列桶中若插入成功则返回0否则返回-1*/ /*设插入第一个元素前基桶的所有KeyData[]Link域已分别初始化为NULLKEYNULL*/ intIndex/*基桶编号*/ intik BUCKET*s*front*t 1 fori=0i<ITEMSi++/*在基桶查找空闲单元若找到则将元素存入*/ ifBucket[Index].KeyData[i]==NULLKEY Bucket[Index].KeyData[i]=NewElemKeybreak if2return0 /*若基桶己满则在溢出桶中查找空闲单元若找不到则申请新的溢出桶*/ 3t=Bucket[Index].Link ift!=NULL/*有溢出桶*/ whilet!=NULL fork=0k<ITEMSk++ ift->KeyData[k]==NULLKEY/*在溢出桶链表中找到空闲单元*/ t->KeyData[k]=NewElemKeybreak /*if*/ if4t=t->Link elsebreak /*while*/ /*if*/ if5/*申请新溢出桶并将元素存入*/ s=BUCKET*mallOCsizeofBUCKET if!sreturn-1 s->Link=NULL fork=0k<ITEMSk++ s->KeyData[k]=NULLKEY s->KeyData[0]=NewElemKey 6 /*if*/ return0 /*InsertToHashTable*/ 5
阅读以下说明和C程序将应填入n处的字句写在对应栏内[说明]假设需要将N个任务分配给N个工人同时去完成每个人都能承担这N个任务但费用不同下面的程序用回溯法计算总费用最小的一种工作分配方案在该方案中为每个人分配1个不同的任务程序中N个任务从0开始依次编号N个工人也从0开始依次编号主要的变量说明如下c[i][i]将任务i分配给工人j的费用task[i]值为0表示任务i未分配值为j表示任务i分配给工人jworker[k]值为0表示工人k未分配任务值为1表示工人k已分配任务mincost最小总费用[程序]#include<stdio.h>#defineN8/*N表示任务数和工人数*/intc[N][N]unsignedintmincost=65535/*设置min的初始值大于可能的总费用*/inttask[N]temp[N]worker[N]voidplanintkunsignedintcostintiif1&&cost<mincostmincost=costfori=0i<Ni++temp[i]=task[i]eisefori=0i<Ni++/*分配任务k*/ifworker[i]==0&&2worker[i]=1task[k]=3plan4cost+c[k][i]5task[k]=0/*if*//*plan*/voidmainintijfori=0i<Ni++/*设置每个任务由不同工人承担时的费用及全局数组的初值*/worker[i]=0task[i]=0temp[i]=0forj=0j<Nj++scanf%d&c[i][j]plan00/*从任务0开始分配*/printf/n最小费用=%d/nmincostfori=0i<Ni++printfTask%disassignedtoWorker%d/nitemp[i]/*main*/
阅读以下函数说明图和C代码将应填入n处的字句写在对应栏内 [说明] 散列文件的存储单位称为桶Bucket假如一个桶能存放m个记录当桶中已有m个同义词散列函数值相同的记录时存放第m+1个同义词会发生“溢出”此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中相对地称存放前m个同义词的桶为“基桶”溢出桶和基桶大小相同用指针链接查找指定元素记录时首先在基桶中查找若找到则成功返回否则沿指针到溢出桶中进行查找 例如设散列函数为HashKey=Keymod7记录的关键字序列为151421879629335241491963161037751531453565168705453建立的散列文件内容如图21-3所示 为简化起见散列文件的存储单位以内存单元表示 函数InsertToHashTableintNewElemKey的功能是若新元素NewElemKey正确插入散列文件中则返回值1否则返回值0 采用的散列函数为HashNewElemKey=NewElemKey%P其中P为设定的基桶数目 函数中使用的预定义符号如下 #defineNULLKey-1/*散列桶的空闲单元标识*/ #defineP7/*散列文件中基桶的数目*/ #defineITEMS3/*基桶和溢出桶的容量*/ typedefstructBucketNode/*基桶和溢出桶的类型定义*/ intKeyData[ITEMS] structBucketNode*Link BUCKET BUCKETBucket[P]/*基桶空间定义*/ [本题函数] intInsertToHashTableintNewElemKey /*将元素NewElemKey插入散列桶中若插入成功则返回0否则返回-1*/ /*设插入第一个元素前基桶的所有KeyData[]Link域已分别初始化为NULLKEYNULL*/ intIndex/*基桶编号*/ intik BUCKET*s*front*t 1 fori=0i<ITEMSi++/*在基桶查找空闲单元若找到则将元素存入*/ ifBucket[Index].KeyData[i]==NULLKEY Bucket[Index].KeyData[i]=NewElemKeybreak if2return0 /*若基桶己满则在溢出桶中查找空闲单元若找不到则申请新的溢出桶*/ 3t=Bucket[Index].Link ift!=NULL/*有溢出桶*/ whilet!=NULL fork=0k<ITEMSk++ ift->KeyData[k]==NULLKEY/*在溢出桶链表中找到空闲单元*/ t->KeyData[k]=NewElemKeybreak /*if*/ if4t=t->Link elsebreak /*while*/ /*if*/ if5/*申请新溢出桶并将元素存入*/ s=BUCKET*mallOCsizeofBUCKET if!sreturn-1 s->Link=NULL fork=0k<ITEMSk++ s->KeyData[k]=NULLKEY s->KeyData[0]=NewElemKey 6 /*if*/ return0 /*InsertToHashTable*/ 1
热门题库
更多
中级网络工程师
中级信息系统管理工程师
初级程序员
中级软件设计师
初级网络管理员
初级信息处理技术员
中级数据库系统工程师
中级多媒体应用设计师
高级系统分析师
高级网络规划设计师
高级系统架构师
中级信息系统监理师
初级通信工程师
中级通信工程师
通信新技术、新业务知识
无线通信专业技术