案例分析题试题三
阅读下列说明和图,回答问题,将解答填入答题纸的对应栏内
案例分析题阅读下列说明,回答下列问题,将解答填入答题纸的对应栏内
案例分析题【说明】
社交网络平台 (SNS) 的主要功能之一是建立在线群组
问答题[说明] 一个描述学校的部分关系模式的结果描述如下: 1.一个系有若干学生,但一个学生只能在一个系; 2.一个系只有一名主任; 3.一个学生可以选修多门课程,每门课程有若干学生选修; 4.每个学生所学的每门课程都有一个成绩; 5.“学生”和“课程表”及“选课表”的关系示例分别如表9-1、表9-2、表9-3所示。 Student(学生表)的字段按顺序为学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所属院系(Sdept)、系主任(Smaster); Course(课程表)的字段按顺序为课程编号(Cno)、课程名(Cname)、先行课程(Cpno)、课程学分 (Ccredit); SC(选课表)的字段按顺序为学号(Sno)、课程号(Cno)、成绩(Grade)。 各表的记录如下: 表9-1 Student Sno Sname Ssex Sage Sdept Smaster 95001 李勇 男 20 CS 王平 95002 刘晨 女 19 IS 周言 95003 王明 女 18 MA 展评 95004 张立 男 19 IS 周言 表9-2 Course Cno Cname Cpno Ceredit 1 数据库 5 4 2 数学 2 3 信息系统 1 4 4 操作系统 6 3 5 数据结构 7 4 6 数据处理 2 7 PASCAL 6 4 表9-3 SC Sno Cno Grade 95001 1 92 95001 2 85 95001 3 88 95002 2 90 95003 3 801. [问题1] 试分析该关系模式中的函数依赖,并指出关系模式的候地选码。
问答题[说明]某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如下表所示。游戏需要模拟的鸭子种类及其特征鸭子种类发声特征飞行特征外观特征灰鸭(MallardDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛红头鸭(RedHeadDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛、头部红色棉花鸭(CottonDuck)不发声(QuackNoWay)不能飞行(FlyNoWay)白色橡皮鸭(RubberDuck)发出橡皮与空气摩擦的声音(Squeak)不能飞行(FlyNoWrdy)黑白橡皮色为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如下图所示。其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。[C++程序]#include<iostream>usingnamespace______;classFlyBehavior{public:______fly()=0;};classQuackBehavior{public:______quack()=0;};classFlyWithWings:publicFlyBehavior{public:voidfly(){cout<<"使用翅膀飞行!"<<end1;}};classFlyNoWay:publicFlyBehavior{public:voidfly(){cout<<"不能飞行!"<<end1;}};classQuack:publicQuackBehavior{public:voidquack(){cout<<"发出"嘎嘎"/声!"<<end1;}};classSqueak:publicQuackBehavior{public:voidquack(){cout<<"发出空气与橡皮摩擦声!"<<end1;}};classQuackNoWay:publicQuackBehavior{public:voidquack(){cout<<"不能发声!"<<end1;}};ClassDuck{protected:FlyBehavior*______;QuackBehavior*______;public:voidfly(){______;}voidquack(){______;}virtualvoiddisplay()=0;};classRubberDuck:publicDuck{public:RubberDuck(){flyBehavior=new______;quackBehavior=new______;}~RubberDuck(){if(!flyBehaVior)deleteflyBehavior;if(!quackBehavior)deletequackBehaVior;}Voiddisplay(){/*此处省略显示橡皮鸭的代码*/};//其他代码省略
问答题[问题1]
根据题意,补充图2-3中(a)处的空缺,即货物关系模式的属性。
问答题[说明]背包问题就是有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,而且选中物品的价值之和为最大。背包问题是一个典型的NP完全难题。对该问题求解方法的研究无论是在理论上,还是在实践中都具有一定的意义。如管理中的资源分配、投资决策、装载问题等均可建模为背包问题。常用的背包问题求解方法很多,但本题中采用了一种新的算法来求解背包问题。该算法思想为:首先要对物品进行价重比排序,然后按价重比从大到小依次装进包裹。这种方法并不能找到最佳的方案,因为有某些特殊情况存在,但只要把包中重量最大的物品取出,继续装入,直到达到limitweight,这时的物品就是limitweight的最大价值。这种算法不需要逐个进行试探,所以在数据非常大时,执行效率主要由排序的时间复杂度决定。该算法的流程图为图11-4。仔细阅读程序说明和C程序流程图及源码,回答问题1和问题2。[流程图11-4][程序说明]structThing:物品结构typedefstructBag:背包结构类型input():将物品按序号依次存入数组函数inbag():物品按物价比入包函数init():初始化函数sort():对物品按价格重量比排序函数outbag():取出包中weiht最大的物品函数print():最佳方案输出函数[C程序]#defineN255structThingdoubleweight;doublevalue;doubledens;thing[N];typedefstmctBagThingthing[N];doubleweighttmp;doublesumvalue;bag,best;inbag()dobag.thing[i]=thing[i](1)(2)i++;while((3))init()for(inti=0;i<N;i++)input(thing[i].weight,thing[i].value)thing[i].dens=thing[i].value/thing[i].weight;;main()init();sort();inbag();dobest=bag;//把包中物品放入暂存数组outbag();//取出包中weight最大的物品(4)while((5))print(best);//输出temp因为是最佳方案
问答题[说明]某大型披萨加工和销售商为了有效管理生产和销售情况,欲开发一披萨信息系统,其主要功能扣下:(1)销售。处理客户的订单信息,生成销售订单,并将其记录在销售订单表中。销售订单记录了订购者、所订购的披萨、期望的交付日期等信息。(2)生产控制。根据销售订单以及库存的披萨数量,制定披萨生产计划(包括生产哪些披萨、生产顺序和生产量等),并将其保存在生产计划表中。(3)生产。根据生产计划和配方表中的披萨配方,向库存发出原材料申领单,将制作好的披萨的信息存入库存表中,以便及时进行交付。(4)采购。根据所需原材料及库存量,确定采购数量,向供应商发送采购订单,并将其记录在采购订单表中;得到供应商的供应量,将原材料数量记录在库存表中,在采购订单表中标记已完成采购的订单。(5)运送。根据销售订单将披萨交付给客户,并记录在交付记录表中。(6)财务管理。在披萨交付后,为客户开具费用清单,收款并出具收据:依据完成的采购订单给供应商支付原材料费用并出具支付细节;将收款和支付记录存入收支记录表中。(7)存储。检查库存的原材料、披萨和未完成订单,确定所需原材料。现采用结构化方法对披萨信息系统进行分析与设计,获得如图1所示的上下文数据流图和图2所示的0层数据流图。图1上下数据流图图20层数据流图
问答题【说明】某教学管理系统的用户是教学管理人员、教师和学生。系统主要提供学生选课管理和学生成绩管理两方面的功能。(1)学生选修课管理主要功能是管理新学期开始时,学生对选修的课程进行选课注册工作。新学期开始后的前两周为学生试听、选课注册时间;允许校内各院系学生跨专业跨年级选修课程;学生可以在校园网的任何一个终端进行选课。①新学期选修课程表生成:各学院教学管理人员在新学期开始前,将准备开设的选修课程名称、课程代码、总课时、上课时间、学分、任课教师和上课教室录入系统,供学生选课使用。新学期开学两周后,系统自动将实际选课学生少于10人的课程停开,并删除该课程;教学管理人员打印学生选课注册名单和开课通知书,送交有关部门和任课教师。②学生选课注册:新学期开学前两周为学生试听、选课注册时间,并允许改变或取消注册申请。学生调用待选课程表,系统显示课程名、课程代码、任课教师、上课时间、总课时、上课教室、学分和本课程已选修人数。学生所选几门课程在上课时间上不能冲突;若一门课程实际选课学生已达到40人时,停止选课。当学生退出系统时,系统提示该学生所选的几门课程、任课教师、上课时间、教室、学分和学分总计。③选修课程查询:选修课程表信息查询,用户是教师、学生和教学管理人员。系统显示课程名、课程代码、任课教师、上课时间、总课时、上课教室、学分和本课程已选修人数。查询关键词可为学院名称、专业、授课教师等。学生选课情况查询:教师和教学管理人员可以查看学生的选课情况。查询关键词可以为学生姓名(学号)、课程名称(课程代码)、授课教师等。学生只能查自己所选课程内容,不允许查其他同学选课情况。教师简历查询:用户是学生、教师和教学管理人员。查询关键词可为教师姓名、性别、职称、年龄等单关键词或组合关键词。④信息统计与报表生成:各学院教学管理人员对学生选课注册信息进行统计(按课程、专业等),打印汇总报表。⑤把学生选课注册信息传送到财务管理系统,计算学生应交纳的费用。(2)学生成绩管理①学生考试成绩录入:各学院教学管理人员将学生考试成绩录入系统。录入学生成绩时,系统自动检查财务系统传来的选课交费信息,核对该学生是否已经交纳本门课程的费用,没有交纳费用者,不给成绩。②成绩查询:教师和教学管理人员可查询学生各门课程的成绩。查询关键词可为学生姓名(学号),课程名(课程代码)等。学生只能查自己各门课程的成绩,不允许查其他同学成绩。③成绩汇总与报表生成:教学管理人员对学生考试成绩信息进行统计(按学生、课程、专业等),打印汇总报表。向学校教务管理系统发送汇总信息表格等,不反馈信息。现在已建立教学管理最高层用例图,如下:
问答题【说明】 通常情况下,用户可以对应用系统进行配置,并将配置信息保存在配置文件中,应用系统在启动时首先将配置文件加载到内存中,这些内存配置信息应该有且仅有一份。 下面的代码应用了单身模式(Singleton)以保证Configure类只能有一个实例。这样,Configure类的使用者无法定义该类的多个实例,否则会产生编译错误。 # include <iostream.h> class Configure{ {{U}} (1) {{/U}}; Configure(){}; //构造函数 public: static Configure *Instance(); public: int GetConfigureData(){return data;} //获取配置信息 int SetConfigureDate(int m_data) {data=m_data; return data;} //设置配置信息 private: static Configure* _instance; int data; //配置信息 }; {{U}} (2) {{/U}}=NULL; Configure * Configure∷Instance() { if(_instance==NULL) { _instance={{U}} (3) {{/U}}; //加载配置文件并设置内存配置信息,此处省略 } return{{U}} (4) {{/U}}; } void main() { Configure *t=NULL; t={{U}} (5) {{/U}}; int d=t->GetConfigureData(); //获取配置信息后进行其它工作,此处省略 }
问答题【说明】 以下C++程序的功能是计算三角形、矩形和正方形的面积并输出。程序由4个类组成:类Triangle、Rectangle和Square分别表示三角形、矩形和正方形;抽象类Figure提供了一个纯虚拟函数getArea(),作为计算上述3种图形面积的通用接口。 #include<iostream.b> #include<math.h> class Figure public: virtual double getArea0=0; //纯虚拟函数 ; class Rectangle: (1) protected: double height; double width; public: Rectangle(); Rectangle(double height, double width) This->height=height; This->width=width; double getarea() return (2) ; ; class Square: (3) public: Square(double width) (4) ; ; class Triangle: (5) double la; double lb; double lc; public: Triangle(double la, double lb, double lc) this->la=la; this->lb; this->lc; double getArea() double s=(la+lb+lc)/2.0; return sqrt(s*(s-la)**(s-lb)*(s-lc)); ; viod main() Figure* figures[3]= new Triangle(2,3,3), new Rectangle(5,8), new Square(5)); for(int i=0;i<3;i++) cout<<"figures["<<i<<"]area="<<(figures[i])->getarea()<<endl;
问答题[问题2]
Web Service的三个基本技术是WSDL、SOAP、UDDI,它们都是以XML为基础定义的。请用120字以内文字,简要说明WSDL、SOAP和UDDI的作用。
问答题[说明]传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)、Closing(正在关闭)5种状态。触发传输门状态转换的事件有click、complete和timeout3种。事件与其相应的状态转换如下图所示。下面的C++程序1与C++程序2分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。[C++程序1]constintCLOSED=1;constintOPENING=2;constintOPEN=3;constintCLOSING=4;constintSTAYOPEN=5;//定义状态变量,用不同整数表示不同状态classDoor{private:intstate;//传输门当前状态voidsetState(intstate){this→state=state;}//设置当前状态public:Door():state(CLOSED){};voidgetState(){//根据当前状态输出相应的宁符串switch(stare){caseOPENING:cout<<"OPENING"<<end1;break;caseCLOSED:cout<<"CLOSED"<<end1;break;caseOPEN:cout<<"OPEN"<<end1;break;caseCLOSING:cout<<"CLOSING"<<end1;break;caseSTAYOPEN:cout<<"STAYOPEN"<<end1;break;}}voidclick()//发生click事件时进行状态转换{if(______)setState(OPENING);elseif(______)setState(CLOSING);elseif(______)setState(STAYOPEN);}voidtimeout()//发生timeout事件时进行状态转换{if(state==OPEN)setState(CLOSING);}voidcomplete()//发生complete事件时进行状态转换{if(state==OPENING)aetState(OPEN);elseif(state==CLOSZNG)setState(CLOSED);}};intmain(){DooraDoor;aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();aDoor.getState();return0;}[C++程序2]classDoor{public:DoorState*CLOSED,*OPENING,*OPEN,*CLOSING,*STAYOPEN,*state;Door();virtual~Door(){…//释放申请的内存,此处代码省略};voidsetState(DoorState*state){this→state=state;}voidgetState(){//此处代码省略,本方法输出状态字符串,//例如,当前状态为CLOSED时,输出字符串为"CLOSED"};voidclick();voidtimeout();voidcomplete();};Door::Door(){CLOSED=newDoorClosed(this);OPENING=newDoorOpening(this);OPEN=newDoorOpen(this);CLOSING=newDoorClosing(this);STAYOPEN=newDoorStayOpen(this);state=CLOSED;//设置当前传输门的状态为CLOSED}voidDoor::click(){______;}voidDoor::timeout(){______;}voidDoor::complete(){______;}classDoorState//定义一个抽象的状态,它是所有状态类的基类{protected:Door*door;public:DoorState(Door*door){this→door=door;}virtual~DoorState(void);virtualvoidclick(){}virtualvoidcomplete(){}virtualvoidtimeout(){}};classDoorClosed:publicDoorState//定义一个基本的Closed状态{public:DoorClosed(Door*door):DoorState(door){}virtual~DoorClosed(){}voidclick();};voidDoorClosed::click(){______;}//其他状态类的定义与实现代码省略intmain(){DooraDoor;aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();aDoor.getState();aDoor.timeout();aDoor.getState();return0;}
问答题阅读以下某人才信息交流网数据库设计的技术说明和图,根据要求回答问题1~问题5。[说明]某市人才交流中心为促进当地人力资源的合理配置,加强当地企业与人才的沟通,拟建立人才信息交流网。[需求分析结果]1.每个前来登记的个人需填写《人才入库登记表》,如表2-17所示,并出示相关证件,经工作人员审核后录入个人信息。{{B}}表2-17人才入库登记表{{/B}}个人编号:_______ 登记日期:___年___月___日姓名性别出生日期照片籍贯身份证号毕业院校专业学历证书名称1.编号2.移动电话家庭电话电子邮件求职意向及薪水职位名称最低薪水备注1.2.个人简历及特长 2.每个前来登记的企业需填写《企业信息登记表》,如表2-18所示,并出示相关证明及复印件,经工作人员核实后录入企业信息。 3.个人和企业的基本信息只需在第一次登记时填写,个人编号和企业编号由系统自动生成。个人和企业的基本信息由计算机长期存储,以后个人只需提供个人编号和求职意向信息,企业只需提供企业编号和岗位需求信息。 4.个人的求职意向信息和企业的岗位需求信息在两个工作日内由工作人员录入数据库并发布。 [概念模型设计] 根据需求阶段收集的信息,设计人才、岗位和企业的实体联系图如图2-24所示(不完整)。 {{B}}表2-18企业信息登记表{{/B}}企业编号:_______ 登记日期:__年__月__日企业名称地址企业网址联系人联系电话电子邮件岗位需求职位专业学历薪水备注企业简介 [逻辑结构设计]1.将概念模型设计的实体联系图转换为以下关系模式人才(个人编号,姓名,性别,出生日期,身份证号,毕业院校,专业,学历,证书名称,证书编号,联系电话,电子邮件,个人简历及特长)企业(企业编号,企业名称,联系人,联系电话,地址,企业网址,电子邮件,企业简介)求职意向({{U}}(2){{/U}})岗位需求({{U}}(3){{/U}})2.由于一个人可能持有多个证书,因此对“人才”关系模式进行优化,得到如下两个新的关系模式人才({{U}}(4){{/U}})证书({{U}}(5){{/U}})根据上述的设计过程,回答以下问题。
问答题【程序6说明】 本程序实现两个多项式的乘积运算。多项式的每一项由类Item描述,而多项式由类List描述。类List的成员函数有: createList():创建按指数降序链接的多项式链表,以表示多项式。 reverseList():将多项式链表的表元链接顺序颠倒。 multiplyList(List L1,List L2):计算多项式L1和多项式L2的乘积多项式。 【程序6】 #include<iostream.h> class List; class |tem friend class List; private: double quot; int exp; |tem * next; public: |tem(double_quot,int_exp) (1) ; ; class List private: |tem * list; public: List()list=NULL; void reverseList(); void multiplyList(List L1,List L2); void createList(); ; void List::createList() |tem * p,* u,*pre; int exp; doubte quot; list=NULL; while(1) cout<<"输入多项式中的一项(系数、指数):"<<endl; cin>>quot>>exp: if(exp<0)break; //指数小于零,结束输入 if(quot==0)continue; p=list; while( (2) ) //查找插入点 pre=p;p=p->next; if(p!=NULL&&exp==p->exp) p->quot+=quot;continue; u= (3) ; if(p==list) list=u; else pre->next=u; u->next=p; void List::reverseList() |tem*p,*u; if(list==NULL)return; p=list->next;list->next=NULL; while(p!=NULL) u=p->next;p->next=list; list=p;p=u; void List::multiplyList(List L1,List L2) |tem*pLI,*pL2,*u; int k,maxExp; double quot; maxExp= (4) ; L2.reverseList();list=NULL; for(k=maxExp;k>=0;k--) pL1=L1.list; while(pL1!=NULL&&pL1->exp>k)pL1=pL1->next; pL2=L2.list; while(pL2!=NULL&& (5) pL2=pL2->next; quot=0.0; while(pL1!=NULL&&pL2!=NULL) if(pL1->exp+pL2->exp==k) (6) ; pL1=pL1->next;pL2=pL2->next; else if(pL1->exp+pL2->exp>k) pL1=pL1->next; else pL2=pL2->next; if(quot!=0.0) u=new |tem(quot,k); u->next=list;list=u; reverseList(:);L2.reverseList(): void main() ListL1,L2,L; cout<<"创建第一个多项式链表/n";L1.createList(); cout<<"创建第二个多项式链表/n";L2.createList(); L.multiplyList(L1,L2);
问答题[说明]某集团公司拥有多个大型连锁商场,公司需要构建一个数据库系统以方便管理其业务运作活动。[需求分析结果](1)商场需要记录的信息包括商场编号(编号唯一)、商场名称、地址和联系电话。某商场信息如下表所示。商场信息表商场编号商场名称地址联系电话PS2101淮海商场淮海中路918号021-64158818PS2902西大街商场西大街时代盛典大厦029-87283229PS2903东大街商场碑林区东大街239号029-87450287PS2901长安商场雁塔区长安中路38号029-85264950(2)每个商场包含有不同的部门,部门需要记录的信息包括部门编号(集团公司分配)、部门名称、位置分布和联系电话。某商场的部门信息如下表所示。部门信息表部门编号部门名称位置分布联系电话DT002财务部商场大楼6层82504342DT007后勤部商场地下负1层82504347DT021安保部商场地下负1层82504358DT005人事部商场大楼6层82504446DT004管理部商场裙楼3层82504668(3)每个部门雇用多名员工处理日常事务,每名员工只能隶属于一个部门(新进员工在培训期不隶属于任何部门)。员工需要记录的信息包括员工编号(集团公司分配)、姓名、岗位、电话号码和工资。员工信息如下表所示。员工信息表员工编号姓名岗位电话号码工资/元XA3310周超理货员136092576381500.00SH1075刘飞防损员134772934871500.00XA0048江雪花广播员152345678931428.00BJ3123张正华部门主管133456984321876.00(4)每个部门的员工中有一名是经理,每个经理只能管理一个部门,系统需要记录每个经理的任职时间。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图(不完整)如下图所示。[关系模式设计]根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整)。商场(商场编号,商场名称,地址,联系电话)部门(部门编号,部门名称,位置分布,联系电话,______)员工(员工编号,员工姓名,岗位,电话号码,工资,______)经理(______,任职时间)
问答题[说明]某地区举行篮球比赛,需要开发一个比赛信息管理系统来记录比赛的相关信息。[需求分析结果](1)登记参赛球队的信息。记录球队的名称、代表地区、成立时间等信息。系统记录球队每个队员的姓名、年龄、身高、体重等信息。每个球队有一个教练负责管理球队,一个教练仅负责一个球队。系统记录教练的姓名、年龄等信息。(2)安排球队的训练信息。比赛组织者为球队提供了若干个场地,供球队进行适应性训练。系统记录现有的场地信息,包括场地名称、场地规模、位置等信息。系统可为每个球队安排不同的训练场地,如下表所示。系统记录训练场地安排的信息。训练场地安排表球队名称场地名称训练时间解放军一号球场2008-06-0914:00~18:00解放军一号球场2008-06-1209:00~12:00解放军二号球场2008-06-1114:00~18:00山西一号球场2008-06-1009:00~12:00(3)安排比赛。该赛事聘请专职裁判,每场比赛只安排一个裁判。系统记录裁判的姓名、年龄、级别等信息。系统按照一定的规则,首先分组,然后根据球队、场地和裁判情况安排比赛(每场比赛的对阵双方分别称为甲队和乙队)。记录参赛球队名称、比赛时间、比分、比赛场地等信息,如下表所示。比赛安排表A组:甲队—乙队场地名称比赛时间裁判比分解放军—北京一号球场2008-06-1715:00李大明天津—山西一号球场2008-06-1717:00胡学海B组:甲队—乙队场地名称比赛时间裁判比分上海—安徽二号球场2008-06-1715:00丁鸿平山东—辽宁二号球场2008-06-1719:00郭爱琪(4)所有球员、教练和裁判可能在表中出现重名情况。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下。(1)实体联系图如下图所示。(2)关系模式如下。教练(教练编号,姓名,年龄)队员(队员编号,姓名,年龄,身高,体重,______)球队(球队名称,代表地区,成立时间,______)场地(场地名称,场地规模,位置)训练记录(______)裁判(裁判编号,姓名,年龄,级别)比赛记录(______)
问答题[说明]某订单管理系统的部分UML类图如图5-15所示。图5-15中,Product表示产品,ProductList表示产品目录,Order表示产品订单,Orderltem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。请完善类Order的成员函数getOrderedAmount()和类SalesSystem的statistic()方法,各个类的属性及部分方法定义参见下面的C++代码。[C++代码]
问答题[说明]已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如下图所示,其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示。当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类,如图中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。己知Application类中的openDocument方法采用了模板方法(TemplateMethod)设计模式,该方法定义了打开文档的每一个主要步骤,具体如下。(1)首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回。(2)创建文档对象。(3)通过文档对象打开文档。(4)通过文档对象读取文档信息。(5)将文档对象加入到Application的文档对象集合中。[C++程序]#include<iostream>#include<vector>usingnamespacestd;//使用全局的命名域方式classDocument{public:voidsave(){/*存储文档数据,此处代码省略*/}voidopen(stringdocName){/*打开文档,此处代码省略*/}voidclose(){/*关闭文档,此处代码省略*/}virtualvoidread(stringdocName)=0;};classAppiication{private:vector<______>docs;/*文档对象集合*/public:boolcanOpenDocument(stringdocName){/*判断是否可以打开指定文档,返回真值表示可以打开,返回假值表示不可打开,此处代码省略*/}voidaddDocument(Document*aDocument){/*将文档对象添加到文档对象集合中*/docs.push_back(______);}virtualDocument*doCreateDocument()=0;/*创建一个文档对象*/voidopenDocument(stringdocName){/*打开文档*/if(______){cout<<"文档无法打开!"<<end1;return;}______adoc=______;______;______;______;}};