2004上半年软件设计师考试真题及答案-下午卷
试题一
阅读下列说明和数据流图,回答问题1至问题4,将解答填入答题纸的对应栏内。
[说明]
某基于微处理器的住宅安全系统,使用传感器(如红外探头、摄像头等)来检测各种意外情况,如非法进入、
火警、水灾等。
房主可以在安装该系统时配置安全监控设备(如传感器、显示器、报警器等),也可以在系统运行时修改配置,
通过录像机和电视机监控与系统连接的所有传感器,并通过控制面板上的键盘与系统进行信息交互。在安装过程中,
系统给每个传感器赋予一个编号(即 id)和类型,并设置房主密码以启动和关闭系统,设置传感器事件发生时应自
动拨出电话号码。当系统检测到一个传感器事件时,就激活警报,拨出预置的电话号码,并报告关于位置和检测到
事件的性质等信息。
[数据流图4-1]
1、[问题1]
数据流图4-1(住宅安全系统顶层图)中的A和B分别是什么?
[数据流图4-2]
2、[问题2]
数据流图4-2(住宅安全系统第0层DFD图)中的数据存储“配置信息”会影响图中的哪些加工?
[数据流图4-3]
1
3、[问题3]
将数据流图4-3(加工4的细化图)中的数据流补充完整,并指明加工名称、数据流的方向 (输入/输出)和数据
流名称。
4、[问题4]
试说明逻辑数据流图(logical data flow diagram)和物理数据流图(physical data flow diagram)之间的
主要差别。
试题二
阅读下列说明和算法,回答问题1和问题2,将解答填入答题纸的对应栏内。
[说明]
算法2-1是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号没有对应的左括号或者右括号,则
给出相应的提示信息,如下所示:
文件
(1+2)
提示信息
abc)
((def)8x))
(((h)
ij)(k
(1ml)
列
缺少对应左括号:第2行,第4列
缺少对应左括号:第3行,第10列
缺少对应右括号:第5行,第4列;第4行,第1
在算法2-1中,stack为一整数栈。算法中各函数的说明如表4-1所示。
2
[算法2-1]
将栈stack置空,置EOF为False
ch←nextch();
while(not EOF.
k←kind(ch);
if(k==
(1)
push(
)
(2)
elself(k==
(4)
);push(
)
(3)
);
if(not empty())
pop(),pop(),
else
显示错误信息(缺少对应左括号或右括号);
显示行号row;显示列号col;
endif
endif
ch←nextch();
endwhile
if(not empty())
显示错误信息(缺少对应左括号或右括号);
while(not empty())
row←pop();col←pop();
显示行号row;显示列号col
cndwhile
endif
为了识别更多种类的括号,对算法2-1加以改进后得到算法2-2。算法2-2能够识别圆括号,方括号和花括号(不
同类型的括号不能互相匹配)。改进后,函数kinnd(char ch)的参数及其对应的返回值如表4-2所示。
表4-2 函数的参数及其返回值
[算法2-2]
将栈stack置空,置EOF为False
ch←nextch();
while(not EOF.
k←kind(ch);
if(k>0)
if( 判断条件1
)
3
push(
(5)
);push(
(6)
);push(
(7)
);
elseif( 判断条件2
and 判断条件3
)
pop();pop();pop();
else
显示错误信息(缺少对应左括号或右括号);
显示行号row;显示列号col;
endif
endif
ch←nexteh();
endwhile
if(not empty())
显示错误信息(缺少对应左括号或右括号);
while(not empty())
pop();row←pop();col←pop();
显示行号row;显示列号col;
endwhile
endif
5、[问题1]
试将[算法2-1)和[算法2-2]中(1)~(7)处补充完整。
[问题2]
从下面的选项中选择相应的判断逻辑填补[算法2-2]中的“判断条件1”至“判断条件 3”。注意,若“判断
条件2”的逻辑判断结果为假,就无需对“判断条件3”进行判断。
(a)字符是括号(b)字符是左括号(c)字符是右括号(d)栈空(e)栈不空
(f)栈顶元素表示的是与当前字符匹配的左括号
(g)栈顶元素表示的是与当前字符匹配的右括号
试题三
阅读下列说明以及图4-4和图4-5,回答问题1、问题2和问题3,将解答填入答题纸的对应栏内。
[说明]
某电话公司决定开发一个管理所有客户信息的交互式网络系统。系统的功能如下。
1.浏览客户信息:任何使用因特网的用户都可以浏览电话公司所有的客户信息(包括姓名、住址、电话号码
等)。
2.登录:电话公司授予每个客户一个账号。拥有授权账号的客户,可以使用系统提供的页面设置个人密码,
并使用该账号和密码向系统注册。
3.修改个人信息:客户向系统注册后,可以发送电子邮件或者使用系统提供的页面,对个人信息进行修改。
4.删除客户信息:只有公司的管理人员才能删除不再接受公司服务的客户的信息。系统采用面向对象方法
进行开发,在开发过程中确定的类如表4-3所示。
表4-3 开发过程中确定的类
[图4-4]
4
[图4-5]
6、[问题1]
在需求分析阶段,采用UML的用例图(use case diagram)描述系统功能需求,如图4-4所示。指出图中的A,B,C
5
和D分别是哪个用例?
7、[问题2]
在UML中,重复度(multiplicity)定义了某个类的一个实例可以与另一个类的多个实例相关联。通常把它写
成一个表示取值范围的表达式或者一个具体的值。例如,图4-5中的类InternetClient和CustomerList,
InternetClient端的“0...*”表示:1个 CustomerList的实例可以与0个或多个InternetClient的实例相关联;
CustomerList端的“1”表示:1个InternetClient的实例只能与1个CustomerList的实例相关。
指出图4-5中(1)~(4)处的重复度分别为多少?
8、[问题3]
类通常不会单独存在,因此当对系统建模时,不仅要识别出类,还必须对类之间的相互关系建模。在面向对
象建模中,提供了4种关系:依赖(dependency)、概括(generaliza tion)、关联(association)和聚集(aggregation)。
分别说明这4种关系的含义,并说明关联和聚集之间的主要区别。
试题四
9、[程序4]
PRUGBC
LD
START
LOOP1
LOOP2
LOOP3
NEXT
LAST
C48
WDT
DC
DC
DC
BTASC
DATA
END
GR0,DATA
GR1,0
GR3,48
GR0,WDT,GR1
LOOP2
GR3,BTASC,GR1
GR1,1,GR1
GR2,-4,GR1
LOOP1
(1)
GR2,48
GR0,WDT,GR1
NEXT
(2)
GR2,1,GR2
LOOP3
(3)
(4)
(5)
GR1,1,GR1
GR2,-4,GR1
LOOP2
;处理个位数
LEA
LEA
CPL
JP2
ST
LEA
LEA
JN2
LEA
CPL
JMI
LEA
JMP
LEA
LEA
JNZ
EXIT
48
10000
DC
DC
1000
100
10
DS
DC
5
#FA59H
试题五
10、[函数5]
int DeleteNode(Bitree *r,int e){
6
Bitree p=* r,pp,s,c;
while(
(1)
){/ * 从树根结点出发查找键值为e的结点 * /
pp=p;
if(e<p->data)
else p=p->Rchild
p=p->Lchild;
}
if(! p)return-1;/ * 查找失败 * /
if(p->Lchild && p->Rchild){/ * 处理情况③ * /
(2) ;pp=p;
s=
while(
p->dara=s->data;P=s;
(3)
){pp=s;s=s->Rchild;}
(4)
}
/ * 处理情况①、② * /
if(
else c=p->Rchild
if(p==*r)
else if(
*r=c;
)c=p->Lchild;
(5)
)pp->Lchild=c;
else pp->Rchild=c;
free(p);
return 0;
}
试题六
11、[程序6]
#include<ioStream.h>
template<class T>class Array;
template<class T>class ArrayBody{
(1) ;
friend
T* tpBody;
int iRows,iCurrentRow;
ArrayBOdy(int iRsz,int iCsz){
tpBody=
iRows=iRsz,iColumns=iCsz;iCurrentRow=-1;
(2) ;
}
public:
T& operator[](int j) {
bool row_error,column_error;
row_error=column_error=false;
try{
if(iCurrentRow<0||iCurrentRow≥iRows)
row_error=;
if(j<0|| j≥iColumns
column_error=;
if(row_error==true || column_error==true)
(3) ;
}
eatch(char) {
if(row error==true)
cerr<<“行下标越界[“<<iCurrentRow<<”]”;
if(column error==true)
cerr<<“列下标越界[“<<j<<”]”;
cout<<“\n”;
}
7
return tpBody[iCurrentRow * iColumns+j];
}
~ArrayBody(){delere[]tpBody;}
};
template<class T>class Array {
ArrayBody<T> tBody;
public:
ArrayBody<T> & operator[](int i){
(4) ;
return tBody;
};
void main()
{
Array<int> a1(10,20);
Array<double> a2(3,5);
int b1;
double b2;
b1=a1[-5][10];
b1=a1[10][15];
b1=a1[1][4];
b2=a2[2][6];
b2=a2[10][20];
/ * 有越界提示:行下标越界[-5] * /
/ * 有越界提示:行下标越界[10] * /
/ * 没有越界提示 * /
/ * 有越界提示:列下标越界[6] * /
/ * 有越界提示:行下标越界[10]列下标越界[20] *
/
}
b2=a2[1][4];
/ * 没有越界提示 * /
答案:
试题一
1、A:传感器;B:报警器
试题1[分析]
本题是一道分层数据流图的题目。解答此类问题最关键的一点就是要细心,把题目看清,不要丢掉任何一个
条件。另外解题有一定的技巧,从一些常规的入口作为突破口,会事半功倍。现在就利用分层数据流图的数据流的
平衡原则(即父图和子图(加工图)的一致性)来解题。
子图是其父图中某一部分内部的细节图(加工图)。它们的输入输出数据流应该保持一致。如同看到地上有只
蚂蚁有6条细细的腿,中间是一个小黑点,要看得更清楚一些就拿放大镜看。这时能看到它的头、触角、身体和比
较粗的腿,但是看到的一定还是6条腿,不是7条,也不是3条。子图也是如此,在上一级中有几个数据流,它的子
图也一定有同样的数据流,而且它们的输送方向是一致的(也就是说原图有3条进的数据流,2条出的数据流,子图
同样也是)。
用这条原则可以轻松地解决问题3。在0层图中,“4监控传感器”模块有1条输入数据流——“传感器状态”
和3条输出数据流——“电话拨号”、“传感器数据”和“告警类型”。在加工4的细化图中,仅看到了输出数据流
“告警类型”,所以知道此加工图少了“传感器状态”、“电话拨号”、“传感器数据”这3条数据流。加工4的结
构非常清晰,所以只需把这 3条数据流对号入座即可,“电话拨号”应是“4.5拨号”的输出数据流;“传感器状
态”应是作为“4.4读传感器”处理的输入数据流;“传感器数据”应该是经“4.1显示格式”处理过的数据流,所
以作为“4.1显示格式”的输出数据流。
[问题1]
此题和以往试题有所不同。以往都给定了完整正确的顶层图。现在顶层图不完整,可以通过题目说明信息以
及顶层图来分析顶层图并解答问题。题目中提到了“房主可以在安装该系统时配置安全监控设备(如传感器,显示
8