2005下半年软件设计师考试真题及答案-下午卷
试题一
阅读下列说明和图,回答问题1~问题3。
[说明]
某公司的主要业务是出租图书和唱碟。由于业务需求,该公司委托软件开发公司A开发一套信息管理系统。
该系统将记录所有的图书信息、唱碟信息、用户信息、用户租借信息等。A公司决定采用面向对象的分析和设计方
法开发此系统。图1-1所示为某类图书或唱碟被借阅时应记录的信息,图1-2描述了系统定义的两个类Book和CD,分
别表示图书和唱碟的信息。
1、[问题1]
经过进一步分析,设计人员决定定义一个类Items on loan,以表示类Book和CD的共有属性和方法。请采用
图1-2中属性和方法的名称给出类Items_on_loan应该具有的属性和方法(注意:不同名称的属性和方法表示不同的
含义,如CD中的composer与 Book甲的author无任何关系)。
1
2、[问题2]
为了记录每种图书或唱碟租借的历史记录,引入类CirculationHistory,类中存储的信息是图1-1中所表示
的内容。请采用UML表示法将下列四个类间的关系表示出来。
3、[问题3]
现需了解十大最畅销(借出次数最多)图书或唱碟。为此,引入TenPopulate类以存储所有十大畅销图书或CD
的名称及其被借出的次数。下列顺序图描述了某类图书或唱碟被借出后成为十大畅销图书或唱碟时对象间的消息交
互。系统在一次运行过程中,应有 (1) 个TenPopulate实例对象最合适,一个TenPopulate类实例对象最多需
要和 (2) 个Items_on_loan实例对象交互。
试题二
试题二
阅读下列说明和图,回答问题1至问题3。
[说明]
2
某企业决定开发一个企业仓储管理系统,山李工承担系统的设计工作。该系统的网络连接如图2-1所示。
[图2-1]
该企业有多个仓库,图2-1所示的中心数据库存储了各个仓库中每种货物的库存信息。每个仓库配备一台前
端机,进出货物均由前端机辅助实现。管理员每天上班时,通过前端机从中心数据库的库存表中读取本仓库各种货
物的库存数,每个仓库的当日业务数据也都暂存在前端机,当天业务结束后,再将前端机中存储的数据传输到主机
进行存储与汇总。
每个仓库可以存放多种货物,但同一种货物不能存放在不同的仓库中。每个仓库有多个管理员,但每个管理
员只管理一个仓库。货物出库/入库时,由仓库管理员将货物的条码通过阅读器输入前端机中,货物数量的默认值
为1,可以由管理员修改。前端机根据输入的货物信息,打印“出库/入库”清单。出库/入库单中同一种货物最多
只出现一次,每份出库/入库单由流水号唯一标识。图2-2是一个出库单的实例。
[图2-2]
2005-10-01 13:22
流水号;200408080001300101
时间:
货物编码
货物名称
单价
6900100180988
全自动洗衣机
1680.00
6900100170655
32寸彩色电视机
7580.00
6901100160126
1P空调
1360.00
数量
26
20
60
管理员:
01105
出库/入库:出库
该系统处理业务的过程如下。
1.初始化:前端机根据仓库号从货物表中读取本仓库中每种货物的货物编码、库存量、货物名称和单价;
2.登记出库/入库信息:由前端机存储每一笔“出库从库”记录:
3.汇总:在每个工作日结束前汇总当日各种货物的“出库/入库”量至日汇总表;
4.更新库存表:根据当日的汇总信息更新货物的库存。
李工经过分析,设计出如图2-3所示的关系模式。
[图2-3]
出入库单(流水号,出入库标志,管理员号,时间)
出入库记录(货物编码,数量,流水号)
3
日汇总表(日期,货物编码,数量,出入库标志)
仓库(仓库号,仓库名,仓库电话)
管理员(管理员号,姓名,仓库号)
货物(
(a)
)
注:时间格式为年-月-日时:分;日期格式为年-月-日。
卖体联系图的表示方法如图2-4所示,其中方框表示实体,菱形表示联系,联系的类型在实体与联系的边上
标出。图2-5为与该系统对应的实体联系图。
[图2-4]
[图2-5]
4、[问题1]
根据题意,补充图2-3中(a)处的空缺,即货物关系模式的属性。
5、[问题2]
根据题意,补充图2-5中缺失的联系和联系的类型,使其成为完善的实体联系图。其中,联系名分别取名为
联系1,联系2,联系3,……。
6、[问题3]
写出每种关系模式的主键。
试题三
试题三
4
阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。
[说明]
某公司计划与客户通过Internet交换电子邮件和数据(以下统一称为“消息”)。为保障安全,在对传输的数
据进行加密的同时,还要对参与通信的实体进行身份认证。因此,需同时使用对称与非对称密钥体系。图3-1描述
了接收者B使用非对称密钥体系对发送者A进行认证的过程。
[图3-1]
图3-2描述了发送和接收消息的过程,其中的认证过程使用了图3-1中的方法。图3—1中的方框a和方框b与图
3-2中的方框a和方框b相同。
[图3-2]
图3-2中发送和接收消息的过程是:
1)发送者A使用与接收者B共享的对称密钥体系的密钥加密将要发送的消息。
2)为了实现身份认证,A使用与B共享的摘要算法生成消息摘要,并使用公钥密码体系把生成的消息摘要加密
后发送给B(这里假设A和B都能通过安全的方法获得对方的公钥)。
3)B使用非对称密钥体系解密收到的消息摘要,使用与A共享的对称密钥体系的密钥解密加密后的消息,再使
用与A共享的摘要算法针对解密后的消息生成消息摘要。
4)B对比自己生成的消息摘要与接收到的A发送的消息摘要是否相同,从而验证发送者A的身份。
5
7、[问题1]
请在下列选项中选择合适的答案,填入图3-1、图3-2的方框a和方框b。
B的公钥,B的私钥,摘要算法,A的私钥,A的公钥,会话密钥
8、[问题2]
请在下列选项中选择合适的答案,填入图3-2的方框c至方框f。
B的公钥,B的私钥,摘要算法,A的私钥,A的公钥,会话密钥
9、[问题3]
按照图3-2中的方法发送邮件时,使用不同的密码体制加密消息和消息摘要,请用 150字以内文字简要说明
这样做的理由。
10、[问题4]
请从下面关于摘要函数的说法中选出所有正确的描述。
[a]很容易使不同的输入数据生成相同的输出数据。
[b]根据输入数据获取输出数据的时间非常短。
[c]根据输入数据获取输出数据的时间非常长。
[d]输出数据的长度比输入数据的长度要长。
[e]根据输出数据无法还原出输入数据。
试题四
试题四
阅读下列函数说明、图和C代码,将应填入 (n) 处的字句。
6
[说明]
散列文件的存储单位称为桶(BUCKET)。假如一个桶能存放m个记录,当桶中已有 m个同义词(散列函数值相同)
的记录时,存放第m+1个同义词会发生“溢出”。此时需要将第m+1个同义词存放到另一个称为“溢出桶”的桶中。
相对地,称存放前m个同义词的桶为“基桶”。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先
在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。
11、例如:设散列函数为Hash(Key)=Key mod 7,记录的关键字序列为
15,14,21,87,97,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图4-1
所示。
[图4-1]
为简化起见,散列文件的存储单位以内存单元表示。
函数InsertToHashTable(int NewElemKey)的功能是:将元素NewEIemKey插入散列桶中,若插入成功则返回0,
否则返回-1。
采用的散列函数为Hash(NewElemKey)=NewElemKey % P,其中P为设定的基桶数目。
函数中使用的预定义符号如下:
#define NULLKEY
-1
/*散列桶的空闲单元标识*/
#define P
7
#define ITEMS
3
/*散列文件中基桶的数目*/
/*基桶和溢出桶的容量*/
typedef struct BucketNode{
/*基桶和溢出桶的类型定义*/
int KcyData[ITEMS];
struct BucketNode *Link;
}BUCKET;
BUCKET Bucket[P];
/*基桶空间定义*/
[函数]
int lnsertToHashTable(int NewElemKey){
/*将元素NewElemKey插入散列桶中,若插入成功则返回0,否则返回-1*/
7
/*设插入第一个元素前基桶的所有KeyData[]、Link域已分别初始化为NULLKEY、
NULL*/
int Index;
/*基桶编号*/
int i,k;
BUCKET *s,*front,*t;
(1)
;
for(i=0; i<ITEMS;i++)/*在基桶查找空闲单元,若找到则将元素存入*/
if(Bucket[Index].KeyData[i]=NULLKEY){
Bucket[Index].KeyData[i]=NewElemKey;
break;
}
if(
(2)
) return 0;
/*若基桶已满,则在溢出桶中查找空闲单元,若找不到则申请新的溢出桶*/
(3)
;
t=Bucket[Index].Link;
if(t!=NULL)
{/*有溢出桶*/
while (t!=NULL){
for(k=0; k<ITEMS; k++)
if(t->KeyData[k]=NULLKEY){/*在溢出桶链表中找到空闲单元*/
t->KeyData[k]=NewElemKey;
break;
}/*if*/
front=t;
if(
(4)
)t=t->Link;
else break;
}/*while*/
}/*if*/
if(
(5)
) {/*申请新溢出桶并将元素存入*/
s=(BUCKET*)malloe(sizeof(BUCKET));
if(!s)
return-1;
s->Link=NULL;
for(k=0; k<ITEMS; k++)
s->KeyData[k]=NULLKEY;
s->KeyData[0]=NewElemKey;
(6)
;
}/*if*/
return 0;
}/*InsertToHashTable*/
8