问答题【问题3】 根据说明中的叙述,抽象出如表3-2所示的方法,请指出图3-1中的类 CustomerInformafionSystem和InstitutionalCustomer应分别具有其中的哪些方法。 {{B}}表3-2类的方法{{/B}}
功能描述
方法名
向系统中添加客户
addCustomer
根据给定的客户标识,在系统中查找该客户
getCustomer
根据给定的客户标识,从系统中删除该客户
removeCustomer
创建新的联系人
addContact
在系统中查找指定的联系人
getContact
从系统中删除指定的联系人
removeContact
问答题阅读下列说明和Java代码,在(n)处填入正确的字句。[说明]某公司的组织结构图如图10.6所示,现采用组合(Composition)设计模式来设计,得到如图10.7所示的类图。其中Company为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment分别表示人力资源部和财务部。[Java代码]importjavA.util.*:(1)CompanyprotectedStringname;publicCompany(Stringname)((2)=name;publicabstractvoidAdd(Companyc);//增加子公司、办事处或部门publicabstractvoidDelete(Companyc);//删除子公司、办事处或部门classConcreteteCompanyextendsCompanyprivateList<(3)>children-newArrayList<(4)>();//存储子公司、办事处或部门publicConcreteCompany(Stringname)super(name);publicvoidAdd(Companyc)(5).add(c);publicvoidDelete(Companyc)(6).remove(c);classHRDepartmentextendsCompanypublicHRDepartment(Stringname)super(name);//其他代码省略classFinanceDepartmentextendsCompanypublicFinanceDepartment(Stringname)(super(name);//其他代码省略publicclassTestpublicstaticvoidmain(String[]args)ConcreteCompanyroot=newConcreteCompany("北京总公司");root.Add(newHRDepartment("总公司人力资源部"));root.Add(newFinanceDepartment("总公司财务部"));ConcreteCompanycomp=newConcreteCompany("上海分公司");comp.Add(newHRDepartment("上海分公司人力资源部"));comp.Add(newFinanceDepartment("上海分公司财务部"));(7);ConcreteCompanycomp1=newConcreteCompany("南京办事处");comp1.Add(newHRDepartment("南京办事处人力资源部"));comp1.Add(newFinanceDepartment("南京办事处财务部");(8);//其他代码省略
问答题【问题1】
数据流图1-7中有两条数据流是错误的,请指出这两条数据流的起点和终点。
问答题阅读下列说明,回答下面问题。[说明]假设某大型商业企业由商品配送中心和连锁超市组成,其中商品配送中心包括采购、财务、配送等部门。为实现高效管理,设计了商品配送中心信息管理系统,其主要功能描述如下。(1)系统接收由连锁超市提出的供货请求,并将其记录到供货请求记录文件。(2)在接到供货请求后,从商品库存记录文件中进行商品库存信息查询。如果库存满足供货请求,则给配送处理发送配送通知;否则,向采购部门发出缺货通知。(3)配送处理接到配送通知后,查询供货请求记录文件,更新商品库存记录文件,并向配送部门发送配送单,在配送货品的同时记录配送信息至商品配送记录文件。(4)采购部门接到缺货通知后,与供货商洽谈,进行商品采购处理,合格商品入库,并记录采购清单至采购清单记录文件,向配送处理发出配送通知,同时通知财务部门给供货商支付货款。该系统采用结构化方法进行开发,得到待修改的数据流图(如图所示)。数据流图
问答题阅读下列说明,回答下面问题。[说明]某服装销售公司拟开发一套服装采购管理系统,以便对服装采购和库存进行管理。[需求分析](1)采购系统需要维护服装信息及服装在仓库中的存放情况,服装信息主要包括:服装编码、服装描述、服装类型、销售价格、尺码和面料,其中,服装类型为销售分类,服装按销售分类编码。仓库信息包括:仓库编码、仓库位置、仓库容量和管理员。系统记录库管员的库管员编码、姓名和级别。一个库管员可以管理多个仓库,每个仓库有一名库管员。一个仓库中可以存放多类服装,一类服装可能存放在多个仓库中。(2)当库管员发现一类或者多类服装缺货时,需要生成采购订单。一个采购订单可以包含多类服装。每类服装可由多个不同的供应商供应,但具有相同的服装编码。采购订单主要记录订单编码、订货日期和应到货日期,并详细记录所采购的每类服装的数量、采购价格和对应的多个供应商。(3)系统需记录每类服装的各个供应商信息和供应情况。供应商信息包括:供应商编码、供应商名称、地址、企业法人和联系电话。供应情况记录供应商所供应服装的服装类型和服装质量等级。一个供应商可以供应多类服装,一类服装可由多个供应商供应。库管员根据入库时的服装质量情况,设定或修改每个供应商所供应的每类服装的服装质量等级,作为后续采购服装时,选择供应商的参考标准。[概念模式设计]根据需求阶段收集的信息,设计的实体联系图(不完整)如图1所示。图1实体联系图[逻辑结构设计]根据概念设计阶段完成的实体联系图,得出如下关系模式(不完整):库管员(库管员编码,姓名,级别)仓库信息(______,仓库位置,仓库容量)服装(服装编码,服装描述,服装类型,尺码,面料,销售价格)供应商(供应商编码,供应商名称,地址,联系电话,企业法人)供应情况(______,服装质量等级)采购订单(______)采购订单明细(______)
问答题阅读下列说明和C++代码,将应填入______处的字句写在下面。[说明]某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。咖啡价格/杯(¥)配料价格/杯(¥)蒸馏咖啡(Espresso)25摩卡(Mocha)10深度烘焙咖啡(DarkRoast)20奶泡(Whip)8现采用装饰器(Decorator)模式来实现计算费用的功能,得到如下图所示的类图。类图[C++代码]#include<iostream>#include<string>usingnamespacestd;constintESPRESSO_PRICE=25;constintDRAKROAST_PRICE=20;constintMOCHA_PRICE=10;constintWHIP_PRICE=8;classBeverage{//饮料______:stringdescription;public:______(){returndescription;}______;};classCondimentDecorator:publicBeverage{//配料protected:______;};classEspresso:publicBeverage{//蒸馏咖啡public:Espresso(){description="Espresso";}intcost(){returnESPRESSOPRICE;}};classDarkRoast:publicBeverage{//深度烘焙咖啡public:DarkRoast(){description="DardRoast";}intcost(){returnDRAKROAST_PRICE;}};classMocha:publicCondimentDecorator{//摩卡public:Mocha(Beverage*beverage){this->beverage=beverage;}stringgetDescription(){returnbeverage->getDescription()+",Mocha";}intcost(){returnMOCHAPRICE+beverage->cost();}};classWhip:publicCondimentDecorator{//奶泡public:Whip(Beverage*beverage){this->beverage=beverage;}stringgetDescription(){returnbeverage->getDescription()+",Whip";}intcost(){returnWHIP_PRICE+beverage->cost();}};intmain()Beverage*beverage=newDarkRoast();beverage=newMocha______;beverage=newWhip______;cout<<beverage->getDescription()<<"¥"<<beverage->cost()<<end1;return0;}编译运行上述程序,其输出结果为:DarkRoast,Mocha,Whip,¥38
问答题[说明]某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲构建数据管理中间件,其主要功能如下。(1)数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实体的标准操作及其所属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该表存储用户可执行的操作信息。(2)中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证通过,中间件将等待前端应用提交操作请求。(3)前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作),若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。(4)连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据库连接,如果不存在,新建连接;如果存在,则重用连接。(5)后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,将其返回给前端应用。现采用结构化方法对系统进行分析与设计,获得如图4.7所示的顶层数据流图和图4.8所示的0层数据流图。1.使用说明中的词语,给出图4.7中的实体E1~E3的名称。
问答题【说明5-1】B树是一种多叉平衡查找树。一棵m阶的B树,或为空树,或为满足下列特性的m叉树:①树中每个节点至多有m棵子树;②若根节点不是叶子节点,则它至少有两棵子树;③除根之外的所有非叶子节点至少有[m/2]棵子树;④所有的非叶子节点中包含下列数据信息(n,A0,K1,A1,K2,A2,…,Kn,An),其中:Ki(i=1,2,…,n)为关键字,且Ki<Ki+1(i=1,2,…,n-1),Ai(i=0,1,…,n)为指向子树根节点的指针,且指针Ai-1所指子树中所有节点的关键字均小于Ki,Ai+1所指子树中所有节点的关键字均大于Ki,n为节点中关键字的数目;⑤所有的叶子节点都出现在同一层次上,并且不带信息(可以看成是外部节点或查找失败的节点,实际上这些节点不存在,指向这些节点的指针为空)。例如,一棵4阶B树如图5-1所示(节点中关键字的数目省略)。B树的阶M、bool类型、关键字类型及B树节点的定义如下:#defineM4/*B树的阶*/typedefenum{FALSE=0,TRUE=1}bool;typedefintElemKeyType;typedefstructBTreeNode{intnumkeys;/*节点中关键字的数目*/structBTreeNode*parent;/*指向父节点的指针,树根的父节点指针为空*/structBTreeNode*A[M];/*指向子树节点的指针数组*/ElemKeyTypeK[M];/*存储关键字的数组,K[0]闲置不用*/}BTreeNode;函数SearchBtree(BTreeNode*root,ElemKeyTypeakey,BTreeNode**ptr)的功能是:在给定的一棵M阶B树中查找关键字akey所在节点,若找到则返回TRUE,否则返回FALSE。其中,root是指向该M阶B树根节点的指针,参数ptr返回akey所在节点的指针,若akey不在该B树中,则ptr返回查找失败时空指针所在节点的指针。例如,在如图5-1所示的4阶B树中查找关键字25时,ptr返回指向节点e的指针。注:在节点中查找关键字akey时采用二分法。【函数5-1】boolSearchBtree(BTreeNode*root,ElemKeyTypeakey,BTreeNode**ptr){intlw,hi,mid;BTreeNode*p=root;*pb=NULL;while(p){lw=1;hi={{U}}(1){{/U}};while(lw<=hi){mid=(lw+hi)/2;if(p->K[mid]==akey){*Ptr=p;returnTRUE;}elseif({{U}}(2){{/U}})hi=mid-1;elselw=mid+1;}*ptr=p;p={{U}}(3){{/U}};}returnFALSE;}【说明5-2】在M阶B树中插入一个关键字时,首先在最接近外部节点的某个非叶子节点中增加一个关键字,若该节点中关键字的个数不超过M-1,则完成插入;否则,要进行节点的“分裂”处理。所谓“分裂”,就是把节点中处于中间位置上的关键字取出来并插入其父节点中,然后以该关键字为分界线,把原节点分成两个节点。“分裂”过程可能会一直持续到树根,若树根节点也需要分裂,则整棵树的高度增1。例如,在如图5-1所示的B树中插入关键字25时,需将其插入节点e中,由于e中已经有3个关键字,因此将关键字24插入节点e的父节点b,并以24为分界线将节点e分裂为e1和e2两个节点,结果如图5-2所示。函数Isgrowing(BTreeNode*root,ElemKeyTypeakey)的功能是:判断在给定的M阶B树中插入关键字akey后,该B树的高度是否增加,若增加则返回TRUE,否则返回FALSE。其中,root是指向该M阶B树根节点的指针。在函数Isgrowing中,首先调用函数SearchBtree(即函数5-1)查找关键字akey是否在给定的M阶B树中,若在则返回FALSE(表明无须插入关键字akey,树的高度不会增加);否则,通过判断节点中关键字的数目考察插入关键字akey后该B树的高度是否增加。【函数5-2】boolIsgrowing(BTreeNode*root,ElemKeyTypeakey){BTreeNode*t,*f;if(!SearchBtree({{U}}(4){{/U}})){t=f;while({{U}}(5){{/U}}){t=t->parent;}if(!t)returnTRUE;}returnFALSE;}
问答题阅读下列说明和图,回答问题1至问题4,将解答填入对应栏内。[说明]某医院欲开发病人监控系统。该系统通过各种设备监控病人的生命体征,并在生命体征异常时向医生和护理人员报警。该系统的主要功能如下:(1)本地监控。定期获取病人的生命体征,如体温、血压、心率等数据。(2)格式化生命体征。对病人的各项重要生命体征数据进行格式化,然后存入日志文件中并检查生命体征。(3)检查生命体征。将格式化后的生命体征与生命体征范围文件中预设的正常范围进行比较。如果超出了预设范围,系统就发送一条警告信息给医生和护理人员。(4)维护生命体征范围。医生在必要时(如:新的研究结果出现时)添加或更新生命体征值的正常范围。(5)提取报告。在医生或护理人员请求病人生命体征报告时,从日志文件中获取病人生命体征生成体征报告,并返回给请求者。(6)生成病历。根据日志文件中的生命体征,医生对病人的病情进行描述,形成病历存入病历文件中。(7)查询病历。根据医生的病历查询请求,查询病历文件,给医生返回病历报告。(8)生成治疗意见。根据日志文件中的生命体征和病历,医生给出治疗意见,如处方等,并存入治疗意见文件中。(9)查询治疗意见。医生和护理人员查询治疗意见,据此对病人进行治疗。现采用结构化方法对病人监控系统进行分析与设计,获得如图15-26所示的顶层数据流图和如图15-27所示的第0层数据流图。
问答题【问题3】如果限制该算法最多输出K个可供选择的房间号,则在图4-5的α所指的判断框应改成什么处理?
问答题【问题2】
该图书管理系统的主要关系模式如下,请补充“借还记录”和“预约登记”关系中的空缺。
管理员(工号,姓名)
读者(读者ID,姓名,电话,E-mail)
书目(ISBN号,书名,作者,出版商,出版年月,册数,经办人)
图书(图书ID,ISBN号,存放位置,状态,经办人)
借还记录({{U}} (a) {{/U}},借出时间,应还时间,归还时间)
预约登记({{U}} (b) {{/U}},预约时间,预约期限,图书ID)
注:时间格式为“年.月.日 时:分:秒”。
问答题阅读下列说明和Java代码,将应填入______处的字句写在下面。[说明]某大型商场内安装了多个简易的纸巾售卖机,自动售出2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图1所示。图1纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图2所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuanerState分别对应图1中纸巾售卖机的4中状态:售出纸巾、纸巾售完、没有投币、有2元钱。图2类图[Java代码]Importjava.util.*interfaceState{publicvoidinsertQuarter();//投币publicvoidejectQuarter();//退币publicvoidturnCrank();//按下、、出纸巾"按钮publicvoiddispense();//出纸巾}ClassTiSsueMachine{______SoldOutState,noQuarterState,hasQuarterState,SoldState,State;State=soldOutState;intcount=0;//纸巾数publicTissueMachine(intnumber){/*实现代码省略*/)publicStategetHasQuarterState(){returnhasQuarterState;}publicStategetNoQuarterState(){returnnoQuarterState;}publicStategetSoldState(){returnsoldState;}publicStategetSoldOutState(){returnsoldOutState;}intgetCount{returncount;}//其余代码省略};ClassNoQuarterStateimplementState{TissueMachinetissueMachine;publicvoidinsertQuarter(){tissureMachine.SetState(______);}//构造方法以及其余代码省略}ClassHasQuarterStateimplementState{TissueMachinetissueMachine;publicvoidejectQuarter(){tissureMachine.setState(______);}//构造方法以及其余代码省略}ClassSoldStateimplementState{TissueMachimetissueMachine;publicvoiddispense(){if(tissueMachine.getCount()>0){tissureMachine.setState(______);}else{tissureMachine.SetState(______);}}}
问答题阅读下列说明和Java代码,将应填入空白处的字句写在答题纸的对应栏内。[说明]某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图1所示。图1菜单的结构图现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如图2所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图1中的甜点菜单。类MenuItem表示菜单中的菜式。图2类图[Java代码]importjava.util.*;______MenuComponent{protectedStringname;______;//添加新菜单publicabstractvoidprint();//打印菜单信息publicStringgetName(){returnname;}}classMenultemextendsMenuComponent{privatedoubleprice;publicMenuItem(Stringname,doubleprice){this.name=name;this.price=price;}publicdoublegetPrice(){returnprice;}publicvoidadd(MenuComponentmenuComponent){return;}//添加新菜单publicvoidprint(){System.out.print(""+getName());System.out.println(","+getPrice());}}classMenuextendsMenuComponent{privateList<MenuComponent>menuComponents=newArrayList<MenuComponent>();publicMenu(Stringname){this.name=name;}publicvoidadd(MenuComponentmenuComponent){//添加新菜单menuComponents.______;}publicvoidprint(){System.out.print("\n"+getName());System.out.println(","+"--------------");Iteratoriterator-menuComponents.iteratoro;while(iterator.hasNext()){MenuComponentmenuComponent=(MenuComponent)iterator.next();______;}}}classMenuTeStDrive{publicstaticvoidmsin(Stringargs[]){MenuComponentallMenus=newMenu("ALLMENUS");MenuComponentdinerMenu=newMenu("DINERMENU");......//创建更多的Menu对象,此处代码省略allMenus.add(dinerMenu);//将dinerMenu添加到餐厅菜单中......//为餐厅增加更多的菜单,此处代码省略______;//打印饭店所有菜单的信息}}
问答题阅读以下说明及数据流图,回答问题1至问题5,将解答填入对应栏内。[说明]某银行已有一套基于客户机/服务器模式的储蓄系统A和一套建账软件。建账软件主要用于将储蓄所手工处理的原始数据转换为系统A所需的数据格式。该建账软件具有以下功能。(1)分户账录入:手工办理业务时建立的每个分户账数据均由初录员和复录员分别录入,以确保数据的正确性。(2)初录/复录比对:将初录员和复录员录入的数据进行一一比较,并标记两套数据是否一致。(3)数据确认:当上述两套数据完全一致后,将其中任一套作为最终进入系统A的原始数据。(4)汇总核对和打印:对经过确认的数据进行汇总,并和会计账目中的相关数据进行核对,以确保数据的整体正确性,并打印输出经过确认的数据,为以后核查可能的错误提供依据。(5)数据转换:将经过确认的数据转换为储蓄系统A需要的中间格式数据。(6)数据清除:为加快初录和复录的处理速度,在数据确认之后,可以有选择地清除初录员和复录员录入的数据。该软件的数据流图如图15-8至图15-10所示。图中部分数据流数据文件的格式如下。初录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质复录分户账=储蓄所号+账号+户名+开户日+开户金额+当前余额+性质初录数据=手工分户账+一致性标志复录数据=手工分户账+一致性标志会计账目=储蓄所号+总户数+总余额操作结果=初录操作结果+比对操作结果+复录操作结果软件需要打印的分户账清单样式如表15-2所示。表15-2分户账清单样式表储蓄所账号开户曰户名其他分户账数据储蓄所1…………储蓄所1合计共XXX户,总余额999999999元储蓄所2…………储蓄所2合计共XXX户,总余额999999999元
问答题【问题2】
写出子程序A的功能,并顺序写出实现该功能的操作。
问答题【问题1】
图3-6是该系统类图的一部分,依据上述说明中给出的术语,给出类Lock的主要属性。
问答题阅读下列说明和图,回答下面问题。[说明]某高校图书馆欲建设一个图书馆管理系统,目前已经完成了需求分析阶段的工作,功能需求均使用用例进行描述,其中用例“借书(CheckOutBooks)”的详细描述如下。参与者:读者<Patron>典型事件流:(1)输入读者ID。(2)确认该读者能够借阅图书,并记录读者ID。(3)输入所要借阅的图书ID。(4)根掘图书目录中的图书ID确认该书可以借阅,计算归还时间,生成借阅记录。(5)通知读者图书的归还时间。重复步骤(3)~(5),直到读者结束借阅图书。备选事件流:(1)若读者不能借阅图书,说明读者违反了图书馆的借书制度(例如,没有支付借书费用等)。①告知读者不能借阅,并说明拒绝借阅的原因。②本用例结束。(2)读者要借阅的书无法外借。①告知读者本书无法借阅。②回到步骤(3)。说明:图书的归还时间与读者身份有关,如果读者是教师,图书可以借阅一年;如果是学生,则只能借阅3个月,读者ID中包含读者的身份信息。现采用面向对象方法开发该系统,得到如图1所示的系统类模型(部分),以及如图2所示的系统操作。图1系统类模型图2系统操作checkout的通信图
问答题【问题3】 对于如表2-3、表2-4所示的“职员”和“部门”关系,请指出下列各行是否可以插入“职员”关系,为什么?
1
60811
芦 峰
800
1
A座201
6883122
2
60802
李晓啸
3500
2
B座202
6883123
3
60812
高亚南
2600
问答题阅读下列说明,回答问题1和问题2,将解答填入对应栏内。[说明]假设某大型商业企业由商品配送中心和连锁超市组成,其中商品配送中心包括采购、财务、配送等部门。为实现高效管理,设计了商品配送中心信息管理系统,其主要功能描述如下:(1)系统接收由连锁超市提出的供货请求,并将其记录到供货请求记录文件中。(2)在接到供货请求后,从商品库存记录文件中进行商品库存信息查询。如果库存满足供货请求,则给配送处理发送配送通知;否则,向采购部门发出缺货通知。(3)配送处理接到配送通知后,查询供货请求记录文件,更新商品库存记录文件,并向配送部门发送配送单,在配送货品的同时记录配送信息至商品配送记录文件中。(4)采购部门接到缺货通知后,与供货商洽谈,进行商品采购处理,将合格商品入库,并记录采购清单至采购清单记录文件中,向配送处理发出配送通知,同时通知财务部门给供货商支付货款。该系统采用结构化方法进行开发,得到待修改的数据流图(如图15-19所示)。
问答题阅读下列说明Java代码,将应填入______处的字句写在下面。[说明]现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQLServer和Access两种数据库以及系统中的数据库表Department为例,其类图如图1所示。图1类图[Java代码]importjava.util.*;classDepartment{/*代码省略*/}interfaceIDepartment{______;______;}classsqlserVerDepartment:______{public:voidInsert(Departmentdepartment){System.out.println("InsertarecordintoDepartmentinSQLServer!\n");//其余代码省略}publicDepartmentGetDepartment(intid){/*代码省略*/}}classAccessDepartment:______{publicvoidInsert(Departmentdepartment){System.out.println("InsertarecordintoDepartmentinACCESS!\n");//其余代码省略}publicDepartmentGetDepartment(intid){/*代码省略*/}};______{______;}classSqlServerFactoryimplementsIFactory{publicIDepartmentCreateDepartment(){returnnewSqlserverDepartment();}//其余代码省略};classAccessFactoryimplementsIFactory{publicIDepartmentCreateDepartment(){returnnewAccessDepartment();}//其余代码省略};
