上半年 软件设计师下午试题分析与解答.docx
《上半年 软件设计师下午试题分析与解答.docx》由会员分享,可在线阅读,更多相关《上半年 软件设计师下午试题分析与解答.docx(28页珍藏版)》请在冰豆网上搜索。
上半年软件设计师下午试题分析与解答
2008年上半年软件设计师下午试题分析与解答
试题一(共15分)
阅读以下说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
某音像制品出租商店欲开发一个音像管理信息系统,管理音像制品的租借业务。
需求如下:
1.系统中的客户信息文件保存了该商店的所有客户的用户名、密码等信息。
对于首次来租借的客户,系统会为其生成用户名和初始密码。
2.系统中音像制品信息文件记录了商店中所有音像制品的详细信息及其库存数量。
3.根据客户所租借的音像制品的品种,会按天收取相应的费用。
音像制品的最长租借周期为1周,每位客户每次最多只能租借6件音像制品。
4.客户租借某种音像制品的具体流程如下。
(1)根据客户提供的用户名和密码,验证客户身份。
(2)若该客户是合法客户,查询音像制品信息文件,查看商店中是否还有这种音像制品。
(3)若还有该音像制品,且客户所要租借的音像制品数小于等于6个,就可以将该音像制品租借给客户。
这时,系统给出相应的租借确认信息,生成一条新的租借记录并将其保存在租借记录文件中。
(4)系统计算租借费用,将费用信息保存在租借记录文件中并告知客户。
(5)客户付清租借费用之后,系统接收客户付款信息,将音像制品租借给该客户。
5.当库存中某音像制品数量不能满足客户的租借请求数量时,系统可以接受客户网上预约租借某种音像制品。
系统接收到预约请求后,检查库存信息,验证用户身份,创建相应的预约记录,生成预约流水号给该客户,并将信息保存在预约记录文件中。
6.客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。
若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。
(a)
(点击查看大图)(b)
【问题1】
图(a)中只有一个外部实体E1。
使用【说明】中的词语,给出E1的名称。
【问题2】
使用【说明】中的词语,给出图(b)中的数据存储D1~D4的名称。
【问题3】
数据流图(b)缺少了3条数据流,根据说明及数据流图(a)提供的信息,分别指出这3条数据流的起点和终点。
起点
终点
【问题4】
在进行系统分析与设计时,面向数据结构的设计方法(如Jackson方法)也被广泛应用。
简要说明面向数据结构设计方法的基本思想及其适用场合。
试题一分析
本题考查数据流图的设计和应用。
根据题目说明,本系统的外部实体仅仅涉及到客户,因此系统的顶层数据流图中E1应该对应为客户。
题目的第二个问题在于识别系统中的数据文件D1~D4,根据0层数据流图中的数据文件与处理之间的关系分析可以得知:
D1为创建新客户加工的输出,并且为加工1、6和7的输入,再根据题目中的描述,客户信息文件与创建客户信息、预约、归还和履行预约都相关,因此D1便是客户信息文件。
同理可分析出D2为音像制品信息文件、D3为租借记录文件、D4为预约记录文件。
图(b)中缺少了3条数据流,我们先检查顶层数据流图和0层数据流是否一致。
首先,从顶层数据流图中可以看出,与E1直接相关的数据流共有9条,而在0层数据流图中与E1直接关联的只有7条,因此可以直接断定,图(b)中至少缺少直接与E1相关的两条数据流:
新客户创建请求和预约流水号。
新客户创建请求通过创建新客户加工将客户的信息写入客户信息文件中,因此其起点和终点分别为:
E1和4。
同理,预约流水号的起点和终点为5和E1。
在说明中,客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。
若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。
因此,在客户归还和履行预约服务之间存在着数据上的联系。
面向数据结构的设计方法以数据结构作为设计的基础,它根据输入/输出数据结构导出程序的结构。
面向数据结构的设计方法用于规模不大的数据处理系统。
参考答案
【问题1】
E1:
客户
【问题2】
D1:
客户信息文件D2:
音像制品信息文件
D3:
租借记录文件D4:
预约记录文件
【问题3】
起点
终点
E1或客户
4或创建新客户
5或创建预约记录
E1或客户
6或归还音像制品
7或履行预约服务
注意:
3条数据流无前后顺序区分。
【问题4】
面向数据结构的设计方法以数据结构作为设计的基础,它根据输入/输出数据结构导出程序的结构。
面向数据结构的设计方法用于规模不大的数据处理系统。
试题二(共15分)
阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
某地区举行篮球比赛,需要开发一个比赛信息管理系统来记录比赛的相关信息。
【需求分析结果】
1.登记参赛。
球队的信息。
记录球队的名称、代表地区、成立时间等信息。
系统记录球队每个队员的姓名、年龄、身高、体重等信息。
每个球队有一个教练负责管理球队,一个教练仅负责一个球队。
系统记录教练的姓名、年龄等信息。
2.安排球队的训练信息。
比赛组织者为球队提供了若干块场地,供球队进行适应性训练。
系统记录现有的场地信息,包括:
场地名称、场地规模、位置等信息。
系统可为每个球队安排不同的训练场地,如下表所示。
系统记录训练场地安排的信息。
球队名称
场地名称
训练时间
解放军
一号球场
2008-06-0914:
00-18:
00
解放军
一号球场
2008-06-1209:
00-12:
00
解放军
二号球场
2008-06-1114:
00-18:
00
山西
一号球场
2008-06-1009:
00-12:
00
3.安排比赛。
该赛事聘请专职裁判,每场比赛只安排一个裁判。
系统记录裁判的姓名、年龄、级别等信息。
系统按照一定的规则,首先分组,然后根据球队、场地和裁判情况,安排比赛(每场比赛的对阵双方分别称为甲队和乙队)。
记录参赛球队名称、比赛时间、比分、比赛场地等信息,如下表所示。
A组:
甲队——乙队
场地名称
比赛时间
裁判
比分
解放军——北京
一号球场
2008-06-1715:
00
李大明
天津——山西
一号球场
2008-06-1719:
00
胡学梅
B组:
甲队——乙队
场地名称
比赛时间
裁判
比分
上海——安徽
二号球场
2008-06-1715:
00
丁鸿平
山东——辽宁
二号球场
2008-06-1719:
00
郭爱琪
4.所有球员、教练和裁判可能出现重名情况。
【概念模型设计】
根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下:
1.实体联系图(图2-1)
2.关系模式
教练(教练编号,姓名,年龄)
队员(队员编号,姓名,年龄,身高,体重, (a) )
球队(球队名称,代表地区,成立时间, (b) )
场地(场地名称,场地规模,位置)
训练记录( (c) )
裁判(裁判编号,姓名,年龄,级别)
比赛记录( (d) )
【问题1】
根据问题描述,补充联系及其类型,完善实体联系图2-1。
(联系及其类型的书写格式参照教练与球队之间的联系描述,联系名称也可使用联系1、联系2、……)
【问题2】
根据实体联系图,填充关系模式中的(a)、(b)、(c)和(d),并给出训练记录和比赛记录关系模式的主键和外键。
【问题3】
如果考虑记录一些特别资深的热心球迷的情况,每个热心球迷可能支持多个球队。
热心球迷包括:
姓名、住址和喜欢的俱乐部等基本信息。
根据这一要求修改上图的实体联系图,给出修改后的关系模式(仅给出增加的关系模式描述)。
试题二分析
本题考查数据库概念结构设计及向逻辑结构转换的基本方法。
此类题目要求认真阅读题目对现实问题的描述,经过分类、聚集、概括等方法,从中确定实体及其联系。
题目已经给出了4个实体,需要根据需求描述,给出实体间的联系。
由"每个球队有一个教练负责管理球队,一个教练仅负责一个球队。
"知球队与教练间为1∶1联系;球队与队员之间应为1∶N联系;多个球队使用多个训练场地,球队与场地之间为M∶M联系;比赛是球队、场地与裁判之间的联系,一个球队会与同组的其他多个队之间比赛,有多个场地和裁决,一位裁判会对多场比赛判罚,一个场地会有多场比赛,涉及多个球队和裁判,因此球队、场地与裁判之间的比赛关系为M∶N∶P联系。
根据补充后的E-R图,球队与球员之间的1∶N联系应通过将1端实体(球员)的主码(球队名称)加入到N端实体(球员)对应的关系中来表达。
这类联系也可通过独立的一个关系来表达,如球队-球员(球队名称,队员编号),这样会对查询增加多余的连接操作,因此一般不采用这种方法。
同样,球队与教练之间的1∶1联系也应通过将一方的主码增加到另一方实体对应的关系中,来表达联系。
训练和比赛为多对多联系,只能独立成一个关系模式,取与该联系相关联的各实体的码及联系自有的属性构成。
例如,比分和分组应该是比赛的属性,再加上球队、裁判、场地的码,即构成"比赛记录"的关系模式。
同理,训练是球队和场地的多对多联系,训练开始时间和结束时间为训练的属性,加上球队的码和场地的码,构成"训练记录"关系模式。
球迷与球队之间为多对多联系,需新增球迷实体和球迷与球队之间的支持联系。
参考答案
【问题1】
(对联系名称不做要求,但不能出现重名,图中的M、N、P也可表示为*)
【问题2】
(1)球队名称
(2)教练编号
(3)球队名称,场地名称,开始时间,结束时间
(4)甲队,乙队,比赛时间,场地名称,比分,裁判,分组
训练记录
主键
(球队,开始时间)或(场地名称,开始时间)
或(球队,结束时间)或(场地名称,结束时间)
外键
球队名称,场地名称
比赛记录
主键
(甲队,比赛时间)或(场地名称,比赛时间)
或(裁判,比赛时间)或(乙队,比赛时间)
外键
甲队,乙队,场地名称,裁判
【问题3】
关系模式:
热心球迷(球迷编号,姓名,住址,俱乐部)
支持球队(球迷编号,球队)
试题三(共15分)
阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
某汽车停车场欲建立一个信息系统,已经调查到的需求如下:
1.在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器,示意图如下:
2.当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。
当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。
3.在停车场内分布着若干个付款机器。
驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。
付清停车费之后,将获得一张出场卡,用于离开停车场。
4.当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。
如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。
若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。
5.系统自动记录停车场内空闲的停车位的数量。
若停车场当前没有车位,系统将在入口处显示"车位已满"信息。
这时,停车卡打印机将不再出卡,只允许场内汽车出场。
根据上述描述,采用面向对象方法对其进行分析与设计,得到了如下表所示的类/用例/状态列表、下图(a)所示的用例图、图(b)所示的初始类图以及图(c)所示的描述入口自动栏杆行为的UML状态图。
类/用例/状态列表
用例名
说明
类名
说明
状态名
说明
Carentry
汽车进入停车场
CentralComputer
停车场信息系统
Idle
空闲状态,汽车可以进入停车场
Carexit
汽车离开停车场
PaymentMachine
付款机器
Disable
没有车位
ReportStatistics
记录停车场的相关信息
CarPark
停车场,保存车位信息
AwaitEntry
等待汽车
进入
Barrier
自动护栏
Await
TicketTake
等待打印停车卡
Carentry
whenfull
没有车位时,汽车请求进入停车场
EntryBarrier
入口的护栏
AwaitEnable
等待停车场内有空闲
车位
ExitBarrier
出口的护栏
(a)用例图
(b)初始类图
(点击查看大图)(c)入口护栏的状态图
【问题1】
根据说明中的描述,使用上页表给出的用例名称,给出图(a)中U1、U2和U3所对应的用例。
【问题2】
根据说明中的描述,使用上页表给出的类的名称,给出图(b)中的A~D所对应 的类。
【问题3】
根据说明中的描述,使用上页表给出的状态名称,给出图(c)中S1~S4所对应的状态。
【问题4】
简要解释图(a)中用例U1和U3之间的extend关系的内涵。
试题三分析
本题考查面向对象设计基本知识和方法。
题目给出了4个用例,在4个用例中,两个用例表示汽车进入停车场,一个用例表示汽车退出停车场,另一个用例表示记录停车场相关信息。
经分析得出,前3个用例的参与者都是驾驶员,因此U1、U2和U3对应进入和退出停车场。
U1和U3之间存在扩展关系,而用例之间的延伸关系用于对被用户看作是可选系统行为的用例的一部分建模。
通过这种方式,可以把可选行为从必需的行为中分离出来。
Carentrywhenfull和Carentry之间就可以使用extend关系进行建模。
类图问题的回答比较容易,因为首先可以判断Barrier、EntryBarrier和ExitBarrier之间存在继承关系,而类图中表示继承关系的部分只有一处,因此这3个类分别对应B、C和D,而剩下的空A只有选择类CarPark了。
在状态图中,Idle表示有空闲车位,Disable表示没有空闲车位,因此在其之间存在双向的状态迁移,因此状态图上的状态S1为Idle状态。
当停车场存在空闲车位时,汽车请求进入停车场,根据说明描述"当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡",可知在该动作正对应于状态图上的S1和状态S2之间的迁移,因此,状态S2表示的含义应该是按下按钮后状态,此时,驾驶员等待打印停车卡,所以,状态S2为AwaitTicketTake。
同理可分析出状态S3和状态S4。
参考答案
【问题1】
U1:
Carentry U2:
Carexit U3:
Carentrywhenfull
【问题2】
A:
CarPark B:
Barrier C:
EntryBarrier
D:
ExitBarrier
其中,C、D的答案可以互换
【问题3】
S1:
Idle S2:
AwaitTicketTake S3:
AwaitEnable S4:
AwaitEntry
【问题4】
用例之间的延伸关系用于对被用户看作是可选系统行为的用例的一部分建模。
通过这种方式,可以把可选行为从必需的行为中分离出来。
试题四(共15分)
阅读下列说明,回答问题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:
待排序数组
p,r:
数组元素下标,从p到r
q:
划分的位置
x:
枢轴元素
i:
整型变量,用于描述数组下标。
下标小于或等于i的元素的值小于或等于枢轴元素的值
j:
循环控制变量,表示数组元素下标
QUICKSORT(A,p,r){
if(pq=PARTITION(A,p,r);
QUICKSORT(A,p,q-1);
QUICKSORT(A,q+1,r);
}
}
PARTITION(A,p,r){
x=A[r]; i=p-1;
for(j=p; j≤r-1; j++){
if(A[j]≤x){
i=i+1;
交换A[i]和A[j]
}
}
交换
(1)和
(2) //注:
空
(1)和空
(2)答案可互换,但两空全部答对方可得分
return (3)
}
【问题2】
(1)假设要排序包含n个元素的数组,请给出在各种不同的划分情况下,快速排序的时间复杂度,用O记号。
最佳情况为(4),平均情况为(5),最坏情况为(6)。
(2)假设要排序的n个元素都具有相同值时,快速排序的运行时间复杂度属于哪种情况?
(7)。
(最佳、平均、最坏)
【问题3】
(1)待排序数组是否能被较均匀地划分对快速排序的性能有重要影响,因此枢轴元素的选取非常重要。
有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素,下面是随机化快速排序划分的伪代码--利用原有的快速排序的划分操作,请填充其中的空缺处。
其中,RANDOM(i,j)表示随机取i到j之间的一个数,包括i和j。
RANDOMIZED-PARTITION(A,p,r){
i=RANDOM(p,r);
交换 (8) 和(9);//注:
空(8)和空(9)答案可互换,但两空全部答对方可得分
returnPARTITION(A,p,r);
}
2)随机化快速排序是否能够消除最坏情况的发生?
(10)。
(是或否)
试题四分析
本题考查算法的设计与分析技术。
问题1考查快速排序算法的伪代码,快速排序最核心的处理是进行划分,即PARTITION操作,根据枢轴元素的值,把一个较大的数组分成两个较小的子数组,一个子数组的所有元素的值小于等于枢轴元素的值,一个子数组的所有元素的值大于枢轴元素的值,而子数组内的元素不排序。
划分时,以最后一个元素为枢轴元素,从左到右依次访问数组的每一个元素,判断其与枢轴元素的大小关系,并进行元素的交换,如图4-1所示:
(点击查看大图)图4-1 PARTITION操作
在问题1给出的伪代码中,当循环结束后,A[p..i]中的值应小于等于枢轴元素值x,而A[i+1..r-1]中的值应大于枢轴元素值x。
此时A[i+1]是第一个比A[r]大的元素,因此A[r]与A[i+1]交换,得到划分后的两个子数组。
PARTITION操作返回枢轴元素的位置,因此返回值为i+1。
问题2考查的是快速排序算法的时间复杂度分析。
当每次能作均匀划分时,算法为最佳情况,此时时间复杂度可以通过计算递归式
得到时间复杂度为
当每次为极端不均匀划分时,即长度为n的数组划分后一个子数组为n-1,一个为0,算法为最坏情况,此时时间复杂度可以通过计算递归式
得到时间复杂度为
平均情况的分析较为复杂,我们可以假设数组每次划分为
此时时间复杂度可以通过计算递归式
得到时间复杂度为
因此在平均情况下快速排序仍然有较好的性能,时间复杂度为
当所有的n个元素具有相同的值时,可以认为数组已经有序,此时每次都划分为长度为n-1和0的两个子数组,属于最坏情况。
问题3中,由于随机化的快速排序的划分调用了传统的快速排序算法的PARTITION操作,而传统的划分每次以数组的最后一个元素作为枢轴元素,因此,随机化的划分操作中每次先随机获得一个元素,将其与最后一个元素交换。
随机化的快速排序消除了输入数据的不同排列对算法性能的影响,降低了极端不均匀划分的概率,但不能保证不会导致最坏情况的发生。
参考答案
【问题1】
(1)A[i+1]
(2)A[r] (3)i+1
注:
空
(1)和空
(2)答案可以互换
【问题2】
【问题3】
(8)A[i] (9)A[r] (10)否
注:
空(8)和空(9)答案可以互换
试题五(共15分)
阅读下列说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
栈(Stack)结构是计算机语言实现中的一种重要数据结构。
对于任意栈,进行插入和删除操作的一端称为栈顶(StackTop),而另一端称为栈底(StackBottom)。
栈的基本操作包括:
创建栈(NewStack)、判断栈是否为空(IsEmpty)、判断栈是否已满(IsFull)、获取栈顶数据(Top)、压栈/入栈(Push)、弹栈/出栈(Pop)。
当设计栈的存储结构时,可以采取多种方式。
其中,采用链式存储结构实现的栈中各数据项不必连续存储(如下图所示)。
以下C代码采用链式存储结构实现一个整数栈操作。
【C代码】
typedefstructList{
intdata; //栈数据
structList*next; //上次入栈的数据地址
}List;
typedefstructStack{
List*pTop; //当前栈顶指针
}Stack;
Stack*NewStack(){return(Stack*)calloc(1,sizeof(Stack));}
intIsEmpty(Stack*S){//判断栈S是否为空栈
if(
(1))return1;
return0;
}
intTop(Stack*S){//获取栈顶数据。
若栈为空,则返回机器可表示的最小整数
if(IsEmpty(S))returnINT_MIN;
return
(2);
}
voidPush(Stack*S,inttheData){//将数据theData压栈
List*newNode;
newNode=(List*)calloc(1,sizeof(List));
newNode->data=theData;
newNode->next=S->pTop;
S->pTop= (3);
}
voidPop(Stack*S) {//弹栈
List*lastTop;
if(IsEmpty(S))return;
lastTop=S->pTop;
S->pTop= (4);
free(lastTop);
}
#defineMD(a) a<<2
intmain(){
inti;
Stack*myStack;
myStack=NewStack();
Push(myStack,MD
(1));
Push(myStack,MD
(2));
Pop(myStack);
Push(myStack,MD(3)