填空题阅读以下说明和C代码,将应填入 (n) 处的字句写在对应栏内。 [说明] 在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当公文类的内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。 [C代码] #include<stdio.h> #define OBS_MAXNUM 20/*一个OfficeDoc变量最多能够关联的DocExplorer变量的个数*/ typedef void( (1) )(struc OfficeDoc *,struct DocExplorer *); Struet DocExplorer func update; /*DocExplorer结构采用的更新函数*/ /*其他的结构字段省略*/ ; struct OffiCeDoc (2) myObs[OBS_MAXNUM]; /*存储所有与OfficeDoc相关联的DocExplorer结构指针*/ int index;/*与OfficeDoc结构变量相关联的DocExplorer结构变量的个数*/ ; void attach(struct OfficeDoc *doc,struct DocExplorer *ob) /*关联Obersver结构ob与OfficeDoc结构doc*/ int loop=0; if(doc->index>=OBS_MAXNUM||ob==NULL)return; for(loop=0;loop<doc->index;loop++) if(doc->myObs[loop]==ob)return; doc->myObs[doc->index]=ob; doc->index++; void detach(Struct OfficeDoc *doc,struct DocExplorer *ob) /*解除doc结构与ob结构间的关系*/ int loop; if(ob==NULL)return; for(loop=0;loop<doc->index;loop++) if(doc->myObs[loop]==ob) if(loop<=doc->index-2) doc->myObs[loop]=doc->myObs[ (3) ]; doc->myObs[doc->index-1]=NULL; doc->index--; breack; void updatel(Struct OfficeDoc *doc,struct DocExplorer *ob) /*更新ob结构的值,更新代码省略*/ void update2(struct OfficeDoc *doc,struct DocExplorer *ob) /*更新ob结构的值,更新代码省略*/ void notifyObs(struct OfficeDoc *doc) /*当doc结构的值发生变化时,通知与之关联的所有DocExplorer结构变量*/ int loop; for(loop=0;loop<doc->index;loop++) (doc->myObs[loop])->update( (4) ); void msin() struct OfficeDoc doc; /*定义一个OfficeDoc变量*/ struct DocExplorer explorer1,explorer2; /*定义两个DocExplorer变量*/ /*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/ doc.index=0; explorer1.update=update1; /*设置explorer1变量的更新函数*/ explorer2.update=update2; /*设置explorer2变量的更新函数*/ attach(&doc,&explorer1);/*关联explorer1与doc对象*/ attach(&doc,&explorer2);/*关联explorer2与doc对象*/ /*其他代码省略*/ (5) ;/*通知与OfficeDoc相关的所有DocExplorer变量*/ return;
填空题阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。[说明]某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表18-6所示。表18-6飞机种类及其特征飞机种类起飞特征飞行特征直升机(Helicopter)垂直起飞(VerticalTakeOff)亚音速飞行(SubSonicFly)客机(AirPlane)长距离起飞(LongDistanceTakeOff)亚音速飞行(SubSonicFly)歼击机(Fighter)长距离起飞(LongDistanceTakeOff)超音速飞行(SuperSonicFly)鹞式战斗机(Harrier)垂直起飞(VerticalTakeOff)超音速飞行(SuperSonicFly)为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图18-21所示。在图18-21中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征;类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。[C++代码]#include<iostream>usingnamespacestd;classFlyBehaviorpublic:virtualvoidfly()=0;;classSubSonicFly:publicFlyBehaviorpublic:voidfly()cout<<"亚音速飞行!"<<end1;;ClassSuperSonicFly:publicFlyBehaviorpublic:voidfly()cout<<"超音速飞行!"<<end1;;classTakeOffBehaviorpublic:virtualvoidtakeOff()=0;;classVerticalTakeoff:publicTakeOffBehaviorpublic:voidtakeOff()cout<<"垂直起飞!"<<end1;;classLongDistanceTakeoff:publicTakeOffBehaviorpublic:voidtakeOff()cout<<"长距离起飞!"<<end1;;classAirCraftprotected:(1);(2);public:voidfly()(3);voidtakeOff()(4);;;classHelicopter:publicAirCraftpublic:Helicopter()flyBehavior=new(5);takeoffBehavior=Flew(6);(7)if(!flyBehavior)deleteflyBehavior;if(!takeOffBehavior)deletetakeOffBehavior;;//其他代码省略
填空题阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。[说明]已知某企业欲开发一个家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器如图18-13所示。该遥控器共有4个按钮,编号分别是0~3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如图18-14所示。在图18-14中,类RomoteController的方法onPressButton(intbutton)表示当遥控器按键按下时调用的方法,参数为按键的编号;Command接N中的On()和off()方法分别用于控制电器的开与关;Light中的mrnLight(intdegree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯,并且将灯光亮度调整到最大;TV中的setChannel(intchannel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,值为1时表示打开电视并将频道切换为第1频道。[Java代码]classLight//电灯类publicvoidturnLight(intdegree)//调整灯光亮度,0表示关灯,100表示亮度最大;classTV//电视机类PublicvoidsetChannel(intchannel)//0表示关机,1表示开机并切换到第1频道;interfaceCommand//抽象命令类voidon();voidoff();;classRemoteController//遥控器类protectedCommand[]commands=newCommand[4];//遥控器有4个按钮,按照编号分别对应4个Command对象publicvoidonPressButton(intbutton)//按钮被按下时执行命令对象中的命令if(button%2==0)commands[button].on();elsecommands[button].off();publicvoidsetCommand(intbutton,Commandcommand)(1)=command;//设置每个按钮对应的命令对象;classLightCommandimplementsCommand//电灯命令类protectedLightlight;//指向要控制的电灯对象publicvoidon()light.turnLight(100);;publicvoidoff()light.(2):;publicLightCommand(Lightlight)this.light=light;;;classTVCommandimplementsCommand//电视机命令类protectedTvtv;//指向要控制的电视机对象publicvoidon()(tv.(3);;publicvoidoff()tv.setChannel(0);;publicTVCommand(TVtv)(this.tv=tv;;;publicclassrspublicstaticvoidmain(String[]args)Lightlight=newLight();TVtv=newTV();//创建电灯和电视对象LightCommandlightCommand=newLightCommand(light);TVCommandtvCommand=newTVCommand(tv);RemoteControllerremoteControllet=newRemoteController();//设置按钮和命令对象remoteController.setCommand(0,(4);…//此处省略设置按钮1、按钮2和按钮3的命令对象代码本题中,应用命令模式能够有效让类(5)和类(6)、类(7)之间的耦合性降至最小。
填空题阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。[说明]某游戏公司现欲开发一款面向儿童的模游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表18-5所示。表18-5鸭子各类及其特征鸭子种类发声特征飞行特征外现特征灰鸭(MallaIdDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛红头鸭(RedHeadDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛、头部红色棉花鸭(CottonDuck)不发声(QuackNoWay)不能飞行(FlyNoWay)白色橡皮鸭(RubberDuck)发出橡皮与空气摩擦声(Squeak)不能飞行(FlyNoWay)黑色橡皮颜色为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图18-8所示。其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;接NFlyBehavior与QuackBehavior分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下Java代码中的空缺。[Java代码](1)FlyBehaviorpublicvoidfly();;(2)QuackBehaviorpublicvoidquack();;classFlyWithWingsimplementsFlyBehaViorpublicvoidfly()(System.out.println("使用翅膀飞行!");;classFlyNoWayimplementsFlyBehaViorpublicvoidfly()(System.out.println("不能飞行!");;classQuackimplementsQuackBehaviorpublicvoidquack()(System.out.println("发出/'嘎嘎/'声!");;classSqueakimplementsQuackBehaviorpublicvoidquack()(System.out.println("发出空气与橡皮摩擦声!");;classQuackNoWayimplementsQuackBehaViorpublicvoidquack()(System.out.println("不能发声!");;abstractclassDuckprotectedFlyBehavior(3);protectedQuackBehavior(4);publicvoidfly()((5);publicvoidquack()(6);;public(7)voiddisplay();;classRubberDuckextendsDuckpublicRubberDuck()flyBehavior=Fiew(8);quackBehavior=new(9);publicvoiddisplay()/*此处省略显示橡皮鸭的代码*/;//其他代码省略
填空题阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。[说明]已知某企业欲开发一个家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器如图18-11所示。该遥控器共有4个按钮,编号分别是0~3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如图18-12所示。在图18-12中,类RomoteController的方法onPressButton(intbutton)表示当遥控器按键按下时调用的方法,参数为按键的编号;Command接口中的on()和off()方法分别用于控制电器的开与关;Light中的mrnLight(intdegree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯,并且将灯光亮度调整到最大;TV中的setChannel(intchannel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,值为1时表示打开电视并将频道切换为第1频道。[C++代码]classLight//电灯类public:voidturnLight(intdegree)//调整灯光亮度,0表示关灯,100表示亮度最大;;classTV//电视机类public:voidsetChannel(intchannel)//调整频道,0表示关机,1表示开机并切换到第1频道;;classCommand//抽象命令类public:virtualvoidon()=0;virtualvoidoff()=0;;classRemoteController//遥控器类protected:Command*commands[4];//遥控器有4个按钮,按照编号分别对应4个Command对象public:voidonPressButton(intbutton)//按钮被按下时执行命令对象中的命令if(button%2==0)commands[button]->on();elsecommands[button]->off();voidsetCommand(intbutton,Command*command)(1)=command;//设置每个按钮对应的命令对象;classLightCommand:publicCommand//电灯命令类protected:Light*light;//指向要控制的电灯对象public:voidon()light->turnLight(100);;voidoff()light->(2);;LightCommand(Light*light)(this->light=light;;;classTVCommand:publicCommand//电视机命令类protected:TV*tv;//指向要控制的电视机对象public:voidon()(tv->(3);;voidoff()(tv->setChannel(0);;TVCommand(TV*tv)(this->tv=tv;;;voidmain()Lightlight;Tvtv;//创建电灯和电视对象LightCommandlightCommand(&light);TVCommandtvCommand(&tv);RemoteControilerremoteController;remoteController.setCommand(0,(4));//设置按钮0的命令对象……//此处省略设置按钮1、按钮2和按钮3的命令对象代码本题中,应用命令模式能够有效让类(5)和类(6)、类(7)之间的耦合性降至最小。
填空题阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。[说明]某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表18-4所示。表18-4鸭子各类及其特征鸭子种类发声特征飞行特征外现特征灰鸭(MallardDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛红头鸭(RedHeadDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛、头部红色棉花鸭(CottonDuck)不发声(QuackNoWay)不能飞行(FlyNoWay)白色橡皮鸭(RubberDuck)发出橡皮与空气摩擦声(Squeak)不能飞行(FlyNoWay)黑色橡皮颜色为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图18-7所示。其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下C++代码中的空缺。[C++代码]#include<iostream>usingnamespace(1);classFlyBehaviorpublic:(2)fly()=0;;classQuackBehaviorpublic:(3)quack()=0;;classFlyWithWings:publicFlyBehaviorpublic:voidfly()cout<<"使用翅膀飞行!">>end1;;classFlyNoWay:publicFlyBehaviorpublic:voidfly()cout"不能飞行!"end1;;classQuack:publicQuackBehaviorpublic:voidquack()"cout发出/'嘎嘎/'声!”end1;;classSqueak:publicQuackBehaviorpublic:voidquack()cout<<"发出空气与橡皮摩擦声!">>end1;;classQuackNoWay:publicQuackBehaviorpublic:voidquack()cout<<"不能发声!">>end1;;classDuckprotected:FlyBehavior*(4);QuackBehavior*(5);public:voidfly()(6);voidquack()(7);;virtualvoiddisplay()=0;;classRubberDuck:publicDuckpublic:RubberDuck()flyBehavior=new(8);quackBehavior=new(9);RubberDuck()if(!flyBehavior)deleteflyBehavior;if(!quackBehavior)deletequackBehavior;voiddisplay()/*此处省略显示橡皮鸭的代码*/;//其他代码省略
填空题阅读下列说明、图及Java程序,将应填入(n)处的字句写在对应栏内。[说明]某订单管理系统的部分UML类图如图18-4所示。在图18-4中,Product表示产品,ProductList表示所销售产品的列表,Order表示产品订单,OrderItem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。各个类的部分属性和方法说明如表18-3所示。表18-3类的部分属性和方法说明表类成员说明ProductListArrayList<Product>productsProductStringcode产品编号Stringdescription产品描述doubleprice产品单价Booleanequals(Objectobject)若两个产品相同则返回true,否则返回falseOrderltemProductproduct订单项中的产品intquantity产品的订购数量ProductgetPmduct()获取单项中的产品OrderArrayList<Orderltern>items订单中包含的单项OrderListArrayList<Order>orders订单voidaddOrder(Orderorder)向订单列表中添加新订单intgetNumberOfOrders()状取订单列表中的订单总数SalesSystemProductListcatalog产品目录OrderListsales订单列表voidstatistic()依次统计产品目录中每个产品的订购总量,并打印出每个产品的编号、说明、订购总量和订购金额可以使用类Java.util.ArrayList<E>来实现对象的聚集关系,如图18-4中OrderList与Order之间的聚集关系。for-each循环提供了一种遍历对象集合的简单方法。在for-each循环中,可以指定需要遍历的对象集合,以及用来接收集合中每个元素的变量。其语法如下:for(用来接收集合中元素的变量:需要遍历的对象集合)如果要使用for-each循环遍历对象集合,那么包含该对象集合的类必须实现接口Java.util.Iterable<T>。Java程序1和Java程序2分别给出了类OrderList和方法statistic()的Java代码。[Java程序1]importjava.util.*;publicclassOrderList(1)privateArrayList<Order>orders;publicOrderLiSt()this.orders=newArrayList<Order>();publicvoidaddOrder(Orderorder)this.orders.add(order);publicIterator<Order>iterator()return(2);publicintgetNumberoforders()returnthis.orders.slze();[Java程序2]importJava.util.*;publicclassSalesSystemprivateProductListcatalog;privateOrderListsales;privatestaticPrintWriterstdOut=newPrintWriter(System.out,true);publicvoidstatistiC()for(Productproduct:(3))intnumber=0;for(Orderorder:(4))for((5):order)if(product.equals(item.getProduct()))number+=item.getQuantity();stdOut.printIn(product.getCode()+""+product.getDescription()+""+number+""+number*product.getPrice());//其余的方法未列出
填空题阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。[说明]在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树形结构,如图21-7所示。信号源是树根,树中的每个结点(除了根)表示一个可以放置放大器的子结点,其中某些结点同时也是信号消耗点,信号从一个结点流向其子结点。每个结点有一个d值,表示从其父结点到该结点的信号衰减量。例如,在图21-7中,结点w、p、q的d值分别为2、1、3,树根结点表示信号源,其d值为0。每个结点有一个M值,表示从该结点出发到其所有叶子结点的信号衰减量的最大值。显然,叶子结点的M值为0。对于非叶子结点j,M[j)=maxM(k)+d(k)k是j的孩子结点)。在此公式中,要计算结点的M值,必须先算出其所有子结点的M值。在计算M值的过程中,对于某个结点i,其有一个子结点k满足d(k)+M(k)大于容忍值,则应在k处放置放大器;否则,从结点i到某叶子结点的信号衰减量会超过容忍值,使得到达该叶子结点时信号不可用,而在结点i处放置放大器并不能解决到达叶子结点的信号衰减问题。例如,在图21-7中,从结点p到其所有叶子结点的最大衰减值为4。若容忍值为3,则必须在s处放置信号放大器,这样可使得结点p的M值为2。同样,需要在结点q、v处放置信号放大器,如图21-8中阴影结点所示。若在某结点放置了信号放大器,则从该结点输出的信号与信号源输出的信号等价。函数placeBoosters(TreeNode*root)的功能是:对于给定树形分布网络中各个结点,计算其信号衰减量的最大值,并确定应在树中的哪些结点放置信号放大器。全局变量Tolerance保存信号衰减容忍值。树的结点类型定义如下:typedefstructTreeN(Ddeintid;/*当前结点的识别号*/intchildNum;/*当前结点的子结点数目*/intd;/*父结点到当前结点的信号衰减值*/structTreeN()de**childptr;/*向量,存放当前结点到其所有子结点的指针*/intM;/*当前结点到其所有子结点的信号衰减值中的最大值*/boolboost;/*是否在当前结点放置信号放大器的标志*/TreeNode;[C语言函数]voidplaceB00sters(TreeNode*root)/*计算root所指结点处的衰减量,如果衰减量超出了容忍值,则放置放大器*/TreeNode*p;inti,degradation;if((1))degradation=0;root->M=0;i=0;if(i>=root->ChildNum)return;p=(2);for(;i<root->ChildNum&&p;i++,p=(3))p->M=0;(4);if(p->d+p->M>Tolerance)/*在p所指结点中放置信号放大器*/p->Doost=true;p->M=0;if(p->d+p->M>degradation)degradation=p->d+p->M;root->M=(5);
填空题阅读下列说明、图和C++代码,将应填入(n)处的字句写在对应栏内。[说明]某订单管理系统的部分UML类图如图18-3所示。在图18-3中,Product表示产品,ProductList表示产品目录,Order表示产品订单,OrderItem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。请完善类Order的成员函数getOrderedAmount()和类SalesSystem的statistic()方法,各个类的属性及部分方法定义参见下面的C++代码。[C++代码]classProduct//产品类private:stringpid;//产品识别码stringdescription;//产品描述doubleprice;//产品单价public:voidsetProductPrice(doubleprice);//设置产品单价stringgetProductld();//获取产品识别码stringgetProductDescription();//获取产品描述doublegetProductPrice();//获取产品单价//其他成员省略;classProductList(//产品列表类private:vector<Product>products;public:ProductList();ProductgetProductByIndex(inti);//获得产品列表中的第i件产品voidaddProduct(Productt);//在产品列表中加入一件产品Product*getProductBylD(stringpid);//获得识别码为pid的产品指针unsignedintgetProductAmount();//获得产品列表中的产品数量;classOrderItem(//订单条目类private:Product*productPtr;//指向被订购产品的指针intquantity;//订购数量public:OrderItem(Product*,int);Product*getProductptr();//获取指向被订购产品的指针intgetQuantity();//获取被订购产品的数量;classOrder(//订单类private:unsignedintorderid;//订单识别号vector<OrderItem>items;//订单内容(订单项)public:Order(unsignedintorderid);//获得识别码为tid的产品在当前订单中被订购的数量intgetOrderedAmount(stringtid);voidadditem(Product*productPtr,unsignedintn);//在订单中增加一个项//其他成员省略;classOrderList//订单列表类prtvate:vector<Order>orders;public:OrderList();//Begin()返回指向订单列表第一个元素的迭代器(指针)virtualvector<Order>::iteratorOrderList::Begin();//End0返回指向订单列表最后一个元素之后的迭代器(指向一个不存在的元素)virtualvector<Order>::iteratorOrderList::End();voidaddOrder(Ordert);//在订单列表中加入一份订单//其他成员省略;classSalesSystemprivate:ProductListcatalog://产品目录OrderListsales;//订单列表Public:SalesSystem();voidstatistic();//统计所有产品的订购情况//其他成员省略;//在订单中查找识别码为tid的产品的订购数量,若该产品没有被订购,则返回0intOrder::getOrderedAmount(stringtid)for(intk=0;k<items.size();k++)if((1)==tid)return(2);return0;//方法statistic()依次统计产品目录中每个产品的订购总量//并打印输出每个产品的识别码、描述、订购总量和订购金额voidSalesSystem::statistic()unsignedintk,t,ordered_qty=0;vector<Order>::iteratorit;Productp;cout<<"产品识别码/t描述/t/t订购数量/t金额"<<end1;for(k=0;k<catalog.getProductAtnount();k++)//遍历产品列表p=(3);//从产品列表中取得一件产品信息存入变量pordered_qty=0;//通过迭代器变量it遍历订单列表中的每一份订单for(it=sales.Begin();(4);it++)//根据产品识别码获得产品P在当前订单中被订购的数量t=(5)(p.getProductId());ordered_qty+=t;cout<<p.getProductId()<<"/t/t"<<p.getProductDescription()<<"/t/t";cout<<ordered_qty<<"/t/t"<<p.getProductPrice()*ordered_qty<<end1;
填空题阅读以下说明和Java代码,将应填入(n)处的字句写在对应栏内。[说明]某绘图系统存在Point、Line、Square三种图元,它们具有Shape接口,图元的类图关系如图18-2所示。现要将Circle图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了XCircle类,且完全满足系统新增的Circle图元所需的功能,但XCircle不是由Shape派生而来的,它提供的接口不能被系统直接使用。代码18.3既使用了XCircle又遵循了Shape规定的接口,既避免了从头开发一个新的Circle类,又可以不修改绘图系统中已经定义的接口。代码18.4根据用户指定的参数生成特定的图元实例,并对之进行显示操作。绘图系统定义的接口与XCircle提供的显示接口及其功能如表18-2所示。表18-2显示接口及其功能ShapeXCircle功能display()DisplayIt()显示图元[代码18.3]classCircle(1)private(2)pxc;publicCircle()pxc=new(3);publicvoiddisplay()pxc(4);[代码18.4]publicclassFactorypublic(5)getShapeInstance(inttyoe)(//生成特定类实例switch(type)case0:returnnewpoint();case1:returnnewRectangle();case2:returnnewline();Case3:returnnewCircle();default:retUrnnull;publicClassApppublicstatiCviodmain(Stringargv[])if(argv.length!=1)system.out.printin("errorparameters!|");Return;inttype=(newInteger(argv[0])).intValue();Factoryfactory=newFactory();shapes;S=factory.(6);if(s==null)system.out.printin("Errorgetinstance!");Return;s.display();return;
填空题阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。[说明]现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性,以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图18-18所示。采用该设计模式的原因在于:系统解析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;xlassGIFextendsImage//此处代码省略;classJPEGextendsImage//此处代码省略;publicclassJavaMainpublicstaticvoidmain(String[]args)//在Windows操作系统上查看demo.bmp图像文件Imageimagel=(4);ImageImpimageImpl=(5);(6);imagel.parseFile("demo.bmp");现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix和类javaMain,若采用桥接设计模式则至少需要设计(7)个类。
填空题阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。[说明]现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在Windows和Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性,以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接(Bridge)设计模式进行设计所得类图如图18-17所示。采用该设计模式的原因在于:系统解析BMP、GIF与JPEG文件的代码仅与文件格式相关,而在屏幕上显示像素矩阵的代码则仅与操作系统相关。[C++代码]clasSMatrix//各种格式的文件最终都被转换为像素矩阵//此处代码省略;classImageImppublic:virtualvoiddoPaint(Matrixm)=0;//显示像素矩阵m;classWinlmp:publicImageImppublic:voiddoPaint(Matrixm)/*调用Windows系统的绘制函数绘制像素矩阵*/;classLinuxlmp:publicImagelmppublic:voiddoPaint(Matrixm)/*调用Linux系统的绘制函数绘制像素矩阵*/;classImagepublic:voidsetImp(Imagelmp*imp)(1)=imp;virtualvoidparseFiie(stringfileName)=0;protected:(2)*imp;;classBMP:publicImagepublic:voidparseFile(stringfileName)//此处解析BMP文件并获得一个像素矩阵对象m(3);//显示像素矩阵m;classGIF:publicImage//此处代码省略;classJPEG:publicImage//此处代码省略;voidmain()//在Windows操作系统上查看demo.bmp图像文件Image*imagel=(4);ImageImp*imageImpl=(5);(6);imagel->parseFile("demo.bmp");现假设该系统需要支持10种格式的图像文件和5种操作系统,不考虑类Matrix,若采用桥接设计模式则至少需要设计(7)个类。
填空题火车售票点T1、T2分别售出了两张2009年10月20号到北京的硬座票,但是数据库里的剩余票却只减少了两张,造成了数据的不一致性,原因是______。
填空题阅读以下说明和C代码,将应填入 (n) 处的字句写在对应栏内。 [说明] 在一个简化的绘图程序中,支持的图形种类有点(point)和圆(ckcle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shape_t、point_t和circle_t分别表示基本图形、点和圆,并且点和圆具有基本图形的所有特征。 [C代码] typedef enumpoint,circle)shape_type; /*程序中的两种图形:点和圆*/ typedef struct /*基本的图形类型*/ shape_type type; /*图形种类标识:点或者圆*/ void(*destroy)(); /*销毁图形操作的函数指针*/ void(*draw)(); /*绘制图形操作的函数指针*/ shape_t; typedef struct(shape_t common;int x;int y;)point_t; /*定义点类型,x、y为点坐标*/ void destroyPoint(point_t* this) free(this);printf("Point destoryed!/n"); /*销毁点对象*/ void drawPoint(point_t* this) printf("P(%d,%d)",this->x,this->y); /*绘制点对象*/ shape_t* createPoint(va_list* ap)/*创建点对象,并设置其属性*/ point_t* p_point; if((p_point=(point_t*)malloc(sizeof(point_t)))==NULL)return NULL; p_point->common.type=point;p_point->common.destroy=destroyPoint; p_point->common.draw=drawPoint; p_point->x=va_arg(*ap,int); /*设置点的横坐标*/ p_point->y=va_arg(*ap,int); /*设置点的纵坐标*/ return(shape_t*)p_point; /*返回点对象指针*/ typedef struct/*定义圆类型*/ shape_t common; point_t*center; /*圆心点*/ int radius; /*圆半径*/ circle_t; void destroyCircle(Circle_t* this) free( (1) );free(this);printf("Circle destoryed!/n"); void drawCircle(Circle_t* this) printf<"C<">; (2) .draw(this->center); /*绘制圆心*/ printf(".%d)",this->radius); shape_t* createCircle(va_list* ap) /*创建一个圆,并设置其属性*/ Circle_t* p_circle; if((p_circle=(circle_t*)malloc(Sizeof(circle_t)))==NULL)return NULL; p_circle->common.type=circle;p_circle->common.destroy=destroyCircle; p_circle->common.draw=drawCircle; (3) =createPoint(ap); /*设置圆心*/ p_circle->radius=va_arg(*ap,int); /*设置圆半径*/ return p_circle; shape_t* createShape(shape_type st,…)/*创建某一种具体的图形*/ va_list ap; /*可变参数列表*/ shape_t* p_shape=NULL; (4) (ap,st); if(st==point)p_shape=createPoint(&ap); /*创建点对象*/ if(st==circle) p_shape=createCircle(&ap); /*创建圆对象*/ va_end(ap); return p_shape; int main() int i; /*循环控制变量,用于循环计数*/ shape_t* shapes[2]; /*图形指针数组,存储图形的地址*/ shapes[0]=createShape(point,2,3);/*横坐标为2,纵坐标为3*/ shapes[1]=createShape(Circle,20,40,10); /*圆心坐标为(20,40),半径为10*/ for(i=0;i<2;i++)(shapes[i]->draw(shapes[i]);printf("/n"); /*绘制数组中图形*/ for(i=1;i>=0;i--) shapes[i]->destroy(shapes[i]); /*销毁数组中图形*/ return 0; [运行结果] P(2,3) (5) Circle destoryed! Point destoryed!
填空题阅读下列说明和C++代码,将应填入空(n)处的字句写在对应栏内。[说明]某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图18-27所示。现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如图18-28所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图18-27中的甜点菜单。类MenuItem表示菜单中的菜式。[C++代码]#include<iostream>#include<list>#Include<string>usingnamespacestd;classMenuComponentprotected:stringname;public:MenuComponent(Stringname)(this->name=name;stringgetName()returnname;(1);//添加新菜单virtualvoidprint()=0;//打印菜单信息;classMenultem:publicMenuComponentprivate:doubleprice;public:Menultem(stringname,doubleprice):MenuComponent(name)(this->price=price;doublegetPrice()returnprice;voidadd(MenuComponent*menuComponent)retum;//添加新菜单voidprint()cout<<""<<getName0<<","<<getPrice0<<end1;;classMenu:publicMenuC0mponentprivate:list<(2)>menuComponents;public:Menu(stringname):MenuComponent(name)voidadd(MenuComponent*menuComponent)//添加新菜单(2);VOidprint()cout<<"/n"<<getNameO<<"/n---------------"<<end1;Std::list<MenuComponent*>::iteratoriter,for(iter=menuComponents.begin0;iter!=menuComponents.end0;iter++)(4)->print();;voidmain()MenuComponent*alIMenus=newMenu("ALLMENUS");MenuComponent*dinerMenu=newMenu("DINERMENU");……∥创建更多的Menu对象,此处代码省略alIMenus->add(dinerMenu);∥将dinerMenu添加到餐厅菜单中……∥为餐厅增加更多的菜单,此处代码省略(5)->printO;∥打印饭店所有菜单的信息
填空题阅读下列说明和c函数,将应填入(n)处的字句写在对应栏内。[说明]已知集合A和B的元素分别用不含头结点的单链表存储,函数Difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A=5,10,20,15,25,30,集合B=5,15,35,25,如图21-10(a)所示,运算完成后的结果如图21-10(b)所示。链表结点的结构类型定义如下:typedefstructNodeElemTypeelem;structNode*next;NodeType;[C函数]voidDifference(NodeType**LA,NodeType*LB)NodeType*pa,*pb,*pre,*q;pre=NULL;(1);while(pa)pb=LB;while((2))pb=pb->next;if((3))if(!pre)*LA=(4);else(5)=pa->next:q=pa;pa=pa->next;free(q);else(6);pa=pa->next;
填空题设供应商供应零件的关系模式为SP(Sno,Pno,Qty),其中Sno表示供应商号,Pno表示零件号,Qty表示零件数量。现查询至少包含了供应商“168”所供应的全部零件的供应商号。请补全下列SQL语句: ______ FROM SP SPX WHERE______ (SELECT* FROM SP SPY WHERE______ AND NOT EXISTS (SELECT* FROM SP SPZ WHERE______))
填空题阅读下列说明,回答问题1至问题3,将解答填入对应栏内。 [说明] 快速排序是一种典型的分治算法。采用快速排序对数组A[p..r]排序的3个步骤如下: (1)分解:选择一个枢轴(pivot)元素划分数组。将数组A[p..r]划分为两个子数组(可能为空)A[p..q-1]和A[q+1..r],使得A[q]大于等于A[p..q-1]中的每个元素,小于A[q+1..r]中的每个元素。q的值在划分过程中计算。 (2)递归求解:通过递归的调用快速排序,对子数组A[p..q-1]和A[q+1..r]分别排序。 (3)合并:快速排序在原地排序,故不需要合并操作。 [问题1] 下面是快速排序的伪代码,请填补其中的空缺。 伪代码中的主要变量说明如下: A:待排序数组; p,r:数组元素下标,从p到r; q:划分的位置; x:枢轴元素; i:整型变量,用于描述数组下标。下标小于或等于i的元素的值小于或等于枢轴元素的值: j:循环控制变量,表示数组元素下标。 QUICKSORT(A,P,r) if(p<r) q=PARTITION(A,p,r); QUICKSORT(A,p,q-1); QUICKSORT(A,q+1,r); PARTITION(A,p,r) X=A[r];i=p-1; for(j=p;j≤r-1;j++) if(A[j]≤x) i=i+1; 交换A[j]和A[j] 交换 (1) 和 (2) //注:空(1)和空(2)答案可以互换,但两个空全部答对方可得分 return (3) [问题2] (1)假设要排序包含n个元素的数组,请给出在各种不同的划分情况下,快速排序的时间复杂度,用O记号。最佳情况为 (4) ,平均情况为 (5) ,最坏情况为 (6) 。 (2)假设要排序的n个元素都具有相同值时,快速排序的运行时间复杂度属于哪种情况? (7) 。(最佳、平均、最坏) [问题3] (1)待排序数组是否能被较均匀地划分对快速排序的性能有重要影响,因此枢轴元素的选取非常重要。有人提出从待排序的数组元素中随机地取出一个元素作为枢轴元素,下面是随机化快速排序划分的伪代码——利用原有的快速排序的划分操作,请填充其中的空缺处。其中,RANDOM(i,j)表示随机取i到j之间的一个数,包括i和j。 RANDOMIZED-PARTITION(A,p,r) i=RANDOM(p,r); 交换 (8) 和 (9) ;//注:空(8)和空(9)答案可以互换,但两个空全部答对方可得分 return PARTITION(A,p,r); (2)随机化快速排序是否能够消除最坏情况的发生? (10) 。(是或否)
单选题采用三级结构/两级映像的数据库体系结构,如果对数据库的一张表创建聚簇索引,改变的是数据库的( )
单选题面向对象分析过程中,从给定需求描述中选择( )来识别对象
