2005年下半年软件设计师下午试题

考试总分:7分

考试类型:模拟试题

作答时间:60分钟

已答人数:967

试卷答案:有

试卷介绍: 2005年下半年软件设计师下午试题

开始答题

试卷预览

  • 1. 试题七(共15分)阅读以下说明和C代码,将应填入_____(n)____处的字句写在答题纸的对应栏内。[说明]在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文件的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。[C代码]#include#defineOBS_MAXNUM20/*一个OfficeDoc变量最多能够关联的DocExplorer变量的个数*/typedefvoid(____(1)____)(strucOfficeDoc*,structDocExplorer*);structDocExplorer{funcupdate;/*DocExplorer结构采用的更新函数*//*其它的结构字段省略*/};structOfficeDoc{___(2)____myObs[OBS_MAXNUM];/*存储所有与OfficeDoc相关联的DocExplorer结构指针*/intindex;/*与OfficeDoc结构变量相关联的DocExplorer结构变量的个数*/};voidattach(structOfficeDoc*doc,structDocExplorer*ob){/*关联Obersver结构ob与OfficeDoc结构doc*/intloop=0;if(doc->index>=OBS_MAXNUM||ob==NULL)return;for(loop=0;loopindex;loop++)if(doc->myObs[loop]==ob)return;doc->myObs[doc->index]=ob;doc->index++;}voiddetach(structOfficeDoc*doc,structDocExplorer*ob){/*解除doc结构与ob结构间的关系*/intloop;if(ob==NULL)return;for(loop=0;loopindex;loop++){if(doc->myObs[loop]==ob){if(loopindex-2)doc->myObs[loop]=doc->myObs[____(3)____];doc->myObs[doc->index-1]=NULL;doc->index--;breack;}}}voidupdate1(structOfficeDoc*doc,structDocExplorer*ob){/*更新ob结构的值,更新代码省略*/}voidupdate2(structOfficeDoc*doc,structDocExplorer*ob){/*更新ob结构的值,更新代码省略*/}voidnotifyObs(structOfficeDoc*doc){/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/intloop;for(loop=0;loopindex;loop++){(doc->myObs[loop])->update(____(4)____);}}voidmain(){structOfficeDocdoc;/*定义一OfficeDoc变量*/structDocExplorerexplorer1,explorer2;/*定义两个DocExplorer变量*//*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/doc.index=0;explorer1.update=update1;/*设置explorer1变量的更新函数*/explorer2.update=update2;/*设置explorer2变量的更新函数*/attach(&doc,&explorer1);/*关联explorer1与doc对象*/attach(&doc,&explorer1);/*关联explorer1与doc对象*//*其它代码省略*/_____(5)____;/*通知与OfficeDoc相关的所有DocExploer变量*/return;}[15分]

    A(1)____)(strucOfficeDoc*,structDocExplorer*);structDocExplorer{funcupdate;/*DocExplorer结构采用的更新函数*//*其它的结构字段省略*/};structOfficeDoc{___

    B(2)____myObs[OBS_MAXNUM];/*存储所有与OfficeDoc相关联的DocExplorer结构指针*/intindex;/*与OfficeDoc结构变量相关联的DocExplorer结构变量的个数*/};voidattach(structOfficeDoc*doc,structDocExplorer*ob){/*关联Obersver结构ob与OfficeDoc结构doc*/intloop=0;if(doc->index>=OBS_MAXNUM||ob==NULL)return;for(loop=0;loopindex;loop++)if(doc->myObs[loop]==ob)return;doc->myObs[doc->index]=ob;doc->index++;}voiddetach(structOfficeDoc*doc,structDocExplorer*ob){/*解除doc结构与ob结构间的关系*/intloop;if(ob==NULL)return;for(loop=0;loopindex;loop++){if(doc->myObs[loop]==ob){if(loopindex-2)doc->myObs[loop]=doc->myObs[____

    C(3)____];doc->myObs[doc->index-1]=NULL;doc->index--;breack;}}}voidupdate1(structOfficeDoc*doc,structDocExplorer*ob){/*更新ob结构的值,更新代码省略*/}voidupdate2(structOfficeDoc*doc,structDocExplorer*ob){/*更新ob结构的值,更新代码省略*/}voidnotifyObs(structOfficeDoc*doc){/*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/intloop;for(loop=0;loopindex;loop++){(doc->myObs[loop])->update(____

    D(4)____);}}voidmain(){structOfficeDocdoc;/*定义一OfficeDoc变量*/structDocExplorerexplorer1,explorer2;/*定义两个DocExplorer变量*//*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/doc.index=0;explorer1.update=update1;/*设置explorer1变量的更新函数*/explorer2.update=update2;/*设置explorer2变量的更新函数*/attach(&doc,&explorer1);/*关联explorer1与doc对象*/attach(&doc,&explorer1);/*关联explorer1与doc对象*//*其它代码省略*/_____

    E(5)____;/*通知与OfficeDoc相关的所有DocExploer变量*/return;}[15分]

  • 2. 试题二(共15分)阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。[说明]某企业决定开发一个企业仓储管理系统,由李工承担系统的设计工作。该系统的网络连接如图2-1所示。[图2-1]该企业有多个仓库,图2-1所示的中心数据库存储了各个仓库中每种货物的库存信息。每个仓库配备一台前端机,进出货物均由前端机辅助实现。管理员每天上班时,通过前端机从中心数据库的库存表中读取本仓库各种货物的库存数,每个仓库的当日业务数据也都暂存在前端机,当天业务结束后,再将前端机中存储的数据传输到主机进行存储与汇总。每个仓库可以存放多种货物,但同一种货物不能存放在不同的仓库中。每个仓库有多个管理员,但每个管理员只管理一个仓库。货物出库/入库时,由仓库管理员将货物的条码通过阅读器输入前端机中,货物数量的默认值为1,可以由管理员修改。前端机根据输入的货物信息,打印"出库/入库"清单。出库/入库单中同一种货物最多只出现一次,每份出库/入库单由流水号唯一标识。图2-2是一个出库单的实例。[图2-2]流水号:200408080001300101时间:2005-10-0113:22货物编码货物名称单价数量6900100180988全自动洗衣机1680.0026690010017065532寸彩色电视机7580.002069001001601261P空调2360.0060管理员:出库/入库:出库该系统处理业务的过程如下:1.初始化:前端机根据仓库号从货物表中读取本仓库中每种货物的货物编码、库存量、货物名称和单价。2.登记出库/入库信息:由前端机存储每一笔"出库/入库"记录。3.汇总:在每个工作日结束前汇总当日各种货物的"出库/入库"量至日汇总表;4.更新库存表:根据当日的汇总信息更新货物的库存。李工经过分析,设计出如图2-3所示的关系模式。[图2-3]出入库单(流水号,出入库标志,管理员号,时间)出入库记录(货物编码,数据,流水号)日汇总表(日期,货物编码,数量,出入库标志)仓库(仓库号,仓库名,仓库电话)管理员(管理号,姓名,仓库号)货物(__________(a)__________)注:时间格式为:年-月-日时:分:日期格式为:年-月-日。实体联系图的表示方法如图2-4所示,其中方框表示实体,菱形表示联系,联系的类型在实体与联系的边上标出。图2-5为与该系统对应的实体联系图。[图2-4][问题1](3分)根据题意,补充图2-3中(a)处的空缺,即货物关系模式的属性。[问题2](6分)根据题意,补充图2-5中缺失的联系和联系的类型,使其成为完善的实体联系图。其中,联系名分别取名为联系1,联系2,联系3,…。[问题3](6分)写出每种关系模式的主键,将其填写在答题纸的对应栏内。[15分]
  • 3. 试题三(共15分)阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。[说明]某公司计划与客户通过Internet交换电子邮件和数据(以下统一称为"消息")。为保障安全,在对传输的数据进行加密的同时,还要对参与通信的实体进行身份认证。因此,需同时使用对称与非对称密钥体系。图3-2描述了接收者B使用非对称密钥体系对发送者A进行认证的过程。[图3-1]图3-2描述了发送和接收消息的过程,其中的认证过程使用了图3-1中的方法。图3-1中的方框a和方框b与图3-2中的方框a和方框b相同。[图3-2]图3-2中发送和接收消息的过程是:1)发送者A使用与接收者B共享的对称密钥体系的密钥加密将要发送的消息。2)为了实现身份认证,A使用与B共享的摘要算法生成消息摘要,并使用公钥密码体系把生成的消息摘要加密后发送给B(这里假设A和B都通过安全的方法获得对方的公钥)。3)B使用非对称密钥体系解密收到的消息摘要,使用与A共享的对称密钥体系的密钥解密加密后的消息,再使用与A共享的摘要算法针对解密后的消息生成消息摘要。4)B对比自已生成的消息摘要与接收到的A发送的消息摘要是否相同,从而验证发送者A的身份。[问题1](2分)请在下列选项中选择合适的答案,填入图3-1、3-2的方框a和方框b。B的公钥,B的私钥,摘要算法,A的私钥,A的公钥,会话密钥[问题2](4分)请在下列选项中选择合适的答案,填入图3-2的方框c至方框f。B的公钥,B的私钥,摘要算法,A的私钥,A的公钥,会话密钥[问题3](5分)按照图3-2中的方法发送邮件时,使用不同的密码体制加密消息和消息摘要,请用150字以内文字简要说明这样做的理由。[问题4](4分)请从下面关于摘要函数的说法中选出所有正确的描述。[a]很容易使不同的输入数据生成相同的输出数据。[b]根据输入数据获取输出数据的时间非常短。[c]根据输入数据获取输出数据的时间非常长。[d]输出数据的长度比输入数据的长度要长。[e]根据输出数据无法还原出输入数据。[15分]
  • 4. 试题四(共15分)阅读以下函数说明、图和C代码,将应填入_____(n)____处的字句写在答题纸的对应栏内。[说明]散列文件的存储单位称为桶(BUCKET)。假如一个桶能存放m个记录,当桶中已有m个同义词(散列函数值相同)的记录时,存放第m+1个同义词会发生"溢出"。此时需要将第m+1个同义词存放到另一个称为"溢出桶"的桶中。相对地,称存放前m个同义词的桶为"基桶"。溢出桶和基桶大小相同,用指针链接。查找指定元素记录时,首先在基桶中查找。若找到,则成功返回,否则沿指针到溢出桶中进行查找。例如:设散列函数为Hash(Key)=Keymod7,记录的关键字序列为15,14,21,87,96,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图4-1所示。[图4-1]为简化起见,散列文件的存储单位以内存单元表示。函数InsertToHashTable(intNewElemKey)的功能是:若新元素NewElemKey正确插入散列文件中,则返回值1;否则返回值0。采用的散列函数为Hash(NewElemKey)=NewElemKey%P,其中P设定的基桶数目。函数中使用的预定义符号如下:#defineNULLKey-1/*散列桶的空闲单元标识*/#defineP7/*散列文件中基桶的数目*/#defineITEMS3/*基桶和溢出桶的容量*/typedefstructBucketNode{/*基桶和溢出桶的类型定义*/intKeyData[ITEMS];structBucketNode*Link;}BUCKET;BUCKETBucket[P];/*基桶空间定义*/[函数]intInsertToHashTable(intNewElemKey){/*将元素NewElemKey插入散列桶中,若插入成功则返回0,否则返回-1*//*设插入第一个元素前基桶的所有KeyData[]、Link域已分别初始化为NULLKEY、NULL*/intIndex;/*基桶编号*/inti,k;BUCKET*s,*front,*t;____(1)____;for(i=0;iKeyData[k]==NULLKEY){/*在溢出桶链表中找到空闲单元*/t->KeyData[k]=NewElemKey;break;}/*if*/if(____(4)____)t=t->Link;elsebreak;}/*while*/}/*if*/if(____(5)____){/*申请新溢出桶并将元素存入*/s=(BUCKET*)malloc(sizeof(BUCKET));if(!s)return-1;s->Link=NULL;for(k=0;kKeyData[k]=NULLKEY;s->KeyData[0]=NewElemKey;_____(6)_____;}/*if*/return0;}/*InsertToHashTable*/[15分]

    A(1)____;for(i=0;i<ITEMS;i++)/*在基桶查找空闲单元,若找到则将元素存入*/if(Bucket[Index].KeyData[i]==NULLKEY){Bucket[Index].KeyData[i]=NewElemKey;break;}if(____

    B(2)____)return0;/*若基桶已满,则在溢出桶中查找空闲单元,若找不到则申请新的溢出桶*/_____

    C(3)_____;t=Bucket[Index].Link;if(t!=NULL){/*有溢出桶*/while(t!=NULL){for(k=0;kKeyData[k]==NULLKEY){/*在溢出桶链表中找到空闲单元*/t->KeyData[k]=NewElemKey;break;}/*if*/if(____

    D(4)____)t=t->Link;elsebreak;}/*while*/}/*if*/if(____

    E(5)____){/*申请新溢出桶并将元素存入*/s=(BUCKET*)malloc(sizeof(BUCKET));if(!s)return-1;s->Link=NULL;for(k=0;kKeyData[k]=NULLKEY;s->KeyData[0]=NewElemKey;_____

    F(6)_____;}/*if*/return0;}/*InsertToHashTable*/[15分]

  • 5. 试题五(共15分)阅读以下说明和C++代码,将应填入_____(n)____处的字句写在答题纸的对应栏内。[说明]在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个C++源文件中,能够正确编译通过。[C++代码]#includeconstOBS_MAXNUM=20//最多与OfficeDoc对象相关联的DocExplorer对象的个数____(1)____;classDocExploer{//关注OfficeDoc公文对象的类public:DocExplorer(____(2)____*doc);//构造函数_____(3)____voidupdate(OfficeDoc*doc)=0;//更新自身状态的函数//其它相关属性和方法省略}classOfficeDoc{//公文类private:DocExploer*myObs[OBS_MAXNUM];//关注此公文类的DocExplorer类对象指针数组intindex;//与OfficeDoc对象关联的DocExploer对象的个数public:OfficeDoc(){index=0;}voidattach(DocExploer*o){//将一DocExploer对象与OfficeDoc对象相关联if(index>=OBS_MAXNUM||o==NULL)return;for(intloop=0;loop____(4)____;//DocExplorer对象更新自身状态}}//其它公文类的相关属性和方法};DocExplorer::DocExplorer(OfficeDoc*doc){//DocExploer类对象的构造函数doc->____(5)____;//将此DocExplorer对象与doc对象相关联}[15分]

    A(1)____;classDocExploer{//关注OfficeDoc公文对象的类public:DocExplorer(____

    B(2)____*doc);//构造函数_____

    C(3)____voidupdate(OfficeDoc*doc)=0;//更新自身状态的函数//其它相关属性和方法省略}classOfficeDoc{//公文类private:DocExploer*myObs[OBS_MAXNUM];//关注此公文类的DocExplorer类对象指针数组intindex;//与OfficeDoc对象关联的DocExploer对象的个数public:OfficeDoc(){index=0;}voidattach(DocExploer*o){//将一DocExploer对象与OfficeDoc对象相关联if(index>=OBS_MAXNUM||o==NULL)return;for(intloop=0;loop____

    D(4)____;//DocExplorer对象更新自身状态}}//其它公文类的相关属性和方法};DocExplorer::DocExplorer(OfficeDoc*doc){//DocExploer类对象的构造函数doc->____

    E(5)____;//将此DocExplorer对象与doc对象相关联}[15分]

  • 6. 试题一(15分)阅读下列说明了和图,回答问题1至问题3,将解答填入答题纸的对应栏内。[说明]某公司的主要业务是出租图书和唱碟。由于业务需求,该公司委托软件开发公司A开发一套信息管理系统。该系统将记录所有的图书信息、唱碟信息、用户信息、用户租借信息等。A公司决定采用面向对象的分析和设计方法开发此系统。图1-1所示为某类图书或唱碟被借阅时应记录的信息,图1-2描述了系统定义的两个类Book和CD,分别表示图书和唱碟的信息。[图1-1][问题1](3分)经过进一步分析,设计人员决定定义一个类Items_on_loan,以表示类Book和CD的共有属性和方法。请采用图1-2中属性和方法的名称给出类Items_on_loan应该具有的属性和方法。(注意:不同名称的属性和方法表示不同的含义,如CD中的composer与Book中的author无任何关系)[问题2](6分)为了记录每种图书或唱碟的历史记录,引入类CirculationHistory,类中存储的信息是图1-1中所表示的内容。请采用UML表示法将下列四个类间的关系表示出来。Items_onBookCirculationHistoryCD[问题3](6分)现需了解十大最畅销(借出次数最多)图书或唱碟。为此引入TemPopulate类以存储所有十大畅销图书或CD的名称及其被借出的次数。下列顺序图描述了某类图书或唱碟被借出后成为十大畅销图书或唱碟时对象间的消息交互。系统在一次运行过程中,应有___(1)___个TenPopulate实例对象最合适,一个TenPopulate类实例对象最多需要和____(2)____个Items_on_loan实例对象交互。[15分]

    A(1)___个TenPopulate实例对象最合适,一个TenPopulate类实例对象最多需要和____

    B(2)____个Items_on_loan实例对象交互。[15分]

  • 7. 试题六(共15分)阅读以下说明和Java代码,将应填入_____(n)____处的字句写在答题纸的对应栏内。[说明]在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件的内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为观察者模式。以下代码写在一个Java源文件中,能够正确编译通过。[Java代码]//Subject.java文件publicinterfaceSubject{publicvoidattach(ObserverDocExplorer);publicvoiddetach(ObserverDocExplorer);voidnotifyObservers();}//Observer,java文件publicinterfaceObsever{voidupdate(____(1)____);}//OfficeDoc.java文件importjava.util.*;publicclassOfficeDocimplementsSubject{//OfficeDoc类实现Subject接口privateVectorObserverVector=newjava.util.Vector();//存储与OfficeDoc相关联的DocExplorer对象publicvoidattach(Obseverobserver){//将某DocExplorer对象与OfficeDoc相关联ObserverVector.addElement(observer);}publicvoiddetach(Observerobserver){//解除某DocExplorer对象与OfficeDoc的关联关系ObserverVector.removeElement(observer);}publicvoidnotifyObservers(){//当OfficeDoc对象状态已发生变化时,通知所有的DocExplorer对象Enumerationenumeration=______(2)_____;while(enumeration.hasMoreElements()){((Observer)enumeration.nextElement())._____(3)_____;}}publicEnumerationObservers(){returnObserverVector.elements();}//其它公文类的属性和方法省略}//DocExplorer.java文件publicclassDocExplorerimplements_____(4)____{publicvoidupdate(____(5)____){//更新DocExplorer自身的状态,代码省略}}[15分]

    A(1)____);}//OfficeDoc.java文件importjava.util.*;publicclassOfficeDocimplementsSubject{//OfficeDoc类实现Subject接口privateVectorObserverVector=newjava.util.Vector();//存储与OfficeDoc相关联的DocExplorer对象publicvoidattach(Obseverobserver){//将某DocExplorer对象与OfficeDoc相关联ObserverVector.addElement(observer);}publicvoiddetach(Observerobserver){//解除某DocExplorer对象与OfficeDoc的关联关系ObserverVector.removeElement(observer);}publicvoidnotifyObservers(){//当OfficeDoc对象状态已发生变化时,通知所有的DocExplorer对象Enumerationenumeration=______

    B(2)_____;while(enumeration.hasMoreElements()){((Observer)enumeration.nextElement())._____

    C(3)_____;}}publicEnumerationObservers(){returnObserverVector.elements();}//其它公文类的属性和方法省略}//DocExplorer.java文件publicclassDocExplorerimplements_____

    D(4)____{publicvoidupdate(____

    E(5)____){//更新DocExplorer自身的状态,代码省略}}[15分]

相关试卷
相关题库