下半年软件设计师下午题.docx
《下半年软件设计师下午题.docx》由会员分享,可在线阅读,更多相关《下半年软件设计师下午题.docx(24页珍藏版)》请在冰豆网上搜索。
![下半年软件设计师下午题.docx](https://file1.bdocx.com/fileroot1/2023-1/4/bc505b9e-00ef-417f-9753-0acaff399b17/bc505b9e-00ef-417f-9753-0acaff399b171.gif)
下半年软件设计师下午题
全国计算机技术与软件专业技术资格(水平)考试
2006年下半年软件设计师下午试卷
(考试时间14:
00~16:
30共150分钟)
请按下述要求正确填写答题纸
1.在答题纸的指定位置填写你所在的省、自治区、直辖市、计划单列市的名称。
2.在答题纸的指定位置填写准考证号、出生年月日和姓名。
3.答题纸上除填写上述内容外只能写解答。
4.本试卷共7道题,试题一至试题四是必答题,试题五至试题七选答1道。
每
题15分,满分75分。
5.解答时字迹务必清楚,字迹不清时,将不评分。
6.仿照下面例题,将解答写在答题纸的对应栏内。
例题
2006年下半年全国计算机技术与软件专业技术资格(水平)考试日期是
(1)
月
(2)日。
因为正确的解答是“11月4日”,故在答题纸的对应栏内写上“11”和“4”
(参看下表)。
例题
解答栏
(1)
11
(2)
4
试题一至试题四是必答题
试题一(共15分)
阅读以下说明以及数据流图,回答问题1至问题5,将解答填入答题纸的对应栏内。
[说明]
某银行已有一套基于客户机/服务器模式的储蓄系统A和一套建帐软件。
建帐软件主要用于将储蓄所手工处理的原始数据转换为系统A所需的数据格式。
该建帐软件具有以下功能:
(1)分户帐录入:
手工办理业务时建立的每个分户帐数据均由初录员和复录员分别录入,以确保数据的正确性;
(2)初录/复录比对:
将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致;
(3)数据确认:
当上述两套数据完全一致后,将其中任一套作为最终进入系统A的原始数据;
(4)汇总核对和打印:
对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性,并打印输出经过确认的数据,为以后核查可能的错误
提供依据;
(5)数据转换:
将经过确认的数据转换为储蓄系统A需要的中间格式数据;
(6)数据清除:
为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。
该软件的数据流图如图1-1~图1-3所示。
图中部分数据流数据文件的格式如下:
初录分户帐=储蓄所号+帐号+户名+开户日+开户金额+当前余额+性质
复录分户帐=储蓄所号+帐号+户名+开户日+开户金额+当前余额+性质
初录数据=手工分户帐+一致性标志
复录数据=手工分户帐+一致性标志
会计账目=储蓄所号+总户数+总余额
操作结果=初录操作结果+比对操作结果+复录操作结果
初录员/
复录员操
手作
工结
分果
户
中
操
作
会计手间分
核工格户
对结分式帐
结果户数清
果帐据单
会计账目154
帐建帐软件
中分
间户
录入比对
6
数据转换
2
打印清单
格
式数
据
系统A
帐清单
打印机
数据清除
会计账目
核对结果
数据确认确认的数据
3
汇总核对
图1-1建帐软件顶层数据流图图1-2建帐软件第0层数据流图
初
录操作结
果
1.1
比对操作结果
1.3
复录操作结果
1.2
初初录
录初
分录
户结
帐果初录数据
比对复录复
复录
录分
结户
复录数据果帐
初录员复录员
图1-3建帐软件第1层数据流图
软件需要打印的分户帐清单样式如表1-1所示:
表1-1分户帐清单样式表
储蓄所
帐号
开户日
户名
其他分户帐数据
储蓄所1
…
…
…
…
储蓄所1合计
共XXX户,总余额9999999.99元
储蓄所2
…
…
…
…
储蓄所2合计
共XXX户,总余额9999999.99元
[问题1](4分)
请采用说明中的词汇,给出数据确认处理所需的数据流在第1层图中的全部可选起点
(第0层图和第1层图中均未给出)。
[问题2](2分)
不考虑数据确认处理(加工2),请指出数据流图中存在的错误。
[问题3](2分)
打印分户帐清单时,必须以下列哪一组数据作为关键字进行排序,才能满足需求?
请从下面选项中选择,并将对应序号填入答题纸相应栏。
①储蓄所②帐号③开户日④总户数和总余额
[问题4](4分)
加工1(录入比对处理)除能够检查出初录数据和复录数据不一致外,还应当检测出下列哪些错误,请将对应序号填入答题纸对应栏。
①输入的无效字符②输入的半个汉字③显示器无法显示
④初录员重复录入同一帐户⑤汇总数据与会计账目不符⑥打印机卡纸
[问题5](3分)
请使用数据字典条目定义形式,给出第0层DFD中的“手工分户帐”数据流和第1层DFD中的“初录分户帐”、“复录分户帐”的关系。
试题二(共15分)
阅读以下说明,回答问题1至问题4,将解答填入答题纸的对应栏内。
[说明]
某宾馆需要建立一个住房管理系统,部分的需求分析结果如下:
(1)一个房间有多个床位,同一房间内的床位具有相同的收费标准。
不同房间的床位收费标准可能不同。
(2)每个房间有房间号(如201、202等)、收费标准、床位数目等信息。
(3)每位客人有身份证号码、姓名、性别、出生日期和地址等信息。
(4)对每位客人的每次住宿,应该记录其入住日期、退房日期和预付款额信息。
(5)管理系统可查询出客人所住房间号。
根据以上的需求分析结果,设计一种关系模型如图2-1所示:
mn
房间住宿客人
[问题1](1分)
图2-1住房管理系统的实体联系图
根据上述说明和实体-联系图,得到该住房管理系统的关系模式如下所示,请补充住宿关系。
房间(房间号,收费标准,床位数目)
客人(身份证号,姓名,性别,出生日期,地址)
住宿(
(1),入住日期,退房日期,预付款额)
[问题2](4分)
请给出问题1中住宿关系的主键和外键。
[问题3](4分)
若将上述各关系直接实现为对应的物理表,现需查询在2005年1月1日到2005年12月31日期间,在该宾馆住宿次数大于5次的客人身份证号,并且按照入住次数进行降序排列。
下面是实现该功能的SQL语句,请填补语句中的空缺。
SELECT住宿.身份证号,count(入住日期)FROM住宿,客人
WHERE入住日期>=‘20050101’AND入住日期<=‘20051231’
AND住宿.身份证号=客人.身份证号
GROUPBY
(2)
(3)count(入住日期)>5
(4)
[问题4](6分)
为加快SQL语句的执行效率,可在相应的表上创建索引。
根据问题3中的SQL语句,除主键和外键外,还需要在哪个表的哪些属性上创建索引,应该创建什么类型的索引,请说明原因。
试题三(共15分)
阅读以下说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
[说明]
S公司开办了在线电子商务网站,主要为各注册的商家提供在线商品销售功能。
为更好地吸引用户,S公司计划为注册的商家提供商品(Commodity)促销(Promotion)功能。
商
品的分类(Category)不同,促销的方式和内容会有所不同。
注册商家可发布促销信息。
商家首先要在自己所销售的商品的分类中,选择促销涉及的某一具体分类,然后选出该分类的一个或多个商品(一种商品仅仅属于一种分类),接着制定出一个比较优惠的折扣政策和促销活动的优惠时间,最后由系统生成促销信息并将该促销信息公布在网站上。
商家发布促销信息后,网站的注册用户便可通过网站购买促销商品。
用户可选择参与某一个促销(Promotion)活动,并选择具体的促销商品(Commodity),输入购买数量等购买信息。
系统生成相应的一份促销订单(POrder)。
只要用户在优惠活动的时间范围内,通过网站提供的在线支付系统,确认在线支付该促销订单(即完成支付),就可以优惠的价格完成商品的购买活动,否则该促销订单失效。
系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图3-1是该系统类图中的一部分;系统的动态行为采用UML序列图表示,图3-2是发布促销的序
列图。
(2)(3)
(5)
(6)
(1)
(4)
图3-1在线促销系统部分类图
(7)
(8)
(9)
(10)
[问题1](6分)
图3-2发布促销序列图
识别关联的多重度是面向对象建模过程中的一个重要步骤。
根据说明中给出的描述,完成图3-1中的
(1)~(6)。
[问题2](4分)
请从表3-1中选择方法,完成图3-2中的(7)~(10)。
表3-1可选消息列表
功能描述
方法名
向促销订单中添加所选的商品
buyCommodities
向促销中添加要促销的商品
addCommodities
查找某个促销的所有促销订单信息列表
getPromotionOrders
生成商品信息
createCommodity
查找某个分类中某商家的所有商品信息列表
getCommodities
生成促销信息
createPromotion
生成促销订单信息
createPOrder
查找某个分类的所有促销信息列表
getCategoryPromotion
查找某商家所销售的所有分类列表
getCategories
查找某个促销所涉及的所有商品信息列表
getPromotionCommodities
[问题3](5分)
关联(Association)和聚集(Aggregation)是UML中两种非常重要的关系。
请说明关
联和聚集的关系,并说明其不同点。
试题四(共15分)
阅读以下说明和图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
[说明]
某汽车制造工厂有两条装配线。
汽车装配过程如图4-1所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。
S0,0S0,1S0,2S0,3S0,n-2S0,n-1
a0,0a0,1a0,2a0,3
...
a0,n-2
a0,n-1
e0x0
t0,0t0,1t0,2t0,n-2
底盘...汽车
t1,0t1,1t1,2t1,n-2
e1x1
a1,0a1,1a1,2a1,3
...
a1,n-2
a1,n-1
S1,0S1,1S1,2S1,3S1,n-2S1,n-1
图4-1汽车装配线
(1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。
(2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-1,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。
其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。
(3)ai,j表示在工位Si,j处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。
(4)ti,j表示从Si,j处装配完成后转移到另一条装配线下一个工位的时间。
(5)x0和x1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。
(6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。
图4-2所示的流程图描述了求最短装配时间的算法,该算法的输入为:
n:
表示装配线上的工位数;
e[i]:
表示e1和e2,i取值为0或1;
a[i][j]:
表示ai,j,i的取值为0或1,j的取值范围为0~n-1;
t[i][j]:
表示ti,j,i的取值为0或1,j的取值范围为0~n-1;
x[i]:
表示x0和x1,i取值为0或1。
算法的输出为:
fi:
最短的装配时间;
li:
获得最短装配时间的下线装配线号(0或者1)。
算法中使用的f[i][j]表示从开始点到Si,j处的最短装配时间。
开始
(1)
初始
化数
据
j=1
(2)<=N
f[1][j-1]+t[1][j-1]+a[0][j]?
Y
f[0][j]=f[0][j-1]+a[0][j]f[0][j]=f[1][j-1]+t[1][j-1]+a[0][j]
第0条装配线j号工位完成装配的最短时间
N
(3)
Y
f[1][j]=f[1][j-1]+a[1][j]f[1][j]=f[0][j-1]+t[0][j-1]+a[1][j]
第1条装配线j号工位完成装配的最短时间
j+=1
Y
j
N
f[0][n-1]+x[0]<=N
f[1][n-1]+x[1]?
最短
Y装配时间
(4)(5)
结束
图4-2求最短装配时间算法
从下列的3道试题(试题五至试题七)中任选1道解答。
如果解答的试题数超过1道,则题号小的1道解答有效。
试题五(15分)
阅读以下说明、图和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
[说明]
一般的树结构常采用孩子-兄弟表示法表示,即用二叉链表作树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。
例如,图5-1(a)所示的树的孩子-兄弟表示如图5-1(b)所示。
D∧
D∧B
BAE
FPC
A
∧FE∧
∧P∧
∧C∧
(a)(b)
图5-1树及其孩子-兄弟表示示意图
函数LevelTraverse()的功能是对给定树进行层序遍历。
例如,对图5-1所示的树进行层序遍历时,结点的访问次序为:
DBAEFPC。
对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示:
函数原型
说明
voidInitQueue(Queue*Q)
初始化队列
BoolIsEmpty(QueueQ)
判断队列是否为空,若是则返回TRUE,否则
返回FALSE
voidEnQueue(Queue*Q,TreeNodep)
元素入队列
voidDeQueue(Queue*Q,TreeNode*p)
元素出队列
Bool、Status类型定义如下:
typedefenum{FALSE=0,TRUE=1}Bool;
typedefenum{OVERFLOW=-2,UNDERFLOW=-1,ERROR=0,OK=1}Status;
树的二叉链表结点定义如下:
typedefstructNode{
chardata;
structNode*firstchild,*nextbrother;
}Node,*TreeNode;
[函数]
StatusLevelTraverse(TreeNoderoot)
{/*层序遍历树,树采用孩子-兄弟表示法,root是树根结点的指针*/
QueuetempQ;
TreeNodeptr,brotherptr;
if(!
root)
returnERROR;
InitQueue(&tempQ);
(1);
brotherptr=root->nextbrother;
while(brotherptr){EnQueue(&tempQ,brotherptr);
(2);
}/*end-while*/
while((3)){
(4);
printf("%c\t",ptr->data);
if((5))continue;
(6);
brotherptr=ptr->firstchild->nextbrother;
while(brotherptr){EnQueue(&tempQ,brotherptr);
(7);
}/*end-while*/
}/*end-while*/
returnOK;
}/*LevelTraverse*/
试题六(共15分)
阅读以下说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
[说明]
传输门是传输系统中的重要装置。
传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)五种状态。
触发传输门状态转换的事件有click、complete和timeout三种。
事件与其相应的状态转换如图6-1所示。
click
Closed
已关闭
complete
Opening
正在打开
complete
Open
打开
click
click
timeout
click
StayOpen
保持打开
Closing
正在关闭
click
图6-1传输门响应事件与其状态转换图
下面的[C++代码1]与[C++代码2]分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。
[C++代码1]
constintCLOSED=1;constintOPENING=2;
constintOPEN=3;constintCLOSING=4;
constintSTAYOPEN=5;//定义状态变量,用不同整数表示不同状态
classDoor{
private:
intstate;//传输门当前状态
voidsetState(intstate){this->state=state;}//设置当前状态
public:
Door():
state(CLOSED){};
voidgetState(){//根据当前状态输出相应的字符串
switch(state){
caseOPENING:
cout<<"OPENING"<cout<<"CLOSED"<cout<<"OPEN"<cout<<"CLOSING"<caseSTAYOPEN:
cout<<"STAYOPEN"<}
}
voidclick(){//发生click事件时进行状态转换
if(
(1))setState(OPENING);
elseif(
(2))setState(CLOSING);
elseif((3))setState(STAYOPEN);
}
voidtimeout(){//发生timeout事件时进行状态转换
if(state==OPEN)setState(CLOSING);
}
voidcomplete(){//发生complete事件时进行状态转换
if(state==OPENING)setState(OPEN);
elseif(state==CLOSING)setState(CLOSED);
}
};
intmain(){
DooraDoor;
aDoor.getState();aDoor.click();aDoor.getState();aDplete();aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();aDoor.getState();return0;
}
[C++代码2]classDoor{public:
DoorState*CLOSED,*OPENING,*OPEN,*CLOSING,*STAYOPEN,*state;
Door();
virtual~Door(){……//释放申请的内存,此处代码省略};
voidsetState(DoorState*state){this->state=state;}
voidgetState(){
//此处代码省略,本方法输出状态字符串,
//例如,当前状态为CLOSED时,输出字符串为“CLOSED”
};
voidclick();voidtimeout();voidcomplete();
};
Door:
:
Door(){
CLOSED=newDoorClosed(this);OPENING=newDoorOpening(this);OPEN=newDoorOpen(this);CLOSING=newDoorClosing(this);STAYOPEN=newDoorStayOpen(this);state=CLOSED;
}
voidDoor:
:
click(){(4);}
voidDoor:
:
timeout(){(5);}
voidDoor:
:
complete(){(6);}
classDoorState//定义一个抽象的状态,它是所有状态类的基类
{
protected:
Door*door;
public:
DoorState(Door*door){this->door=door;}
virtual~DoorState(void);
virtualvoidclick(){}
virtualvoidcomplete(){}
virtualvoidtimeout(){}
};
classDoorClosed:
publicDoorState{//定义一个基本的Closed状态
public:
DoorClosed(Door*door):
DoorState(door){}
virtual~DoorClosed(){}
voidclick();
};
voidDoorClosed:
:
click(){(7