1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 29及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读以下说明和流程图,回答问题 1和问题 2,将答案写在答卷的对应栏内。【说明】 本流程图实现从比赛成绩文件生成赛车成绩一览表。 某国际高等级赛车比赛使用如图所示的成绩处理流程,比赛成绩记录在成绩文件 F0中,其记录格式如下:由该成绩文件生成如下所示的车手成绩一览表。生成的车手成绩一览表按总名次 (系统会根据总成绩和分段成绩按规定方式计算得出总名次,不会有相同名次存在 )降序排列。表中第 n赛段的名次是该车手相应赛段在全部车手中的名次,成绩是根据规定方式计算而得的成绩
2、,总名次是总成绩在所有车手中排名的名次。流程图中的顺序文件 F0是车手成绩文件, F0文件经处理 l处理后产生顺序文件 F,然后经处理 2至处理 4对文件 F进行处理和更新,在处理 5中,仅仅对文件 F的记录进行车手成绩一览表的编排输出,不进行排序和增加名次等处理。 1 流程图中的文件 F的记录格式设置为如下形式: 其中的 、 应定义为何种数据 ? 2 简述处理 2、处理 3和处理 4做何种处理,若有排序处理则需指明排序的键及序(升序或降序 )。 3 阅读以下说明,回答问题 1至问题 3,将答案写在答卷的对应栏内。 【说明】 下面是某 ERP系统中零件供应模块的 3个关系模式。 供应商: S(
3、SNO, SNAME, CITY, STATUS) 零件: P(PNO, PNAME, WEIGHT, COLOR, CITY) 供应单: SP(SNO, PNO, PTY, SP Date) 属性说明: SNO供应商编号, SNAME供应商名称, CITY地址, STATUS供应商状态 PNO零件编号, PNAME零件名称, WEIGHT零件重量 , COLOR零件颜色, CITY地址, PTY数量, SP Date订单日期 问题: 用 SQL语句完成以下操作。 3 求供应红色零件北京供应商的编号、名称和状态。 4 将所有北京供应商的状态为 2的修改为 1。 5 求零件颜色不是白色和黑色的供
4、应商状态为 1的订单的数量。 6 阅读以下说明和图,回答问题 1和问题 2,将答案写在答卷的对应栏内。 【说明】 银行客户需要从 ATM取 100元,他向 ATM的读卡机插卡,读卡机读取卡号,然后 ATM屏幕初始化, ATM提示输入 PIN(密码 ),客 户输入 PIN(123456), ATM打开他的账户,密码有效,因此 ATM提示选择事务,客户选择取钱, ATM提示输入金额,客户输入 100元, ATM验证账户上有足够的钱,就从账上减去 100元, ATM吐出 100元,并退出客户的卡。 6 根据上面的描述,完成下述的时序图。7 比较时序图和协作图,说明区别和联系。 8 阅读下列 C程序和
5、程序说明,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】用克鲁斯卡尔算法求解给定图的最小生成树。 #include stdio. h #include stdlib. h #define MAXN 30 typedef struct int v1,v2; /*一条边依附的两个顶点 */ int weight; /*边上的权值 */ EDGE; typedef struct int Vnum; /*图中的顶点数目 */ EDGE eMAXN*(MAXN-1)/2; /*图中的边 */ Graph; typedef struct node /*用链表存储同一个连通分量的顶点 */ int
6、 v; struct node *next; Alist; void heapadjust(EDGE data, int s, int m) /*将元素序列 datasm调整为小顶堆 , 堆顶元素 (最小元素 )为 datas*/ int j; EDGE t; t=datas; /*备份元素 datas, 为其找到适当位置后再插入 */ for(j=2*s+1; j =m; j=j*2+1)/*沿值较小的子结点向下筛选 */ if(j m if(!(t. weight dataj. weight) break; datas=dataj;s=j; /*用 s记录待插入元素的位置 (下标 )*/
7、/*for*/ datas=t; /*将备份元素插入由 s所指出的插入位置 */ /*heapadjust*/ int creat_graph(Graph *p) /*输入图中的顶点及边 , 返回图中边的数目 */ int k=0; /*记录图中边的数目 */ int n; int v1,v2; int w; printf(“vertex number of the graph:“); scanf(“%d“, /*输入图中的顶点数目 */ if(n 1) return 0; p- Vnum=n; do printf(“edge(vertex1,vertex2,weight):“); scanf
8、(“%d %d %d“, if(v1 =0 p- ek. v2=v2; p- ek. weight=w; k+; /*if*/ while(!( (2) ); return k; /*返回图中边的数目 */ /*creat_graph*/ int kruskal(Graph G, int enumber, int tree3) /*用 kruskal算法求无向连通图 G的最小生成树 , 图中边所得数目为 enumber, */ /*数组 tree3中存放生成树中边的顶点和边上的权值 , 函数返回生成树的代价*/ int i, k, m, c=0; int v1, v2; Alist *p, *
9、q, *aMAXN; for(i=0; i G Vnum; +i) /*将每个连通分量中的顶点存放在一个单链表中*/ ai=(Alist*)malloc(sizeof(Alist); if(!ai) printf(“n mernory allocation error!“); exit(0); /*if*/ ai- v=i; ai- next=NULL; /*for*/ for(i=enumber-1; i =0; -i)/*按照边上的权值建立小顶堆 */ heapadjust( (3) ); k=G. Vnum; /*k用于计算图中的连通分量数目 */ m=enumber-1; i=0; d
10、o v1=G. e0. v1; v2=G. e0. v2; p=av1; while(p p=p- next; if(!p) /*当前边的顶点不在一个连 通分量中 */ p=q; p- next=aG. e0. v2; p=aG. e0. v1); /*加入边 (v1,v2), 将两个连通分量合并为一个 */ while(p)ap- v=(4); p=p- next; k-; /*连通分量数目减少一个 */ treei0=v1; /*记 录加入最小生成树的边 */ treei1=v2; treei2=G. e0. weight; c+=G. e0. weight; +i; /*if*/ G.
11、e0=G. em; m-; heapadjust (5); while(k 1); /*当所有顶点不在同一个连通时 , 继续 */ return c; /*返回最小生成树的代价 */ /*kruskal*/ void main(void) int i, enumber; int treeMAXN3; int cost=0; Graph G; enumber=creat_graph( cost=-kruskal(G,enumber,tree); printf(“Minimum-Cost spanning tree(kruskal): n“); printf(“edget weighttn“);
12、for(i=0; i G. Vnum-1; +i) printf(“v %d v %d t %dn“, treei0, treei1, treei2); printf(“Cost: %dn“, cost); 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 9 阅读下列 C+程序和程序说明,将应填入 (n)处的字句写在对应栏内。 【说明】 程序 6说明 单源最短路径的分支限界算法。 const int MAXNUM=29999; #include iostream #include vector #inc
13、lude algorithm #include functional using namespace std; template class VertexType,class EdgeType class MinNode /程序中使用的最小化堆的结点说明 friend class Graph VertexType,EdgeType public: MinNode (int nl, EdgeType length1) VexNum=nl; length=length1; bool operator (const MinNode VertexType,EdgeType /记录源点序号,序号数组 p
14、及 distance下标相一致。源点为初始扩展顶点 EdgeType length; /记录源点到本顶点的当前最短路径的长度,源点到自身的长度为 0 template class VertexType,classEdgeType void Graph VertexType,EdgeType : shortestpath(VertexType start) int j,k,source;/source 记录源点的序号。 EdgeType*distance=(2); int*p=new intMaxNumVertex; vector MinNode VertexType,EdgeType H; f
15、or(source=0; source MaxNumVertex;source+) if(NodeListsource=start)break; if (source =MaxNumVertex)cout ”This is error!” end1; return; MinNode VertexType,Edge Type (3); for(k=0; k MaxNumVertex; k+) distancek: MAXXUM; /记录源点到本顶点 k的最终的最短路径的长度 pk=source; /记录最短路径上的本顶点的直接前驱顶点的序号 distancesource=0; psource=-
16、1; /m 是源点,前一顶点不存在 vector MinNode VertexType, EdgeType :iterator q; while(1) for(j=0; j MaxNumVertex; j+) if(AdjMatrixE.VexNum* MaxNumVertex+j MAXNUM) &(4) distancej) distancej=E.length+AdjMatrixE.VexNum* MaxNumVertex+j; pj=E. VexNum; /记录顶点 j的前一顶点 MinNode VertexType, EdgeType (5); H push_ back(N); pu
17、sh_heap(H. begin(), H.end(), greater MinNode VertexType, EdgeType (); if(H.empty() true)break; /若优先队列为空,那么算法结束 else pop_ heap(H.begin(), H. end(), greater MinNode VertexType, EdgeType (); q=H.end()-1; /从 最小化堆中取路径最短的顶点 E=*q; H.pop_ back(); /删除从最小化堆中 “挤 ”出的顶点 /end while for(k=0; k MaxNumVertex; k+) co
18、ut “Shorstest path from vertex“ k “is“ distancek end1; j=k; cout “All vertices are: “; while(j!=source)cout j “- “; j=pj; cout source ”.” end1; /打印顶点的最短路径长度和至源点的最短路径上经过的顶点序列 return; 10 阅读下列 Java程序和程序说明,将应填入 (n)处的字句写在对应栏内。 【说明】清点盒子。本程序 当用户输入一个整数值时,一切正常;当输入其他数值时,程序就出错。现在已做了改进,请填空。 import java. text. N
19、umberFormat; Public class InventoryLoop public static void main(String args) String numBoxesIn; Int numBoxes; Double boxPrice=3.25; Boolean gotGoodInput=false; NumberFormat currency=NumberFormat.(1); do System.out. print(“How many boxes do we have?”); numBoxesIn=DummiesIO. (2); try numBoxes=Integer.
20、parseInt(3); system. out. print(“The value is“); system.out. println(currency, format (numBoxes*boxPrice); gotGoodInput=true; catch(4) System.out.println(); System.out. println(Thats not a number.“); while(5); /输入不正确时 System. out.println(“Thats that.“); 软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 29答案与解析 一、必答题(共
21、4道大题,每道大题 15分) 1 【正确答案】 成绩 名次。 2 【正确答案】 按课程代码 (升序 )、成绩 (降序 ) 处理 2:对文件 F排序。 处理 3:决定分赛段名次,计算总成绩,决定总名次,填入文件 F的相应字段。 处理 4:按总成绩 (降序 ),按课程代码 (降序 )排列。 【试题解析】 文件 F是文件 F0经过处理 1产生的文件,这个文件又经过处理2、处理 3、处理 4的处理和更新,而在处理 5中,只是进行了车手成绩一览表的输出编排,不进行排序和增加名次等处理,文件 F中的数据项必须是由文件 F0产生,还要经过处理产生车手成绩一览表。所以,可以推导出文件 F中 是成绩, 是名次
22、通过对给出的车手成绩一览表的观察,可以确定对文件 F的处理中要按课程代码升序,按成绩降序进行排列。 处理 2、处理 3、处理 4要对文件进行一系列处理,最后得到的文件 F在处理 5只是做了输出编排,所以在处理 4已经完成要求的根据分赛段成绩比较而获得的分赛段名次,按总名次降序排序,按课程名排序。所以,可以推导,处理 2对文件 F排序,处理 3决定分赛段名次,计算总成绩,决定总名次,填入文件 F的相应字段。处理 4按总成绩 (降序 ),按课程代码 (降序 )排列。 3 【正确答案】 SELECT DISTINCT S.SNO, S.SNAME, S.STATUS FROM S, P, SP WH
23、ERE S.SNO=SP.SNO AND P.PNO=SP.PNO AND P/PNO=红色 4 【正确答案】 UPDATE S SETSTATUS=1 WHERE CITY=北京 AND STATUS=1 5 【正确答案】 SELECT COUNT(*) FROM S,P,SP WHERE S.SNO=SP.SNO AND P.PNO=SP.PN0 AND P.COLOR=红色 AND S.STATUS=1 【试题解析】 这 3个语句比较简单,只是考查考 生的 SQL语句基本知识。 6 【正确答案】 1插卡 2读卡号 3提示输入 PIN 4输入 PIN 5验证 PIN 6选择事务 (取钱 )
24、 7扣钱 (100元 ) 8提供钱 (100元 ) 9退卡 7 【正确答案】 时序图和协作图都可以用来描述系统对象之间的交互。时序图强调一组对象之间调用的时间顺序,协作图强调这组对象之间的关系。 【试题解析】 时序图用来描述对象间的交互行为。它注重消息的时间顺序,即消息的发送和接收的顺序。 时序图的图形组成成分为:对象、生存线、消息和对象激活期 (本题中省 略 )。 试题中要求的就是完成消息,所以要根据消息的时间顺序,和消息发出与接收的对象。由于已经给出了详细明晰的动作过程描述,未完成的时序图中也标识出对象和部分消息,所以,应该比较容易地完成其它的消息。 8 【正确答案】 (1) dataj.
25、weight dataj+1.weight (2) v1=-1 & v2=-1 (3) G.e, i, enumber-1 (4) aG.e0.v1 (5) G.e,0,m 【试题解析】 (1) dataj.weight dataj+1.weight 沿值较小的子结点向下筛选,建堆,堆顶元素最小; (2) v1=-1 & v2=-1 当 v1!=-1|v2!=-1时,循环读入,直到 v1=-1 & v2=-1为真。 (3) G.e, i, enumber-1 按照边上的权值建立小顶堆。 (4) aG.e0.v1 加入边 (v1,v2),将两个连通分量合并为一个。 (5) G.e,0,m 找出下
26、一条权值最小的边。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答 的试题数超过 1道,则仅题号小的 1道题解答有效。 9 【正确答案】 (1)this- length或 (*this).length (2)new EdgeTypeMaxNumVertex (3)E(source, 0) (4)E.length+ AdjMatrix E. VcxNum* MaxNumVertex+j (5)N(j, distancej) 【试题解析】 (1)this- length或 (*this).length 操作符,的成员函数,比较两个对象的最短路径的长度 le
27、ngth,大于则返回真(1)。 (2)new EdgeTypeMaxNumVertex 动态申请 EdgeType类的对象数组 distance,长度为 MaxNumVertex,存放最短路径的长度。 (3)E(source, 0) 定义最小化堆模板类 MinNode VertexType, EdgeType的对象 E(source, 0)。 (4)E.length+ AdjMatrix E. VcxNum* MaxNumVertex+j 若 E.length+ AdjMatrix E.VexNum*MaxNumVertex+j小于 distancej,则distancej取这个更小值。 (5
28、)N(j, distancej) 定义最小化堆模板类 MinNode VertexType, EdgeType的对象 N(j,distancej)。 10 【正确答案】 (1)getCurrencyInstance()或 getCurrencyInstance(currentLocale) (2)getString() (3)numBoxesIn (4)NegativeNumberException e (5)!gotGoodInput 【试题解析】 (1)getCurrencyInstance()或 getCurrencyInstance(currentLocale) 货币 currency对象指向格式化数据 NumberFormat类的货币数字格式getCurrencyInstance()。 (2)getString() 读入货币数字的字符串到 NumBoxesIn中。 (3)numBoxesIn 分析字符串 NumBoxesIn的合法性,并转换成整数。 (4)NegativeNumberException e 捕捉数据格式错误的信息 NegativeNumberException e。 (5)!gotGoodInput 输入不正确时,继续循环输入。