📄 2006年下半年软件设计师下午试卷.htm
字号:
<TD width=180>
<P>getCommodities</P></TD></TR>
<TR>
<TD width=324>
<P>生成促销信息</P></TD>
<TD width=180>
<P>createPromotion</P></TD></TR>
<TR>
<TD width=324>
<P>生成促销订单信息</P></TD>
<TD width=180>
<P>createPOrder</P></TD></TR>
<TR>
<TD width=324>
<P>查找某个分类的所有促销信息列表</P></TD>
<TD width=180>
<P>getCategoryPromotion</P></TD></TR>
<TR>
<TD width=324>
<P>查找某商家所销售的所有分类列表</P></TD>
<TD width=180>
<P>getCategories</P></TD></TR>
<TR>
<TD width=324>
<P>查找某个促销所涉及的所有商品信息列表</P></TD>
<TD width=180>
<P
align=left>getPromotionCommodities</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P><B>[问题 3]</B>(5 分)<BR> 关联(Association)和聚集(Aggregation)是 UML
中两种非常重要的关系。请说明关联和聚集的关系,并说明其不同点。</P>
<P><B>试题四</B>(共 15
分)<BR> 阅读以下说明和图,填补流程图中的空缺,将解答填入答题纸的对应栏内。<BR><B>[说明]</B><BR> 某汽车制造工厂有两条装配线。汽车装配过程如图
4-1 所示,即汽车底盘进入装配线,零件在多个工位装配,结束时汽车自动完成下线工作。</P>
<P align=center><IMG height=296 src="2006年下半年软件设计师下午试卷.files/gc06_2x06.gif"
width=712 border=0><BR>图 4-1 汽车装配线</P>
<P> (1) e0 和 e1 表示底盘分别进入装配线 0 和装配线 1 所需要的时间。<BR> (2) 每条装配线有 n 个工位,第一条装配线的工位为
S0,0, S0,1, …, S0,n-1, 第二条装 配线的工位为 S1,0, S1,1, …, S1,n-1。其中 S0,k 和
S1,k(0≤k≤n-1)完成相同的任务,但所需时间可能不同。<BR> (3) ai,j 表示在工位 Si,j 处的装配时间,其中 i 表示装配线(i=0 或
i=1),j 表示工位号(0≤j≤n-1)。<BR> (4) ti,j 表示从 Si,j 处装配完成后转移到另一条装配线下一个工位的时间。<BR> (5)
x0 和 x1 表示装配结束后,汽车分别从装配线 0 和装配线 1 下线所需要的时间。<BR> (6)
在同一条装配线上,底盘从一个工位转移到其下一个工位的时间可以忽略不计。<BR> 图 4-2
所示的流程图描述了求最短装配时间的算法,该算法的输入为:<BR> n: 表示装配线上的工位数;<BR> e[i]: 表示 e1 和 e2,i 取值为 0
或 1;<BR> a[i][j]:表示 ai,j,i 的取值为 0 或 1,j 的取值范围为 0~n-1;<BR> t[i][j]:表示 ti,j, i
的取值为 0 或 1,j 的取值范围为 0~n-1;<BR> x[i]: 表示 x0 和 x1,i 取值为 0 或
1。<BR> 算法的输出为:<BR> fi:最短的装配时间;<BR> li:获得最短装配时间的下线装配线号(0 或者 1)。<BR> 算法中使用的
f[i][j]表示从开始点到 Si,j 处的最短装配时间。</P>
<P align=center><IMG height=764 src="2006年下半年软件设计师下午试卷.files/gc06_2x10.gif"
width=578 border=0><BR>图 4-2 求最短装配时间算法</P>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=1 width="61%" border=0>
<TBODY>
<TR>
<TD width="100%"> 从下列的 3 道试题(试题五至试题七)中任选 1 道解答。如果解答的试题数超过 1 道,则题号小的 1
道解答有效。</TD></TR></TBODY></TABLE></CENTER></DIV>
<P><B>试题五</B>(15 分)<BR> 阅读以下说明、图和 C 代码,将应填入<U> (n)</U>
处的字句写在答题纸的对应栏内。<BR><B>[说明]</B><BR> 一般的树结构常采用孩子-兄弟表示法表示,即用二叉链表作树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。例如,图
5-1(a) 所示的树的孩子-兄弟表示如图 5-1(b)所示。</P>
<P align=center><IMG height=233 src="2006年下半年软件设计师下午试卷.files/gc06_2x07.gif"
width=556 border=0><BR>图 5-1 树及其孩子-兄弟表示示意图</P>
<P><BR> 函数 LevelTraverse()的功能是对给定树进行层序遍历。例如,对图 5-1 所示的树进 行层序遍历时,结点的访问次序为:D B A
E F P C 。<BR> 对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示:</P>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 cellPadding=3 width="100%" border=1>
<TBODY>
<TR>
<TD align=middle width=284>
<P>函数原型</P></TD>
<TD align=middle width=405>
<P>说明</P></TD></TR>
<TR>
<TD width=284>
<P>void InitQueue(Queue *Q)</P></TD>
<TD width=405>
<P>初始化队列</P></TD></TR>
<TR>
<TD width=284>
<P>Bool IsEmpty(Queue Q)</P></TD>
<TD width=405>
<P>判断队列是否为空,若是则返回 TRUE,否则返回 FALSE</P></TD></TR>
<TR>
<TD width=284>
<P>void EnQueue(Queue *Q,TreeNode p)</P></TD>
<TD width=405>
<P>元素入队列</P></TD></TR>
<TR>
<TD width=284>
<P>void DeQueue(Queue *Q,TreeNode *p)</P></TD>
<TD width=405>
<P>元素出队列</P></TD></TR></TBODY></TABLE></CENTER></DIV>
<P> Bool、Status 类型定义如下:<BR> typedef enum {FALSE = 0,TRUE = 1}
Bool;<BR> typedef enum {OVERFLOW = -2,UNDERFLOW = -1,ERROR = 0,OK = 1}
Status;</P>
<P> 树的二叉链表结点定义如下:<BR> typedef struct Node {<BR> char data;<BR> struct
Node *firstchild,*nextbrother;<BR> }Node,*TreeNode;</P>
<P><B>[函数]</B><BR> Status LevelTraverse(TreeNode
root)<BR> { /*层序遍历树,树采用孩子-兄弟表示法,root 是树根结点的指针*/<BR> Queue
tempQ;<BR> TreeNode ptr,brotherptr;<BR> if (!root)<BR> return
ERROR;<BR> InitQueue(&tempQ);<BR> <U> </U><U>(1) </U>;<BR> brotherptr
= root -> nextbrother;<BR> while (brotherptr){
EnQueue(&tempQ,brotherptr);<BR> <U> (2)
</U>;<BR> } /*end-while*/<BR> while (<U> (3)</U> ) {<BR> <U> (4)
</U>;<BR> printf("%c\t",ptr->data);<BR> if (<U> (5) </U>)
continue;<BR> <U> </U><U>(6) </U>;<BR> brotherptr =
ptr->firstchild->nextbrother;<BR> while (brotherptr){
EnQueue(&tempQ,brotherptr);<BR> <U> (7)
</U>;<BR> } /*end-while*/<BR> } /*end-while*/<BR> return
OK;<BR> }/*LevelTraverse*/</P>
<P><B>试题六</B>(共 15 分)<BR> 阅读以下说明和 C++代码,将应填入<U> (n)</U>
处的字句写在答题纸的对应栏内。<BR><B>[说明]</B><BR> 传输门是传输系统中的重要装置。传输门具有
Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)五种状态。触发传输门状态转
换的事件有 click、complete 和 timeout 三种。事件与其相应的状态转换如图 6-1 所示。</P>
<P align=center><IMG height=297 src="2006年下半年软件设计师下午试卷.files/gc06_2x08.gif"
width=540 border=0><BR>图 6-1 传输门响应事件与其状态转换图</P>
<P><BR> 下面的[C++代码 1]与[C++代码 2]分别用两种不同的设计思路对传输门进行状态模拟, 请填补代码中的空缺。<BR><B>[C++代码
1]</B><BR> const int CLOSED = 1; const int OPENING = 2;<BR> const int OPEN =
3; const int CLOSING = 4;<BR> const int STAYOPEN = 5; //定义状态变量,用不同整数表示不同状态</P>
<P> class Door {<BR> private:<BR> int state; //传输门当前状态<BR> void
setState(int state){ this->state = state; }
//设置当前状态<BR> public:<BR> Door():state(CLOSED){};<BR> void
getState(){ //根据当前状态输出相应的字符串<BR> switch(state){<BR> case OPENING: cout
<<"OPENING" << endl; break;<BR> case CLOSED: cout <<
"CLOSED" << endl; break;<BR> case OPEN: cout << "OPEN" <<
endl; break;<BR> case CLOSING: cout << "CLOSING" << endl;
break;<BR> case STAYOPEN: cout << "STAYOPEN" << endl;
break;<BR> }<BR> }<BR> void click() { //发生click事件时进行状态转换<BR> if (<U>
(1) </U>) setState(OPENING);<BR> else if (<U> (2) </U>)
setState(CLOSING);<BR> else if (<U> (3) </U>)
setState(STAYOPEN);<BR> }<BR> void timeout(){ //发生timeout事件时进行状态转换<BR> if
(state == OPEN) setState(CLOSING);<BR> }<BR> void
complete(){ //发生complete事件时进行状态转换<BR> if (state == OPENING)
setState(OPEN);<BR> else if (state == CLOSING)
setState(CLOSED);<BR> }<BR> };<BR> int main(){<BR> Door
aDoor;<BR> aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();<BR> aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click();<BR> aDoor.getState();
return 0;<BR> }</P>
<P><B>[C++代码 2]</B><BR> class Door {<BR> public:<BR> DoorState *CLOSED,
*OPENING, *OPEN, *CLOSING, *STAYOPEN, *state;<BR> Door();<BR> virtual
~Door(){ …… //释放申请的内存,此处代码省略};<BR> void setState(DoorState *state) {
this->state = state; }<BR> void getState(){<BR> //
此处代码省略,本方法输出状态字符串,<BR> // 例如,当前状态为CLOSED时,输出字符串为“CLOSED”<BR> };<BR> void
click();<BR> void timeout();<BR> void complete();<BR> };</P>
<P><BR> Door::Door(){<BR> CLOSED = new DoorClosed(this); OPENING = new
DoorOpening(this);<BR> OPEN = new DoorOpen(this); CLOSING = new
DoorClosing(this);<BR> STAYOPEN = new DoorStayOpen(this); state =
CLOSED;<BR> }<BR> void Door::click(){ <U>(4)</U> ;}<BR> void
Door::timeout(){<U> (5) </U>; }<BR> void Door::complete(){<U> (6) </U>; }</P>
<P> class DoorState //定义一个抽象的状态,它是所有状态类的基类<BR> {<BR> protected: Door
*door;<BR> public:<BR> DoorState(Door *door) { this->door = door;
}<BR> virtual ~DoorState(void);<BR> virtual void click() {}<BR> virtual
void complete() {}<BR> virtual void timeout() {}<BR> };</P>
<P> class DoorClosed :public DoorState{ //定义一个基本的 Closed
状态<BR> public:<BR> DoorClosed(Door *door):DoorState(door) {}<BR> virtual ~
DoorClosed (){}<BR> void click();<BR> };<BR> void DoorClosed::click() {<U>
(7) </U>; }<BR> // 其它状态类的定义与实现代码省略</P>
<P> int main(){<BR> Door
aDoor;<BR> aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();<BR> aDoor.getState(); aDoor.timeout(); aDoor.getState(); return
0;<BR> }</P>
<P><B>试题七</B>(共 15 分)<BR> 阅读以下说明以及 Java 程序,将应填入 <U>(n)</U>
处的字句写在答题纸的对应栏内。<BR><B>[说明]</B><BR> 传输门是传输系统中的重要装置。传输门具有
Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)五种状态。触发状态的转换事件有
click、complete 和 timeout 三种。事件与其相应的状态转换如图 7-1 所示。</P>
<P align=center><IMG height=299 src="2006年下半年软件设计师下午试卷.files/gc06_2x09.gif"
width=548 border=0><BR>图 7-1 传输门响应事件与其状态转换图</P>
<P> 下面的[Java 代码 1]与[Java 代码 2]分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。<BR><B>[Java 代码
1]</B><BR> public class Door {<BR> public static final int CLOSED =
1; public static final int OPENING = 2;<BR> public static final int OPEN =
3; public static final int CLOSING = 4;<BR> public static final int STAYOPEN
= 5; private int state = CLOSED;<BR> //定义状态变量,用不同的整数表示不同状态<BR> private void
setState(int state){this.state = state;} //设置传输门当前状态<BR> public void
getState(){<BR> // 此处代码省略,本方法输出状态字符串,<BR> // 例如,当前状态为 CLOSED
时,输出字符串为”CLOSED”<BR> }<BR> public void click() { //发生 click
事件时进行状态转换<BR> if (<U> (1) </U>) setState(OPENING);<BR> else if (
<U>(2)</U> ) setState(CLOSING);<BR> else if (<U> (3) </U>)
setState(STAYOPEN);<BR> //发生 timeout 事件时进行状态转换<BR> public void timeout(){
if (state == OPEN) setState(CLOSING); }<BR> public void complete(){ //发生
complete 事件时进行状态转换<BR> if (state == OPENING) setState(OPEN);<BR> else if
(state == CLOSING) setState(CLOSED);<BR> }<BR> public static void
main(String [] args){<BR> Door aDoor = new
Door();<BR> aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();<BR> aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click();<BR> aDoor.getState(); return;<BR> }<BR> }</P>
<P><B>[Java 代码 2]</B><BR> public class Door {<BR> public final DoorState
CLOSED = new DoorClosed(this);<BR> public final DoorState OPENING = new
DoorOpening(this);<BR> public final DoorState OPEN = new
DoorOpen(this);<BR> public final DoorState CLOSING = new
DoorClosing(this);<BR> public final DoorState STAYOPEN = new
DoorStayOpen(this);<BR> private DoorState state = CLOSED;</P>
<P> //设置传输门当前状态<BR> public void setState(DoorState state){ this.state =
state;}<BR> public void
getState(){ //根据当前状态输出对应的状态字符串<BR> System.out.println(state.getClass().getName());<BR> }</P>
<P> public void click(){ <U>(4)</U> ;} //发生 click 事件时进行状态转换<BR> public void
timeout(){ <U>(5)</U> ;} //发生 timeout 事件时进行状态转换<BR> public void complete(){
<U>(6)</U> ;} //发生 complete 事件时进行状态转换</P>
<P> public static void main(String[] args){<BR> Door aDoor = new
Door();<BR> aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();<BR> aDoor.getState(); aDoor.timeout(); aDoor.getState(); return;<BR> }<BR> }</P>
<P> public abstract class DoorState { //定义所有状态类的基类<BR> protected Door door
;<BR> public DoorState(Door door) {this.door = door;}<BR> public void
click() {}<BR> public void complete() {}<BR> public void timeout()
{}<BR> }</P>
<P> class DoorClosed extends DoorState{ //定义一个基本的 Closed 状态<BR> public
DoorClosed(Door door) { super(door); }<BR> public void click() { <U>(7)</U> ;
}<BR> //该类定义的其余代码省略<BR> }<BR> //其余代码省略</P>
<P><FONT
color=#3d5c44>(从PDF中转过来的,实在是错误太多,手工修改太多地方了,有可能有差错,还忘见谅,www.4juan.com)</FONT></P>
<P align=center><A href="http://www.oldchild.net/stgc.htm">回目录</A> <A
href="http://www.4juan.com/">http://www.4juan.com/</A> 收集整理</P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -