问答题【说明】某音像制品出租商店欲开发一个音像管理信息系统,管理音像制品的租借业务。需求如下:1.系统中的客户信息文件保存了该商店的所有客户的用户名、密码等信息。对于首次来租借的客户,系统会为其生成用户名和初始密码。2.系统中音像制品信息文件记录了商店中所有音像制品的详细信息及其库存数量。3.根据客户所租借的音像制品的品种,会按天收取相应的费用。音像制品的最长租借周期为1周,每位客户每次最多只能租借6件音像制品。4.客户租借某种音像制品的具体流程如下。(1)根据客户提供的用户名和密码,验证客户身份。(2)若该客户是合法客户,查询音像制品信息文件,查看商店中是否还有这种音像制品。(3)若还有该音像制品,且客户所要租借的音像制品数小于等于6个,就可以将该音像制品租借给客户。这时,系统给出相应的租借确认信息,生成一条新的租借记录并将其保存在租借记录文件中。(4)系统计算租借费用,将费用信息保存在租借记录文件中并告知客户。(5)客户付清租借费用之后,系统接收客户付款信息,将音像制品租借给该客户。5.当库存中某音像制品数量不能满足客户的租借请求数量时,系统可以接受客户网上预约租借某种音像制品。系统接收到预约请求后,检查库存信息,验证用户身份,创建相应的预约记录,生成预约流水号给该客户,并将信息保存在预约记录文件中。6.客户归还到期的音像制品,系统修改租借记录文件,并查询预约记录文件和客户信息文件,判定是否有客户预约了这些音像制品。若有,则生成预约提示信息,通知系统履行预约服务,系统查询客户信息文件和预约记录文件,通知相关客户前来租借音像制品。
问答题[说明]已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万~10万元(不包括10万元)的采购单,董事长可以审批10万~50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(ChainofResponsibility)对上述过程进行设计后得到的类图如下图所示。[C++程序]#include<string>#include<iostream>usingnamespacestd;classPurchaseRequest{public:doubleAmount;//一个采购的金额intNumber;//采购单编号stringPurpose;//采购目的};classApprover//审批者类{public:Approver(){successor=NULL;}virtualvoidProcessRequest(PurchaseRequestaRequest){if(successor!=NULL){successor→______;}}voidSetSuccessor(Approver*aSuccessor){successor=aSuccessor;}private:______successor;};classCongress:publicApprover{public:voidProcessRequest(PurchaseRequestaRequest){if(aRequest.Amount>=500000){/*决定是否审批的代码省略*/}else______ProcessRequest(aRequest);}};classDirector:publicApprover{public:voidProcessRequest(PurchaseRequestaRequest){/*此处代码省略*/}};classPresident:publicApprover{public:voidProcessRequest(PurchaseRequestaRequest){/*此处代码省略*/}};classVicePresident:publicApprover{public:voidProcessRequest(PurchaseRequestaRequest){/*此处代码省略*/}};voidmain(){CongressMeeting;VicePresidentSam;DirectorLarry;PresidentTammy;//构造责任链Meeting.SetSuccessor(NULL);Sam.SetSuccessor(______);Tammy.SetSuccessor(______);Larry.SetSuccessor(______);PurchaseRequestaRequest;//构造一采购审批请求cin>>aRequest.Amount;//输入采购请求的金额______.ProcessRequest(aRequest);//开始审批return;
问答题某汽车停车场欲建立一个信息系统,已经调查到的需求如下:(1)在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器,示意图如图1所示。图1停车示意图(2)当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。(3)在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后,将获得一张出场卡,用于离开停车场。(4)当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。(5)系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到了如表所示的类/用例/状态列表、如图2所示的用例图、如图3所示的初始类图以及如图4所示的描述入口自动栏杆行为的UML状态图。图2用例图图3初始类图图4入口护栏的状态图类/用例/状态列表用例名说明类名说明状态名说明Carentry汽车进入停车场CentralComputer停车场信息系统Idle空闲状态,汽车可以进入停车场Carexit汽车离开停车场PaymentMachine付款机器Disable没有车位RepoitStatistics记录停车场的相关信息CarPark停车场,保存车位信息AwaitEntry等待汽车进入Barrier自动护栏AwaitTicketTake等待打印停车卡Carentrywhenfull没有车位时,汽车请求进入停车场EntryBarrier入口的护栏AwaitEnable等待停车场内有空闲车位ExitBarrier出口的护栏
问答题阅读下列说明,根据要求回答问题1~问题3。[说明]某地区举行篮球比赛,需要开发一个比赛信息管理系统来记录比赛的相关信息。[需求分析结果]1.登记参赛球队的信息。记录球队的名称、代表地区、成立时间等信息。系统记录球队的每个队员的姓名、年龄、身高、体重等信息。每个球队有一个教练负责管理球队,一个教练仅负责一个球队。系统记录教练的姓名、年龄等信息。2.安排球队的训练信息。比赛组织者为球队提供了若干个场地,供球队进行适应性训练。系统记录现有的场地信息,包括:场地名称、场地规模、位置等信息。系统可为每个球队安排不同的训练场地,如表3-9所示。系统记录训练场地安排的信息。{{B}}表3-9训练安排表{{/B}}{{B}}球队名称{{/B}}{{B}}场地名称{{/B}}{{B}}训练时间{{/B}}解放军一号球场2008-06-0914:00-18:00解放军一号球场2008-06-1209:00-12:00解放军二号球场2008-06-1114:00-18:00山西一号球场2008-06-1009:00-12:003.安排比赛。该赛事聘请有专职裁判,每场比赛只安排一个裁判。系统记录裁判的姓名、年龄、级别等信息。系统按照一定的规则,首先分组,然后根据球队、场地和裁判情况,安排比赛(每场比赛的对阵双方分别称为甲队和乙队)。记录参赛球队、比赛时间、比分、场地名称等信息,如表3-10所示。{{B}}表3-10比赛安排表{{/B}}A组:{{B}}甲队…乙队{{/B}}{{B}}场地名称{{/B}}{{B}}比赛时间{{/B}}{{B}}裁判{{/B}}{{B}}比分{{/B}}解放军…北京一号球场2008-06-1715:00李大明天津…山西一号球场2008-06-1719:00胡学梅B组{{B}}甲队…乙队{{/B}}{{B}}场地名称{{/B}}{{B}}比赛时间{{/B}}{{B}}裁判{{/B}}{{B}}比分{{/B}}上海…安徽二号球场2008-06-1715:00丁鸿平山东…辽宁二号球场2008-06-1719:00郭爱琪4.所有球员、教练和裁判可能出现重名情况。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下。1.实体联系图(图3-20)2.关系模式教练(教练编号,姓名,年龄)队员(队员编号,姓名,年龄,身高,体重,{{U}}(a){{/U}}球队(球队名称,代表地区,成立时间,{{U}}(b){{/U}}场地(场地名称,场地规模,位置)训练记录({{U}}(c){{/U}})裁判(裁判编号,姓名,年龄,级别)比赛记录({{U}}(d){{/U}})
问答题阅读下列说明和C++代码,回答下列问题。[说明]在超市销售管理系统中通常需要根据顾客需求打印购物小票,在购物小票中体现所购买的物品名称、数量、单价及总价等信息,以及购物时间、收银员号码等基本信息。而且有的需要打印票据的头信息(如欢迎辞等),有的需要打印票据的页脚信息(如促销打折广告提示信息等),有的只需要打印票据的内容。并且这些信息的内容及打印位置也需要根据具体情况而发生变动,相当于是对购物小票的额外装饰了。以上这些功能采用装饰器(Decorator)设计模式来设计,得到的类图如图7-15所示。以下C++代码可为购物小票动态添加各种抬头和注释信息。[C++代码]#include<iostream.h>classcxiaopiaopublic:______=0;;classcjutixiaopiao:______public:voidDaYinXiaoPiao()cout<<"票据正文"<<endl;;classczhuangshixiaopiao:____________:cxiaopiao*xpobj;public:czhuangshixiaopiao(cxiaopiao*obj)xpobj=obj;______=0;;classheaderxiaopiao:publicczhuangshixiaopiaopublic:headerxiaopiao(cxiaopiao*obj):czhuangshixiaopiao(obj)voidDaYinXiaoPiao()cout<<"抬头"<<endl;xpobj->DaYinXiaoPiao();;classfooterxiaopiao:publicczhuangshixiaopiaopublic:footerxiaopiao(cxiaopiao*obj):czhuangshixiaopiao(obj)voidDaYinXiaoPiao()xpobj->DaYinxiaoPiao();cout<<"脚注"<<endl;;intmain()czhuangshixiaopiao*xiaopiao=newheaderxiaopiao(newfooterxiaopiao(newcjutixiaopiao));xiaopiao->DaYinXiaoPiao();cout<<endl;return0;装饰器(Decorator)模式是一种______型设计模式,其设计意图是:______。
问答题[说明]某客户信息管理系统中保存着以下两类客户的信息。(1)个人客户。对于这类客户,系统保存了其客户标识(由系统生成)和基本信息(包括姓名、住宅电话和E-mail)。(2)集团客户。集团客户可以创建和管理自己的若干名联系人。对于这类客户,系统除了保存其客户标识(由系统生成)之外,也保存了其联系人的信息。联系人的信息包括姓名、住宅电话、E-mail、办公电话及职位。该系统除了可以保存客户信息之外,还具有以下功能。(1)向系统中添加客户(addCustomer)。(2)根据给定的客户标识,在系统中查找该客户(getCustommer)。(3)根据给定的客户标识,从系统中删除该客户(removeCustomer)。(4)创建新的联系人(addContact)。(5)在系统中查找指定的联系人(getContact)。(6)从系统中删除指定的联系人(removeContact)。该系统采用面向对象方法进行开发。在面向对象分析阶段,根据上述描述,得到如下表所示的类及类的说明。类及类的说明类名说明CustomerInformationSystem客户信息管理系统IndividualCustomer个人客户InstitutionalCustomer集团客户Contact联系人描述该客户信息管理系统的UML类图如下图所示。
问答题[说明]以下VisualBasic代码实现了系统登录时对用户进行合法性检查。界面如图9-6所示。阅读下面代码,将(n)处代码补充完整。[代码7-1]BeginVB.Formform1BackColor=&H00808080&Caption="系统登录"//...窗体描述(略)BeginVB.Labe1Labe12Backstyle=0'TransparentCaption="密码:"//…窗体描述(略)EndBeginVB.Labe1Labe11Backstyle=0'TransparentCaption="操作员:"//...窗体描述(略)End//...窗体描述(略)End[代码7-2]DimTIMAsIntegerDimmydbAsDatabaseDimmyrsAsRecordsetDimsq1AsStringPrivateSubFormACdvate()Setmydb=Workspaces(0).OpenDatabase(App.Path&"/CIUID.mdb")'打开数据库sq1="select操作员fromqxsz"Setmyrs=mydb.OpenRecordset(sq1)If(1)Thenmyrs.MoveLastIf(2)Thenmyrs.MoveFirstFori=0TOmyrs.RecordCount-1(3)(4)NextiIf(5)Thenmaster.Listlndex=0myrs.Closemydb.Closemaster.SetFocusEndSub[代码7-3]PrivateSubCmdok_Click()'确认操作员和密码DimMESSAGEAsStringIfmaster.Text<>'''ThenSetmydb=Workspaces(0).OpenDatabase(App.Path&"/CIUID.mdb")Setmyrs=mydb.OpenRecordset("qxsz",dbOpenDynaset)myrs.Findfirst"操作员="+Chr(34)+master.Text+Chr(34)+""'查找操作员If(6)ThenMsgBox("无此操作员!")ElseIfpassword.Text=myrs.Fields("密码")Then'确认密码MsgBox"系统登录成功!"'系统登录成功ElseIfTIM=3ThenMESSAGE=MsgBox("密码输入错误,请向系统管理员查询!",0,"")IfMESSAGE=vbOKThenEndEndIfMsgBox("密码错误,请重新输入密码!")TIM=TIM+1'密码输入错误次数password.SetFocusEndIfEndIfEndIfEndSub
问答题[说明]职工信息管理系统是用于对职工相关信息进行检索、统计、工资管理、内部调动管理等的系统。利用该系统,人事科可以对本单位职工信息进行管理,根据不同命令对信息进行增、删、改、内部调动,打印人事表格,进行统计、检索。人事科输入的系统命令需要合法性检查才能被接受、处理。系统命令包括档案维护、数据检索、统计报表、打印命令、代码维护。人事科的输入信息包括个人资料、检索选项、统计选项、代码资料、新增档案字段、档案修改资料等条目。完整的个人资料应包括职工的档案编号、姓名、工作单位、性别、出生日期、技术职称以及学历。通过系统授权,用户可以进行对职工信息数据进行查询检索,检索的条件可以是姓名、工作单位、,性别、技术职称等组合。通过系统授权,超级用户还可以对职工档案进行维护。当超级用户需要对档案进行维护时,输入档案维护命令,得到合法性确认后,可以对系统数据库档案信息进行维护,否则将拒绝执行。档案维护操作可以是增加档案、修改档案、删除档案、增加档案字段中的任何一种操作。档案维护成功后要及时更新职工信息数据文件,保存维护结果。职工管理信息系统的顶层图如图12-1所示;职工管理信息系统的第0层DFD图如图12-2所示,其中,加工3的细化图如图12-3所示,加工3.2的细化图如图12-4所示。[数据流图12-1][数据流图12-2][数据流图12-3][数据流图12-4]
问答题[问题3]请根据说明写出“实验室课题信息”数据字典条目的定义。实验室课题信息=_____________________________。图8-4实验室信息管理系统顶层DFD图图8-5实验室信息管理系统0层DFD图
问答题[说明]下面的流程图(如图3所示)用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:[流程图][算法说明]将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数intp(intA[],intlow,inthieh)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数voidsort(intA[],intL,intH)的功能是实现数组A中元素的递增排序。[算法]voidsort(intA[],intL,intH){if(L<H){k=p(A,L,R);//p()返回基准数在数组A中的下标sort({{U}}(4){{/U}});//小于基准敷的元素排序sort({{U}}(5){{/U}});//大于基准数的元素排序}}
问答题
阅读下列说明和图,回答问题1到问题3,将解答填入对应栏内。 [说明]
操作系统中,死锁(Deadlock)是指多个进程在运行的过程中因争夺资源而造成的一种僵局。当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
面对死锁问题有两个解决方案:预防死锁和避免死锁。
预防死锁是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或多个,以此来预防死锁的发生。预防死锁由于较易实现,已被广泛应用,但由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量的降低。
避免死锁同样是属于事先预防的策略,但它无须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
银行家算法(Banker's
algorithm)是Dijkstra于1965年提出的一个经典的避免死锁的算法。形象地描述银行发放贷款不能使有限可用资金匮乏而导致整个银行无法运转的思路,也就是说每次请求贷款,银行要考虑他能否凭着贷款完成项目,并还清贷款使银行运转正常。令Request(i)是进程P(i)请求向量,如果Request(i)[j]=k则进程P(i)希望请韵类资源k个。具体算法步骤如下:
(1)如果Request(i)>Need(i)则出错(请求量超过申报的最大量),否则转到(2);
(2)如果Request(i)>Available则P(i)等待,否则转(3);
(3)系统对P(i)所请求的资源实施试探分配,并更改数据结构中的数值;
(4)Available=Available-Request(i); A1location(i)
=Allocation(i) +Request(i); Need(i)=Need(i)-Request(i);
(5)执行安全性算法,如果是安全的,则承认试分配,否则废除试分配,让进程P(i)继续等待。
所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并且依次运行完成,这种进程序列{P1,P2,…,Pn)就是安全序列。如果存在这样一个安全序列,则系统是安全的;如果系统不存在这样一个安全序列,则系统是不安全的。
问答题{{B}}阅读下列说明,回答问题。{{/B}}
【说明】
现有事务T1,T2、L3它们对数值型数据A执行的操作分别如下:
T1;将A加1。 T2:将A加倍。
T3:输出A的值,并将A置为1。
问答题【说明】某考务处理系统主要功能是考生管理和成绩管理:1.对考生送来的报名表进行检查。2.对合格的报名表编好准考证号码后将准考证送给考生,将汇总后的考生名单送给阅卷站。3.对阅卷站送来的成绩表进行检查,并根据考试中心指定的合格标准审定合格者。4.填写考生通知单(内容包含该考生的准考证号、姓名、各课程成绩及最终合格/不合格标志),送给考生。5.根据考生信息及考试成绩,按地区、年龄、文化程度和职业进行成绩分类统计及试题难度分析,产生统计分析表。考务处理系统的顶层图如图1所示,第0层图如图2所示,加工2子图如图3所示。【数据流图】
问答题[说明]某市人才交流中心为促进当地人力资源的合理配置,加强当地企业与人才的沟通,拟建立人才信息交流网。[需求分析结果]1.每个前来登记的个人需填写《人才入库登记表》,如表2-17所示,并出示相关证件,经工作人员审核后录入个人信息。表2-17人才入库登记表个人编号:_______ 登记日期:___年___月___日姓名性别出生日期照片籍贯身份证号毕业院校专业学历证书名称1.编号2.移动电话家庭电话电子邮件求职意向及薪水职位名称最低薪水备注1.2.个人简历及特长 2.每个前来登记的企业需填写《企业信息登记表》,如表2-18所示,并出示相关证明及复印件,经工作人员核实后录入企业信息。 3.个人和企业的基本信息只需在第一次登记时填写,个人编号和企业编号由系统自动生成。个人和企业的基本信息由计算机长期存储,以后个人只需提供个人编号和求职意向信息,企业只需提供企业编号和岗位需求信息。 4.个人的求职意向信息和企业的岗位需求信息在两个工作日内由工作人员录入数据库并发布。 [概念模型设计] 根据需求阶段收集的信息,设计人才、岗位和企业的实体联系图如图2-24所示(不完整)。 表2-18企业信息登记表企业编号:_______ 登记日期:__年__月__日企业名称地址企业网址联系人联系电话电子邮件岗位需求职位专业学历薪水备注企业简介 [逻辑结构设计]1.将概念模型设计的实体联系图转换为以下关系模式人才(个人编号,姓名,性别,出生日期,身份证号,毕业院校,专业,学历,证书名称,证书编号,联系电话,电子邮件,个人简历及特长)企业(企业编号,企业名称,联系人,联系电话,地址,企业网址,电子邮件,企业简介)求职意向((2))岗位需求((3))2.由于一个人可能持有多个证书,因此对“人才”关系模式进行优化,得到如下两个新的关系模式人才((4))证书((5))根据上述的设计过程,回答以下问题。
问答题【说明】
所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。
应用贪婪法求解该问题。程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择边组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。
函数中使用的预定义符号如下:
#define M 100
typedef struct{/*x为两端点p1、p2之间的距离,p1、p2所组成边的长度*/
float x;
int p1, p2;
}tdr;
typedef struct{/*p1、p2为和端点相联系的两个端点,n为端点的度*/
int n, P1, p2;
}tr;
typedef struct{/*给出两点坐标*/
float x,y;
}tpd;
typedef int tl[M];
int n=10;
【函数】
float distance(tpd a,tpd b);/*计算端点a、b之间的距离*/
void sortArr(tdr a[M], int m);
/*将已经计算好的距离关系表按距离大小从小到大排序形成排序表,m为边的条数*/
int isCircuit(tr[M], int i, int j);
/*判断边(i, j)选入端点关系表r[M]后,是否形成回路,若形成回路返回0*/
void selected(tr r[M], int i, int j);/*边(i,j)选入端点关系表r*/
void course(tr r[M], tl 1[M]);/*从端点关系表r中得出回路轨迹表*/
void exchange(tdr a[M], int m, int b);
/*调整表排序表,b表示是否可调,即是否有边长度相同的边存在*/
void travling(tpd pd[M], int n, float dist, t1 locus[M])
/*dist记录总路程*/
{
tdr dr[M];/*距离关系表*/
tr r[M];;/*端点关系表*/
int i, j, k, h, m;/*h表示选入端点关系表中的边数*/
int b;/*标识是否有长度相等的边*/
k=0;
/*计算距离关系表中各边的长度*/
for(i=1;i<n;i++){
for(j=i+1;j<=n;j++){
k++;
dr[k].x={{U}} (1) {{/U}};
dr[k].p1=i;
dr[k].p2=j;
}
}
m=k;
sortArr(dr,m);/*按距离大小从小到大排序形成排序表*/
do{
b=1;
dist=0;
k=h=0;
do{
k++;
i=dr[k].p1;
j=dr[k].p2;
if((r[i].n<=1)
h++;
dist+=dr[k].x;
}else if({{U}} (4) {{/U}}){
/*最后一边选入r成回路,则该边必须加入且得到解*/
selected(r,i,j);
h++;
dist+=dr[k].x;
}
}
}while((k!=n)
if(h==n){/*最后一边选入构成回路,完成输出结果*/
course(r,locus);
}else{/*找不到解,调整dr,交换表中边长相同的边在表中的顺序,并将b置0*/
{{U}} (5) {{/U}};
}
}while(!b);
}
问答题[说明]
在一公文处理系统中,开发者定义了一个公文结构OfficeDoc,其中定义了公文应该具有的属性。当系统中的文件内容或状态发生变化时,与之相关联的DocExplorer结构的值都需要发生改变。一个OfficeDoc结构能够关联一组DocExplorer结构。当OfficeDoc结构的内容或状态发生变化时,所有与之相关联的DocExplorer结构都将被更新,这种应用被称为观察者模式。以下代码采用C语言实现,能够正确编译通过。
[C程序]
#include<stdio.h>
#define OBS_MAXNUM 20/*一个OfficeDoc变量最多能够关联的DocExplorer结构变量的个数*/
typedef void(______)(struct OfficeDoc*, struct DocExplorer*);
struct DocExplorer {
func update; /*DocExplorer结构采用的更新函数*/
/*其他的结构字段省略*/
};
Struct OfficeDoc {
______ 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 *b) {
/*解除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 [______];
doc→myObs[doc→index-1] = NULL;
doc—÷index-一j
break;
}
}
}
void update1 (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(______);
}
}
void main() {
struct OfficeDoc doc; /*定义一个OfficeDoc变量*/
struct DocExplorer explorer1, explorer2; /*定义两个DocExplorer变量*/
/*初始化与OfficeDoc变量相关的DocExplorer变量个数为0*/
doc. index=0;
explorer1. update = update1; /*设置explorer1 变量的更新函数*/
explorer2. update = update2; /*设置explorer2 变量的更新函数*/
attach ( /*关联explorer1与doc对象*/
attach ( /*关联explorer2与doc对象*/
/*其他代码省略*/
______; /*通知与OfficeDoc相关的所有DocExploer变量*/
return;
}
问答题 阅读以下说明和流程图,回答问题1和问题2,将解答写在对应栏内。
【说明】
存在某鲜花批发系统,系统中处理的信息单元有鲜花和客户,对鲜花使用编号进行唯一标识,鲜花的具体信息包括:名称、颜色、等级。客户包括鲜花种植商,鲜花经销商,客户不使用编号,只需要名称和地址。系统功能如下所述。
(1)当系统统计销存清单时发现某种鲜花当前库存数量少于指定最低库存量时,向鲜花种植商发出采购单,订单中要记录所需鲜花的信息、数量、供应商名称和地址。
(2)收到鲜花种植商的鲜花后,向系统录入归档送货单,要记录交易对应的采购单和实际金额。
(3)当某种鲜花库存数量大于或等于订购数量时,接受鲜花经销商的订货单,并更新销存清单,系统要求订单中标明鲜花的信息和经销商的信息。
(4)鲜花经销商订购的鲜花到达批发环节后,系统生成提货单,包括鲜花信息和经销商信息,然后将提货单发给经销商,等待提货。
(5)系统还要随时可以接受管理人员对于销售和库存的查询,并生成销售与库存情况表,提供给管理人员,包括鲜花信息、本周销售数量、库存数量。
现在假定顶层图是正确的,客户信息文件已经存在并可使用。
问答题【说明】软件设计师东方飞龙利用UML设计了一个迷你小型复数类,其类图如图13-11所示。【代码13-l】/*___________________________________*//*********文件MiniComplex.h*********//*___________________________________*/#include<iostream>usingnamespacestd;classMiniComplex(1)://重载流插入和提取运算符(2)ostreamisObject>>complex.realPart>>ch>>complex.imagPart>>ch;returnisObject;MiniComplex(doublereal=0,doubleimag=0);//构造函数MiniComplexoperator+(constMiniComplex/*_______________________________________________________*//*********文件MiniComplex.cpp**********//*_______________________________________________________*/#include"MiniComplex.h"boolMiniComplex::operator==(constMiniComplexMiniComplex::MiniComplex(doublereal,doubleimag)realPart=real;imagPart=imag!MiniComplexMiniComplex::operator+(constMiniComplextemp.realPart=realPart+otherComplex.realPart;temp.imagPart=imagPart+otherComplex.imagPart;returntemp;MiniComplexMiniComplex::operator--(constMiniComplextemp.realPart=realPart-otherComplex.realPart;temp.imagPart=imagPart-otherCompler.imagPart;returntemp;MiniComplexMiniComplex::operator*(constMiniComplextempimagPart=(realPart*otherComplex.imagPart)+(imag-Part*otherComplex.realPart);returntemp,MiniComplexMiniComplex::operator/(constMiniComplexfloattt;tt=1/(otherComplex.realPart*otherComplex.realPart+otherComplex.imagPart*otherComplex.imagPart);temp.realPart=((realPart*otherComplex.realPart)+(imagPart*otherComplex.imagPart))*tt;temp.imagPart=((imagPart*otherComplex.realPart)-(realPart*otherComplex.imagPart))*tt;returntemp;/*__________________________________________________*//********主函数所在文件main.cpp********//*_________________________________________________*/#include<iostream>#include"(5)"usingnamespacestd;intmain(void)MiniComplexnum1(23,34),num2;cin>>num2;cout<<"InitialValueofNuml="<<num1<<"/nInitialValueofNum2="<<num2<<end1;cout<<num1<<"+"<<num2<<"="<<num1+num2<<end1;//使用重载的加号运算符cout<<num1<<"-"<<num2<<"="<<num1-num2<<end1;//使用重载的减号运算符cout<<num1<<"*"<<num2<<"-"<<num1*num2<<end1;//使用重载的乘号运算符cout<<num1<<"/"<<num2<<"="<<num1/num2<<end1;//使用重载的除号运算符return0;
