1、中级软件设计师下午试题-95 及答案解析(总分:102.99,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)说明一个新的音像商店准备向比较广泛的人群出租录像带和光碟。该商店的管理决定在计算机系统的支持下来运作。音像商店在货架上存放着题材广泛的当前流行的电影库。由于同一个电影片名可能有于不同的导演而有不同的版本,因此电影用电影代码区分,而不用电影片名;同一个版本有多份拷贝,因此音像制品用一个唯一的编号标识。某个特定的电影可以存放在录像带或光碟上,录像带和光碟的租金不同。录像带要么是Beta 格式要么是 VHS 格式;光碟为 DVD 格式,容量比较大,一张光碟可以存储同一电影片名
2、的不同版本。每个电影都有特定的租用期(用天表示),并带有在租用期内的租金。音像商店必须能够立即回答关于某个电影的库存和有多少供租用的带子或光碟。音像商店的店员负责定购音像、联系客户、音像上架,并对客户的询问给出答复。该系统采用面向对象方法开发,系统中的类以及类之间的关系用 UML 类图表示,图 1-1 是该系统的用例图,图 1-2 是该系统的类图的一部分。图 1-1图 1-2(分数:15.00)_二、试题二(总题数:1,分数:13.00)说明为了有效记录交通事故情况,欲设计一个交通事故记录系统。一辆汽车有一个唯一的“车牌号”,车主购买汽车时需要提供相关信息,包括身份证、姓名、年龄、性别、地址等
3、。一个车主可以拥有多辆汽车,而一辆汽车只有一个车主。驾驶员不一定是车主,因此记录交通事故时要记录驾驶员身份证号,同时记录事故发生时刻。图 2-1 描绘了人、汽车、交通事故三个实体类型及实体间联系的一个 E-R 图。图 2-1(分数:12.99)_三、试题三(总题数:1,分数:15.00)1.说明在数据链路层扩展局域网时使用网桥。网桥工作在数据链路层,它根据 MAC 帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能:当网桥收到一个帧时,并不是向所有的端口转发此帧,而是先检查此帧的目的 MAC 地址,然后确认将该帧转发到哪个端口。最简单的网桥有两个端口(即接口)。网桥的每个端口与一个网段相连。
4、每当收到一个帧时,通过查找转发表将收到的帧转发。当一个网桥刚刚连接到局域网上时,其转发表是空的,此时若收到一个帧,按照以下算法处理和建立自己的转发表:(1)从端口 x 收到的无差错的帧(如有差错即丢弃),在转发表中查找目的站 MAC 地址;(2)如有,则查找出到此 MAC 地址应走的端口 d,然后进行(3),否则转到(5);(3)如到这个 MAC 地址去的端口 d=x,则丢弃此帧(因为这表示不需要经网桥进行转发),否则从端口 d 转发此帧;(4)转到(6);(5)向网桥除 x 以外的所有端口转发此帧(这样做可以保证找到目的站);(6)如源站不在转发表中,则将源站 MAC 地址加入转发表,登记该
5、帧进入网桥的端口号,设置计时器,然后转到(8),如源站在转发表中,则执行(7);(7)更新计时器;(8)等待新的数据帧,转到(1)。这时,网桥就在转发表中登记以下三个信息:站地址登记收到帧的源 MAC 地址、端口登记收到的帧进入该网桥的端口号、时间登记收到的帧进入该网桥的时间。现有五个工作站分别连接在三个局域网上,并且用两个网桥连接起来,如图 3-1。每一个网桥的两个端口号都标明在图上。在一开始,两个网桥中的转发表都是空的。以后有以下各站向其他的站发送了数据帧,即 H1 发送给 H5,H3 发送给 H2,H4 发送给 H3,H2 发送给 H1。图 3-1(分数:15.00)_四、试题四(总题数
6、:1,分数:15.00)说明在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树。程序构造一棵二叉排序树,每个节点存储一个单词,按字典序列,较小的在左子树,较大的在右子树。函数中使用的预定义符号如下:typedef struct TreeNode/*二叉排序树节点*/char *word;struct TreeNode *left, *right;BNODE;函数int getWord(FILE *fpt, char *word)/*从文件 fpt 中读取单词到 word 中,到达文件结束时返回 0*/char c
7、;c = fgetc(fpt);if(c = EOF)return 0;/*跳过单词间的非字母字符*/while(!(tolower(c) = a ptr = (BNODE*)malloc(sizeof ptr);ptr-left = ptr-right = NULL;ptr-word = (char*)malloc(strlen(word) + 1);strcpy(ptr-word, word);if(p = NULL)(4) ;else if(compres 0)p-right = ptr;elsep-left = ptr;int main()FILE *fpt;char word40;B
8、NODE *root = NULL;if(fpt = fopen(“text.in“, “r“) = NULL)printf(“不能打开文件 text.in! /n“);return 1;while(getWord(fpt, word) = 1)BTree (5) ;fclose(fpt);return 0;(分数:15.00)_五、试题五(总题数:1,分数:15.00)说明任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。以下是一个“剪刀石头布”游戏
9、。猜拳时的“策略”有 2 种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式中,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了 Hand 类表示猜拳时的“手势”,类内部以 0(石头)、1(剪刀)、2(布)来表示。Hand 类的实例只会产生 3 个。以下是 C+语言实现,能够正确编译通过。C+代码class Handprivate:int handvalue;static Hand *hand0;static Hand *hand1;static Hand *hand2;(1) ;Hand(int handva
10、lue)this-handvalue = handvalue;public:(2) Hand* getHand(int handvalue)/*省略具体实现*/;Hand *Hand:hand0 = new Hand(0);Hand *Hand:hand1 = new Hand(1);Hand *Hand:hand2 = new Hand(2);class Strategypublic:(3) Hand* nextHand() = 0;class WinningStrategy : public Strategyprivate:bool won;Hand *prevHand;public:wi
11、nningStrategy()won = false;Hand* nextHand()if(!won)prevHand = Hand:getHand(rand()%3);return prevHand;class probstrategy : public Strategypublic:Hand* nextHand()int handvalue = 0;/*省略具体实现*/return Hand:getHand(handvalue);class Playerprivate:string name;Strategy* strategy;public:Player(string name, (4)
12、 strategy)this-name = name;this-strategy = strategy;Hand *nextHand()(/向战略请示手势return (5) ;(分数:15.00)_六、试题六(总题数:1,分数:15.00)说明任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。以下是一个“剪刀石头布”游戏。猜拳时的“策略”有 2 种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种
13、,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了 Hand 类表示猜拳时的“手势”,类内部以 0(石头)、1(剪刀)、2(布)来表示。Hand 类的实例只会产生 3 个。以下是 Java 语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。Java 代码/Hand.java 文件public class Handpublic static final int HANDVALUE_GUU = 0; /石头public static final int HANDVALUE_CHO = 1; /剪刀public static final int
14、HANDVALUE_PAA = 2; /布public static final Hand hand = new Hand(HANDVALUE_GUU),new Hand(HANDVALUE_CHO),new Hand(HANDVALUE_PAA),;private int handvalue;(1) Hand(int handvalue)this.handvalue = handvalue;public (2) Hand getHand(int handvalue)(/从值取得对象实例return handhandvalue;/Strategy.java 文件public interface
15、 Strategypublic (3) Hand nextHand();/ProbStrategy.java 文件import java.util.Random;public class ProbStrategy implements Strategypublic Hand nextHand()int handvalue = 0;/*省略具体实现*/return Hand.getHand(handvalue);/WinningStrategy.java 文件import java.util.Random;public class WinningStrategy implements Strat
16、egy /*省略了不相关属性*/public Hand nextHand()if(!won)prevHand = Hand.getHand(random.nextInt(3);return prevHand;/Player.java 文件public class Player private String name;private Strategy strategy;public Player(String name, (4) strategy)this.name = name;this.strategy = strategy;public Hand nextHand()/向战略请示手势ret
17、urn (5) ;(分数:15.00)_七、试题七(总题数:1,分数:15.00)说明任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。以下是一个“剪刀石头布”游戏。猜拳时的“策略”有 2 种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了 Hand 类表示猜拳时的“手势”,类内部以 0(石头)、1(剪刀)、2(布)来
18、表示。Hand 类的实例只会产生 3 个。以下是 C 语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。C 代码typedef (1) (*funl)();enum HandValueHANDVALUE_GUU=0, HANDVALUE_CHO=1, HANDVALUE_PAA=2;/手势可取值,依次为“石头”、“剪刀”、“布”/其大小顺序是循环相克的,即:石头赢剪刀,剪刀赢布,布赢石头bool won;struct Hand *WSprevHand;struct Hand/手势enum HandValue handvalue;hand3=HANDVALUE_GUU,
19、HANDVALUE_CHO, HANDVALUE_PAA;int fight(struct Hand *h1, struct Hand *h2)/比较 h1 和 h2。h1 代表的手势较大时返回 1,h1 较小时返回-1,相等时返回 0/if(h1-handvalue = h2-handvalue)return 0;else if(h1-handvalue+1)% (2) = h2handvalue)return 1;elsereturn -1;struct Hand* getHand(int handvalue)/依据手势代表的值取得手势,若 handvalue 不合法,返回 NULLswi
20、tch(handvalue)case 0:return break;case 1:return bteak;case 2;return break;return (3) ;struct Strategy/策略funl nextHand;/下一个手势;struct Hand* WSnextHand()if(!won)PSprevHand = getHand(rand()%3);return PSprevHand;struct Playerchar name20;(4) strategy;/策略int wincount;int losecount;int gamecount;void main()
21、Strategy WS;WS.nextHand = WSnextHand;WSpreVHand = NULL;struct Player WSplayer;(5)(WSplayer.name,“ww“);WSplayer.wincount = 0;WSplayer.losecount = 0;WSplayer.gamecount = 0;WSplayer.strategy = (分数:15.00)_中级软件设计师下午试题-95 答案解析(总分:102.99,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)说明一个新的音像商店准备向比较广泛的人群出租录像带和光碟。该商店的管理决定
22、在计算机系统的支持下来运作。音像商店在货架上存放着题材广泛的当前流行的电影库。由于同一个电影片名可能有于不同的导演而有不同的版本,因此电影用电影代码区分,而不用电影片名;同一个版本有多份拷贝,因此音像制品用一个唯一的编号标识。某个特定的电影可以存放在录像带或光碟上,录像带和光碟的租金不同。录像带要么是Beta 格式要么是 VHS 格式;光碟为 DVD 格式,容量比较大,一张光碟可以存储同一电影片名的不同版本。每个电影都有特定的租用期(用天表示),并带有在租用期内的租金。音像商店必须能够立即回答关于某个电影的库存和有多少供租用的带子或光碟。音像商店的店员负责定购音像、联系客户、音像上架,并对客户
23、的询问给出答复。该系统采用面向对象方法开发,系统中的类以及类之间的关系用 UML 类图表示,图 1-1 是该系统的用例图,图 1-2 是该系统的类图的一部分。图 1-1图 1-2(分数:15.00)_正确答案:(电影代码、电影片名、导演)解析:“由于同一个电影片名可能有于不同的导演而有不同的版本,因此电影用电影代码区分,而不用电影片名;同一个版本有多份拷贝,因此音像制品用一个唯一的编号标识。”,由此可得电影的主要属性:电影代码、电影片名、导演。注意:“编号”不是“电影”的属性,而是“音像制品”的属性。_正确答案:(A)“定购音像” (B)“联系客户”)解析:图 1-1 是该系统的用例图。根据题
24、述,“音像商店的店员负责定购音像、联系客户、音像上架,并对客户的询问给出答复”,易知缺失的用例为:“定购音像”和“联系客户”。_正确答案:( )解析:UML 中的关系有依赖、关联、泛化和实现。依赖(dependency)是两个事物之间的语义关系,其中一个事物发生变化会影响另一个事物的语义。关联是一种结构关系,聚集(aggregation)是一种特殊类型的关联,描述整体和部分之间的结构关系。泛化(generalization)是一种特殊/一般关系。实现(realization)是类元之间的语义关系,其中一个类元制定了由另一个类元保证执行的契约。“音像制品”是电影的载体,自然与“电影”有关联,关联
25、度是多少呢?先来看“音像制品”与“录像带”及“光碟”间的关系,“录像带”及“光碟”都是“音像制品”的不同存储格式,因此“录像带”及“光碟”都是“音像制品”的特殊化。再回到“音像制品”与“电影”的关联度,“录像带”只存储一个电影版本,而“光碟”可以存储多个版本,因此一个“音像制品”有一个或多个“电影”,一个“电影”可以存储于多个“音像制品”中(当然也可能没有)。一个“音像制品”对应多个“租用记录”,一个租用记录只对应一个“音像制品”。二、试题二(总题数:1,分数:13.00)说明为了有效记录交通事故情况,欲设计一个交通事故记录系统。一辆汽车有一个唯一的“车牌号”,车主购买汽车时需要提供相关信息,
26、包括身份证、姓名、年龄、性别、地址等。一个车主可以拥有多辆汽车,而一辆汽车只有一个车主。驾驶员不一定是车主,因此记录交通事故时要记录驾驶员身份证号,同时记录事故发生时刻。图 2-1 描绘了人、汽车、交通事故三个实体类型及实体间联系的一个 E-R 图。图 2-1(分数:12.99)_正确答案:(人:身份证汽车:车牌号 事故:(车牌号,身份证) 拥有:车牌号)解析:身份证号是唯一的,可作为人的主键。依题述,“一辆汽车有一个唯一的车牌号”,因此汽车关系的主键为:车牌号。一起事故自然与某量车(车牌号标识)相关,而“驾驶员不一定是车主”,因此还须记录驾驶员(身份证标识),故其主键为:(车牌号,身份证号)
27、。“一个车主可以拥有多辆汽车,一辆汽车只有一个车主”,因此拥有关系的主键为:车牌号。_正确答案:(1)NOT NULL (2)PRIMARY KEY(身份证号)解析:要求姓名列非空,故空(1)填 NOT NULL,列级约束。身份证号是该表的主键,创建表时需要声明,故空(2)应填 PRIMARY KEY(身份证号),是表级约束。声明主键也可以用列级约束实现,即在列后紧跟 NOT NULL 和 UNQUIE。_正确答案:(1)身份证号=“123456“ (2)IN (3)拥有 (4)EXISTS(5)拥有 (6)拥有.身份证号 = 事故.身份证号)解析:这里都是一些比较简单的小查询。空(1)处填身
28、份证号=“123456“,表示“身份证号为 123456”语意。空(2)填 IN。连接子查询的连接词有:IN、NOT IN、EXISTS、NOT EXISTS,根据语意,此处应为 IN。FROM之后应跟表名或视图名,根据语意,应该是从拥有表中选出满足条件的车牌号,故空(3)应填“拥有”。查询(3)要求车牌号是 123456、车主是驾驶员的事故记录,空(4)同空(2),据语意应填 EXISTS。空(5)同空(3),据语意可得应填“拥有”,车主信息是在拥有表中,事故时驾驶员信息是在事故表中,要求车主是驾驶员,则空(6)应为:拥有.身份证号 = 事故.身份证号,“拥有.身份证号”即为车主信息,“事故
29、.身份证号”即为事故时驾驶员信息。三、试题三(总题数:1,分数:15.00)1.说明在数据链路层扩展局域网时使用网桥。网桥工作在数据链路层,它根据 MAC 帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能:当网桥收到一个帧时,并不是向所有的端口转发此帧,而是先检查此帧的目的 MAC 地址,然后确认将该帧转发到哪个端口。最简单的网桥有两个端口(即接口)。网桥的每个端口与一个网段相连。每当收到一个帧时,通过查找转发表将收到的帧转发。当一个网桥刚刚连接到局域网上时,其转发表是空的,此时若收到一个帧,按照以下算法处理和建立自己的转发表:(1)从端口 x 收到的无差错的帧(如有差错即丢弃),在转发表
30、中查找目的站 MAC 地址;(2)如有,则查找出到此 MAC 地址应走的端口 d,然后进行(3),否则转到(5);(3)如到这个 MAC 地址去的端口 d=x,则丢弃此帧(因为这表示不需要经网桥进行转发),否则从端口 d 转发此帧;(4)转到(6);(5)向网桥除 x 以外的所有端口转发此帧(这样做可以保证找到目的站);(6)如源站不在转发表中,则将源站 MAC 地址加入转发表,登记该帧进入网桥的端口号,设置计时器,然后转到(8),如源站在转发表中,则执行(7);(7)更新计时器;(8)等待新的数据帧,转到(1)。这时,网桥就在转发表中登记以下三个信息:站地址登记收到帧的源 MAC 地址、端口
31、登记收到的帧进入该网桥的端口号、时间登记收到的帧进入该网桥的时间。现有五个工作站分别连接在三个局域网上,并且用两个网桥连接起来,如图 3-1。每一个网桥的两个端口号都标明在图上。在一开始,两个网桥中的转发表都是空的。以后有以下各站向其他的站发送了数据帧,即 H1 发送给 H5,H3 发送给 H2,H4 发送给 H3,H2 发送给 H1。图 3-1(分数:15.00)_正确答案:(网桥 1 的转发表 网桥 2 的转发表发送的帧站地址 端口 站地址 端口网桥 1 的处理网桥 2 的处理H1-H5 H1 1 H1 1 登记,转发 登记,转发H3-H2 H3 2 H3 1 登记,转发 登记,转发H4-
32、H3 H4 2 H4 2 登记,丢弃 登记,转发H2-H1 H2 1 登记,丢弃 收不到)解析:本题考察的是网桥的工作原理。网桥工作在数据链路层,它根据 MAC 帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能:当网桥收到一个帧时,并不是向所有的端口转发此帧,而是先检查此帧的目的 MAC 地址,然后确认将该帧转发到哪个端口。认真阅读建立转发表的算法不难解答该题。需要特别注意的是:步骤(6)是检查源站,而不是目的站,若源站不在转发表,将其加入,以后作为目的站地址待查。四、试题四(总题数:1,分数:15.00)说明在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和
33、定位的速度,通常都要画出与单词列表所对应的单词查找树。程序构造一棵二叉排序树,每个节点存储一个单词,按字典序列,较小的在左子树,较大的在右子树。函数中使用的预定义符号如下:typedef struct TreeNode/*二叉排序树节点*/char *word;struct TreeNode *left, *right;BNODE;函数int getWord(FILE *fpt, char *word)/*从文件 fpt 中读取单词到 word 中,到达文件结束时返回 0*/char c;c = fgetc(fpt);if(c = EOF)return 0;/*跳过单词间的非字母字符*/whi
34、le(!(tolower(c) = a ptr = (BNODE*)malloc(sizeof ptr);ptr-left = ptr-right = NULL;ptr-word = (char*)malloc(strlen(word) + 1);strcpy(ptr-word, word);if(p = NULL)(4) ;else if(compres 0)p-right = ptr;elsep-left = ptr;int main()FILE *fpt;char word40;BNODE *root = NULL;if(fpt = fopen(“text.in“, “r“) = NUL
35、L)printf(“不能打开文件 text.in! /n“);return 1;while(getWord(fpt, word) = 1)BTree (5) ;fclose(fpt);return 0;(分数:15.00)_正确答案:(ptr=*t)解析:_正确答案:(ptr-word)解析:_正确答案:(p=ptr)解析:_正确答案:(*t=ptr)解析:_正确答案:(static Hand *hand0;static Hand *hand1;static Hand *hand2;(1) ;Hand(int handvalue)this-handvalue = handvalue;publi
36、c:(2) Hand* getHand(int handvalue)/*省略具体实现*/;Hand *Hand:hand0 = new Hand(0);Hand *Hand:hand1 = new Hand(1);Hand *Hand:hand2 = new Hand(2);class Strategypublic:(3) Hand* nextHand() = 0;class WinningStrategy : public Strategyprivate:bool won;Hand *prevHand;public:winningStrategy()won = false;Hand* nex
37、tHand()if(!won)prevHand = Hand:getHand(rand()%3);return prevHand;class probstrategy : public Strategypublic:Hand* nextHand()int handvalue = 0;/*省略具体实现*/return Hand:getHand(handvalue);class Playerprivate:string name;Strategy* strategy;public:Player(string name, (4) strategy)this-name = name;this-strategy = strategy;Hand *nextHand()(/向战略请示手势return (5) ;(分数:15.00)_正确答案:(1)private)解析:_正确答案:(