问答题阅读以下说明和C代码,根据要求回答问题。[说明]某工程计算中要完成多个矩阵相乘(链乘)的计算任务。两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算Am×n*Bn×p,需要m*n*p次乘法运算。矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A110×100,A2100×5,A35×50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。矩阵链乘问题可描述为:给定n个矩阵<A1,A2,…,An>,矩阵4的维数为pi-1×pi,其中i=1,2,…,n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2*…*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…Ak和Ak+1*Ak+2*…*An两个子问题,则该最优解应该包含A1*A2*…*Ak的一个最优计算顺序和Ak+1*Ak+2*…*An的一个最优计算顺序。据此构造递归式:其中,cost[i][j]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。[C代码]算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵……n个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的C语言实现。(1)主要变量说明●n:矩阵数。●seq[]:矩阵维数序列。●cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价。●trace[][]:二维数组,长度为n*n,其中元素trace[i][j]表示Ai+1*Ai+2*…*Aj+1的最优计算对应的划分位置,即k。(2)函数cmm#defineN100intcost[N][N];inttrace[N][N];intcmm(intn,intseq[]){inttempCoSt;inttempTrace;inti,j,k,p;inttemp;for(i=0;i<n;i++){cost[i][i]=0;}for(p=1;p<n;p++){for(i=0;______;i++){______;tempCost=-1;for(k=i;k<j;k++){temp=______;if(tempCost==-1||tempCost>temp){tempCost=temp;______;}}cost[i][j]=tempCost;trace[i][j]=tempTrace;}}returncost[0][n-1];}
问答题阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。[说明]某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分,Command模式的类图如下图所示。Command模式类图[C++代码]classLight{public:Light(stringname){/*代码省略*/}voidon(){/*代码省略*/)//开灯voidoff(){/*代码省略*/)//关灯}:classCommand{public:______;};classLightOnCommand:publicCommand{//开灯命令private:Light*light;public:LightOnCommand(Light*light){this->light=light;}Voidexecute(){______;}};classLightOffCommand:publicCommand{//关灯命令private:Light*light;public:LightOffCommand(Light*light){this->light=light;}Voidexecute()(______;}};ClassRemoteControl{//遥控器private:Command*onCommands[7];Command*offCommands[7];public:RemoteControl(){/*代码省略*/}voidsetCommand(intslotCommand*onCommand,Command*offCommand){______=onCommand;______=offCommand;}voidonButtonWasPushed(intslot){______:)voidoffButtonWasPushed(intslot){______:}};intmain(){RemoteControl*remoteControl=newRemoteControl();Light*livingRoomLight=newLight("LivingRoom");Light*kitchenLight=newLight("kitchen");LightOnCommand*livingRoomLightOn=newLightOnCommand(livingRoomLight);LightOffCommand*livingRoomLightOff=newLightOffCommand(livingRoomLight);LightOnCommand*kitchenLighton=newLightOnCommand(kitchenLight);LightOffCommand*kitchenLightOff=newLightOffCommand(kitchenLight);remoteControl->setCommand(0,livingRoomLightOn,livingRoomLightoff);remoteControl->setCommand(1,kitchenLighton,kitchenLightOff);remoteControl->onButtonWasPushed(0);remoteControl->OffButtonWasPushed(0);remoteControl->onButtonWasPushed(1);remoteControl->OffButtonWasPushed(1);/*其余代码省略*/return0;}
问答题阅读下列说明和Java代码,在(n)处填入适当的字句。[说明]现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF_种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图10.21所示。采用该设计模式的原因在于:系统解析BMP、GIF与JPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。[Java代码]classMatrix//各种格式的文件最终都被转化为像素矩阵//此处代码省略;abstractclassImageImppublicabstractvoiddoPaint(Matrixm);//显示像素矩阵m;classWinImpextendsImageImppublicvoiddoPaint(Matrixm)/*调用windows系统的绘制函数绘制像素矩阵*/;classLinuxImpextendsImageImppublicvoiddoPaint(Matrixm)/*调用Linux系统的绘制函数绘制像素矩阵*/;abstractclassImagepublicvoidsetImp(ImageImpimp)(1)=imp;publicabstractvoidparseFile(StringfileName);protected(2)imp;;classBMPextendsImagepublicvoidparseFile(StringfileName)//此处解析BMP文件并获得一个像素矩阵对象m(3);//显示像素矩阵m;classGIFextendsImage//此处代码省略;classJPEGextendsImage//此处代码省略;publicclassjavaMainpublicstaticvoidmain(String[]args)//在Windows操作系统上查看demo.bmp图像文件Imageimagel=(4);ImageImpImageImp1=(5);(6);image1.parseFile("demo.bmp");现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix和类javaMain,若采用桥接设计模式则至少需要设计(7)个类。
问答题阅读下列说明和Java代码,在(n)处填入适当的字句。[说明]已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如图10.32所示,其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,例如图10.32中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。已知Application类中的openDocument方法采用了模板方法(TemplateMethod)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示。(1)首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回。(2)创建文档对象。(3)通过文档对象打开文档。(4)通过文档对象读取文档信息。(5)将文档对象加入到Application的文档对象集合中。[Java代码]abstractclassDocumentpublicvoidsave()/*存储文档数据,此处代码省略*/publicvoidopen(StringdocName)/*打开文档,此处代码省略*/publicvoidclose()/*关闭文档,此处代码省略*/publicabstractvoidread(StringdocName);;abstractclassAppplicationprivateVector<(1)>docs;/*文档对象集合*/publicbooleancanOpenDocument(StringdocName)/*判断是否可以打开指定文档,返回真值时表示可以打开,返回假值表示不可打开,此处代码省略*/publicvoidaddDocument(DocumentaDocument)/*将文档对象添加到文档对象集合中*/docs.add((2));publicabstractDocumentdoCreateDocument();/*创建一个文档对象*/publicvoidopenDocument(StringdocName)/*打开文档*/if((3))System.out.println("文档无法打开!");return;(4)adoc=(5);(6);(7);(8);;
问答题阅读下列说明,回答问题。[说明]现准备为某银行开发一个信用卡管理系统CCMS,该系统的基本功能为:(1)信用卡申清。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交CCMS。如果信用卡申请被银行接受,CCMS将记录该客户的基本信息,并发送确认函给该客户,告知客户信用卡的有效期及信贷限额;否则该客户将会收到一封决绝函。非信用卡客户收到确认函后成为信用卡客户。(2)信用卡激活。信用卡客户向CCMS提交激活清求,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS将激活通知发送给客户,告知客户其信用卡是否被成功激活。(3)信用卡客户信息管理。信用卡客户的个人信息可以在CCMS中进行在线管理。每位信用卡客户可以在线查询和修改个人信息。(4)交易信息查询。信用卡客户使用信用卡进行的每一笔交易都会记录在CCMS中。信用卡客户可以通过CCMS查询并核实其交易信息(包括信用卡交易记录及交易额)。图4.9和图4.10分别给出了该系统的顶层数据流图和0层数据流图的初稿。1.根据说明,将图4.9中的E1~E3填充完整。
问答题阅读下列说明和C++代码,在(n)处填入适当的字句。[说明]已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如图10.29所示,其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,例如图10.29中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。已知Application类中的openDocument方法采用了模板方法(TemplateMethod)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示。(1)首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回。(2)创建文档对象。(3)通过文档对象打开文档。(4)通过文档对象读取文档信息。(5)将文档对象加入到Application的文档对象集合中。[C++代码]#include<iostream>#include<vector>usingnamespacestd;//使用全局的命名域方式classDocumentpublic:voidsave()/*存储文档数据,此处代码省略*/voidopen(stringdocName)/*打开文档,此处代码省略*/voidclose()/*关闭文档,此处代码省略*/virtualvoidread(stringdocName)=0;;classApplicationprivate:vector<(1)>docs;/*文档对象集合*/public:boolcanOpenDocument(stringdocName)/*判断是否可以打开指定文档,返回真值时表示可以打开,返回假值表示不可打开,此处代码省略*/voidaddDocument(Document*aDocument)/*将文档对象添加到文档对象集合中*/docs.push_back((2));virtualDocument*doCreateDocument()=0;/*创建一个文档对象*/voidopenDocument(stringdocName)(/*打开文档*/if((3))cout<<"文档无法打开!"<<endl;return;(4)adoc=(5);(6);(7);(8);;
问答题【问题3】
组合(Composition)和聚集(Aggregation)是UML中两种非常重要的关系。请说明组合和聚集分别表示什么含义?两者的区别是什么?
问答题阅读下列说明和图,回答下面问题。[说明]某大型披萨加工和销售商为了有效管理生产和销售情况,欲开发一披萨信息系统,其主要功能如下。(1)销售。处理客户的订单信息,生成销售订单,并将其记录在销售订单表中。销售订单记录了订购者、所订购的披萨、期望的交付日期等信息。(2)生产控制。根据销售订单以及库存的披萨数量,制定披萨生产计划(包括生产哪些披萨、生产顺序和生产量等),并将其保存在生产计划表中。(3)生产。根据生产计划和配方表中的披萨配方,向库存发出原材料申领单,将制作好的披萨信息存入库存表中,以便及时进行交付。(4)采购。根据所需原材料及库存量,确定采购数量,向供应商发送采购订单,并将其记录在采购订单表中;得到供应商的供应量,将原材料数量记录在库存表中,在采购订单表中标记已完成采购的订单。(5)运送。根据销售订单将披萨交付给客户,并记录在交付记录表中。(6)财务管理。在披萨交付后,为客户开具费用清单,收款并出具收据:依据完成的采购订单给供应商支付原材料费用并出具支付细节;将收款和支付记录存入收支记录表中。(7)存储。检查库存的原材料和未完成订单,确定所需原材料。现采用结构化方法对披萨信息系统进行分析与设计,获得如图1所示的上下文数据流图,以及如图2所示的0层数据流图。图1上下文数据流图图20层数据流图
问答题【问题3】根据数据流图的设计原则,阅读如图1-1所示的数据流图,找出其中的错误之处。
问答题事务T1、T2和T3按如下调度方式并发地对数据项X、Y、Z进行访问,假设X、Y、Z的初值分别为X=200,Y=300,Z=500。 ①在事务T2刚完成提交后,数据中X、Y、Z的值各是多少? ②当事务T3结束后,X、Y、Z的值各是多少? T1 T2 T3 begin-transaction T1read(X)X:=X-100write(X)rollback begin-transaction T2read(Y)Y:Y+100write(Y)commit begin-transaction T3read(Z)Z:Z*2write(Z)commit
问答题阅读下列说明及数据流图,回答问题1至问题3,将解答填入对应栏内。 [说明] 某学校建立了一个网上作业提交与管理系统,基本功能描述如下。 (1)账号和密码。任课老师用账号和密码登录系统后,提交所有选课学生的名单。系统自动为每个选课学生创建登录系统的账号和密码。 (2)作业提交。学生使用账号和密码登录系统后,可以向系统申请所选课程的作业。系统首先检查学生的当前状态,如果该学生还没有做过作业,则从数据库服务器申请一份作业。若申请成功,则显示需要完成的作业。学生需在线完成作业,单击“提交”按钮上交作业。 (3)在线批阅。系统自动在线批改作业,显示作业成绩,并将该成绩记录在作业成绩统计文件中。
问答题阅读下列说明和图,回答下面问题。[说明]某电子商务系统采用以数据库为中心的集成方式改进购物车的功能,详细需求如下。1.加入购物车。顾客浏览商品,点击加入购物车,根据商品标识从商品表中读取商品信息,并更新购物车表。2.浏览购物车。顾客提交浏览购物车请求后,显示出购物车表中的商品信息。3.提交订单。顾客点击提交订单请求,后台计算购物车表中商品的总价(包括运费)加入订单表,将购物车表中的商品状态改为待付款,显示订单详情。若商家改变价格,则刷新后可看到更改后的价格。4.改变价格。商家查看订购自家商品的订单信息,根据特殊优惠条件修改价格,更新订单表中的商品价格。5.付款。顾客点击付款后,系统先根据顾客表中关联的支付账户,将转账请求(验证码、价格等)提交给支付系统(如信用卡系统)进行转账;然后根据转账结果返回支付状态并更改购物车表中商品的状态。6.物流跟踪。商家发货后,需按订单标识添加物流标识(物流公司、运单号);然后可根据顾客或商家的标识以及订单标识,查询订单表中的物流标识,并从相应物流系统查询物流信息。7.生成报表。根据管理员和商家设置的报表选项,从订单表、商品表以及商品分类表中读取数据,调用第三方服务CrystalReports生成相关报表。8.维护信息。管理员维护(增、删、改、查)顾客表、商品分类表和商品表中的信息。现采用结构化方法实现上述需求,在系统分析阶段得到如图1所示的顶层数据流图和图2所示的0层数据流图。图1顶层数据流图图20层数据流图
问答题【说明】函数intToplogcal(LinkedWDigraphG)的功能是对图G中的顶点进行拓扑排序,并返回关键路径的长度。其中图G表示一个具有n个顶点的AOE网,图中顶点从1~n依次编号,图G的存储结构采用邻接表表示,其数据类型定义如下:typedefstructGnode{/*邻接表的表节点类型*/intadjvex;/*邻接顶点编号*/intweieht;/*弧上的权值*/stractGnode*nextarc;/*指示下一个弧的节点*/}Gnode;typedefstructAdjlist{/*邻接表的头节点类型*/charvdata;/*顶点的数据信息*/structGnode*Firstadj;/*指向邻接表的第一个表节点*/}Adjlist;typedefstructLinkedWDigraph{/*图的类型*/intn,e;/*图中顶点个数和边数*/structAdjlist*head;/*指向图中第一个顶点的邻接表的头节点*/}LinkedWDigraph;例如,某AOE网如图5-4所示,其邻接表存储结构如图5-5所示。intToplogical(LinkedWDigraphG){Gnode*p;intj,w,top=0;int*Stack,*ve,*indegree;ve=(int*)malloc((G.n+1)*sizeof(int));indegree=(int*)malloc((G.n+1)*sizeof(int));/*存储网中各顶点的入度*/Stack=(int*)malloe((G.n+1)*sizeof(int));/*存储入度为0的顶点的编号*/if(!ve||!indegree||!Stack)exit(0);for(j=1;j<=G.n;j++){ve[j]=0;indegree[j]=0;}/*for*/for(j=1;j<=G.n;j++){/*求网中各顶点的入度*/p=G.head[j].Firstadj;while(p){{{U}}(1){{/U}};p=p->nextarc;}/*while*/}/*for*/for(j=1;j<=G.n;j++)/*求网中入度为0的顶点并保存其编号*/if(!indegree[j])Stack[++top]=j;while(top>0){w={{U}}(2){{/U}};printf("%c",G.head[w].vdata);p=G.head[w].Firstadj;while(p){{{U}}(3){{/U}};if(!indegree[p->adjvex])Stack[++top]=p->adjvex;if({{U}}(4){{/U}})ve[p->adjvex]=ve[w]+p->weight;p=p->nextarc;}/*while*/}/*while*/return{{U}}(5){{/U}};}/*Toplogical*/
问答题阅读下列说明,回答下面问题。[说明]某物流公司为了整合上游供应商与下游客户,缩短物流过程,降低产品库存,需要构建一个信息系统以方便管理其业务运作活动。[需求分析结果](1)物流公司包含若干部门,部门信息包括部门号、部门名称、经理、电话和邮箱。一个部门可以有多名员工处理部门的日常事务,每名员工只能在一个部门工作。每个部门有一名经理,只需负责本部门的事务和人员。(2)员工信息包括员工号、姓名、职位、电话号码和工资;其中,职位包括:经理、业务员等。业务员根据托运申请负责安排承运货物事宜,例如:装货时间、到达时间等。一个业务员可以安排多个托运申请,但一个托运申请只由一个业务员处理。(3)客户信息包括客户号、单位名称、通信地址、所属省份、联系人、联系电话、银行账号,其中,客户号唯一标识客户信息的每一个元组。每当客户要进行货物托运时,先要提出货物托运申请。托运申请包括申请号、客户号、货物名称、数量、运费、出发地、目的地。其中,一个申请号对于唯一的一个托运申请;一个客户可以有多个货物托运申请,但一个托运申请对应唯一的一个客户号。[概念设计模型]根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如图1所示。图1实体联系图[关系模式设计]部门(部门号,部门名称,经理,电话,邮箱)员工(员工号,姓名,职位,电话号码,工资,(a))客户((b),单位名称,通信地址,所属省份,联系人,联系电话,银行账号)托运请求((c),货物名称,数量,运费,出发地,目的地)安排承运((d),装货时间,达到时间,业务员)
问答题【问题1】
图1-12中缺少了哪些数据流?请指明每条数据流的名称、起点和终点。
问答题阅读下列说明,回答问题。[说明]0-1背包问题可以描述为:有n个物品,对i=1,2,…,n,第i个物品价值为vi,重量为wi(vi,和wi为非负数),背包容量为W(W为非负数),选择其中一些物品装入背包,使装入背包物品的总价值最大,即,且总重量不超过背包容量,即,其中,Xi∈0,1,xi=0表示第i个物品不放入背包,xi=1表示第i个物品放入背包。[问题1]用回溯法求解此0-1背包问题,请填充下面伪代码中(1)~(4)处空缺。回溯法是一种系统的搜索方法。在确定解空间后,回溯法从根节点开始,按照深度优先策略遍历解空间树,搜索满足约束条件的解。对每一个当前节点,若扩展该节点己经不满足约束条件,则不再继续扩展。为了进一步提高算法的搜索效率,往往需要设计一个限界函数,判断并剪枝那些即使扩展了也不能得到最优解的节点。现在假设已经设计了BOUND(v,w,k,w)函数,其中v,w,k和W分别表示当前已经获得的价值、当前背包的重量、己经确定是否选择的物品数和背包的总容量。对应于搜索树中的某个节点,该函数值表示确定了部分物品是否选择之后,对剩下的物品在满足约束条件的前提下进行选择可能获得的最大价值,若该价值小于等于当前已经得到的最优解,则该节点无需再扩展。下面给出0-1背包问题的回溯算法伪代码。函数参数说明如下。W:背包容量;n:物品个数;w:重量数组;v:价值数组;fw:获得最大价值时背包的重量;fp:背包获得的最大价值;X:问题的最优解。变量说明如下。cw:当前的背包重量;cp:当前获得的价值;k:当前考虑的物品编号;Y:当前已获得的部分解。BKNAP(W,n,w,v,fw,fp,X)1cw←cp←02(1)3fp←-14whiletrue5whilek≤nandcw+w[k]≤Wdo6(2)7cp←cp+v[k]8Y[k]←19k←k+110ifk>nthen11iffp<cpthen12fp←cp13fw←ew14k←n15X←Y16elseY(k)←017whileBOUND(cp,cw,k,W)≤fpdo18whilek≠0andY(k)≠1do19(3)20ifk=0thenreturn21Y[k]←022cw←cw-w[k]23cp←cp-v[k]24(4)[问题2]考虑表9.2的实例,假设有3个物品,背包容量为22。图9.1中是根据上述算法构造的搜索树,其中节点的编号表示了搜索树生成的顺序,边上的数字1/0分别表示选择/不选择对应物品。除了根节点之外,每个左孩子节点旁边的上下两个数字分别表示当前背包的重量和已获得的价值,右孩子节点旁边的数字表示扩展了该节点后最多可能获得的价值。为获得最优解,应该选择物品(5),获得的价值为(6)。 表9.2 0-1背包问题实例物品1物品2物品3重量151010价值301817单位价值21.81.7对于表9.2的实例,若采用穷举法搜索整个解空间,则搜索树的节点数为(7),而用了上述回溯法,搜索树的节点数为(8)。
问答题阅读下列说明和图,回答下面问题[说明]某巴士维修连锁公司欲开发巴士维修系统,以维护与维修相关的信息,该系统的主要能如下。(1)记录巴士ID和维修问题。巴士到车库进行维修,系统将巴士的基本信息和ID记录在巴士列表文件中,将待维修机械问题记录在维修记录文件中,并生成维修订单。(2)确定所需部件,根据维修订单确定维修所需部件,并在部件清单中进行标记。(3)完成维修,机械师根据维修记录文件中的待维修机械问题,完成对巴士的维修,登记维修情况;将机械问题的维修情况记录在维修记录文件中,将所用部件记录在部件清单中,并将所用部件清单发送至库存管理系统以对部件使用情况进行监控,巴士司机可查看已维修的机械问题。(4)记录维修工时,将机械师提供的维修工时记录在人事档案中,将维修总结发送给主管进行绩效考核。(5)计算维修总成本,计算部件清单中实际所用部件、人事档案中所用维修工时的总成本;将维修工时和所用部件成本的详细信息交给会计进行计费。现采用结构化方法对巴士维修系统进行分析与设计,获得如图1所示的上下文数据流图和如图2所示的0层数据流图。图1上下文数据流图图20层数据流图
问答题[说明]某大型企业的数据中心为了集中管理、控制用户对数据的访问并支持大量的连接需求,欲构建数据管理中间件,其主要功能如下。(1)数据管理员可通过中间件进行用户管理、操作管理和权限管理。用户管理维护用户信息,用户信息(用户名、密码)存储在用户表中;操作管理维护数据实体的标准操作及其所属的后端数据库信息,标准操作和后端数据库信息存放在操作表中;权限管理维护权限表,该表存储用户可执行的操作信息。(2)中间件验证前端应用提供的用户信息。若验证不通过,返回非法用户信息;若验证通过,中间件将等待前端应用提交操作请求。(3)前端应用提交操作请求后,中间件先对请求进行格式检查。如果格式不正确,返回格式错误信息;如果格式正确,则进行权限验证(验证用户是否有权执行请求的操作),若用户无权执行该操作,则返回权限不足信息,否则进行连接管理。(4)连接管理连接相应的后台数据库并提交操作。连接管理先检查是否存在空闲的数据库连接,如果不存在,新建连接;如果存在,则重用连接。(5)后端数据库执行操作并将结果传给中间件,中间件对收到的操作结果进行处理后,将其返回给前端应用。现采用结构化方法对系统进行分析与设计,获得如图4.7所示的顶层数据流图和图4.8所示的0层数据流图。
问答题阅读以下说明和图,回答问题1至问题3,将解答填入对应栏内。[说明]某时装邮购提供商拟开发订单处理系统,用于处理客户通过电话、传真、邮件或Web站点所下的订单。其主要功能如下:(1)增加客户记录。将新客户信息添加到客户文件,并分配一个客户号以备后续使用。(2)查询商品信息。接收客户提交商品信息请求,从商品文件中查询商品的价格和可订购数量等商品信息,返回给客户。(3)增加订单记录。根据客户的订购请求及该客户记录的相关信息,产生订单并添加到订单文件中。(4)产生配货单。根据订单记录产生配货单,并将配货单发送给仓库进行备货;备好货后,发送备货就绪通知。如果现货不足,则需向供应商订货。(5)准备发货单。从订单文件中获取订单记录,从客户文件中获取客户记录,并产生发货单。(6)发货。当收到仓库发送的备货就绪通知后,根据发货单给客户发货;产生装运单并发送给客户。(7)创建客户账单。根据订单文件中的订单记录和客户文件中的客户记录,产生并发送客户账单,同时更新商品文件中的商品数量和订单文件中的订单状态。(8)产生应收账户。根据客户记录和订单文件中的订单信息,产生并发送给财务部门应收账户报表。现采用结构化方法对订单处理系统进行分析与设计,获得如图15-24所示的顶层数据流图和如图15-25所示的第0层数据流图。
问答题阅读以下说明和Java代码,将应填入______处的字句写在下面。[说明]欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。不同的绘图程序DP1DP2绘制直线drawaline(x1,y1,x2,y2)drawline(x1,x2,y1,y2)绘制圆drawacircle(x,y,r)drawcircle(x,y,r)该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如下图所示的类图。某绘图软件类图[Java代码]______Drawing{______;______;}classDP1{staticpublicvoiddraw_aline(doublex1,doubley1,doublex2,doubley2){/*代码省略*/}staticpublicvoiddraw_a_circle(doublex,doubley,doubler){/*代码省略*/}};classDP2(staticpublicvoiddrawline(doublex1,doublex2,doubley1,doubley2){/*代码省略*/}staticpublicvoiddrawcircle(doublex,doubley,doubler){/*代码省略*/}};classV1DrawingimplementsDrawing{publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){/*代码省略*/}publicvoiddrawCircle(doublex,doubley,doubler){______;)};classV2DrawingimplementsDrawing{DublicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){/*代码省略*/}publicvoiddrawCircle(doublex,doubley,doubler){______;}};abstractclassShape(privateDrawing_dp;______;Shape(Drawingdp){_dp=dp;}publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){_dp.drawLine(x1,y1,x2,y2);}publicvoiddrawCircle(doublex,doubley,doubler){dp.drawCircle(x,y,r);}};classRectangleextendsShape{privatedouble_x1,_x2,_y1,_y2;publicRectangle(Drawingdp,doublex1,doubley1,doublex2,doubley2){/*代码省略*/}publicvoiddraw(){/*代码省略*/}};classCircleextendsShape{privatedouble_x,_y,_r;publicCircle(Drawingdp,doublex,doubley,doubler){/*代码省略*/)publicvoiddraw(){drawCircle(_x,_y,_r);}};
