2014年上半年软件水平考试(中级)软件设计师下午(应用技术)
真题试卷 (题后含答案及解析)
题型有:1. 必答题 2. 选答题
必答题(共4道大题,每道大题15分)
1. 阅读下列说明和图,回答【问题1】至【问题4】,将解答填人答题纸的对应栏内: 【说明】 某巴士维修连锁公司欲开发巴士维修系统,以维护与维修相关的信息,该系统的主要能如下: (1)记录巴士ID和维修问题。巴士到车库进行维修,系统将巴士基本信息和ID记录在巴士列表文件中,将待维修机械问题记录在维修记录文件中,并生成维修订单。 (2)确定所需部件,根据维修订单确定维修所需部件,并在部件清单中进行标记。 (3)完成维修,机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况;将机械问题维修情况记录在维修记录文件中,将所用部件记录在部件清单中,并将所用部件清单发送绘库存管理系统以对部件使用情况进行监控,巴士司机可查看已维修机械问题。 (4)记录维修工时,将机械师提供的维修工时记录在人事档案中,将维修总结发送给主管进行绩效考核。 (5)计算维修总成本。计算部件清单中实际所用部件、人事档案中所用维修工时的总成本;将维修工时和所用部件成本详细信息给会计进行计费。 现采用结构化方法对巴士维修系统进行分析与设计,获得如图1一l所示的上下文数据流图和图1-2所示的0层数据流图。 【问题1】使用说明中的词语,给出图1—1中的实体E1~E5的名称。 【问题2】使用说明中的词语,给出图1—2中的数据存储D1~D4的名称, 【问题3】说明图1—2中所存在的问题。 【问题4】根据说明和图中术语,采用补充数据流的方式,改正图1—2中的问题。要求给出所补充数据流的名称、起点和终点。
正确答案:【问题1】 E1:巴士司机 E2:机械师 E3:会计 E4:主管 E5:库存管理系统 【问题2】 D1:巴士列表文件 D2:维修记录文件 D3:部件清单 D4:人事档案 【问题3】 缺失以开吻邑流: 缺失以下数据流: (1)名称:待维修机械问题;起点:D2;终点:3完成维修。 (2)名称:实际所用部件;起点:D3;终点:5计算总成本。 【问题4】 补充以下数据流: (1)名称:待维修机械问题;起点:D2;终点:3完成维修。 (2)名称:实际所用部件;起点:D3;终点:5计算总成本。
解析:本题考查数据流图(DFD)的应用,采用结构化方法进行系统分析与设计,是一道传统题目,要求考生细心分析题目中所描述的内容。DFD是一种便于用户理解、分析系统数据流程的图形化建模工具,是系统逻辑模型的重要组成部分。 【问题1】 本问题考查顶层。DFD。顶层DFD一般用来确定系统边界。结合图1—1上下文数据流图以及根据系统功能的描述(3)“巴士司机可查看已维修问题”可知,E1为“巴士司机”;根据系统功能描述(4)“机械师提供的维修工时记录在人事档案中”和“维修总结发送给主管进行考核”可知,E2
为“机械师”,E4为“主管”;根据系统功能描述(5)“维修工时和所用成本详细信息给会计进行计费”可知,E3为“会计师”,由“所用部件清单发送给库存管理系统”可推断,E5为库存管理系统。 【问题2】 本问题考查DFD中数据存储的确定。本题涉及的数据存储有5个,即巴士列表文件、维修记录文件、部件清单和人事档案。接下来需要结合图1—2所示的O层数据流进行确定。D1与“记录巴士ID和维修问题”有关,根据题意,D1是“巴士列表文件”;待维修机械问题记录在D2中,可知,D2为“维修记录文件”;所需部件记录在D3中,由题意可知D3为“部件清单”;D4记录的是工时,由题意,D4是“人事档案”。 【问题3】 本问题考查DFD中的数据流。在分查DFD中,需要保持父图和子图的平衡,即父图中某加工的输入/输出数据流必须与其子图的输入/输出数据流在数量和名字上相同,或者父图的一个输入(或输出)数据流对应于子图中几个输入(或输出)数据流,而子图中组成这些数据流的数据项全体正好是父图中的一个数据流。由(5)的描述“计算部件清单中实际所用部件、人事档案中所用维修工时的总成本”可知,缺少关于实际所用部件数据流,因此增加一个数据流实际所用部件,起点:D3,终点:5计算总成本。根据“完成维修”功能中的描述,机械师可根据维修记录文件中的待维修机械问题,完成巴士维修,因此缺少数据流“待维修机械问题”,起点:D2,终点:3完成维修。 【问题4】 根据问题3解析,补充以下数据流:实际所用部件,起点:D3,终点:5计算总成本;待“维修机械问题”,起点:D2,终点:3完成维修。
2. 阅读下列说明和图,回答【问题1】至【问题3】,将解答填入答题纸的对应栏内。 【说明】某家电销售电子商务公司拟开发一套信息管理系统,以方便对公司的员工、家电销售、家电厂商和客户等进行管理。 【需求分析】 (1)系统需要维护电子商务公司的员工信息、客户信息、家电信息和家电厂商信息等,员工信息主要包括:工号、姓名、性别、岗位、身份证号、电话、住址,其中岗位包括部门经理和客服等,客户信息主要包括:客户ID、姓名、身份证号、电话、住址、账户余额。家电信息主要包括:家电条码、家电名称、价格、出厂日期、所属商,家电厂商信息包括:厂商ID、厂商名称、电话、法人代表信息、厂址。 (2)电子商务公司根据销售情况,由部门经理向家电厂商订购各类家电,每个家电厂商只能由一名部门经理负责。 (3)客户通过浏览电子商务公司网站查询家电信息,与客服沟通获得优惠后,在线购买。 【概念模型设计】 根据需求阶段收集的信息,设计的实体联系图(不完整)如图2—1所示。 【逻辑结构设计】 根据概念模型设计阶段完成的实体联系图,得出如下关系模式【不完整】 客户(客户ID、姓名、身份证号、电话、住址、账户余额) 员工(工号、姓名、性别、岗位、身份证号、电话、住址)家电(家电条码、家电名称、价格、出厂日期、(1)) 家电厂商(厂商ID、厂商名称、电话、法人代表信息、厂址、(2)) 购买(订购单号、(3)、金额) 【问题1】 补充图2—1中的联系和联系的类型。 【问题2】 根据图2—1,将逻辑结构设计阶段生成的关系模式中的空(1)一(3)补充完整,用下划线支出“家电”、“家电厂商”和“购买”关系模式的主键。 【问题3】 电子商务公司的主营业务是销售各类家电,对账户有余额的客户,还可以联合第二方基金公司提供理财服务,为此设立客户经理岗位。客户通过电子商务公司的客户经理和基金公司的基金经理进行理财,每名客户只有一名客户经理和一名基金经理负责,客户经理和基金经理均可负责多名客户。请根据该要求,对图2—1进行修改,画
出修改后的实体间联系和联系的类型。
正确答案:【问题1】【问题2】(1)厂商ID(2)工号(3)家电条码,客户ID,工号(4)家电关系的主键:家电条码(5)家电厂商关系的主键:厂商ID(6)购买关系的主键:订购单号【问题3】
解析:本题考查数据库设计。设计考点有数据库的概念结构设计和逻辑结构设计。 【问题1】 根据题意,每个家电厂商可以购买多种家电,因此家电厂商和家电之间是一对多的联系。一种家电可由多个客户购买,一个客户可购买多件家电,因此家电和客户之间是多对多的联系,由此可画出完整的实体联系图。 【问题2】 电子商务公司根据销售情况,由部门经理向家电厂商订购各类家电,每个家电厂商只能由一名部门经理负责,家电厂商中需要保存是由哪名部门经理负责的,因此这里需要有员工的工号,这样才能在员工中找到唯一对应的员工。 【问题3】 由题意可知,可增设实体客户经理和基金经理,客户和客户经理、基金经理都有联系,且客户经理和客户、基金经理和客户都是一对多的联系,由此可补充图2—1。
3. 阅读下列说明和图,回答【问题1】至【问题3】,将解答填入答题纸的对应栏内。 【说明】 某高校图书馆欲建设一个图书馆管理系统,目前已经完成了需求分析阶段的工作,功能需求均使用用例进行描述,其中用例“借书(Check Out 800ks)”的详细描述如下。 参与者:读者 典型事件流: 1.输入读者ID: 2.确认该读者能够借阅图书,并记录读者ID; 3.输入所要借阅的图书ID; 4.根据图书目录中的图书ID确认该书可以借阅,计算归还时间,生成借阅记录; 5.通知读者图书归还时间; 重复步骤3~5,直到读者结束借阅图书。 备选事件流: 2a.若读者不能借阅图书,说明读者违反了图书馆的借书制度(例如,没有支付借书费用等)。 ①告知读者不能借阅,并说明拒绝借阅的原因; ②本用例结束。 4a.读者要借阅的书无法外借。 ①告知读者本书无法借阅; ②回到步骤3。 说明:图书的归还时间与读者身份有关。如果读者是教师,图书可以借阅一年:如果是学生,则只能借阅3个月,读者ID中包含读者身份信息,现采用面向对象方法开发该系统,得到如图3—1所示的系统类模型(部分);以及如图3—2所示的系统操作。“Checkout(bookID).(借书)“通信图”(或协作图)。【问题1】 根据说明中的描述,以及图3—1和图3—2,给出图3—1中C1一C4处所对应的类名(类名使用图3—1和图3—2中给出的英文词汇)。【问题2】 根据说明中的描述,以及图3—1和图3—2,给出图3—2中M1一M4处所对应的方法名(方法名使用图3一l和图3—2中给出的英文词汇)。【问题3】 用例“借书”的备选事件流4a中,根据借书制度来判定读者能否借阅图书,随着图书馆的借书制度会不断地扩充,并需要根据图书馆的实际运行情况来调整具体使用哪些制度,为满足这一要求,在原有类设计的基础上,可以采用何种设计模式?简要说明原因。
正确答案:【问题1】 C1:Patron C2:Book C3:Catalog C4:CheckoutSessioncontrolIer 【问题2】 M1( ):getforcheck(b00kID)M2( ):isFacultyo M3( ):circulateso M4( ):recordBookLoan 【问题3】 应采用策略模式,策略模式的优势在于可以灵活的添加对同一问题的不同处理方案,这与题目要求非常吻合。
解析:【问题1】 根据系统类模型,我们可以各个类之间的关联关系。 首先从类Acoonts中的canCheckOut(patronID:string)方法,可以看出Accouts关联Patron,因此图中C1为Patron。 C1为Patron,则CI必会与书关联,从C1中的recordBookLoad(b,C2),可以看出C1关联C2。因此C2为Book。 C2为Book,根据系统操作checkOut的通信图,可以看出与Book关联的是Catalog,因此C3为Catalog。 结合两图,则可以得出C4为CheckoutSessioncontroller. 【问题2】 结合典型事件流: 1.输入读者ID; 2.确认该读者能够借阅图书,并记录读者ID; 以上两步实际上就是判断读者是不是老师,也就是isFaculty( ),因此M2为isFaculty( ); 3.输入所要借阅的图书ID;对应的操作就是M1:getforcheck(bookID); 4.根据图书目录中的图书ID确认该书可以借阅,计算归还时间,生成借阅记录;对应的操作就是M3:circulates( ); 5.通知者图书归还时间,对应的操作就是M4:recordBookLoan( )。
4. 阅读下列说明和C代码,回答【问题1】至【问题3】,将解答写在答题纸的对应栏内。 【说明】 采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含n/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序的子数组得到排序结果。 下面的C代码是对上述归并算法的实现,其中的常量和变量说明如下: arr:待排序数组 P,q,r:一个子数组的位置从P到q,另一个子数组的位置从q+1到r begin,end:待排序数组的起止位量 left,right:临时存放待合并的两个子数组 n1,n2:两个子数组的长度 i,j,k:循环变量 mid:临耐变量 【C代码】 #inciude<stdio.h> #inciude<stdlib.h> Define MAX 65536 void merge(int arr([],int P,int q,int r){ int*left,*right; int nl,n2,I,J,k; n1=q—P+1: n2=r—q: If(left=(int*)malloc((nl+1)*sizeof(int)))=NULL)( Perror(“malloc error”): exit(1); } If((right=(int*)malloc((n2+1)*sizeof(int)))=NULL){ Perror(“malloc error”); exit(1); } for(i=0;i<nl;i++){ left[i]=arr[p+i]; } left[i]=MAX; for(i=0;i<n2;i++){ right[i]=arr[q+i+1] } right[i]=MAX;i=0;j=0; For(k=p;(1);k++)( If(1eft[i]>right[j]{ (2) j++; )else{ arr[k1]=left[i]; i++: } } } Void merge Sot-t(int arr( ),int begin,int end){ int mid: if( (3) ){ mid=(begin+end)/2; merge Sort (arr,begin,mid); (4) ; Merge(arr,begin,mid,end); } } 【问题1】 根据以上说明和C代码,填充(1)一(4)。 【问题2】 根据题干说明和以上C代码,算法采用了(5)算法设计策略,分析时间复杂度时,列出其递归式位 (6) ,接触渐进时间复杂度 (7) (用O符号表示)。空间复杂度为 (8) 。(用O符号表示) 【问题3】 两个长度分别为n1和n2的已经排好序的子数组进行归并,根据上述C代码,则元素之间比较次数为 (9) 。
正确答案:【问题1】 (1)k<=r (2)arr[k]=right[j] (3)begin<end (4)mergeSort(arr,mid+1,end) 【问题2】 (5)分治 (6)T(n)=2T(n/2)+O(n) (7)O(nlogn) (8)O(n) 【问题3】 (9)n1+n2
解析:【问题1】 首先,函数void merge(int arr[],int P,int q,int r)的意思是:对子数组arr[p…q3和子数组arr[q+L..r3进行合并。因此第一空为k<=q;由于是采用归并排序对n个元素进行递增排序,所以第二空是将left[i]和right[j]的小者存放到arr[k]中去,即arr[k]=right[j]:当数组长度为1时,停止递归,因为此时该数组有序,则第三空为begin<end,即数组至少有两个元素才进行递归。合并了begin到mid之间的元素,继续合并mid+1到end之间的元素,则第四空为mergeSort(arr,mid+1,end)。 【问题2】 归并算法实际上就是将数组一直往下分割,直到分割到由一个元素组成的n个子数组,再往上两两归并。 将数组进行分割需要logN步,因为每次都是讲数组分割成两半(2x=N,x=logN)。 合并N个元素,需要进行N步,也就是O(N),则总的时间复杂度为O(NlogN)。 合并过程中,使用了n个中间变量存储,left=(int*)malloc((nl+1)*sizeof(int))。所以空间复杂度为O(n)。 推导递归式: 假设n个元素进行归并排序需要T(n),可以将其分割成两个分别有n/2个元素的数组分别进行归并,也就是2T(n/2),在将这两个合并,需要O(n)的时间复杂度,则推导公式为T(n)=2T(n/2)+O(n)。
选答题(共3道大题,每道大题15分)从下列3道试题中任选1道解答,如果解答的试题数超过1道,则仅题号小的1道题解答有效。
5. 阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如图5—1所示。(c++代码)#include#includeUsing namespace std;Class Observer{Public:Virtual void update(float temp,float humidity,float cleanness)=0;);Class Subject{Public:Virtual void registerObserver(Observer*o)=0;//注册对主题感兴趣的观察者Virtual void removeObserver(Observer*o)=0;//删除观察者Virtual void notifyObservers( )=0;//当主题发生变化时通知观察者}Class EnvironmentData:publ ic (1) {Private:Vectorobservers:Float temperature,humidity,cleanness;Public:Void registerobserVer(0bserVer* o){observers.push—back(o); )Void removeObserver(Observer*O)::const iterator it=observers.begin( );it!=observers.end( );it++){ (2) ;}}Void measurementsChanged( ){ (3) ;}Void setMeasurements(float temperature,float humidity,float cleanness){this->temperature=temperature:this->humidity=humidity;this一>cleanness=cleanness: (4) ;}};Class CurrentconditionsDisplay:publ ic (5) {private:float temperature,humidity,cleanness;Subject*envData;Public:CurrentConditionsDisplay(Subject* envData){this一>envData=envData; (6) :}Void update(float temperature,float humidity,float cleanness)(this一>temperature=temperature;This->humidity=humidity;This一>cleanness=cleanness; display( ); } Void display( ){/*代码省略*/) }; int main( ){ EnvironmentData*envData。new EnvironmentData0: CurrentConditionsDisplay*currentDisplay=new CurrentConditionsDisplay(envData): envData->setMeasurements(80,65,30.4f); return 0; }
正确答案:(1)Subject (2)(*it)一>update(temperature,humidity,cleanness) (3)notifyObservers( ) (4)measurementsChanged( ) (5)Observer( ) (6)this一>envData-->registerObserver(this)
解析: 当主题中的环境发生变化,也就是调用measurementsChanged( ),会通知观察者,即调用notifyObservers( ),在notifyObservers( )方法中,观查者会调用自身的update(float temperature,float humidity,float cleanness)。在主题的registerobserver(0bserve*o)中会注册对主题感兴趣的观察者。
6. 阅读下列说明和Java代码,将应填入(n)址的字句写在答题纸的对应栏内。 【说明】 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如图6-1所示。【Java代码】import java.util.*interface Observer{Public void update(float temp,float humidity,float cleanness);} interface Subject{Public void registerobserver(Observer o);//注册对主题感兴趣的观察者Public void removeobserver(Observer o);//删除观察者Public void notifyObservers0;//当主题发生变化时通知观察者}Class EnvironmentDataimplements (1) {Private ArrayLjst observers;Private float temperature,humidity,cleanness;Publ ic EnvironmentData0{observers=new ArrayListO;)Public void registerObserver(Observer o){observers.add(o);)Public void removeObserver(Observer o){/*代码省略*/)publ ic void notifyObservers( ){For(int i=0;i<observers.size( );i++){Observer observer=(0bserVer)obserVers.get(i);(2) ;}public void measurementsChanged( ){ (3) ;)public void setMeasurements(float temperature,float humidity,float cleanness){this.temperature=temperature:this.humidity=humidity;this.cleanness=cleanness;(4) ;}}Class CurrentConditionsDisplay implements (5)private float temperature;private float humidity;private float cleanness;private Subj ect envData;public CurrentCondit ionsDisplay(Subj ect envData){this.envData=envData;(6) ;}Publ ic void update(float temperature,float humidity,float cleanness){this.temperature=temperature;this.humidity=humidity;this.cleanness=cleanness;Display( );}Public void display0(/*代码省略*/)}Class EnvironmentMonitor{Public static void main(String[]args){Env ironmentData envData=new EnvironmentData0;CurrentCondit\onsDisplay currentDisplay= new CnrrentConditionsDisplay(envOata);envData.setMeasurements(80,65,30.4f);)Public void display( )(/*代码省略*/)}Class EnvironmentMonitor{Public static void main(String[]args){Env ironmentData envData=new EnvironmentData0;CurrentConditionsDisplay currentDisplay= new CnrrentConditionsDisplay(envData);envData.setMeasurements(80,65,30.4f);}}
正确答案:(1)Subject (2)observer.update(temperature,humidity,cleanness) (3)notifyObservers( ) (4)measurementsChanged( ) (5)Observer( )
(6)envData.registerObserver(this)
解析: EnvironmentData是环境数据,也就是我们要监测的对象,即主题(Subject),因此(1)处为Subject。(2)处为通知观察者,因此遍历观察者容器,遍历到一个观察者对象,则更新该观察者的数据,即调用观察者的update( )方法,当环境数据变化时,需要通知观察者,因此(4)处是调用环境变化方法measurementsChanged( ),通过此方法通知观察者更新数据,因此,(3)处为notifyObservers( )。 根据CurrentConditionsDisplay类中的update( )方法可知:CurrentConditionsDisplay是个观察者,因此(5)处为Observer(6)是将观察者添加到主题中去。
因篇幅问题不能全部显示,请点此查看更多更全内容