首页
试卷库
试题库
当前位置:
X题卡
>
所有题目
>
题目详情
高级语言源程序的编译过程分若干个阶段,分配寄存器属于()阶段的工作。
查看本题答案
包含此试题的试卷
中级软件设计师《单项选择》真题及答案
点击查看
你可能感兴趣的试题
编译器和解释器是两种高级语言处理程序与编译器相比29编译器对高级语言源程序的处理过程可以划分为问法分
自左至右
自顶向下
自底向上
自右至左
编译器和解释器是两种高级语言处理程序与解释器相比186编译器对高级语言源程序的处理过程可以划分为词法
词法分析
语法分析
代码优化
语义分析
编译和解释是实现高级语言翻译的两种基本方式相对应的程序分别称为编译器和解释器与编译器相比解释器__1
语法分析
语义分析
中间代码生成
目标代码生成
对高级语言源程序进行编译或翻译的过程可以分为多个阶段解释方式不包含阶段
词法分析
语法分析
语义分析
目标代码生成
编译器和解释器是两种高级语言处理程序与解释器相比2编译器对高级语言源程序的处理过程可以划分为词法分析
词法分析
语义分析
语法分析
目标代码生成
编译器和解释器是两种高级语言处理程序与解释器相比186编译器对高级语言源程序的处理过程可以划分为词法
自顶向下
自左至右
自底向上
自右至左
编译器和解释器是两种高级语言处理程序与编译器相比1 编译器对高级语言源程序的处理过程可
机器语言
C语言
汇编语言
数据库语言
编译器和解释器是两种高级语言处理程序与编译器相比29编译器对高级语言源程序的处理过程可以划分为问法分
字符串
单词
语句
标识符
编译器和解释器是两种高级语言处理程序与解释器相比186编译器对高级语言源程序的处理过程可以划分为词法
编译器不参与运行控制,程序执行的速度慢
编译器参与运行控制,程序执行的速度慢
编译器参与运行控制,程序执行的速度快
编译器不参与运行控制,程序执行的速度快
编译器和解释器是两种高级语言处理程序与解释器相比2编译器对高级语言源程序的处理过程可以划分为词法分析
词法分析
语法分析
代码优化
语义分析
编译器和解释器是两种高级语言处理程序与解释器相比2编译器对高级语言源程序的处理过程可以划分为词法分析
字符串
语句
标识符
单词
对高级语言源程序进行编译的过程可以分为多个阶段分配寄存器的工作在阶段进行
词法分析
语法分析
语义分析
目标代码生成
编译和解释是实现高级语言翻译的两种基本方式相对应的程序分别称为编译器和解释器与编译器相比解释器
语法分析
语义分析
中间代码生成
目标代码生成
编译和解释是实现高级语言翻译的两种基本方式相对应的程序分别称为编译器和解释器与编译器相比解释器__1
常量和变量
数据类型
记号
语句
编译器和解释器是两种高级语言处理程序与解释器相比2编译器对高级语言源程序的处理过程可以划分为词法分析
自顶向下
自左至右
自底向上
自右至左
编译器和解释器是两种高级语言处理程序与编译器相比29编译器对高级语言源程序的处理过程可以划分为问法分
词法分析
语义分析
中间代码生成
语法分析
编译和解释是实现高级语言翻译的两种基本方式相对应的程序分别称为编译器和解释器与编译器相比解释器
常量和变量
数据类型
记号
语句
编译器和解释器是两种高级语言处理程序与解释器相比186编译器对高级语言源程序的处理过程可以划分为词法
词法分析
语义分析
语法分析
目标代码生成
编译器和解释器是两种高级语言处理程序与解释器相比2编译器对高级语言源程序的处理过程可以划分为词法分析
编译器不参与运行控制,程序执行的速度慢
编译器参与运行控制,程序执行的速度慢
编译器参与运行控制,程序执行的速度快
编译器不参与运行控制,程序执行的速度快
编译器和解释器是两种高级语言处理程序与解释器相比186编译器对高级语言源程序的处理过程可以划分为词法
字符串
语句
标识符
单词
热门试题
更多
Ravilikemanyproject126hadstudiedthewaterfallmodelofsoftwaredevelopmentastheprimarysoftwarelife-cycle127.Hewasallsettouseitforanupcomingprojecthisfirstassignment.HoweverRavifoundthatthewaterfallmodelcouldnotbeusedbecausethecustomerwantedthesoftwaredeliveredinstagessomethingthatimpliedthatthesystemhadtobedeliveredandbuiltin128andnotas129.Thesituationinmanyotherprojectsisnotverydifferent.Therealworldrarelypresentsaprobleminwhichastandardprocessortheprocessusedinapreviousprojectisthebestchoice.Tobethemostsuitableanexistingprocessmustbe130tothenewproblem.Adevelopmentprocessevenaftertailoringgenerallycannothandlechangerequests.Toaccommodatechangerequestswithoutlosingcontroloftheprojectyoumustsupplementthedevelopmentprocesswitharequirementchangemanagementprocess.
阅读以下说明图和C代码将应填入n处的字句写在对应栏内 [说明] 一般的树结构常采用孩子一兄弟表示法表示即用二叉链表作为树的存储结构链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点例如如图21-6a所示的树的孩子一兄弟表示如图21-6b所示 函数LevelTraverse0的功能是对给定树进行层序遍历例如对如图21-6a所示的树进行层序遍历时结点的访问次序为DBAEFPC 对树进行层序遍历时使用了队列结构实现队列基本操作的函数原型如表21-1所示 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*/ 3处填
Peopleareindulginginanillusionwhenevertheyfindthemselvesexplainingatacocktail鸡尾酒partysaythattheareincomputersorintelecommunicationsorinelectronicfundstransfer.Theimplicationisthattheyarepartofthehigh-techworld.Justbetweenustheyusuallyaren’t.Theresearcherswhomadefundamentalbreakthroughsinthoseareasareinahigh-techbusiness.Therestofusare121oftheirwork.Weusecomputersandothernewtechnologycomponentstodevelopourproductsortoorganizeouraffairs.Becausewegoaboutthisworkinteamsandprojectsandothertightlyknitworkinggroup紧密联系在一起的工作小组wearemostlyinthehumancommunicationbusiness.Oursuccessesstemfromgoodhumaninteractionsbyallparticipantsintheeffortandourfailuresstemfrompoorhumaninteractions.Themainreasonwetendtofocusonthe122ratherthanthehumansideofworkisnotbecauseit’smore123butbecauseit’seasiertodo.GettingthenewdiskdriveinstalledispositivelytrivialcomparedtofigurineoutwhyHoraceisinabluefunk恐惧orwhySusanisdissatisfiedwiththecompanyaveronlyafewmonths.Humaninteractionsarecomplicatedandneververycrisp干脆的干净利落的andcleanintheireffectsbuttheymattermorethananyotheraspectofthework.Ifyoufindyourselfconcentratingonthe124ratherthanthe125.you’relikethevaudevillecharacter杂耍人物wholoseshisKeysonadarkstreetandlooksforthemontheadjacentstreetbecauseasheexplainsThelightisbetterthere!/
阅读下列说明回答问题1至问题3将解答填入对应栏内 [说明] 快速排序是一种典型的分治算法采用快速排序对数组A[p..r]排序的3个步骤如下 1分解选择一个枢轴pivot元素划分数组将数组A[p..r]划分为两个子数组可能为空A[p..q-1]和A[q+1..r]使得A[q]大于等于A[p..q-1]中的每个元素小于A[q+1..r]中的每个元素q的值在划分过程中计算 2递归求解通过递归的调用快速排序对子数组A[p..q-1]和A[q+1..r]分别排序 3合并快速排序在原地排序故不需要合并操作 [问题1] 下面是快速排序的伪代码请填补其中的空缺 伪代码中的主要变量说明如下 A待排序数组 pr数组元素下标从p到r q划分的位置 x枢轴元素 i整型变量用于描述数组下标下标小于或等于i的元素的值小于或等于枢轴元素的值 j循环控制变量表示数组元素下标 QUICKSORTAPr ifp<r q=PARTITIONApr QUICKSORTApq-1 QUICKSORTAq+1r PARTITIONApr X=A[r]i=p-1 forj=pj≤r-1j++ ifA[j]≤x i=i+1 交换A[j]和A[j] 交换1和2//注空1和空2答案可以互换但两个空全部答对方可得分 return3 [问题2] 1假设要排序包含n个元素的数组请给出在各种不同的划分情况下快速排序的时间复杂度用O记号最佳情况为4平均情况为5最坏情况为6 2假设要排序的n个元素都具有相同值时快速排序的运行时间复杂度属于哪种情况7最佳平均最坏 [问题3] 1待排序数组是否能被较均匀地划分对快速排序的性能有重要影响因此枢轴元素的选取非常重要有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素下面是随机化快速排序划分的伪代码——利用原有的快速排序的划分操作请填充其中的空缺处其中RANDOMij表示随机取i到j之间的一个数包括i和j RANDOMIZED-PARTITIONApr i=RANDOMpr 交换8和9//注空8和空9答案可以互换但两个空全部答对方可得分 returnPARTITIONApr 2随机化快速排序是否能够消除最坏情况的发生10是或否 3处填
阅读下列函数说明和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*/ 4处填
阅读以下说明和C程序将应填入n处的字句写在对应栏内 [说明] 假设需要将N个任务分配给N个工人同时去完成每个人都能承担这N个任务但费用不同下面的程序用回溯法计算总费用最小的一种工作分配方案在该方案中为每个人分配1个不同的任务 程序中N个任务从0开始依次编号N个工人也从0开始依次编号主要的变量说明如下 c[i][i]将任务i分配给工人j的费用 task[i]值为0表示任务i未分配值为j表示任务i分配给工人j worker[k]值为0表示工人k未分配任务值为1表示工人k已分配任务 mincost最小总费用 [程序] #include<stdio.h> #defineN8/*N表示任务数和工人数*/ intc[N][N] unsignedintmincost=65535/*设置min的初始值大于可能的总费用*/ inttask[N]temp[N]worker[N] voidplanintkunsignedintcost inti if1&&cost<mincost mincost=cost fori=0i<Ni++temp[i]=task[i] eise fori=0i<Ni++/*分配任务k*/ ifworker[i]==0&&2 worker[i]=1task[k]=3 plan4cost+c[k][i] 5task[k]=0 /*if*/ /*plan*/ voidmain intij fori=0i<Ni++/*设置每个任务由不同工人承担时的费用及全局数组的初值*/ worker[i]=0task[i]=0temp[i]=0 forj=0j<Nj++ scanf"%d"&c[i][j] plan00/*从任务0开始分配*/ printf"/n最小费用=%d/n"mincost fori=0i<Ni++ printf"Task%disassignedtoWorker%d/n"itemp[i] /*main*/ 3处填
阅读以下函数说明图和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*/ 6处填
阅读以下说明和C代码将应填入n处的字句写在对应栏内 [说明] 在一个简化的绘图程序中支持的图形种类有点point和圆ckcle在设计过程中采用面向对象思想认为所有的点和圆都是一种图形shape并定义了类型shape_tpoint_t和circle_t分别表示基本图形点和圆并且点和圆具有基本图形的所有特征 [C代码] typedefenumpointcircleshape_type/*程序中的两种图形点和圆*/ typedefstruct/*基本的图形类型*/ shape_typetype/*图形种类标识点或者圆*/ void*destroy/*销毁图形操作的函数指针*/ void*draw/*绘制图形操作的函数指针*/ shape_t typedefstructshape_tcommonintxintypoint_t /*定义点类型xy为点坐标*/ voiddestroyPointpoint_t*thisfreethisprintf"Pointdestoryed!/n" /*销毁点对象*/ voiddrawPointpoint_t*thisprintf"P%d%d"this->xthis->y /*绘制点对象*/ shape_t*createPointva_list*ap/*创建点对象并设置其属性*/ point_t*p_point ifp_point=point_t*mallocsizeofpoint_t==NULLreturnNULL p_point->common.type=pointp_point->common.destroy=destroyPoint p_point->common.draw=drawPoint p_point->x=va_arg*apint/*设置点的横坐标*/ p_point->y=va_arg*apint/*设置点的纵坐标*/ returnshape_t*p_point/*返回点对象指针*/ typedefstruct/*定义圆类型*/ shape_tcommon point_t*center/*圆心点*/ intradius/*圆半径*/ circle_t voiddestroyCircleCircle_t*this free1freethisprintf"Circledestoryed!/n" voiddrawCircleCircle_t*this printf<"C<"> 2.drawthis->center/*绘制圆心*/ printf".%d"this->radius shape_t*createCircleva_list*ap/*创建一个圆并设置其属性*/ Circle_t*p_circle ifp_circle=circle_t*mallocSizeofcircle_t==NULLreturnNULL p_circle->common.type=circlep_circle->common.destroy=destroyCircle p_circle->common.draw=drawCircle 3=createPointap/*设置圆心*/ p_circle->radius=va_arg*apint/*设置圆半径*/ returnp_circle shape_t*createShapeshape_typest…/*创建某一种具体的图形*/ va_listap/*可变参数列表*/ shape_t*p_shape=NULL 4apst ifst==pointp_shape=createPoint&ap/*创建点对象*/ ifst==circlep_shape=createCircle&ap/*创建圆对象*/ va_endap returnp_shape intmain inti/*循环控制变量用于循环计数*/ 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 [运行结果] P23 5 Circledestoryed! Pointdestoryed! 1处填
阅读以下函数说明图和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*/ 2处填
阅读以下说明和C程序将应填入n处的字句写在对应栏内 [说明] 假设需要将N个任务分配给N个工人同时去完成每个人都能承担这N个任务但费用不同下面的程序用回溯法计算总费用最小的一种工作分配方案在该方案中为每个人分配1个不同的任务 程序中N个任务从0开始依次编号N个工人也从0开始依次编号主要的变量说明如下 c[i][i]将任务i分配给工人j的费用 task[i]值为0表示任务i未分配值为j表示任务i分配给工人j worker[k]值为0表示工人k未分配任务值为1表示工人k已分配任务 mincost最小总费用 [程序] #include<stdio.h> #defineN8/*N表示任务数和工人数*/ intc[N][N] unsignedintmincost=65535/*设置min的初始值大于可能的总费用*/ inttask[N]temp[N]worker[N] voidplanintkunsignedintcost inti if1&&cost<mincost mincost=cost fori=0i<Ni++temp[i]=task[i] eise fori=0i<Ni++/*分配任务k*/ ifworker[i]==0&&2 worker[i]=1task[k]=3 plan4cost+c[k][i] 5task[k]=0 /*if*/ /*plan*/ voidmain intij fori=0i<Ni++/*设置每个任务由不同工人承担时的费用及全局数组的初值*/ worker[i]=0task[i]=0temp[i]=0 forj=0j<Nj++ scanf"%d"&c[i][j] plan00/*从任务0开始分配*/ printf"/n最小费用=%d/n"mincost fori=0i<Ni++ printf"Task%disassignedtoWorker%d/n"itemp[i] /*main*/ 5处填
阅读下列说明图和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:// 2处填
阅读以下说明和C代码将应填入n处的字句写在对应栏内 [说明] 在一个简化的绘图程序中支持的图形种类有点point和圆ckcle在设计过程中采用面向对象思想认为所有的点和圆都是一种图形shape并定义了类型shape_tpoint_t和circle_t分别表示基本图形点和圆并且点和圆具有基本图形的所有特征 [C代码] typedefenumpointcircleshape_type/*程序中的两种图形点和圆*/ typedefstruct/*基本的图形类型*/ shape_typetype/*图形种类标识点或者圆*/ void*destroy/*销毁图形操作的函数指针*/ void*draw/*绘制图形操作的函数指针*/ shape_t typedefstructshape_tcommonintxintypoint_t /*定义点类型xy为点坐标*/ voiddestroyPointpoint_t*thisfreethisprintf"Pointdestoryed!/n" /*销毁点对象*/ voiddrawPointpoint_t*thisprintf"P%d%d"this->xthis->y /*绘制点对象*/ shape_t*createPointva_list*ap/*创建点对象并设置其属性*/ point_t*p_point ifp_point=point_t*mallocsizeofpoint_t==NULLreturnNULL p_point->common.type=pointp_point->common.destroy=destroyPoint p_point->common.draw=drawPoint p_point->x=va_arg*apint/*设置点的横坐标*/ p_point->y=va_arg*apint/*设置点的纵坐标*/ returnshape_t*p_point/*返回点对象指针*/ typedefstruct/*定义圆类型*/ shape_tcommon point_t*center/*圆心点*/ intradius/*圆半径*/ circle_t voiddestroyCircleCircle_t*this free1freethisprintf"Circledestoryed!/n" voiddrawCircleCircle_t*this printf<"C<"> 2.drawthis->center/*绘制圆心*/ printf".%d"this->radius shape_t*createCircleva_list*ap/*创建一个圆并设置其属性*/ Circle_t*p_circle ifp_circle=circle_t*mallocSizeofcircle_t==NULLreturnNULL p_circle->common.type=circlep_circle->common.destroy=destroyCircle p_circle->common.draw=drawCircle 3=createPointap/*设置圆心*/ p_circle->radius=va_arg*apint/*设置圆半径*/ returnp_circle shape_t*createShapeshape_typest…/*创建某一种具体的图形*/ va_listap/*可变参数列表*/ shape_t*p_shape=NULL 4apst ifst==pointp_shape=createPoint&ap/*创建点对象*/ ifst==circlep_shape=createCircle&ap/*创建圆对象*/ va_endap returnp_shape intmain inti/*循环控制变量用于循环计数*/ 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 [运行结果] P23 5 Circledestoryed! Pointdestoryed! 3处填
阅读下列函数说明和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*/ 2处填
阅读以下说明和C代码将应填入n处的字句写在对应栏内 [说明] 在一个简化的绘图程序中支持的图形种类有点point和圆ckcle在设计过程中采用面向对象思想认为所有的点和圆都是一种图形shape并定义了类型shape_tpoint_t和circle_t分别表示基本图形点和圆并且点和圆具有基本图形的所有特征 [C代码] typedefenumpointcircleshape_type/*程序中的两种图形点和圆*/ typedefstruct/*基本的图形类型*/ shape_typetype/*图形种类标识点或者圆*/ void*destroy/*销毁图形操作的函数指针*/ void*draw/*绘制图形操作的函数指针*/ shape_t typedefstructshape_tcommonintxintypoint_t /*定义点类型xy为点坐标*/ voiddestroyPointpoint_t*thisfreethisprintf"Pointdestoryed!/n" /*销毁点对象*/ voiddrawPointpoint_t*thisprintf"P%d%d"this->xthis->y /*绘制点对象*/ shape_t*createPointva_list*ap/*创建点对象并设置其属性*/ point_t*p_point ifp_point=point_t*mallocsizeofpoint_t==NULLreturnNULL p_point->common.type=pointp_point->common.destroy=destroyPoint p_point->common.draw=drawPoint p_point->x=va_arg*apint/*设置点的横坐标*/ p_point->y=va_arg*apint/*设置点的纵坐标*/ returnshape_t*p_point/*返回点对象指针*/ typedefstruct/*定义圆类型*/ shape_tcommon point_t*center/*圆心点*/ intradius/*圆半径*/ circle_t voiddestroyCircleCircle_t*this free1freethisprintf"Circledestoryed!/n" voiddrawCircleCircle_t*this printf<"C<"> 2.drawthis->center/*绘制圆心*/ printf".%d"this->radius shape_t*createCircleva_list*ap/*创建一个圆并设置其属性*/ Circle_t*p_circle ifp_circle=circle_t*mallocSizeofcircle_t==NULLreturnNULL p_circle->common.type=circlep_circle->common.destroy=destroyCircle p_circle->common.draw=drawCircle 3=createPointap/*设置圆心*/ p_circle->radius=va_arg*apint/*设置圆半径*/ returnp_circle shape_t*createShapeshape_typest…/*创建某一种具体的图形*/ va_listap/*可变参数列表*/ shape_t*p_shape=NULL 4apst ifst==pointp_shape=createPoint&ap/*创建点对象*/ ifst==circlep_shape=createCircle&ap/*创建圆对象*/ va_endap returnp_shape intmain inti/*循环控制变量用于循环计数*/ 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 [运行结果] P23 5 Circledestoryed! Pointdestoryed! 5处填
阅读下列说明图和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:// 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*/ 4处填
阅读下列说明回答问题1至问题3将解答填入对应栏内 [说明] 快速排序是一种典型的分治算法采用快速排序对数组A[p..r]排序的3个步骤如下 1分解选择一个枢轴pivot元素划分数组将数组A[p..r]划分为两个子数组可能为空A[p..q-1]和A[q+1..r]使得A[q]大于等于A[p..q-1]中的每个元素小于A[q+1..r]中的每个元素q的值在划分过程中计算 2递归求解通过递归的调用快速排序对子数组A[p..q-1]和A[q+1..r]分别排序 3合并快速排序在原地排序故不需要合并操作 [问题1] 下面是快速排序的伪代码请填补其中的空缺 伪代码中的主要变量说明如下 A待排序数组 pr数组元素下标从p到r q划分的位置 x枢轴元素 i整型变量用于描述数组下标下标小于或等于i的元素的值小于或等于枢轴元素的值 j循环控制变量表示数组元素下标 QUICKSORTAPr ifp<r q=PARTITIONApr QUICKSORTApq-1 QUICKSORTAq+1r PARTITIONApr X=A[r]i=p-1 forj=pj≤r-1j++ ifA[j]≤x i=i+1 交换A[j]和A[j] 交换1和2//注空1和空2答案可以互换但两个空全部答对方可得分 return3 [问题2] 1假设要排序包含n个元素的数组请给出在各种不同的划分情况下快速排序的时间复杂度用O记号最佳情况为4平均情况为5最坏情况为6 2假设要排序的n个元素都具有相同值时快速排序的运行时间复杂度属于哪种情况7最佳平均最坏 [问题3] 1待排序数组是否能被较均匀地划分对快速排序的性能有重要影响因此枢轴元素的选取非常重要有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素下面是随机化快速排序划分的伪代码——利用原有的快速排序的划分操作请填充其中的空缺处其中RANDOMij表示随机取i到j之间的一个数包括i和j RANDOMIZED-PARTITIONApr i=RANDOMpr 交换8和9//注空8和空9答案可以互换但两个空全部答对方可得分 returnPARTITIONApr 2随机化快速排序是否能够消除最坏情况的发生10是或否 7处填
阅读以下说明和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 2处填
阅读下列说明回答问题1至问题3将解答填入对应栏内 [说明] 快速排序是一种典型的分治算法采用快速排序对数组A[p..r]排序的3个步骤如下 1分解选择一个枢轴pivot元素划分数组将数组A[p..r]划分为两个子数组可能为空A[p..q-1]和A[q+1..r]使得A[q]大于等于A[p..q-1]中的每个元素小于A[q+1..r]中的每个元素q的值在划分过程中计算 2递归求解通过递归的调用快速排序对子数组A[p..q-1]和A[q+1..r]分别排序 3合并快速排序在原地排序故不需要合并操作 [问题1] 下面是快速排序的伪代码请填补其中的空缺 伪代码中的主要变量说明如下 A待排序数组 pr数组元素下标从p到r q划分的位置 x枢轴元素 i整型变量用于描述数组下标下标小于或等于i的元素的值小于或等于枢轴元素的值 j循环控制变量表示数组元素下标 QUICKSORTAPr ifp<r q=PARTITIONApr QUICKSORTApq-1 QUICKSORTAq+1r PARTITIONApr X=A[r]i=p-1 forj=pj≤r-1j++ ifA[j]≤x i=i+1 交换A[j]和A[j] 交换1和2//注空1和空2答案可以互换但两个空全部答对方可得分 return3 [问题2] 1假设要排序包含n个元素的数组请给出在各种不同的划分情况下快速排序的时间复杂度用O记号最佳情况为4平均情况为5最坏情况为6 2假设要排序的n个元素都具有相同值时快速排序的运行时间复杂度属于哪种情况7最佳平均最坏 [问题3] 1待排序数组是否能被较均匀地划分对快速排序的性能有重要影响因此枢轴元素的选取非常重要有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素下面是随机化快速排序划分的伪代码——利用原有的快速排序的划分操作请填充其中的空缺处其中RANDOMij表示随机取i到j之间的一个数包括i和j RANDOMIZED-PARTITIONApr i=RANDOMpr 交换8和9//注空8和空9答案可以互换但两个空全部答对方可得分 returnPARTITIONApr 2随机化快速排序是否能够消除最坏情况的发生10是或否 5处填
Ravilikemanyproject126hadstudiedthewaterfallmodelofsoftwaredevelopmentastheprimarysoftwarelife-cycle127.Hewasallsettouseitforanupcomingprojecthisfirstassignment.HoweverRavifoundthatthewaterfallmodelcouldnotbeusedbecausethecustomerwantedthesoftwaredeliveredinstagessomethingthatimpliedthatthesystemhadtobedeliveredandbuiltin128andnotas129.Thesituationinmanyotherprojectsisnotverydifferent.Therealworldrarelypresentsaprobleminwhichastandardprocessortheprocessusedinapreviousprojectisthebestchoice.Tobethemostsuitableanexistingprocessmustbe130tothenewproblem.Adevelopmentprocessevenaftertailoringgenerallycannothandlechangerequests.Toaccommodatechangerequestswithoutlosingcontroloftheprojectyoumustsupplementthedevelopmentprocesswitharequirementchangemanagementprocess.
阅读下列说明和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 2处填
阅读下列说明回答问题1至问题3将解答填入对应栏内 [说明] 快速排序是一种典型的分治算法采用快速排序对数组A[p..r]排序的3个步骤如下 1分解选择一个枢轴pivot元素划分数组将数组A[p..r]划分为两个子数组可能为空A[p..q-1]和A[q+1..r]使得A[q]大于等于A[p..q-1]中的每个元素小于A[q+1..r]中的每个元素q的值在划分过程中计算 2递归求解通过递归的调用快速排序对子数组A[p..q-1]和A[q+1..r]分别排序 3合并快速排序在原地排序故不需要合并操作 [问题1] 下面是快速排序的伪代码请填补其中的空缺 伪代码中的主要变量说明如下 A待排序数组 pr数组元素下标从p到r q划分的位置 x枢轴元素 i整型变量用于描述数组下标下标小于或等于i的元素的值小于或等于枢轴元素的值 j循环控制变量表示数组元素下标 QUICKSORTAPr ifp<r q=PARTITIONApr QUICKSORTApq-1 QUICKSORTAq+1r PARTITIONApr X=A[r]i=p-1 forj=pj≤r-1j++ ifA[j]≤x i=i+1 交换A[j]和A[j] 交换1和2//注空1和空2答案可以互换但两个空全部答对方可得分 return3 [问题2] 1假设要排序包含n个元素的数组请给出在各种不同的划分情况下快速排序的时间复杂度用O记号最佳情况为4平均情况为5最坏情况为6 2假设要排序的n个元素都具有相同值时快速排序的运行时间复杂度属于哪种情况7最佳平均最坏 [问题3] 1待排序数组是否能被较均匀地划分对快速排序的性能有重要影响因此枢轴元素的选取非常重要有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素下面是随机化快速排序划分的伪代码——利用原有的快速排序的划分操作请填充其中的空缺处其中RANDOMij表示随机取i到j之间的一个数包括i和j RANDOMIZED-PARTITIONApr i=RANDOMpr 交换8和9//注空8和空9答案可以互换但两个空全部答对方可得分 returnPARTITIONApr 2随机化快速排序是否能够消除最坏情况的发生10是或否 1处填
阅读以下说明和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 4处填
阅读下列说明和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 4处填
阅读下列说明回答问题1至问题3将解答填入对应栏内 [说明] 快速排序是一种典型的分治算法采用快速排序对数组A[p..r]排序的3个步骤如下 1分解选择一个枢轴pivot元素划分数组将数组A[p..r]划分为两个子数组可能为空A[p..q-1]和A[q+1..r]使得A[q]大于等于A[p..q-1]中的每个元素小于A[q+1..r]中的每个元素q的值在划分过程中计算 2递归求解通过递归的调用快速排序对子数组A[p..q-1]和A[q+1..r]分别排序 3合并快速排序在原地排序故不需要合并操作 [问题1] 下面是快速排序的伪代码请填补其中的空缺 伪代码中的主要变量说明如下 A待排序数组 pr数组元素下标从p到r q划分的位置 x枢轴元素 i整型变量用于描述数组下标下标小于或等于i的元素的值小于或等于枢轴元素的值 j循环控制变量表示数组元素下标 QUICKSORTAPr ifp<r q=PARTITIONApr QUICKSORTApq-1 QUICKSORTAq+1r PARTITIONApr X=A[r]i=p-1 forj=pj≤r-1j++ ifA[j]≤x i=i+1 交换A[j]和A[j] 交换1和2//注空1和空2答案可以互换但两个空全部答对方可得分 return3 [问题2] 1假设要排序包含n个元素的数组请给出在各种不同的划分情况下快速排序的时间复杂度用O记号最佳情况为4平均情况为5最坏情况为6 2假设要排序的n个元素都具有相同值时快速排序的运行时间复杂度属于哪种情况7最佳平均最坏 [问题3] 1待排序数组是否能被较均匀地划分对快速排序的性能有重要影响因此枢轴元素的选取非常重要有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素下面是随机化快速排序划分的伪代码——利用原有的快速排序的划分操作请填充其中的空缺处其中RANDOMij表示随机取i到j之间的一个数包括i和j RANDOMIZED-PARTITIONApr i=RANDOMpr 交换8和9//注空8和空9答案可以互换但两个空全部答对方可得分 returnPARTITIONApr 2随机化快速排序是否能够消除最坏情况的发生10是或否 9处填
Ravilikemanyproject126hadstudiedthewaterfallmodelofsoftwaredevelopmentastheprimarysoftwarelife-cycle127.Hewasallsettouseitforanupcomingprojecthisfirstassignment.HoweverRavifoundthatthewaterfallmodelcouldnotbeusedbecausethecustomerwantedthesoftwaredeliveredinstagessomethingthatimpliedthatthesystemhadtobedeliveredandbuiltin128andnotas129.Thesituationinmanyotherprojectsisnotverydifferent.Therealworldrarelypresentsaprobleminwhichastandardprocessortheprocessusedinapreviousprojectisthebestchoice.Tobethemostsuitableanexistingprocessmustbe130tothenewproblem.Adevelopmentprocessevenaftertailoringgenerallycannothandlechangerequests.Toaccommodatechangerequestswithoutlosingcontroloftheprojectyoumustsupplementthedevelopmentprocesswitharequirementchangemanagementprocess.
阅读以下说明图和C代码将应填入n处的字句写在对应栏内 [说明] 一般的树结构常采用孩子一兄弟表示法表示即用二叉链表作为树的存储结构链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点例如如图21-6a所示的树的孩子一兄弟表示如图21-6b所示 函数LevelTraverse0的功能是对给定树进行层序遍历例如对如图21-6a所示的树进行层序遍历时结点的访问次序为DBAEFPC 对树进行层序遍历时使用了队列结构实现队列基本操作的函数原型如表21-1所示 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*/ 7处填
阅读以下说明图和C代码将应填入n处的字句写在对应栏内 [说明] 一般的树结构常采用孩子一兄弟表示法表示即用二叉链表作为树的存储结构链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点例如如图21-6a所示的树的孩子一兄弟表示如图21-6b所示 函数LevelTraverse0的功能是对给定树进行层序遍历例如对如图21-6a所示的树进行层序遍历时结点的访问次序为DBAEFPC 对树进行层序遍历时使用了队列结构实现队列基本操作的函数原型如表21-1所示 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*/ 5处填
阅读以下说明和C程序将应填入n处的字句写在对应栏内 [说明] 假设需要将N个任务分配给N个工人同时去完成每个人都能承担这N个任务但费用不同下面的程序用回溯法计算总费用最小的一种工作分配方案在该方案中为每个人分配1个不同的任务 程序中N个任务从0开始依次编号N个工人也从0开始依次编号主要的变量说明如下 c[i][i]将任务i分配给工人j的费用 task[i]值为0表示任务i未分配值为j表示任务i分配给工人j worker[k]值为0表示工人k未分配任务值为1表示工人k已分配任务 mincost最小总费用 [程序] #include<stdio.h> #defineN8/*N表示任务数和工人数*/ intc[N][N] unsignedintmincost=65535/*设置min的初始值大于可能的总费用*/ inttask[N]temp[N]worker[N] voidplanintkunsignedintcost inti if1&&cost<mincost mincost=cost fori=0i<Ni++temp[i]=task[i] eise fori=0i<Ni++/*分配任务k*/ ifworker[i]==0&&2 worker[i]=1task[k]=3 plan4cost+c[k][i] 5task[k]=0 /*if*/ /*plan*/ voidmain intij fori=0i<Ni++/*设置每个任务由不同工人承担时的费用及全局数组的初值*/ worker[i]=0task[i]=0temp[i]=0 forj=0j<Nj++ scanf"%d"&c[i][j] plan00/*从任务0开始分配*/ printf"/n最小费用=%d/n"mincost fori=0i<Ni++ printf"Task%disassignedtoWorker%d/n"itemp[i] /*main*/ 1处填
阅读以下说明图和C代码将应填入n处的字句写在对应栏内 [说明] 一般的树结构常采用孩子一兄弟表示法表示即用二叉链表作为树的存储结构链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点例如如图21-6a所示的树的孩子一兄弟表示如图21-6b所示 函数LevelTraverse0的功能是对给定树进行层序遍历例如对如图21-6a所示的树进行层序遍历时结点的访问次序为DBAEFPC 对树进行层序遍历时使用了队列结构实现队列基本操作的函数原型如表21-1所示 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*/ 1处填
热门题库
更多
中级软件设计师
初级网络管理员
初级信息处理技术员
中级数据库系统工程师
中级多媒体应用设计师
高级系统分析师
高级网络规划设计师
高级系统架构师
中级信息系统监理师
初级通信工程师
中级通信工程师
通信新技术、新业务知识
无线通信专业技术
移动通信专业技术
有线传输专业技术
电话交换专业技术