中级软件设计师下半年下午试题Word格式.docx
《中级软件设计师下半年下午试题Word格式.docx》由会员分享,可在线阅读,更多相关《中级软件设计师下半年下午试题Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
┆
储蓄所1合计
共×
×
户,总余额9999999.99元
储蓄所2
储蓄所2合计
1.【问题1】
请采用说明中的词汇,给出数据确认处理所需的数据流在第1层图中的全部可选起点(第0层图和第1层图中均未给出)。
这道题您没有回答
答案:
初录数据、复录数据
[分析]
在本题说明中关于“数据确认”功能的描述中,指出当初录员和复录员分别录入的数据比对正确后,可从其中任一套数据作为最终进入系统A的原始数据(即图10-2中的确认数据)。
因此无论是初录数据还是复录数据都可作为“数据确认处理”的数据源。
10.【问题2】
不考虑数据确认处理(加工2),请指出数据流图中存在的错误。
0层图(图10-2)中,数据清除处理(加工6)没有输入数据流
在DFD中,一个加工就是对输入数据进行处理并生成输出数据的过程,所以数据流图中的每个加工都要求(至少)有一个输入数据流和一个输出数据流。
而在0层DFD(图10-2)中,加工6(数据清除)只有输出数据流而没有输入数据。
11.【问题3】
打印分户账清单时,必须以下列哪一组数据作为关键字进行排序,才能满足需求?
请从下面选项中选择。
①储蓄所②账号⑧开户日④总户数和总余额
①
在表10-1中,多行中的数据按照储蓄所分组输出并打印该储蓄所所有分户账的户数和余额合计,这就要求在数据查询操作中,至少要按照储蓄所进行排序才能实现。
当然在软件实现时,也可以按照账号、开户日等数据排序,但从表10-1中无法确定是否需要这些额外的排序。
15.【问题4】
加工1(录入比对处理)除能够检查出初录数据和复录数据不一致外,还应当检测出下列哪些错误。
①输入的无效字符②输入的半个汉字③显示器无法显示
④初录员重复录入同一账户⑤汇总数据与会计账目不符⑥打印机卡纸
①、②、④
图10-2中的加工1(录入比对)包含了图10-3中的三个加工:
初录员录入数据、复录员录入数据、两组数据比对。
按照本题说明,比对的任务就是在两组已经存储在数据文件中的数据之间一一比较,并指出那些不一致者、重复录入的同一账户数据,这个加工是完全由软件完成的,不再需要用户输入数据。
但在手工录入过程中,有可能输入无效字符,比如输入的金额中有除小数点、数字之外的其他字符、半个汉字(这在某些运行环境中是可能存在的情况)。
另外,从图10-3和其他叙述中可以看出,录入比对处理不涉及打印,也不应该检查汇总数据和会计账目是否相符(因为这是汇总核对的功能)。
16.【问题5】
请使用数据字典条目定义形式,给出第0层DFD中的“手工分户账”数据流和第1层DFD中的“初录分户账”、“复录分户账”的关系。
手工分户账=初录分户账+复录分户账
在图10-2给出的软件第0层DFD中,“手工分户账”是“录入比对”加工的输入数据流,而该加工包含了图10-3中的“初录”加工和“复录”加工。
所以手工分户账由初录分户账和复录分户账组成。
试题二
阅读以下说明,回答问题1至问题4。
某宾馆需要建立一个住房管理系统,部分的需求分析结果如下:
(1)一个房间有多个床位,同一房间内的床位具有相同的收费标准,不同房间的床位收费标准可能不同;
(2)每个房间有房间号(如201、202等)、收费标准、床位数目等信息;
(3)每位客人有身份证号码、姓名、性别、出生日期和地址等信息:
(4)对每位客人的每次住宿,应该记录其入住日期、退房日期和预付款额信息;
(5)管理系统可查询出客人所住房间号。
根据以上的需求分析结果,设计一种关系模型如下图所示:
2.【问题1】
根据上述说明和实体-联系图,得到该住房管理系统的关系模式如下所示,请补充住宿关系。
房间(房间号,收费标准,床位数目)
客人(身份证号,姓名,性别,出生日期,地址)
住宿(
(1),入住日期,退房日期,预付款额)
房间号,身份证号
房间号和身份证号分别是房间关系和客人关系的主键,作为外键出现在住宿关系中。
住宿关系记录客人的身份证号和住宿的房间号。
9.【问题2】
请给出问题1中住宿关系的主键和外键。
住宿主键:
房间号,身份证号,入住日期
住宿外键:
该题主要考核关系的主键。
住宿关系主键包括房间号,身份证号和入住日期。
房间号和身份证号是较明显的答案,但仅是这两者并不能唯一识别一个记录,一位客人有可能多次在同一房间里住宿,故入住日期也要包含在主键中。
12.【问题3】
若将上述各关系直接实现为对应的物理表,现需查询在2005年1月1日到2005年12月31日期间,在该宾馆住宿次数大于5次的客人身份证号,并且按照入住次数进行降序排列。
下面是实现该功能的SQL语句,请填补语句中的空缺。
SELECT住宿.身份证号,count(入住日期)
FROM住宿,客人
WHERE入住日期>='
20050101'
AND入住日期<='
20051231'
AND住宿.身份证号=客人.身份证号
GROUPBY
(2)
(3)count(入住日期)>5
(4)
住宿.身份证号
(3)HAVING
(4)ORDERBY2DSC,或ORDERBY2DESC
该题主要考查SQL语言。
GROUPBY后必须出现SELECT后查询项中不包含聚集函数的部分;
GROUPBY后跟的条件应该用HAVING子句表示:
题目要求按照入住次数降序排序,故最后应填入ORDERBY子句。
14.【问题4】
为提交SQL语句的执行效率,可在相应的表上创建索引。
根据问题3中的SQL语句,除主键和外键外,还需要在哪个表的哪些属性上创建索引,应该创建什么类型的索引,请说明原因。
表:
住宿
属性:
入住日期
类型:
聚簇索引,或聚集索引,或cluster
原因:
表中记录的物理顺序与索引项的顺序一致,根据索引访问数据时,一次读取操作可以获取多条记录数据,因而可减少查询时间。
该题主要考核索引的概念。
在数据库中,索引使数据库程序无需对整个表进行扫描,就可以从其中找到所需的数据。
索引分为两类:
聚集索引和非聚集索引。
聚集索引对表的物理数据页中的数据按列进行排序,然后重新存储到磁盘上,即聚集索引与数据是混为一体的,其叶结点中存储的是实际的数据。
非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序。
非聚集索引的叶结点存储的是组成非聚集索引的关键字值和行定位器。
按题目要求,查询涉及的属性有身份证号和入住日期,但它们均为主键属性,故不需要再为其他属性创建索引。
针对本题要求为提交SQL语句的执行效率,对“入住日期”属性建立聚集索引,使得索引项顺序和物理数据顺序一致以提高查询性能。
问题3中查询涉及到的属性有身份证号和入住日期,由于这两个属性均为住宿关系的主键,故不需要再在其他属性上创建索引。
在主键上创建的索引类型应为聚簇索引(或聚集索引或cluster)。
创建聚簇索引的原因是令表中记录的物理顺序与索引项的顺序一致,根据索引访问数据时,一次读取操作可以获取多条记录数据,因而可减少查询时间。
试题三
阅读以下说明和图,回答问题1至问题3。
S公司开办了在线电子商务网站,主要为各注册的商家提供在线商品销售功能。
为更好地吸引用户,S公司计划为注册的商家提供商品(Commodity)促销(Promotion)功能。
商品的分类(Category)不同,促销的方式和内容也会有所不同。
注册商家可发布促销信息。
商家首先要在自己所销售的商品的分类中,选择促销涉及的某一具体分类,然后选出该分类的一个或多个商品(一种商品仅仅属于一种分类),接着制定出一个比较优惠的折扣政策和促销活动的优惠时间,最后由系统生成促销信息并将该促销信息公布在网站上。
商家发布促销信息后,网站的注册用户便可通过网站购买促销商品。
用户可选择参与某一个促销活动,并选择具体的促销商品,输入购买数量等购买信息。
系统生成相应的一份促销订单(POrder)。
只要用户在优惠活动的时间范围内,通过网站提供的在线支付系统,确认在线支付该促销订单(即完成支付),就可以优惠的价格完成商品的购买活动,否则该促销订单失效。
系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图10-4是该系统类图中的一部分;
系统的动态行为采用UML序列图表示,图10-5是发布促销的序列图。
7.【问题1】
识别关联的多重度是面向对象建模过程中的一个重要步骤。
根据说明中给出的描述,完成图10-4中的
(1)~(6)。
(1)0~n或1~n
(2)1
(3)0~n
(4)1~n
(5)1
(6)0~n
问题1主要考查类的多样性分析,在充分理解题目需求的基础上补充类图中的类间关系的多样性描述。
根据题目中所描述:
(1)
(2)一个商品(Commodity)属于一种分类,一个分类(Category)中包含零个或多个商品对象,所以多样性关系为0~n或1~n个商品对象对应1个分类对象;
(3)(4)一个促销(Promotion)中由一个或多个商品组成(至少一个),而一个商品可以属于零个或多个促销,所以多样性关系为0~n个促销对象对应1~n个商品对象。
(5)(6)一个促销可以产生多个促销订单(POrder),一个促销订单只能对应一个促销。
所以多样性关系为1个促销对象涉及0~n个促销订单对象。
8.【问题2】
请从表10-2中选择方法,完成图10-5中的(7)~(10)。
表10-2可选消息列表
功 能 描 述
方 法 名
向促销订单中添加所选的商品
buyCommodities
向促销中添加要促销的商品
addCommodities
查找某个促销的所有促销订单信息列表
getPromotionOrders
生成商品信息
createCommodity
查找某个分类中某商家的所有商品信息列表
getCommodities
生成促销信息
createPromotion
生成促销订单信息
createPOrder
查找某个分类的所有促销信息列表
getCategoryPromotion
查找某商家所销售的所有分类列表
getCategories
查找某个促销所涉及的所有商品信息列表
getPromtionCommodities
(7)getCategories
(8)getCommodities
(9)createPromotion
(10)addCommodities
问题2主要考查用UML序列图对系统的行为进行分析和建模。
序列图描述对象间的消息交互,刻画系统的行为。
根据题目的描述:
商家在发布促销信息时,要先浏览自己所销售的商品的分类及分类中的具体商品信息:
商家通过getCategories消息将浏览请求提交给类CatagoryManager实例,再由类CatagoryManager的实例通过getCommodities消息请求类Category实例获得其分类中该商家的所有商品:
类Category的实例通过getCommodityinfo消息请求类Commodity的实例返回商品的详细描述信息。
当把商家所销售的商品分类及分类中的具体商品信息返回给商家之后,商家在其中选择要促销的一个或多个商品,并输入一些促销信息,通过CreatePromotion消息请求类PromotionManager实例生成促销信息。
类PromotionManager实例通过Create消息创建一个促销对象,并通过addCommodities消息向新建的促销对象中添加要促销的商品对象。
13.【问题3】
关联(Association)和聚集(Aggregation)是UML中两种非常重要的关系。
请说明关联和聚集的关系,并说明其不同点。
关系:
聚集(聚合)是关联的特例(聚集是关联的一种)。
不同点:
聚集表示部分与整体关系的关联。
若从生命周期的角度考虑,则关联对象的生命周期一般无必然关系,聚集的整体对象往往对部分对象的生命周期负责。
问题3主要考查面向对象分析设计中对类之间不同关系的理解。
试题四
阅读以下说明和图,填补流程图中的空缺。
3.【说明】
某汽车制造工厂有两条装配线。
汽车装配过程如图10-6所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。
(1)e0和e1表示底盘分别进入装配线0和装配线1所需要的时间。
(2)每条装配线有n个工位,第一条装配线的工位为S0,0,S0,1,…,S0,n-0,第二条装配线的工位为S1,0,S1,1,…,S1,n-1。
其中S0,k和S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。
(3)aij表示在工位Sij处的装配时间,其中i表示装配线(i=0或i=1),j表示工位号(0≤j≤n-1)。
(4)tij表示从Sij处装配完成后转移到另一条装配线下一个工位的时间。
(5)X0和X1表示装配结束后,汽车分别从装配线0和装配线1下线所需要的时间。
(6)在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。
图10-7所示的流程图描述了求最短装配时间的算法,该算法的输入为;
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)f[0][0]=e[0]+a[0][0]
f[1][0]=e[1]+a[1][0]
(2)f[0][j-1]+a[0][j]
(3)f[j][j-1)+a[1][j]<f[0][j-1)+t[0][j-1]+a[1][j],
或f[1][j-1)+a[1][j]<=f[0][j-1]+t[0][j-1)+a[1][j],
或其等价形式
(4)fi=f[0][n-1]+x[0]
li=0
(5)fi=f[1][n-1]+x[1]
1i=1
本题考查动态规划算法设计方法。
当问题具有两个特性,即最优子结构和重叠子问题时,可以考虑用动态规划求解问题。
用动态规划求解问题具有四个步骤。
(1)刻画问题的最优子结构,描述问题的最优解包含子问题的最优解。
对于本题来说,最短装配时间等于经过装配线。
的第n个工位的最短装配时间加上x[0],或者等于经过装配线1的第n个工位的最短装配时间加上x[1],取哪条装配线取决于哪个值更小。
而经过某个装配线0/1的第i个工位的最短装配时间又等于经过装配线0/1的第1-1个工位的最短装配时间,或者等于经过装配线I/0的第i-1个工位的最短装配时间加上从这个工位到装配线0/1的迁移时间,取决于哪个值更小。
(2)建立最优子结构的递归关系,这是非常关键的一步。
对于本题来说,递归关系为
(3)根据递归关系求最优解的值。
对于本题来说,最优解记录在fi中,fi=min(f(0,n-1)+x0,f(1,n-1)+x1):
(4)构造最优解。
对于本题来说,只是求出最优解是从哪条装配线装配出来,并没有记录最优解。
试题五
阅读以下说明、图和C代码。
4.【说明】
一般的树结构常采用孩子-兄弟表示法表示,即用二叉链表作树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。
例如,图10-8(a)所示的树的孩子-兄弟表示如图10-8(b)所示。
函数LevelTraverse()的功能是对给定树进行层序遍历。
例如,对图10-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;
(7);
returnOK;
}/*LevelTraverse*/
(1)EnQueue(&
tempQ,root)
(2)brotherptr=brotherptr->nextbrother
(3)!
IsEmpty(tempQ),或其等价形式
(4)DeQueue(&
tempQ,&
ptr)
(5)!
ptr->firstchild,或其等价形式
(6)EnQueue(&
tempQ,ptr->firstchild)
(7)brotherptr=brotherptr->nextbrother
本题考查树结构的存储及遍历运算。
借助队列结构对树进行层序遍历时,每个结点都进出队列一次,结点出队列时进行访问。
其过程是:
首先令树根结点入队,若是森林(树根之间互为兄弟),接着则令其余树的根结点入队,然后在队列非空的情况下,队头结点出队,访问该结点同时令其孩子结点入队。
以此类推,直到队列为空。
队列可以保证访问结点时按照层次和自左至右的顺序。
函数中,代码“InitQueue(&
(1)”初始化队列并令根结点入队列,因此空
(1)处应填入“EnQueue(&
tempQ,root)”。
采用二叉树存储树结构时,其右分支表示兄弟关系,因此队头结点出队时,应沿右分支将队头结点的所有孩子依次加入队列。
以下代码处理第一棵树的兄弟结点,如下:
while(brotherptr){
因此,空
(2)处应填入“brotherptr=brotherptr->nextbrother”。
这样,就完成了第一层结点的处理。
显然,空(3)处应判断队列是否为空,即填入“!
IsEmpty(tempQ)”。
队列非空的情况下,令队头元素出队列,即空(4)处应填入“DeQueue(&
ptr)”。
这是使用队列或栈结构存储元素以实现某种运算的基本特点。
若一个结点不存在孩子,则其firstchild指针域为空,也无需令其孩子结点入队列。
因此,空(5)处应填入“!
ptr->firstchild”。
反之,若一个结点有孩子,则应首先令其第一个孩子结点入队列,然后通过右分支链使其他孩子结点入队列。
因此,空(6)处应填入“EnQueue(&
tempQ,ptr->firstchild)”,空(7)处应填入“brotherptr=brotherptr->nextbrother”。
试题六
阅读以下说明和C++代码。
5.【说明】
传输门是传输系统中的重要装置。
传输门具有Open(打开)、Closed