1、中级软件设计师下午试题-13 及答案解析(总分:80.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 A 公司决定开发一套公共交通自动售票系统,系统要求如下所述。 (1)乘客能按以下 3 步操作购票:选定目的地,投入钱币,获得一张票。 (2)并且仅当乘客选定目的地后,系统才接收投钱;每次投入的钱只购买一张票。 (3)只要投入的钱不少于所需的票价,且票库中有所要求的票,则应尽快出票。 (4)如需找钱,则在出票的同时应退还多余的钱。 (5)如果乘客投入的钱不够票价,或者票库中没有所需要的票时,系统将全额退钱,并允许乘客另选目的地,继续购票。 (6)出票前乘
2、客可以单击“取消”按钮取消购票,系统将全额退出该乘客投入的钱,并允许乘客另选目的地,继续购票。 (7)出票结束(包括退还多余的钱)后,系统应保存销售记录,并等待乘客购票。 该系统还要求快速响应和操作同步,所以它应是一个实时系统。为此,A 公司在该系统的数据流程图中附加了过程控制部分,形成转换图。在该图中,控制流(事件流)用虚 线表示,数据流用实线表示。图中的数据流并没有画全,需要考生填补。 对售票全过程进行的控制可以用系统内部各个状态之间的迁移来描述,从而形成状态迁移图。在状态迁移图中,用双线框表示状态,用有向边表示状态的迁移。引起状态迁移的事件以及由该事件引起的动作,在有向边旁用“ ”形式注
3、明。 该公司还制定了一个过程启动表,用以表明状态迁移图中的 4 个动作与转换图中的 4 个过程之间的“启动”关系,即说明哪个动作将启动哪个过程。用 1 表示启动,用 0 表示不启动。启动的过程将根据获得的输入数据产生输出数据,未唐动的过程则不会产生输出数据,该表中没有列出的过程,其执行与否与事件无关。 (分数:15.00)_二、B试题二/B(总题数:1,分数:5.00)2.【说明】 学校中有若干系,每个系有若干班级和教研室,每个教研室有若干教员,其中有的教授和副教授各带有若干研究生;每个班有若干学生,每个学生选修若干课程,每门课可由若干学生选修。 【问题 1】 用 E-R 图画出此学校的概念模
4、型,用文字写出各实体和联系的属性。 【问题 2】 将 E-R 图转换成关系模型。 【问题 3】 指出各关系模型的候选键。(分数:5.00)_三、B试题三/B(总题数:1,分数:15.00)3.【说明】 (1)这是一个图书馆支持系统。 (2)图书馆应用系统可以将图书和杂志借给借书者,这些借书者已经在系统中注册了,图书和杂志也已经注册过了。 (3)图书馆负责新书的购买,一本流行图书会多买几本。当旧书和杂志已经过时或破旧不堪时,将它们从图书馆应用系统中删除。 (4)图书馆馆员是图书馆的员工。他们与客户(借书者)打交道,并且是在图书馆软件系统提供的支持下开展工作的。 (5)借书者可以预订图书馆中当前还
5、没有的图书或杂志,这样,当某借书者所预订的图书或杂志归还回来或购进时,应用系统就通知这个预订人。当该借书者借阅了他所预订的图书或杂志后,或者通过一个显式的取消过程取消他的预订后,他的本次预订就被取消了。 (6)图书馆应用系统能够容易地建立、修改和删除系统中的信息,包括书名、借书者、借阅信息和预订信息。 (7)图书馆应用系统能够在所有流行的 Web 浏览器平台(Internet Explorer 5.1 以上,Netscape 4.0 以上等等)上运行。 (8)图书馆应用系统应该易于扩展新功能。 【问题】分析这个图书馆系统中涉及的角色和用例,完成用例图。 *(分数:15.00)_四、B试题四/B
6、(总题数:1,分数:15.00)4.【说明】 本程序在 33 方格中填入 1N(N10)内的某 9 个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。试求出满足这个要求的所有填法。33 方格中的每个方格按行按列(先行后列)序号排列为:0,1,2,3,4,5,6,7,8。 程序采用试探法,即从序号为 0 的方格开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入整数;直至序号为 8 的方格也填入合理的整数后,就找到了一个解,将该解输出。再调整序号为 8 的方格所填整
7、数,继续去找下一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组 check Matrix,存放需要进行合理性检查的相邻方格的序号。 # include stdio. h # define N 12 int bN+1; int pos; int a9;/* 用于存储诸方格所填入的整数*/ int AllNum=0;/* 统计有多少种填法*/ int checkMatrix3= -1,0,-1,1,-1, 0,-1,1,3,-1,2,4,-1, 3,-1,4,6,-1,5,7,-1; void write(int a) int i, j; for(i=0; i3; i+) for(j=
8、0; j3; j+) printf(“%3d“, a3*i+j); printf(“/n“); int isPrime(int m) int i; if(m=2)return 1; if(m=1 m%2=0)return 0; for(i=3; i*im;) if(m%i=0)return 0; i+=2; return 1; int selectNum(int start) int j; for(j=start; j=N; j+) if(bj)return j; return 0; int check()/*检查填入 pos 位置的整数是否合理*/ int i,j; for(i=0; (j=
9、U (1) /U)=0; i+) if(!isPrime(apos+aj) U(2) /U; U(3) /U; extend ()/* 为下一方格找一个尚未使用过的整数*/ aU (4) /U=selectNum(1); bapos=0; void change ()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/ int j; while(pos =0 if(pos0)return; bapos=1; apos=j; bj=0; int find () int ok=1; pos=0; apos=1; bapos=0; do if(ok) if(pos=8) write(a); ch
10、ange(); AllNum+;/* 统计有多少种填法*/ else extend(); else change(); ok=check(); while(pos=0); void main() int i; for(i=1; i=N; i+) bi=1; find(); prinrf(“共有%d 种不同填法!/n“, AllNum); (分数:15.00)_五、B试题五/B(总题数:1,分数:15.00)5.【说明】 以下 C+程序的功能是计算三角形、矩形和正方形的面积并输出。程序由 4 个类组成:类Triangle、Rectangle 和 Square 分别表示三角形、矩形和正方形;抽象类
11、 Figure 提供了一个纯虚拟函数getArea(),作为计算上述 3 种图形面积的通用接口。 #includeiostream.b #includemath.h class Figure public: virtual double getArea0=0; /纯虚拟函数 ; class Rectangle:U (1) /U protected: double height; double width; public: Rectangle(); Rectangle(double height, double width) This-height=height; This-width=widt
12、h; double getarea() returnU (2) /U; ; class Square:U (3) /U public: Square(double width) U (4) /U; ; class Triangle:U (5) /U double la; double lb; double lc; public: Triangle(double la, double lb, double lc) this-la=la; this-lb; this-lc; double getArea() double s=(la+lb+lc)/2.0; return sqrt(s*(s-la)
13、*(s-lb)*(s-lc); ; viod main() Figure* figures3= new Triangle(2,3,3), new Rectangle(5,8), new Square(5); for(int i=0;i3;i+) cout“figures“i“area=“(figuresi)-getarea()endl; (分数:15.00)_六、B试题六/B(总题数:1,分数:15.00)6.【说明】StringEditor 类的功能是:已知一个字符串,返回将字符串中的非字母字符都删除后的字符串。 publicU (1) /U public static String rem
14、oveNonLetters(U (2) /U) StringBuffer aBuffer=U (3) /U; char aCharacter; for(int i=0; ioriginal.length();i+) aCharacter=U (4) /U; if(Character.isLetter(aCharacter) aBuffer.append(U (5) /U); return new String(aBuffer); public class StringEditorTester public static void main(String args) String origina
15、l=“Hi!, My Name is Mark, 234I think you are my classmate?!“; System.out.println(StringEditor.removeNonLetters(original); (分数:15.00)_中级软件设计师下午试题-13 答案解析(总分:80.00,做题时间:90 分钟)一、B试题一/B(总题数:1,分数:15.00)1.【说明】 A 公司决定开发一套公共交通自动售票系统,系统要求如下所述。 (1)乘客能按以下 3 步操作购票:选定目的地,投入钱币,获得一张票。 (2)并且仅当乘客选定目的地后,系统才接收投钱;每次投入的钱
16、只购买一张票。 (3)只要投入的钱不少于所需的票价,且票库中有所要求的票,则应尽快出票。 (4)如需找钱,则在出票的同时应退还多余的钱。 (5)如果乘客投入的钱不够票价,或者票库中没有所需要的票时,系统将全额退钱,并允许乘客另选目的地,继续购票。 (6)出票前乘客可以单击“取消”按钮取消购票,系统将全额退出该乘客投入的钱,并允许乘客另选目的地,继续购票。 (7)出票结束(包括退还多余的钱)后,系统应保存销售记录,并等待乘客购票。 该系统还要求快速响应和操作同步,所以它应是一个实时系统。为此,A 公司在该系统的数据流程图中附加了过程控制部分,形成转换图。在该图中,控制流(事件流)用虚 线表示,数
17、据流用实线表示。图中的数据流并没有画全,需要考生填补。 对售票全过程进行的控制可以用系统内部各个状态之间的迁移来描述,从而形成状态迁移图。在状态迁移图中,用双线框表示状态,用有向边表示状态的迁移。引起状态迁移的事件以及由该事件引起的动作,在有向边旁用“ ”形式注明。 该公司还制定了一个过程启动表,用以表明状态迁移图中的 4 个动作与转换图中的 4 个过程之间的“启动”关系,即说明哪个动作将启动哪个过程。用 1 表示启动,用 0 表示不启动。启动的过程将根据获得的输入数据产生输出数据,未唐动的过程则不会产生输出数据,该表中没有列出的过程,其执行与否与事件无关。 (分数:15.00)_正确答案:(
18、)解析:解析 这道考题的题型比较特殊,但仍可以参考常考的数据流程图的解题思路。应全面细致地阅读试题说明、转换图和状态迁移图,体会系统的实际运行场景,以帮助顺利地解题。 问题 1 已经明确指出转换图中缺少 3 条数据流,而从直观上看,“核查”处于核心位置,它还非常显著地同全部 3 个文件有关。当然,有些考生不一定有这种直接看出关键点的技能,但是对于具有扎实软件工程理论基础和实际系统设计经验的人员,在经过一定的考试训练后,应该具有这种技能。下面具体分析。 系统的使用者乘客与系统之间的活动有选择目的地、投钱、出票。首先应该按照这 3 个活动去解答第 1 个问题。 乘客选择目的地应该经过核查,防止错误
19、和异常,但这一点在转换图中没有画出。 乘客投钱,系统接到钱后应核查,如果正确(不是假币,规定面值的纸币,面值不低于票价),系统将进入后面的出票流程。如果是规定的面值且面值大于票价,同时还要进入退还钱(找零)的流程。 在中,如果系统对钱核查后发现不正确(假币,不是规定的面值,面值低于票价),系统将进入退还钱的流程。 出票时也应该核查,这一点在转换图中已经画出。现在,已经找到了缺少的 3 条数据流。 将上述 3 条数据流补充到转换图中,在以“核查”为中心的转换图中,每个输入数据流/输出数据流都经过“核查”的检测。系统设计师们应该具有这样的设计思想:“核查”是系统中必须的、核心的、决定系统健壮性的功
20、能。 给出的状态图是一个完整的循环流程,正常过程中,状态“正在接受投钱”后,应该接下去是出票,但事件 a 导致“退钱”事件发生,在说明中已经很明确给出,是乘客按“取消”按钮。 按照问题 1 中的分析,知道“接受投钱”后,系统经过“核查”,如果正确,就可以“出票”,所以 b 是“核查正确”。 出票结束后,该乘客的事务已经完成,系统将进入下一个乘客事务的等待,所以 c 应该是“出票结束”。 对于问题 3,应该按照已经补充完的转换图和状态迁移图,及过程启动表中的规则进行分析,可以很容易得出解答。d 是1001,e 是 1100。二、B试题二/B(总题数:1,分数:5.00)2.【说明】 学校中有若干
21、系,每个系有若干班级和教研室,每个教研室有若干教员,其中有的教授和副教授各带有若干研究生;每个班有若干学生,每个学生选修若干课程,每门课可由若干学生选修。 【问题 1】 用 E-R 图画出此学校的概念模型,用文字写出各实体和联系的属性。 【问题 2】 将 E-R 图转换成关系模型。 【问题 3】 指出各关系模型的候选键。(分数:5.00)_正确答案:()解析:【问题 1】 用 E-R 图表示的概念模型如下所示。 三、B试题三/B(总题数:1,分数:15.00)3.【说明】 (1)这是一个图书馆支持系统。 (2)图书馆应用系统可以将图书和杂志借给借书者,这些借书者已经在系统中注册了,图书和杂志也
22、已经注册过了。 (3)图书馆负责新书的购买,一本流行图书会多买几本。当旧书和杂志已经过时或破旧不堪时,将它们从图书馆应用系统中删除。 (4)图书馆馆员是图书馆的员工。他们与客户(借书者)打交道,并且是在图书馆软件系统提供的支持下开展工作的。 (5)借书者可以预订图书馆中当前还没有的图书或杂志,这样,当某借书者所预订的图书或杂志归还回来或购进时,应用系统就通知这个预订人。当该借书者借阅了他所预订的图书或杂志后,或者通过一个显式的取消过程取消他的预订后,他的本次预订就被取消了。 (6)图书馆应用系统能够容易地建立、修改和删除系统中的信息,包括书名、借书者、借阅信息和预订信息。 (7)图书馆应用系统
23、能够在所有流行的 Web 浏览器平台(Internet Explorer 5.1 以上,Netscape 4.0 以上等等)上运行。 (8)图书馆应用系统应该易于扩展新功能。 【问题】分析这个图书馆系统中涉及的角色和用例,完成用例图。 *(分数:15.00)_正确答案:()解析:参与者 1注册用户 参与者 2图书馆管理员 参与者 3借书者 参与者 4图书馆馆长 用例 1登录 用例 2搜索 用例 3浏览 用例 4管理借书者 用例 5管理书目 用例 6管理标题 用例 7担任借书者的身份 用例 8预订 用例 9取消预订 用例 10借书 用例 11还书 解析 由试题给出的用例图可以看到有 4 个参与者
24、,并且他们之间是泛化(继承)的关系,结合案例描述进行分析。 图书馆系统的参与者有图书管理员(Librarian)和借书者(Borrower),因为他们二者都是该系统的用户。图书管理员具有添加借书者、标题和书目这些管理能力,而借书者则是来借阅或预订图书和杂志的用户。偶尔,图书馆馆员或另一个图书馆也可能成为借书者。最后,我们有一个图书馆馆长(Master Librarian)这一参与者,这个角色具有管理其他图书馆馆员的能力。另外,在该图书馆有某本书籍的副本(一个书目)之前,先向该系统添加一个标题,这是可以的,目的是为了让借书者能够进行预订。 图书馆系统中的用例有以下这些: Login(登录) Se
25、arch(搜索) Browse(浏览) Make Reservation(预订) Remove Reservation(取消预订) Checkout Item(借书) Return Item(还书) Manage Titles(管理标题) Manage Items(管理书目) Manage Borrowers(管理借书者) Manage Librarians(图书管理员) Assume Identity of Borrower(担任借书者的身份) 上述列表中需要注意的是 Title(标题)和 Item(书目)这两个概念。因为在一个图书馆中,一本流行书通常有多本副本,所以系统必须把标题(可以是一
26、本书的名称、书的作者)和同一标题的一个单一物理副本(这是一个书目)的概念分开。从实用角度考虑,为了限制本题的复杂度,这里不完成某些“Manage(管理)”用例(例如 Manage Librarians 和 Manage Borrowers)的实现。四、B试题四/B(总题数:1,分数:15.00)4.【说明】 本程序在 33 方格中填入 1N(N10)内的某 9 个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。试求出满足这个要求的所有填法。33 方格中的每个方格按行按列(先行后列)序号排列为:0,1,2,3,4,5,6,7,8。 程序采用试探法,即从序号为 0 的方格开始,为当前方格
27、寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入整数;直至序号为 8 的方格也填入合理的整数后,就找到了一个解,将该解输出。再调整序号为 8 的方格所填整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组 check Matrix,存放需要进行合理性检查的相邻方格的序号。 # include stdio. h # define N 12 int bN+1; int pos; int a9;/* 用于存储诸方格所填入的整数*/ int AllNum=0;/* 统计
28、有多少种填法*/ int checkMatrix3= -1,0,-1,1,-1, 0,-1,1,3,-1,2,4,-1, 3,-1,4,6,-1,5,7,-1; void write(int a) int i, j; for(i=0; i3; i+) for(j=0; j3; j+) printf(“%3d“, a3*i+j); printf(“/n“); int isPrime(int m) int i; if(m=2)return 1; if(m=1 m%2=0)return 0; for(i=3; i*im;) if(m%i=0)return 0; i+=2; return 1; int
29、 selectNum(int start) int j; for(j=start; j=N; j+) if(bj)return j; return 0; int check()/*检查填入 pos 位置的整数是否合理*/ int i,j; for(i=0; (j=U (1) /U)=0; i+) if(!isPrime(apos+aj) U(2) /U; U(3) /U; extend ()/* 为下一方格找一个尚未使用过的整数*/ aU (4) /U=selectNum(1); bapos=0; void change ()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/ int j
30、; while(pos =0 if(pos0)return; bapos=1; apos=j; bj=0; int find () int ok=1; pos=0; apos=1; bapos=0; do if(ok) if(pos=8) write(a); change(); AllNum+;/* 统计有多少种填法*/ else extend(); else change(); ok=check(); while(pos=0); void main() int i; for(i=1; i=N; i+) bi=1; find(); prinrf(“共有%d 种不同填法!/n“, AllNum)
31、; (分数:15.00)_正确答案:()解析:解析 (1)checkMatrixposi 本处填空是在循环检查填入 pos 位置的整数是否合理,把与 pos相邻的数都求和判断是否为质数。 (2)return 0 若不是质数则返回 0,表示不可以。 (3)return 1 若相邻的数都是质数则返回 1,表示可以。 (4)+pos 本处填空是为下一个方格找一个尚未使用过的整数。 (5)apos+1 本处填空是在循环为当前方格找下一个尚未使用过的整数。五、B试题五/B(总题数:1,分数:15.00)5.【说明】 以下 C+程序的功能是计算三角形、矩形和正方形的面积并输出。程序由 4 个类组成:类Tr
32、iangle、Rectangle 和 Square 分别表示三角形、矩形和正方形;抽象类 Figure 提供了一个纯虚拟函数getArea(),作为计算上述 3 种图形面积的通用接口。 #includeiostream.b #includemath.h class Figure public: virtual double getArea0=0; /纯虚拟函数 ; class Rectangle:U (1) /U protected: double height; double width; public: Rectangle(); Rectangle(double height, doubl
33、e width) This-height=height; This-width=width; double getarea() returnU (2) /U; ; class Square:U (3) /U public: Square(double width) U (4) /U; ; class Triangle:U (5) /U double la; double lb; double lc; public: Triangle(double la, double lb, double lc) this-la=la; this-lb; this-lc; double getArea() d
34、ouble s=(la+lb+lc)/2.0; return sqrt(s*(s-la)*(s-lb)*(s-lc); ; viod main() Figure* figures3= new Triangle(2,3,3), new Rectangle(5,8), new Square(5); for(int i=0;i3;i+) cout“figures“i“area=“(figuresi)-getarea()endl; (分数:15.00)_正确答案:()解析:解析 (1)public Figure 本处由于 Rectangle 是派生类,需要公有继承 Figure。 (2)height*
35、width 或 width*height 或 this-height*this-width 或 this-width*this-height 本处是计算矩形的面积。 (3)public Rectangle 本处由于 Square 是派生类,需要公有继承 Rectangle。 (4)this-height=this-width=width 或 height=this-width=width 本处是正方形的构造函数,是给继承的 Rectangle 赋初值,由于正方形长等于宽,因此应该填入:this-height=this-width=width 或height=this-width=width。
36、(5)public Figure 本处由于 Triangle 是派生类,需要公有继承Figure,因此应该填入:public Figure。六、B试题六/B(总题数:1,分数:15.00)6.【说明】StringEditor 类的功能是:已知一个字符串,返回将字符串中的非字母字符都删除后的字符串。 publicU (1) /U public static String removeNonLetters(U (2) /U) StringBuffer aBuffer=U (3) /U; char aCharacter; for(int i=0; ioriginal.length();i+) aCh
37、aracter=U (4) /U; if(Character.isLetter(aCharacter) aBuffer.append(U (5) /U); return new String(aBuffer); public class StringEditorTester public static void main(String args) String original=“Hi!, My Name is Mark, 234I think you are my classmate?!“; System.out.println(StringEditor.removeNonLetters(o
38、riginal); (分数:15.00)_正确答案:()解析:解析 (1)class StringEditor 类 StringEditor 的头部。 (2)String original StringEditor类的方法 removeNonLetters 的形参是 String 类型。 (3)new StringBuffer(original.length() 动态生成一个 StringBuffer 类对象,长度是形参字符串 original 的长度。 (4)original.charAt(i) 取original 字符串的第 i 个字符。 (5)new Character(aCharacter) 将生成一个字母字符,值为aCharacter,添加到字符串 aBuffer 的尾部。