2010上半年软件设计师考试真题及答案-下午卷
试题一
阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。
[说明]
某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需
求,欲构建数据管理中问件,其主要功能如下:
1数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户
信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实体的标准操作及其所
属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,
该表存储用户可执行的操作信息。
2中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证
通过,中间件将等待前端应用提交操作请求。
3前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回
格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作),若用
户无权执行该操作,则返回权限不足信息,否则进行连接管理。
4连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据
库连接,如果不存在,新建连接;如果存在,则重用连接。
5后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,
将其返回给前端应用。
现采用结构化方法对系统进行分析与设计,获得如图1-1所示的顶层数据流图和图1-2
所示的0层数据流图。
1、使用说明中的词语,给出图1-1中的实体E1~E3的名称。
2、使用说明中的词语,给出图1-2中的数据存储D1~D3的名称
3、给出图1-2中加工P的名称及其输入、输出流。
起点
名称
输入流
输出流
P
终点
P
除加工P的输入与输出流外,图1-2还缺失了两条数据流,请给出这两条数据流的起点和终
点。
起点
终点
注:名称使用说明中的词汇,起点和终点均使用图1-2中的符号或词汇。
4、在绘制数据流图时,需要注意加工的绘制。请给出三种在绘制加工的输入、输出时可能
出现的错误。
试题二
阅读下列说明,回答问题1至问题3,将解答填入对应栏内。
[说明]
某学校拟开发一套实验管理系统,对各课程的实验安排情况进行管理。
[需求分析]
一个实验室可进行多种类型不同的实验。由于实验室和实验员资源有限,需根据学生
人数分批次安排实验室和实验员。一门课程可以为多个班级开设,每个班级每学期可以开设
多门课程。一门课程的一种实验可以根据人数、实验室的可容纳人数和实验类型,分批次开
设在多个实验室的不同时问段。一个实验室的一次实验可以分配多个实验员负责辅导实验,
实验员给出学生的每次实验成绩。
(1)课程信息包括:课程编号、课程名称、实验学时、授课学期和丌课的班级等信息;
实验信息记录该课程的实验进度信息,包括:实验名、实验类型、学时、安排周次等信息,
如表2-1所示。
表2-1
课程及实验信息
课程编号 15054037 课程名称 数字电视原删
实验学时 12
班级
授课院系 机械与电气工程
授课学期 第三学期
电0501,信
0501,计0501
实验名
序号
1505403701 音视频AD-DA实验
1505403702 音频编码实验
1505403703 视频编码实验
实验类
验证性
验证性
演示性
难度
1
2
0.5
学时
2
2
1
安排周次
3
5
9
(2)以课程为单位制定实验安排计划信息,包括:实验地点,实验时间、实验员等信息,实
课程编号 15054037 课程名称
验计划如表2-2所示。 表2-2 实验安排计划
数字电视
原理
实验员 实验员 地点
安排学期 2009年秋 总人数 220
批次号 人数
实验编号 实验名
150540370
1
150540370
1
150540370
1
150540370
1
150540370
2
音视频AD-DA丈验
音视频AD-DA实验
音视频AD-DA实验
音视频AD-DA实验
音频编码实验
盛×,陈×
盛×,陈×
吴×,刘×
吴×
盛×,刘×
第3周周四
晚上
第3周周四
晚上
第3周周五
晚上
第3周周五
晚上
第5周周一
下午
实验三楼
310
实验三楼
310
实验三楼
311
实验三楼
311
实验四楼
410
1
2
3
4
1
60
60
60
40
70
(3)由实验员给出每个学生每次实验的成绩,包括:实验名、学号、姓名、班级、实验成绩
等信息,实验成绩如表2-3所示。 表2-3 实验成绩 实验员: 盛×
实验名
学号
030501001
030501002
040501001
音视频AD-DA实验
姓名
陈民
刘志
张勤
课程名
班级
信0501
信0501
计0501
数字电视原理
实验成绩
87
78
86
(4)学生的实验课程总成绩根据每次实验的成绩以及每次实验的难度来计算。
[概念模型设计]
根据需求阶段收集的信息,设计的实体联系图(不完整)如图2-1所示。
[逻辑结构设计]
根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):
课程(课程编号,课程名称,授课院系,实验学时)
班级(班级号,专业,所属系)
开课情况(
实验(
实验计划(
实验员(
实验室(实验室编号,地点,开放时间,可容纳人数,实验类型)
学生(
实验成绩(
(2) ,实验类型,难度,学时,安排周次)
(6) ,实验成绩,评分实验员)
(5) ,姓名,年龄,性别)
(1) ,授课学期)
(3) ,实验时间,人数)
(4) ,级别)
5、补充图2-1中的联系和联系的类型。
根据图2-1,将逻辑结构设计阶段生成的关系模式中的空6~7补充完整并用下划线指出这六
个关系模式的主键。
12、如果需要记录课程的授课教师,新增加“授课教师”实体。请对图2-1进行修改,画出
修改后的实体问联系和联系的类型。
试题三
阅读下列说明和图,回答问题1至问题3,将解答填入对应栏内。
[说明]
某运输公司决定为新的售票机开发车票销售的控制软件。图3-1给出了售票机的面板
示意图以及相关的控制部件。
售票机相关部件的作用如下所述:
13目的地键盘用来输入行程目的地的代码(例如,200表示总站)。
14乘客可以通过车票键盘选择车票种类(单程票、多次往返票和座席种类)。
15继续/取消键盘上的取消按钮用于取消购票过程,继续按钮允许乘客连续购买多张
票。
16显示屏显示所有的系统输出和用户提示信息。
17插卡口接受MCard(现金卡),硬币口和纸币槽接受现金。
18打印机用于输出车票。
假设乘客总是支付恰好需要的金额而无需找零,售票机的维护工作(取回现金、放入
空白车票等)由服务技术人员完成。
系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图和类图分别如图
3-2和图3-3所示。
13、根据说明中的描述,给出图3-2中A1和A2所对应的参与者,U1所对应的用例,以及(1)、
(2)处所对应的关系。
14、根据说明中的描述,给出图3-3中缺少的C1~C4所对应的类名以及(3)~(6)处所对应的
多重度。
15、图3-3中的类图设计采用了中介者(Mediator)设计模式,请说明该模式的内涵。
试题四
阅读下列说明和C代码,回答问题1至问题3,将解答写在对应栏内。
[说明]
对有向图进行拓扑排序的方法是:
(1)初始时拓扑序列为空;
(2)任意选择一个入度为0的顶点,将其放入拓扑序列中,同时从图中删除该顶点以
及从该顶点出发的弧;
(3)重复(2),直到不存在入度为0的顶点为止(若所有顶点都进入拓扑序列则完成拓
扑排序,否则由于有向图中存在回路无法完成拓扑排序)。
函数int* TopSort(LinkedDigraphG.的功能是对有向图G中的顶点进行拓扑排序,返
回拓扑序列中的顶点编号序列,若不能完成拓扑排序,则返回空指针。其中,图G中的顶点
从1开始依次编号,顶点序列为v1,v2,…,vn,图G采用邻接表表示,其数据类型定义如下:
/*指示下一个邻接顶点*/
/*头结点类型*/
/*最大顶点数*/
/*表结点类型*/
/*邻接顶点编号*/
#define MAXVNUM 50
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct AdjList {
char vdata;
ArcNode *fimstarc;
}AdjList;
typedef struct LinkedDigraph {
int n;
AdjList Vhead[MAXVNUM];
}LinkedDigraph;
例如,某有向图G如图4-1所示,其邻接表如图4-2所示。
/*顶点的数据信息*/
/*指向邻接表的第一个表结点*/
/*图中顶点个数*/
/*图的类型*/
/*所有顶点的头结点数组*/
函数TopSort中用到了队列结构(Queue的定义省略),实现队列基本操作的函数原型如
下表所示:
函数原型
说明
void InitQueue(Queue *Q)
初始化队列(构造一个卒队列)
bool IsEmpty(Queue Q)
void EnQueue(Queue *Q,int e)
void DeQueue(Queue *Q,int *p)
判断队列是否为空,若是则返回true,否则返
回false
元素入队列
元素出队列
{
[C代码]
int *TopSort(LinkedDigraphG.
ArcNode *p;
Queue Q;
/*临时指针,指示表结点*/
/*临时队列,保存入度为0的顶点编号*/
int k=0;
/*临时变量,用作数组元素的下标*/
intj=0,w=0;
/*临时变量,用作顶点编号*/
int *topOrder,*inDegree;
topOrder=(int *)malloc((G.n+1) *sizeof(int));
/*存储拓扑序列中的顶点编号*/
inDegree=(int *)malloc((G.n+1) *sizeof(int));
/*存储图G中各顶点的入度*/
if(!inDegree || !topOrder) return NULL;
(1)
;
inDegree[j]=0;
/*构造一个空队列*/
for(j=1; j<=G.n; j++){/*初始化*/
topOrder[j]=0;
}
for(j=1;j<=G.n;j++)
for(p=G.Vhead[j].firstarc; P; P=P->nextarc)
inDegree[P->adjvex]+=1;
for(j=1; j<=G.n;j++)
if(0==inDegree[j])
while(!IsEmpty(Q)){
EnQueue(&Q,j);
/*求图G中各顶点的入度*/
/*将图G中入度为0的顶点保存在队列中*/
(2)
;
/*队头顶点出队列并用w保存该顶点的编号*/