1、软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 25及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 阅读下列说明和图,回答问题 1至问题 3。 【说明】 某汽车数字仪表板将完成下述功能: (1)通过模 /数转换,实现传感器和微处理器的接口。 (2)在发光二极管面板上显示数据。 (3)指示速度 (mph)、行驶里程、油耗 (mpg)等。 (4)指示加速或减速。 以下是经分析得到的数据流图,有些地方有待填充,假定顶层数据流图是正确的。图 9-14是顶层数据流图,图 9-15是第 0层数据流图,图 9-16是第 1层数据流图,其中 A是加工 1的细化图, B是加工 2的细
2、化图。图中, sps表示转速 sps的瞬时变化值,若 sps 0则汽车加速, sps 0则减速, sps=0则匀速。假定题中提供的顶层图是正确的,请回答下列问题。1 第 0层数据流图 (如图 9-15所示 )中有一条缺失的数据流,请指出该数据流的起点和终点。 加工 1的细化图 (如图 9-16中的 A所示 )中有一条缺失的数据流,请指出该数据流的起点和终点。 2 加工 2的细化图 (如图 9-16中的 B所示 )中有一条错误的数据流,请指出该数据流的起点或终点 (若可以 ,指出两者 )。 3 小说明是用来描述加工的。小说明的描述方法有哪些 ?请分别用这些描述方法描述加工 1.2。 4 阅读下列
3、说明和图,回答问题 1至问题 3。 【说明】 图书管理系统详细记录图书库存情况、读者信息及读者借阅记录 (包括借书日期和还书日期 )。 新书入库时要为该书编制图书卡片,包括分类目录号、图书流水号 (要保证每本书都有唯一的流水号,即使同类图书也是如此 )、书名、作者、内容摘要、价格和购书日期。同一个书名由于版次、作者等不同有可能存在多 “种 ”图书,其间用 “分类目录号 ”区分。 系统为每一位合法读者编制 一个唯一的借书证号,读者需要提供姓名、单位。 一个读者最多可以同时借阅 5本图书。借阅图书时,新添借阅记录,并将对应的 “归还标记 ”字段置为 “false”,表示 “尚未归还 ”;归还图书时
4、,将相应的 “归还标记 ”字段置为 “true”,表示 “已经归还 ”。一本书可能供多位读者借阅,同一本书读者可以重复借阅。 如图 9-17所示为该系统的 E-R图。4 实体间的联系有 “一对一 ”、 “一对多 ”和 “多对多 ”,指出 “借阅 ”联系属于哪一种 ?“借阅 ”关系模式的外键是什么 ?有主键吗 ?为什么 ? 5 由于同一个分类目录号 (同一种图书 )有多个副本,若用表 Book(图书流水号,分类目录号,书名,作者,内容摘要,价格,购书日期 )存储图书信息则有很多的冗余信息,该如何分解使之满足 BCNF,并指出分解后的关系模式的主键。 6 若用表 Reader存储读者信息, Boo
5、k表存储图书信息, Borrow表存储借阅情况。 以下 SQL语句是 “查询证号为 12345的读者当前所借阅的图书书名 (即尚未归还的图书 )”,请补充完整。 SELECT 书名 FROM Book WHERE 流水号 (1) (SELECT 流水号 FROM(2)WHERE 证号 =“12345“ AND(3) 以下 SQL语句是 “查询书名包含 软件设计师 的图书情况 ”,请补充完整。 SELECT * FROM Book WHERE 书名 (4)“%软件设计师 %“ 7 阅读下列说明和图,回答问题 1至问题 3。 【说明】 C市刚开通了地铁线,为方便乘客,计划开发自动售票系统。 该公司
6、在每一个地铁站放置了多台自动售票机,每一台售票机有一唯一编号,售票记录统一汇总主机。自动售票机只发售从该站起始的各种地铁票,因此乘客只需输入目的站,起始站默认为该站,售票机给出从该站到达目的站的单 程票。打印地铁票时为其编一个唯一的流水号,并同时打印自动售票机的编号及票价。 售票机的状态变化如下: “空闲 ”时,显示地铁线路图,等待乘客输入目的站;当乘客输入目的站后,转入 “目的站确认 /票数输入 ”状态,同时给出票价,此时若目的站有误,可返回到空闲状态重新输入,否则,输入票数;乘客输入票数后,转入 “票数确认 /付款 ”状态,同样此时若票数有误,可返回到上一状态重新输入,否则,投入钱币付款;
7、当付款金额足够时, “出票 /找零 ”(有必要时进行找零 );然后转入 “空闲 ”等待输入目的站状态。 该系统采用面向对象方法开发,系统中 的类及类之间的关系用 UML类图表示,如图 9-18所示是该系统类图的一部分,图 9-19描述了自动售票机的状态转换图。7 根据题意,给出 “自动售票机 ”类的主要属性。 8 根据题意,给出 “地铁票 ”类的主要属性。 9 根据题中所述术语,指出图 9-19中状态 1到状态 4分别是什么 ? 10 阅读下列函数说明和 c代码,将应填入 (n)处的字句写在对应栏内。 【说明】 所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路
8、,使回路经过图中的每一个点,而且回路各边的权 之和最小。 应用贪婪法求解该问题。程序先计算由各点构成的所有边的长度 (作为边的权值 ),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择边组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。 函数中使用的预定义符号如下: #define M 100 typedef struct/*x 为两端点 p1、 p2之间的距离, p1、 p2所组成边的长度 */ float x; int p1, p2; tdr; typedef struct/*p1、 p2为和端点相联系的两个端点, n为端点的度 */ int n, P1, p2; tr;
9、 typedef struct/*给出两点坐标 */ float x,y; tpd; typedef int tlM; int n=10; 【函数】 float distance(tpd a,tpd b);/*计算端点 a、 b之间 的距离 */ void sortArr(tdr aM, int m); /*将已经计算好的距离关系表按距离大小从小到大排序形成排序表, m为边的条数 */ int isCircuit(trM, int i, int j); /*判断边 (i, j)选入端点关系表 rM后,是否形成回路,若形成回路返回 0*/ void selected(tr rM, int i,
10、int j);/*边 (i,j)选入端点关系表 r*/ void course(tr rM, tl 1M);/*从端点关系表 r中得出回路轨迹表 */ void exchange(tdr aM, int m, int b); /*调整表排序表, b表示是否可调,即是否有边长度相同的边存在 */ void travling(tpd pdM, int n, float dist, t1 locusM) /*dist记录总路程 */ tdr drM;/*距离关系表 */ tr rM;/*端点关系表 */ int i, j, k, h, m;/*h表示选入端点关系表中的边数 */ int b;/*标识
11、是否有长度相等的边 */ k=0; /*计算距离关系表中各边的长度 */ for(i=1;i n;i+) for(j=i+1;j =n;j+) k+; drk.x=(1); drk.p1=i; drk.p2=j; m=k; sortArr(dr,m);/*按距离大小从小到大排序形成排序表 */ do b=1; dist=0; k=h=0; do k+; i=drk.p1; j=drk.p2; if(ri.n =1) h+; dist+=drk.x; else if(4) /*最后一边选入 r成回路,则该边必须加入且得到解 */ selected(r,i,j); h+; dist+=drk.x;
12、 while(k!=n) if(h=n)/*最后一边选入构成回路,完成输出结果 */ course(r,locus); else/*找不到解,调整 dr,交换表中边长相同的边在表中的顺序,并将 b置 0*/ (5); while(!b); 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 11 阅读以下函数说明和 Java代码,将应填入 (n)处的字句写在对应栏内。 【说明】 下面的程序先构造 Point类,再顺序构造 Ball类。由于在类 Ball中不 能直接存取类 Point中的 xCoordinat
13、e及 yCoordinate属性值, Ball中的 toString方法调用 Point类中的 toStrinS方法输出中心点的值。在 MovingBsll类的 toString方法中,super.toString调用父类 Ball的 toString方法输出类 Ball中声明的属性值。 【 Java代码】 /Point.java文件 public class Point private double xCoordinate; private double yCoordinate; public Point() public Point(double x,double y) xCoordina
14、te=x; yCoordinate=y; public String toStrthg() return“(“+Double.toString(xCoordinate)+“,“ +Double.toString(yCoordinate)+“)“; /other methods /Ball.java文件 public class Ball private (1);/中心点 private double radius;/半径 private String color;/颜色 public Ball() public Ball(double xValue, double yValue, double
15、 r) /具有中心点及其半径的构造方法 center=(2);/调用类 Point中的构造方法 radius=r; public Ball(double xValue, double yValue, double r, String c) /具有中心点、半径和颜色的构造方法 (3);/调用 3个参数的构造方法 color=c; public String toString() return “A ball with center“+center.toString() +“,radius “+Double.toString(radius)+“,color“+color; /other metho
16、ds class MovingBall (4) private double speed; public MovingBall() public MoyingBall(double xValue, double yValue, double r, String c, double s) (5);/调用父类 Ball中具有 4个参数的构造方法 speed=s; public String toString() return super.toString()+“,speed“+Double.toString(speed); /other methods public class test publ
17、ic static void main(String args) MovingBall mb=new MovingBall(10,20,40,“green“,25); System.out.println(mb); 12 阅读以下说明和 C+代码,将应填入 (n)处的字句写在对应栏内。 【说明】 以下 C+程序的功能是计算三角形、矩形和正方形的面积并输出。程序由 4个类组成:类 Triangle、 Rectangle和 Square分别表示三角形、矩形 和正方形:抽象类Figure提供了一个纯虚函数 getAxea(),作为计算上述 3种图形面积的通用接口。 【 C+代码】 #include
18、iostream #include cmath using namespace std; class Figure public: virtual double getArea()=0;/纯虚函数 ; class Rectangle : (1) protected: double height; double width; public: Rectangle() Rectangle(double height, double width) this- height=height; this- width=width; double getArea() return (2); ; class S
19、quare: (3) public: Square(double width) (4); ; class Triangle: (5) private: double la,lb,lc; public: Triangle(double la,double lb,double lc) this- la=la;this- 1b=1b;this- lc=lc; double getArea() double s=(la+lb+lc)/2.0; return sqrt(s*(s-la)*(s-lb)*(s-lc); int main() Figure *figures3=new Triangle(2,3
20、,3),new Rectangle(5,8), new Square(5); for(int i=0;i 3;i+) cout “figures“ i “area=“ (figuresi)- getArea() endl; return 0; 软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷 25答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正确答案】 图 9-15中,缺失的数据流:速度 mph,起点:加工 1速度处理,终点:仪表板。 图 9-16(A)中,缺失的数据流:加速 /减速,起点:加工 1.2确定加速 /减速,终点:仪表板。 【试题解析】 分层数据流图时刻
21、牢记父图与子图平衡原则。对这种数 据流缺失题目,认真对照父图与子图就可得出答案。另外,还要注意与文件的交互,包括错误数据流大多也是出在此。 将第 0层数据流图 (见图 9-15)与顶层数据流图 (见图 9-14)仔细对照,可以发现缺失了输出数据流 “速度 mph”,其起点为加工 1速度处理,终点为仪表板。数据流“速度 mph”虽然从加工 1输出到了加工 2,但这只是内部数据流。 同理,加工 1的细化图 (见图 9-16(A)缺失了数据流 “加速碱速 ”,其起点是加工1.2确定加速 /减速,终点是仪表板。 2 【正确答案】 图 9-16(B)中,错误的数据流: 速度 mph,起点:加工 2.2计
22、算油耗。 【试题解析】 仔细对照加工 2(见图 9-15)和加工 2的细化图 (见图 9-16(B),可以发现对于加工 2.2数据流 “速度 mph”作为输出数据,而该数据流应该是输入数据。 3 【正确答案】 小说明并不描述具体的加工过程,常用的有自然语言、结构化自然语言、判定表和判定树。 自然语言描述:若 sps 0则汽车加速, sps 0则减速, sps=0则匀速。 结构化自然语言描述: IF sps 0 THEN加速 ELSE IF sps 0 THEN 减速 ELSE 匀速 判定表描述: 判定树描述:确定加速 /减速 4 【正确答案】 “借阅 ”联系是 “多对多 ”联系,外键有:借书证
23、号、图书流水号。 “借阅 ”关系模式不存在主键,因为同一本书读者可以重复借阅,即使加上 “借书日期 ”亦不能唯一标识,读者可以在同一天借阅并归还再借阅,应增加一个属性 (如借阅流水号 )来标识。 【试题解析】 “一个读者最多可以同时借阅 5本图书 一本书可能供多位读者借阅,同一本书读者可以重复借阅 ”,因此联系 “借阅 ”是多对多联系。 要特别分清 “一本图书 ”与 “一种图书 ”,一本图书是有流水号 标识的,一种图书是由分类目录号标识的。对借阅联系,借阅的是具体的某本书,因此外键有:借书证号、图书流水号。 “借阅 ”关系模式不存在主键,因为同一本书读者可以重复借阅,即使加上 “借书日期 ”亦
24、不能唯一标识,读者可以在同一天借阅并归还再借阅,应增加一个属性 (如借阅流水号 )来标识。 5 【正确答案】 图书 (分类目录号,书名,作者,内容摘要,价格,购书日期 ),主键:分类目录号 副本 (图书流水号,分类目录号 ),主键:图书流水号 【试题解析】 由于同一个分类目录号 (同一种图书 )有多个副本,同一个分类目录号 具有相同的很多信息:书名、作者、内容摘要、价格等,同 种书中的不同副本由图书流水号区分。故可分解如下: 图书 (分类目录号,书名,作者,内容摘要,价格,购书日期 ),主键:分类目录号 副本 (图书流水号,分类目录号 ),主键:图书流水号 6 【正确答案】 (1)IN(2)
25、Borrow(3) 归还标记 =“false“(4) LIKE 【试题解析】 空 (1)是引出于查询的,该类连接词有: IN、 NOT IN、 EXISTS、NOT EXISTS, EXISTS 引出的子查询一般是 SELECT *型,故排 除;再据语意分析应填 IN。 子查询的语意是 “查询当前所借阅的图书流水号 (即尚未归还的图书 )”,因此应从Borrow 表中查询,而且归还标记应为 false,故空 (2)应填 Borrow,空 (3)应填:归还标记 =“false“。 对字符串进行的操作通常是使用操作符 LIKE 的模式匹配,正符合题意,故空 (4)应填 “LIKE”。 7 【正确答
26、案】 “自动售票机 ”类的主要属性有;编号、所在地铁站名。 【试题解析】 “每一台售票机有一唯一编号 ”,因此自动售票机应有属性 “编号 ”。“自动售票机只发售从该站起 始的各种地铁票 ”,亦即自动售票机只发售其所在站为起始站的地铁票,故应有属性 “地铁站名 ”。 8 【正确答案】 “地铁票 ”类的主要属性有:流水号、起始站、目的站、票价。 【试题解析】 地铁票应有属性:起始站、目的站、票价、流水号、自动售票机编号。 9 【正确答案】 状态 1: “目的站确认 /票数输入 ” 状态 2: “票数确认 /付款 ” 状态 3: “出票 /找零 ” 状态 4: “空闲 ” 【试题解析】 根据售票机状
27、态变化的描述,易于得出答案。状态 1应为 “目的站确认 /票数输入 ”,状态 2应为 “票数确认 /付款 ”,状态 3应为 “出票 /找零 ”,状态 4应为 “空闲 ”。 10 【正确答案】 (1) distance(pdi,pdj) (2) !isCircuit(r,i,j) (3) selected(r,i,j) (4) h=n-1 (5) exchange(dr,m,b) 【试题解析】 本题主要是函数调用的问题。 空 (1)是计算各边的长度,根据函数的声明及说明,应填 distance(pdi, pdj)。 由注释可见空 (2)是判断边 (i, j)加入 r后是否形成回路,若形成了回路,
28、不加入。由语句 “dist+=drk.x;”可知此处是将边加入,故此处应该是不形成回路条件。参照 isCircuit 函数声明及说明可知,若形成回路返回 0,故空 (2)填“!isCircuit(r,i,j)”。 空 (3)是将边 (i,j)加入到 r中,参照 selected 函数声明及说明,可得空 (3)填selected(r, i,j)。 由注释可见空 (4)是最后一条边条件,变量 h表示的是 “选入端点关系表中的边数 ”,而 n 各节点回路应该包含 n条边,这点也可从后面 h=n输出解看出,故空(4)填 h=n-1。 空 (5)是进行调整,调用 exchange函数,正确调用形式为 e
29、xchange(dr,m,b)。 二、选答题(共 3道大题,每道大题 15分) 从下列 3道试题中任选 1道解答,如果解答的试题数超过 1道,则仅题号小的 1道题解答有效。 11 【正确答案】 (1) Point center (2) new Point(xValue, yValue) (3) this(xValue, yValue, r) (4) extends Ball (5) super(xValue, yValue, r, c) 【试题解析】 在类 Ball 的有参数构造函数中,对成员变量 center通过调用 Point类的构造方法初始化,而 center在类 Ball 中尚未声明。
30、结合注释可得空 (1)是将center变量声明为 Point对象引用,故空 (1)应填 Point。空 (2)是调用 Point类的构造函数,根据题意,此处应将 xValue和 yValue作为参数调用类 Point的有参数构造函数,故空 (2)应填 new Point(xValue, yValue)。 根据注释,空 (3)是调用类 Ball 的有 3个参数的构造方法,而其所在方法本身就是类 Ball 的一个构造方法,因 此可用 this 来调用自身的构造方法,故空 (3)应填this(xValue, yValue, r)。 根据题述 “在 MovingBall 类的 toString 方法中
31、, super.toString 调用父类 Ball的toString方法输出类 Ball 中声明的属性值 ”,可知类 MovingBall是类 Ball 的子类,因此空 (4)应填 extends Ball。 根据注释,空 (5)是调用父类 Ball中具有 4个参数的构造方法,通过 super关键字实现,故空 (5)应填 super(xValue, yValue, r, c)。 12 【正确答案】 (1) public Figure (2) height *width (3) public Rectangle (4) height=this- width=width (5) public F
32、igure 【试题解析】 根据题述 “抽象类 Figure提供了一个纯虚函数 getArea(),作为计算上述 3种图形面积的通用接口 ”,可知类 Rectangle均应继承自类 Figure,并实现其抽象方法 getArea。故空 (1)应填 public Figuare。 getArea方法是计 算面积的,空 (2)是返回该类的代表的图形面积。类 Rectangle代表矩形,而矩形的面积的计算公式是长与宽的乘积,类 Rectangle 的成员变量height和 width 分别代表了长和宽,故空 (2)应填 height*width。 类 Square按理应该继承自 Figuare,但并未
33、实现其抽象方法 getArea,若继承自Figure则不能被实例化,而题中 main 函数中已将其实例化,不符合题意,因此不能继承自 Figure。考虑到正方形其实就是长和宽相等的矩形,因此 Square可从Rectangle继承,故空 (3)应填 public Rectangle。这样,计算面积仍用 Rectangle的getArea方法,这就要求将 height和 width 正确赋值,题中已将这两个成员变量声明为 protected,因此这两个变量继承为子类的变量,故空 (4)应填 height=this-width=width。 空 (5)同空 (1),应填 public Figure。