某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表17—2所示。现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图17—5所示的类图。[Java代码]importjava.util.*;(1)classBeverage(//饮料Stringdescription=“UnknownBeverage”;public(2)()(returndescription;)public(3);}abstractclassCondimentDecoratorextendsBeverage{//配料(4);}classEspressoextendsBeverage(//蒸馏咖啡privatefinalintESPRESSO—PRICE=25;pubiicEspresso()(description=”Espresso”;*}publicintcost()(returnESPRESSO—PRICE;)}classDarkRoastextendsBeverage(//深度烘焙咖啡privatefinalintDARKROAST—PRICE=20;publicDarkRoast()(description=“DarkRoast”;}publicintcost()(rcturnDARKROASTPRICE;}}classMochaextendsCondimentDecorator{//摩卡privatefinalintMOCHA_PRICE=10;publicMocha(Beveragebeverage){this.beverage=beverage;}publicStringgetDescription(){returnbeverage.getDescription0+“,Mocha”;}publicintcost(){returnMOCHA—PRICE+beverage.cost();}}classWhil3extendscondimentDecorator(//奶泡privatefinalintWHIP_PRICE=8;publicWhip(Beveragebeverage)(this.beverage=beverage;)publiCStringgetDescrip七ion()(returnbeverage.getDescrip七ion()+”,Whip”;}publicintcost()(returnWHIP—PRICE+beverage.cost();}}publicClasSCoffee{publicstaticvoidmain(Stringargs[]){Beveragebeverage=newDarkRoast();beverage=newMocha((5));beverage=newWhip((6));System.out.printin(beverage.getDescrip七ion()+。“¥”+beverage.cost());}}编译运行上述程序,其输出结果为:DarkRoast,Mocha,Whip¥38
阅读下列说明和Java代码,将应填入__________(n)处的字句写在答题纸的对应栏内。【说明】某大型购物中心欲开发一套收银软件,要求其能够支持购物中心在不同时期推出的各种促销活动,如打折、返利(例如,满300返100)等。现采用策略(Strategy)模式实现该要求,得到如图6-1所示的类图。[Java、代码]importjava.util.*;enumTYPE{NORMAL,CASHDISCOUNT,CASHRETURN);interfaceCashSuper{public___________(1);}classCashNormalimplementsCashSuper{//正常收费子类publicdoubleacceptCash(doublemoney){returnmoney;}}classCashDiscountimplementsCashSuper{privatedoublemoneyDiscount;//折扣率publicCashDiscount(doublemoneyDiscount){this.moneyDiscount=moneyDiscount;}publicdoubleacceptCash(doublemoney){returnmoney*moneyDiscount;}}classCashReturnimplementsCashSuper{//满额返利privatedoublemoneyCondition;privatedoublemoneyReturn;publicCashReturn(doublemoneyCondition,doublemoneyReturn){this.moneycondition=moneyCondition;//满额数额this.moneyReturn=moneyReturn;//返利数额}publicdoubleacceptCash(doublemoney){doubleresult=money;if(money>=moneyCondition)result=money-Math.floor(money/moneyCondition)*moneyReturn;returnresult;}}ClassCashContext{privateCashSupercs;privateTYPEt;publicCashContext(TYPEt){switch(t){caseNORMAL://”正常收费”___________(2);break;caseCASHDISCOUNT://"打8折"___________(3);break;caseCASHRETURN://"满300返100"____________(4);break;}}publicdoubleGetResult(doublemoney){___________(5);}//此处略去main()函数}
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表17—3所示。为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图17—11所示。图17—11中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与L0ngDistanceTakeoff分别描述垂直起飞与长距离起飞的行为。[Java代码]interfaceFlyBehavior(publiCVOidfly();};classSubSonicFlyimplementsFlyBehaVior(publicvoidfly()(System.out.printin(“亚音速飞行!”);)};ClassSuperSonicFlyimplementsFlyBehaVior(publicvoidfly()(System.out.println(”超音速飞行!”);)};interfaceTakeOffBehavior{publicvoidtakeOff();};ClassVerticalTakeOffimplementsTakeOffBehavior(publicvoidtakeOff()(System.out.println(“垂直起飞!”);)};ClassLongDistanceTakeOffimplementsTakeOffBehavior{publicvoidtakeOff()
阅读下列说明C++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如表16.3所示。现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图16—5所示的类图。【C++代码】#include{}includeUSingnamespacestd;constintESPRESSO_PRICE=25;constintDRAKROAST_PRICE=20;constintMOCHA—PRICE=10;constintWHIP_PRICE=8;classBeverage(//饮料(1):stringdescription;public:(2)()(returndescription;)(23);};classCondimentDecorator:publicBeverage(//配料protected:(4);};classEspresso:publicBeverage(//蒸馏咖啡public:EspresSO(){description:”Espresso”;}intcost()(returnESPRESSO_PRICE;}};classDarkRoast:publicBeverage(//深度烘焙咖啡public:DarkRoast()(description=”DardRoast”;)intcost()(returnDRAKROAST_PRICE;));classMocha:publicCondimentDecorator{//摩卡public:Mocha(Beverage‘beverage)(thiS一>beverage=beverage;)stringgetDescription()(returnbeverage一>getDescription()+”,Mocha”;)intcost()(returnMOCH@A@-pRICE+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((15));beVerage=newWhip((6));coutgetDescription()
阅读下列说明C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】用两台处理机A和B处理n个作业。设A和B处理第i个作业的时间分别为ai和bi。由于各个作业的特点和机器性能的关系,对某些作业,在A上处理时间长,而对某些作业在B上处理时间长。一台处理机在某个时刻只能处理一个作业,而且作业处理是不可中断的,每个作业只能被处理一次。现要找出一个最优调度方案,使得n个作业被这两台处理机处理完毕的时间(所有作业被处理的时间之和)最少。算法步骤:(1)确定候选解上界为最短的单台处理机处理所有作业的完成时间m,(2)用p(x,y,k)=1表示前k个作业可以在A用时不超过x且在B用时不超过y时间内处理完成,则p(x,y,k)=p(x—ak,Y,k一1)∥p(x,y.bk,k一1)(11表示逻辑或操作)。(3)得到最短处理时间为min(max(x,y))。【C代码】下面是该算法的C语言实现。(1)常量和变量说明n:作业数m:候选解上界a:数组,长度为n,记录n个作业在A上的处理时间,下标从0开始b:数组,长度为n,记录n个作业在B上的处理时间,下标从0开始k:循环变量p:三维数组,长度为(m+1)*(m+1)*(n+1)temp:临时变量max:最短处理时间(2)C代码#includeintn,m;inta[60],b[60],P[100][100][60];voidread()(/*输入rl、a、b,求出m,代码略*/)voidschedule()(/(求解过程*/intX,Y,k;for(x=0;xfor(y=0;y=0)(2);if((3))p[x][y][k]=(pIx][y][k]lIP[X][y—b[k一1\]\][k一1]);}}}}voidwrite(){/*确定最优解并输出*/intXY,temp,max:m;for(x=0;xfor(y=0;yif((4)){temp=(5);if(temp
阅读下列说明、流程图和算法,将应填(n)处的字句写在对应栏内。[说明]下面的流程图(如图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((4));//小于基准敷的元素排序sort((5));//大于基准数的元素排序}}
某高校欲开发一个成绩管理系统。记录并管理所有选修课程的学生的平时成绩和考试成绩,其主要功能描述如下。(1)每门课程都由3~6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门课程的平时成绩。课程结束后进行期末考试,其成绩作为这门课程的考试成绩。(2)学生的平时成绩和考试成绩均由每门课程的主讲教师上传给成绩管理系统。(3)在记录学生成绩之前,系统需要验证这些成绩是否有效。首先,根据学生信息文件来确认该学生是否选修这门课程,若没有,那么这些成绩是无效的;如果他的确选修了这门课程,再根据课程信息文件和课程单元信息文件来验证平时成绩是否与这门课程所包含的单元相对应,如果是,那么这些成绩是有效的,否则无效。(4)对于有效成绩,系统将其保存在课程成绩文件中。对于无效成绩,系统会单独将其保存在无效成绩文件中,并将详细情况提交给教务处。在教务处没有给出具体处理意见之前,系统不会处理这些成绩。(5)若一门课程的所有有效的平时成绩和考试成绩都已经被系统记录,系统会发送课程完成通知给教务处,告知该门课程的成绩已经齐全。教务处根据需要,请求系统生成相应的成绩列表,用来提交考试委员会审查。(6)在生成成绩列表之前,系统会生成一份成绩报告给主讲教师,以便核对是否存在错误。主讲教师须将核对之后的成绩报告退还系统。(7)根据主讲教师核对后的成绩报告,系统生成相应的成绩列表,递交考试委员会进行审查。考试委员会在审查之后,上交一份成绩审查结果给系统。对于所有通过审查的成绩,系统将会生成最终的成绩单,并通知每个选课学生。现采用结构化方法对这个系统进行分析与设计,得到如图12-10所示的顶层数据流图和图12-11所示的0层数据流图。
阅读以下说明,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】某公司拟开发一套小区物业收费管理系统。初步的需求分析结果如下:(1)业主信息主要包括:业主编号,姓名,房号,房屋面积,工作单位,联系电话等。房号可唯一标识一条业主信息,且一个房号仅对应一套房屋;一个业主可以有一套或多套的房屋。(2)部门信息主要包括:部门号,部门名称,部门负责人,部门电话等;一个员工只能属于一个部门,一个部门只有一位负责人。(3)员工信息主要包括:员工号,姓名,出生年月,性别,住址,联系电话,所在部门号,职务和密码等。根据职务不同员工可以有不同的权限,职务为“经理”的员工具有更改(添加、删除和修改)员工表中本部门员工信息的操作权限;职务为“收费”的员工只具有收费的操作权限。(4)收费信息包括:房号,业主编号,收费日期,收费类型,数量,收费金额,员工号等。收费类型包括物业费、卫生费、水费和电费,并按月收取,收费标准如表14—4所示。其中:物业费=房屋面积(平方米)×每平米单价,卫生费=套房数量(套)×每套庆单价,水费=用水数量(吨)×每吨水单价,电费=用电数量(度)×每度电单价。(5)收费完毕应为业主生成收费单,收费单示例如表14.5所示。【概念模型设计】根据需求阶段收集的信息,设计的实体联系图(不完整)如图14.17所示。图14.17中收费员和经理是员工的子实体。【逻辑结构设计】根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整);业主((1),姓名,房屋面积,工作单位,联系电话)员工((2),姓名,出生年月,性别,住址,联系电话,职务,密码)部门((3),部门名称,部门电话)权限(职务,操作权限)收费标准((4))收费信息(5),收费类型,收费金额,员工号)
根据以上C代码,分析该排序算法是否稳定。若稳定,请简要说明(不超过100字);若不稳定,请修改其中代码使其稳定(给出要修改的行号和修改后的代码)。
阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】某出版社拟开发一个在线销售各种学术出版物的网上商店(ACShop),其主要的功能需求描述如下:(1)ACShop在线销售的学术出版物包括论文、学术报告或讲座资料等。(2)ACShop的客户分:为两种:未注册客户和注册客户。(3)未注册客户可以浏览或检索出版物,将出版物添加到购物车中。未注册客户进行注册操作之后,成为ACShop注册客户。(4)注册客户登录之后,可将待购买的出版物添加到购物车中,并进行结账操作。结账操作的具体流程描述如下:①从预先填写的地址列表中选择一个作为本次交易的收货地址。如果没有地址信息,可以添加新地址信息。②选择付款方式。ACShop支持信用卡付款或银行转账两种方式。注册客户可以从预先填写的信用卡或银行账号中选择一个付款,若没有付款方式信息,则可以添加新付款方式。③确认提交购物车中待购买的出版物,ACShop会自动生成与之相对应的订单。(5)管理员负责维护在线销售的出版物目录,包括添加新出版物或者更新在售出版物信息等操作。现采用面向对象方法分析并设计该网上商店ACShop,得到如图3-1所示的用例图和图3-2所示的类图。
阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】Pay&Drive系统(开多少付多少)能够根据驾驶里程自动计算应付的费用。系统中存储了特定区域道路交通网的信息。道路交通网由若干个路段(RoadSegment)构成,每个路段由两个地理位置坐标点(.Node)标定,其里程数(Distance)是己知的。在某些地理坐标点上安装了访问控制(AccessControl)设备,可以自动扫描行驶卡(Card)。行程(Trajectory)由一组连续的路段构成。行程的起点(Entry)和终点(Exit)都装有访问控制设备。系统提供了3种行驶卡。常规卡(RegularCard)有效期(ValidPeriod)为一年,可以在整个道路交通网内使用。季卡(SeasonCard)有效期为三个月,可以在整个道路交通网内使用。单次卡(MinitripCard)在指定的行程内使用,且只能使用一次。其中,季卡和单次卡都足预付卡(PrepaidCard),需要客户(Customer。)预存一定的费用。系统的主要功能有:客户注册、申请行驶卡、使用行驶卡行驶等。使用常规卡行驶,在进入行程起点时,系统记录行程起点、进入时间(DateofEntry)等信息。在到达行程终点时,系统根据行驶的里程数和所持卡的里程单价(UnitPrice)计算应付费用,并打印费用单(Invoice)。季卡的使用流程与常规卡类似,但是不需要打印费用单,系统自动从卡中扣除应付费用。单次卡的使用流程与季卡类似,但还需要存行程的起点和终点上检查行驶路线是否符合该卡所规定的行驶路线。现采用面向对象方法开发该系统,使用LIML进行建模。构建出的用例图和类图分别如图13—9和图13一10所示。
某基于微处理器的住宅系统,使用传感器(如红外探头、摄像头等)来检测各种意外情况,如非法进入、火警、水灾等。房主可以在安装该系统时配置安全监控设备(如传感器、显示器、报警器等),也可以在系统运行时修改配置,通过录像机和电视机监控与系统连接的所有传感器,并通过控制面板上的键盘与系统进行信息交互。在安装过程中,系统给每个传感器赋予一个编号(即ID)和类型,并设置房主密码以启动和关闭系统,设置传感器事件发生时应自动拨出的电话号码。当系统检测到一个传感器事件时,就激活警报,拨出预置的电话号码,并报告关于位置和检测到的事件的性质等信息。住宅安全系统顶层数据流图和第0层数据流图如图12-3和图1-4所示。
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某大型商场内安装了多个简易的纸巾售卖机,自动售出2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图17—7所示。采用状态(State)模式来实现该纸巾售卖机,得到如图17-8所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState31HasQuarterState分别对应图17—7中纸巾售卖机的4中状态:售出纸巾、纸巾售完、没有投币、有2元钱。[Java代码]ImportJava.util.*interfaceState{PublicvoidinsertQuarter();//投币publicvoidejectQuarter();//退币DublicvoidturnCrank();//按下“出纸巾”按钮publicvoiddispense();//出纸巾}ClasSTiSsueMachine{(1)soldOutState,noQuarterState,hasQuarterSta七e,soldState,state;State=s01dOutState;intcount:0;//纸巾数DublicTissueMachine(intnumber)(/*实现代码省略*/)publicStategetHasQuarterState()(returnhasQuarterState;)publicStategetNoQuarterState()(returnnoQuarterState;)publicStategetSoldState()(returnsoldState;)publicStategetSoldoutState()(returnsoldOutState;)intgetCount(returncount;)//其余代码省略};ClassNoQuarterStateimplementState{TiSsueMachinetiSsueMachine;publicvoidinsertQuarter(){tissureMachine.setState((2));}//构造方法以及其余代码省略}ClassHasQuarterStateimplementState{TissueMachinetissueMachine;publiCvoidejectQuarter(){tiSsureMachine.setState((3));}//构造方法以及其余代码省略}ClasSSoldStateimplementState(TissueMachinetiSsueMachine:publicvoiddispense()(if(tiSsueMachine.getCount()>0){tiSsureMachine.setState((4));}e1Se{tissureMachine.setState((5));}}
阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】某电视台拟开发一套信息管理系统,以方便对全台的员工、栏目、广告和演播厅等进行管理。【需求分析】(1)系统需要维护全台员工的详细信息、栏目信息、广告信息和演播厅信息等。员工的信息主要包括:工号、姓名、性别、出生日期、电话、住址等。栏目信息主要包括:栏目名称、播出时间、时长等。广告信息主要包括:广告编号、价格等。演播厅信息包括:房间号、房间面积等。(2)电视台分局调度单来协调各档栏目、演播厅和场务。一销售档栏目只会占用一个演播厅,但会使用多名场务来进行演出协调。演播厅和场务可以被多个栏日循环使用。(3)电视台根据栏目来插播广告。每档栏目可以插播多条广告,每条广告也可以在多档栏目插播。(4)一档栏目可以有多个主持人,但一名主持人只能主持。一档栏目。(5)一名编辑人员可以编辑多条广告,一条广告只能由…一名编辑人员编辑。【概念模型设计】根据需求阶段收集的信息设计的实体联系图(不完整)如图14一1所示。【逻辑结构设计】根据概念模型设计阶段完成的实体联系图,得出如下关系模式(不完整):演播厅(房间号,房间面积)栏目(栏目名称,播出时间,时长)广告(广告编号,销售价格,(1))员工(工号,姓名,性别,出生日期,电话,住址)主持人(主持人工号,(2))插播单((3),播出时间)调度单((4))
阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】某慕课教育平台欲添加在线作业批改系统,以实现高效的作业提交与批改,并进行统计。学生和讲师的基本信息已经初始化为数据库中的学生表和讲师表。系统的主要功能如下。(1)提交作业。验证学生标识后,学生将电子作业通过在线方式提交,并进行存储。系统给学生发送通知表明提交成功,通知中包含唯一编号;并通知讲师有作业提交。(2)下载未批改作业。验证讲师标识后,讲师从系统中下载学生提交的作业。下载的作业将显示在屏幕上。(3)批改作业。讲师按格式为每个题目进行批改打分,并进行整体评价。(4)上传批改后的作业。将批改后的作业(包括分数和评价)返回给系统,进行存储。(5)记录分数和评价。将批改后的作业的分数和评价记录在学生信息中,并通知学生作业已批改。(6)获取已批改作业。根据学生标识,给学生查看批改后的作业,包括提交的作业、分数和评价。(7)作业抽检。根据教务人员标识抽取批改后的作业样本,给出抽检意见,然后形成抽检报告给讲师。现采用结构化方法对在线作业批改系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。
阅读下列说明SDC++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某大型商场内安装了多个简易的纸巾售卖机,自动售出2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图16.6所示。采用状态(State)模式来实现该纸巾售卖机,得到如图16—7所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别对应图16—4中纸巾售卖机的4中状态:售出纸巾、纸巾售完、没有投币、有2元钱。【C++代码】#includeUSingnamespaceStd;//以下为类的定义部分ClassTissueMachine;//类的提前引用C1assState{publiC:virtualvoidinsertQuar七er()=0;//投币virtualvoidejectQuarter()=0;//退币virtualvoidturnCrank()=0;//按下“出纸巾”按钮virtualvoiddispense()=0;//出纸巾);/*类SoldOutState、NoQuarterState、HasQuarterState、SoldState的定义省略,每个类中均定义了私有数据成员TissueMachine*tissueMachine*/ClasSTiSsueMachine(private:1*soldOutState,*noQuarterState,*hasQuartersta七e,*soldState,*state;intcount;//纸巾数public:TiSsueMachine(intnumber);voidsetState(State*state);State*getHasQuarterState();State*getNoQuarterState();State*getSoidState();State*getS01dOurState();intgetCount();//其余代码省略};//以下为类的实现部分voidNoQuarterState::inserQuarter()(tissureMachine->setState(2);}voidHasQuarterstate::ejectQuarter(){tissureMachine->setState(3);}voidSoldState::dispense()(if(tiSsueMachine一>getCount()>0)(tissureMachine->setState(4);}e1Se{tissureMachine->setState(5);}}//其余代码省略
阅读下列说明,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】某物流公司为了整合上游供应商与下游客户,缩短物流过程,降低产品库存,需要构建一个信息系统以方便管理其业务运作活动。【需求分析结果】(1)物流公司包含若干部门,部门信息包括部门号、部门名称、经理、电话和邮箱。一个部门可以有多名员工处理部门的日常事务,每名员工只能在一个部门工作。每个部门有一名经理,只需负责管理本部门的事务和人员。(2)员工信息包括员工号、姓名、职位、电话号码和工资;其中,职位包括:经理、业务员等。业务员根据托运申请负责安排承运货物事宜,例如:装货时间、到达时间等。一个业务员可以安排多个托运申请,但一个托运申请只由一个业务员处理。(3)客户信息包括客户号、单位名称、通信地址、所属省份、联系人、联系电话、银行账号,其中,客户号唯一标识客户信息的每一个元组。每当客户要进行货物托运时,先要提出货物托运申请。托运申请信息包括申请号、客户号、货物名称、数量、运费、出发地、目的地。其中,一个申请号对应唯一的一个托运申请;一个客户可以有多个货物托运申请,但一个托运申请对应唯一的一个客户号。【概念模型设计】根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如图13-5所示。【关系模式设计】部门(部门号,部门名称,经理,电话,邮箱)员工(员工号,姓名,职位,电话号码,工资,(a))客户((b),单位名称,通信地址,所属省份,联系人,联系电话,银行账号)托运申请((c),货物名称,数量,运费,出发地,目的地)安排承运,((d),装货时间,到达时间,业务员)
阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。【说明】某运输公司决定为新的售票机开发车票销售的控制软件。图13-15给出了售票机的面板示意图以及相关的控制部件。售票机相关部件的作用如下所述:(1)目的地键盘用来输入行程目的地的代码(例如,200表示总站)。(2)乘客可以通过车票键盘选择车票种类(单程票、多次往返票和座席种类)。(3)继续/取消键盘上的取消按钮用于取消购票过程,继续按钮允许乘客连续购买多张票。(4)显示屏显示所有的系统输出和用户提示信息。(5)插卡口接受MCard(现金卡),硬币口和纸币槽接受现金。(6)打印机用于输出车票。假设乘客总是支付恰好需要的金额而无需找零,售票机的维护工作(取回现金、放入空白车票等)由服务技术人员完成。系统采用面向对象方法开发,使用UML进行建模。系统的顶层用例图和类图分别如图13—16和图13—17所示。
阅读下列说明和C语言代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
设某一机器由n个部件组成,每一个部件都可以从m个不同的供应商处购得。供应商j供应的部件i具有重量W
ij
和价格C
ij
设计一个算法,求解总价格不超过上限cc的最小重量的机器组成。采用回溯法来求解该问题:首先定义解空间。解空间由长度为n的向量组成,其中每个分量取值来自集合{1,2,…,m},将解空间用树形结构表示。接着从根节点开始,以深度优先的方式搜索整个解空间。从根节点开始,根节点成为活节点,同时也成为当前的扩展节点。向纵深方向考虑第一个部件从第一个供应商处购买,得到一个新节点。判断当前的机器价格(C
11
)是否超过上限(cc),重量(W
11
)是否比当前已知的解(最小重量)大,若是,应回溯至最近的一个活节点;若否,则该新节点成为活节点,同时也成为当前的扩展节点,根节点不再是扩展节点。继续
向纵深方向考虑第二个部件从第一个供应商处购买,得到一个新节点。同样判断当前的机器价格(C
11
+C
21
)是否超过上限(cc),重量(W
11
+W
21
)是否比当前已知的解(最小重量)大。若是,应回溯至最近的一个活节点;若否,则该新节点成为活节点,同时也成为当前的扩展节点,原来的节点不再是扩展节点。以这种方式递归地在解空间中搜索,直到找到所要求的解或者解空间中已无活节点为止。
【C语言代码】
下面是该算法的C语言实现。
(1)变量说明
n:机器的部件数
m:供应商数
cc:价格上限
w[][]:二维数组,w[i][j]表示第j个供应商供应的第i个部件的重量
c[][]:二维数组,c[i][j]表示j个供应商供应的第i个部件的价格
bestlW:满足价格上限约束条件的最小机器重量
bestC:最小重量机器的价格
bestX[]:最优解,一维数组,bestX[i]表示第i个部件来自哪个供应商
CW:搜索过程中机器的重量
cp:搜索过程中机器的价格
x[]:搜索过程中产生的解,x[i]表示第i个部件来自哪个供应商
i:当前考虑的部件,从0到n—1
j:循环变量
(2)函数backtrack
intn=3;
intm=3;
int CC=4;
intw[3][3]={(1,2,3),(3,2,1),(2,2,2}};
intc[3][3]={(1,2,3),(3,2,1),(2,2,2}};
int bestW=8;
int bestC=0;
int bestX[3]=(0,0,0);
int CW=0;
int cp=0;
int x[3]=(0,0,0);
int backtrack(int i){
int j=0;
int found=0;
if(i>n一1){/*得到问题解*/
beStW=cw:
bestC=cp;
for(j=0;j
阅读以下说明和图,根据要求回答问题1~问题3。【说明】某航空公司会员积分系统(CFrequentFlyer)的主要功能描述如下:乘客只要办理该航空公司的会员卡,即可成为普卡会员(CBasic)。随着飞行里程数的积累,可以从普卡会员升级到银卡会员(CSilver)或金卡会员(CGold)。非会员(CNonMember)不能累积里程数。每年年末,系统根据会员在本年度累积的里程数对下一年会员等级进行调整。普卡会员在一年内累积的里程数若满25,000英里但不足50,000英里,则自动升级为银卡会员;若累积的里程数在50,000英里以上,则自动升级为金卡会员。银卡会员在一年内累积的里程数若在50,000英里以上,则自动升级为金卡会员。若一年内没有达到对应级别要求的里程数,则自动降低会员等级。金卡会员一年内累积的里程数若不足25,000英里,则自动降级为普卡会员;若累积的里程数达到25,000英里,但是不足50,000英里,则自动降级为银卡会员。银卡会员一年内累积的里程数若不足25,000英里,则自动降级为普卡会员。采用面向对象方法对会员积分系统进行分析与设计,得到如图13—3所示的状态图和图13—4所示的类图。
