问答题[说明]在某些系统中,存在非常复杂的对象,可以采用循序渐进的方式进行组合将小对象组合,成复杂的对象。以下实例展示了Builder(生成器)模式。该实例用来建立“文件”,文件内容包括:一个标题、一串字符以及一些有项目符号的项目。Builder类规定组成文件的方法,Director类利用这个方法产生一份具体的文件。图6-1显示了各个类间的关系。以下是Java语言实现,能够正确编译通过。[Java代码]//Builder.java文件public(1)classBuilderpublicabstractvoidmakeTitle(Stringtitle);publicabstractvoidmakeString(Stringstr);publicabstractvoidmakeItems(String[]items);publicabstractObjectgetResult();//Director.java文件publicclassDirectorprivate(2)builder;publicDirector(Builderbuilder)this.builder=builder;publicObjectconstruct()builder.makeTitle("Greeting");builder.makeString("从早上到白天结束");builder.makeItems(newString[]"早安","午安",);builder.makeString("到了晚上");builder.makeItems(newString[]("晚安","好梦",);returnbuilder.getResult();//TextBuilder.java文件publicclassTextBuilder(3)BuilderprivateStringBufferbuffer=newStringBuffer();publicvoidmakeTitle(Stringtitle)buffer.append("『"+title+"』"/n/n");publicvoidmakeString(Stringstr)buffer.append('■'+str+"/n/n");publicvoidmakeItems(String[]items)for(inti=0;i(4);i++)buffer.append('·'+items[i]+"/n");buffer.append("/n");publicObjectgetResult()returnbuffer.toString();//Main.java文件publicclassMainpublicstaticvoidmain(String[]args)Directordirector=newDirector(newTextBuilder());Stringresult=(String)director.(5);System.out.println(result);
问答题[说明] 以下程序实现了在applet里移动图形文件,仔细阅读代码和相关注释,将程序补充完整。 [代码6-1] import j ava. awt. *; import j ava.awt.event.*; import java.applet. Applet; public class AppCIU extends Applet implements MouseMotionListener, MouseListener Image img; // 声明 Image 类类型的变量 img int x=70,y=60,posX=70,posY=60,dx,dy; public void init ( ) img=getImage ( getCodeBase ( ) ,"mouse.gif" ); //载入影像 addMouseListener ( this ); addMouseMotionListener ( this ); public void mousePressed ( MouseEvent e ) dx=e.getX()-posX; //取得按下之点与基准点X方向的距离 dy=e.getY()-posY; //取得按下之点与基准点Y方向的距离 public void mouseDragged ( MouseEvent e ) (1) (2) if ( dx>0 (3) public void paint ( Graphics g ) (4) (5) (6) public void mouseMoved ( MouseEvent e ) ; public void mouseReleased ( MouseEvent e ) ; public void mouseEntered ( MouseEvent e ) ; public void mouseExited ( MouseEvent e ) ; public void mouseClicked ( MouseEvent e ) ;
问答题[问题4]
请从下面关于摘要函数的说法中选出所有正确的描述。
[a]很容易使不同的输入数据生成相同的输出数据。
[b]根据输入数据获取输出数据的时间非常短。
[c]根据输入数据获取输出数据的时间非常长。
[d]输出数据的长度比输入数据的长度要长。
[e]根据输出数据无法还原出输入数据。
问答题阅读下列程序说明,将应填入{{U}} (n) {{/U}}处的字句写在答卷纸的对应栏内。
【程序说明】
对于一个公司的雇员来说,无非有3种:普通雇员、管理人员和主管。这些雇员有共同的数据:名字、每小时的工资,也有一些共同的操作:数据成员初始化、读雇员的数据成员及计算雇员的工资。但是,他们也有不同。例如,管理人员除有这些共同的特征外,有可能付固定薪水,主管除有管理人员的共同特征外,还有其他物质奖励等。3种雇员中,管理人员可以看作普通雇员的一种,而主管又可以看作管理人员的一种。我们很容易想到使用类继承来实现这个问题:普通雇员作为基类,管理人员类从普通雇员类中派生,而主管人员类又从管理人员类中派生。
下面的程序1完成上述各个类的定义,并建立了3个雇员(一个普通雇员、一个管理人员和一个主管)的档案,并打印出各自的工资表。将“程序1”中的成员函数定义为内联函数,pay成员函数定义为虚函数,重新完成上述要求。
【程序1】
//普通雇员类
class Employee
{
public:
Employee(char *theName, float thePayRate);
char *getName0 const;
float getPayRate0 const;
float pay,(float hours Worked) eonst;
protected:
ehar *name; //雇员名称
float payRate; //薪水等级
};
Employee::Employee(char *theName, float thePa~Rate)
{
name = the Name;
payRate = the PayRate;
}
char *Employee::getName0 eonst
return name;
float Employee::getPayRate0 const
return payRate;
float Employee::pay(float hoursWorked) const
return hours Worked * payRate;
class Manager: public Employee
{
public:
//is Salaried 付薪文方式:true 付薪固定工资,false 按小时付薪
Manager(char *the Name, float the Pay Rate, bool is Salaried);
bool getSalaried0 const;
float pay(float hoursWorked) const;
protected:
bool salaried;
};
Manager::Manager(ehar *theName,fioat thePayRate,bool isSalaried)
: Employee(theName, thePayRate)
{
salaried = isSalaried;
bool Manager::getSalaried0 eonst
{
return salaried;
}
float Manager::pay(float hoursWorked) eonst
{
if (salaried)
return payRate;
/* else */
return Employee::pay(hoursWorked);
}
//主管人员类
class Supervisor: public Employee
{
public:
Supervisor(char *theName, float thePayRate, float theBouns):
Employee (theName, thePayRate,{{U}} (1) {{/U}}.) ,bouns(theBouns) { }
float getBouns0 const { return bouns; }
float pay(float hoursWorked) const
return{{U}} (2) {{/U}};
}
protected:
float houris;
}
#include "iostream.h"
void main()
{
Employee e("Jack",50.00);
Manager m("Tom",8000.00,tme);
Supervior sCTanya",8000.00,8000.00);
cout<<"Name:"<<e.getName0<<endl;
cout <<"Pay: "<<e.pay(80)<<endl; //设每月工作80小时
cout <<"Name: "<<m.getName0<<endl;
cout <<"Pay: "<<m.pay(40)<<endl;
cout <<"Name: "<<s.getName0<<endl;
cout <<"Pay: "<<s.pay(40)<<endl; //参数40在这里不起作用
}
#include "employee.h"
class Employee
{
public:
Employee(string theName, float thePayRate):
name(theName),payRate(thePayRate) { }
string getName0 const {return name; }
float getPayRate0 const { return payRate; }
virtual float pay(float hoursWorked) const { return{{U}} (3) {{/U}}; }
protected:,
string name; //雇员名
Boat payRate; //薪水等级
};
//管理人员类
//继承普通雇员类
class Manager: public Employee
{
public:
//构造函数
//isSalaried标识管理人员类的付薪方式
//true 按阶段付薪(固定工资)
//false 按小时付薪
Manager(string theName, float thePayRate, bool isSalaried):
Employee(theName,thePayRate),salaried(isSalaried) { }
bool getSalaried0 const { return salaried; }
virtual float pay(float{{U}} (4) {{/U}}) const;
protected:
bool salaried;
};
float Manager ::pay(float hoursWorked) const
{
if (salaried) //固定付薪方式
return payRate;
else //按小时付薪
return{{U}} (5) {{/U}};
}
//主管人员类
class Supervisor:{{U}} (6) {{/U}}
{
public:
//构造函数
Supervisor (string theName, float thePayRate, float theBouns) :
Manager(theName, thePayRate, true), bouns(theBouns) { }
//取奖金数额
float getBouns0 const { return bouns; }
//计算薪水
virtual float pay(float hours Worked) const
{
{{U}} (7) {{/U}}
float bouns;
#include "employee.h"
#nclude "iostream.h"
void main()
{
{{U}} (8) {{/U}}*ep[3];
ep[0]=new Employee("Jack" ,"50.00");
ep[1]=new Manager("Tom", "8000.00",true);
ep[2]=new Supervior("Tanya","8000.00","8000.00");
for (int i=0;i<3;i++) {
Cout<<"Name: "<<{{U}} (9) {{/U}}<<endl;
Cout<<"Pay: "<<{{U}} (10) {{/U}}<<endl; //设每月工作80小时
}
}
问答题
阅读下列说明和图,回答问题1至问题3。 [说明]
某大型旅店为了便于管理,欲开发一个客房管理系统。希望实现客房预定、入住登记、帐务结算、退房,以及将服务项目记入客人帐单。
旅客包括散客和团体,散客预定或入住时需要提供姓名、性别、身份证和联系电话,团体则提供团体名称、负责人的姓名、性别、身份证和联系电话,以及团体人数。对于散客,还要提供换房。
旅店还提供了很多服务项目,比如早餐。对每一个入住客人,服务列表记录了住宿期间的各项服务,包括服务类型、日期、数量等。当然,客人也可以不要任何服务。
旅店的客房有一个唯一的房间号,分为不同的类别,不同的房间床位数和价格不同。
为了有效的管理,需要记录每天的客房状态。客房的状态有:空闲、占用、已预定和维修。 ·
客人入住后,客房处于占用状态; · 客人退房后,客房处于空闲状态; ·
客人预定后,客房处于已预定状态; · 预定客人入住后,客房处于占用状态; ·
预定客人取消预定后客房处于空闲状态; · 需要维修时客房处于维修状态; ·
维修完成后客房处于空闲状态。
该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图3-1是该系统的类图的一部分,图3-2描述了客房状态的转变情况。
[图3-1] [图3-2]
问答题【说明】某网络故障诊断系统使用故障代理(agent、SNMPTrap等)来检测各种意外情况,如大幅丢包、路由冲突、广播风暴等。网络管理员可以在安装该系统时配置安全监控程序(如故障代理程序、实时诊断程序、报警器等),也可以在系统运行时修改配置,通过网络状态采集器和故障特征数据库,并通过控制面板上的键盘与系统进行信息交互。在安装过程中,系统给每个故障代理赋予一个编号(即ID)和类型,并设置管理员密码以启动和关闭系统,设置故障代理事件发生时应自动拨出的电话号码。当系统检测到一个故障代理事件时,就激活警报,拨出预置的电话号码,并报告位置和检测到的事件的性质等信息。该网络故障诊断系统的顶层图如图13-16所示,0层图如图13-17所示,加工4的子图如图13-18所示。【问题1】将顶层图中的(1)和(2)空填充完整。【问题2】0层图中的数据文件“配置信息”是多余的吗?若是,请说明理由;若不是,请指出它会影响。层图中的哪些(哪个)加工(除加工“1系统配置”之外)?【问题3】指出图13-18所示的加工4的子图中遗漏的数据流。注意:书写格式为“缺少从××到××的数据流××”或“××缺少输入(出)数据流××”。若未按格式书写,将被扣分。
问答题
问答题[说明]已知某企业欲开发一家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器面板如图1-18所示。该遥控器共有4个按钮,编号分别是0至3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如图1-19所示。在图1-19中,类RomoteController的方法onPressButton(intbutton)表示当遥控器按键按下时调用的方法,参数为按键的编号;Command接口中on和off方法分别用于控制电器的开与关;Light中turnLight(intdegree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中setChannel(intchannel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为1时表示开机并将频道切换为第1频道。[Java代码]本试题应用命令模式能够有效让类(5)和类(6)、类(7)之间的耦合性降至最小。
问答题8.
问答题[说明]分糖果问题是一个经典问题。问题描述如下:幼儿国有n(<20)个孩子围成一圈分糖果,老师先随机地发给每个孩子若干颗糖果,然后按以下规则调整:每个孩子同时将自己手中的糖果分一半给坐在他右边的小朋友;如共有8个孩子,则第1个将原来的一半分给第2个,第2个将原有的一半分给第3个……第8个将原来的一半分给第1个,这样的平分动作同时进行;若平分前,某个孩子手中的糖果是奇数颗,则必须从老师那里要一颗,使他的糖果变成偶数。小孩人数和每个小孩的初始数由键盘输入。经过多少次调整,使每个孩子手中的糖果一样多,调整结束时每个孩子有糖果多少颗,在调整过程中老师又新增发了多少颗糖果。[C程序]#include<stdlib.h>#include<stdio.h>boolallequall(intchild[],intn)//判断各小孩子手中的糖果是否相等{for(inti=0;i<n-1;i++)if(child[i]!=child[i+1])returnfalse;//不相等返回假returntrue;//相等返回真}constintMaxNum=20;//定义最大人数//主函数voidmain(){intNum=0;int*child;int*child1;//构造两个相应大小的数组child代表小朋友现有的粮果数child1代表小朋友原来有的糖果数intTnum=0;inti=0;do{printf("Pelaseinputthenumberofthechildren:").,scanf("%d",if(Num>MaxNum)printf("ErrorNumber!!");}while(Num>MaxNum);child=newint[Nmn];child1=newint[Num];for(i=0;i<Num;i++)//将数组赋值{printf("InputNO.%dchild'scandynumbers:",i+1);scanf("%d",}while({{U}}(1){{/U}}){for(i=0;i<Num;i++){if({{U}}(2){{/U}}){{{U}}(3){{/U}}Tnum++;}}for(i=0;i<Num;i++)child1[i]=child[i];//将child1赋值用来记忆原来小朋友的粮果数for(i=0;i<Nam;i++){{U}}(4){{/U}}for(i=0;i<Num-1;i++)//用循环实现前一个小朋友粮果数加后一个小朋友粮果数的一半{child[i]/=2;child[i]+=child1[i+1];}child[Num-1]/=2;{{U}}(5){{/U}}}printf("每个同学最后分到糖果数目是%d/n",child[1]);printf("老师分发出的糖果是%d/n",Tnum);}图12-7是一种解决问题的流程图,请根据该流程图将对应C代码{{U}}(n){{/U}}处补充完整。
问答题[说明]
以下程序实现了在applet里移动图形文件,仔细阅读代码和相关注释,将程序补充完整。
[代码6-1]
import j ava. awt. *;
import j ava.awt.event.*;
import java.applet. Applet;
public class AppCIU extends Applet implements MouseMotionListener, MouseListener
{
Image IMG onClick=over(this) title=放大; // 声明 Image 类类型的变量 IMG onClick=over(this) title=放大
int x=70,y=60,posX=70,posY=60,dx,dy;
public void init ( )
{
IMG onClick=over(this) title=放大=getImage ( getCodeBase ( ) ,"mouse.gif" ); //载入影像
addMouseListener ( this );
addMouseMotionListener ( this );
}
public void mousePressed ( MouseEvent e )
{
dx=e.getX()-posX; //取得按下之点与基准点X方向的距离
dy=e.getY()-posY; //取得按下之点与基准点Y方向的距离
}
public void mouseDragged ( MouseEvent e )
{
{{U}} (1) {{/U}}
{{U}} (2) {{/U}}
if ( dx>0
{{U}} (3) {{/U}}
}
}
public void paint ( Graphics g )
{
{{U}} (4) {{/U}}
{{U}} (5) {{/U}}
{{U}} (6) {{/U}}
}
public void mouseMoved ( MouseEvent e ) {};
public void mouseReleased ( MouseEvent e ) {};
public void mouseEntered ( MouseEvent e ) {};
public void mouseExited ( MouseEvent e ) {};
public void mouseClicked ( MouseEvent e ) {};
}
问答题某集团公司拥有多个大型连锁商场,公司需要构建一个数据库系统以方便管理其业务运作活动。[需求分析结果](1)商场需要记录的信息包括商场编号(编号唯一)、商场名称、地址和联系电话。某商场信息如表1所示。表1商场信息表商场编号商场名称地址联系电话PS2101淮海商场淮海中路918号021-64158818PS2902西大街商场西大街时代盛典大厦029-87283229PS2903东大街商场碑林区东大街239号029-87450287PS2901长安商场雁塔区长安中路38号029-85264950(2)每个商场包含不同的部门,部门需要记录的信息包括部门编号(集团公司分配)、部门名称、位置分布和联系电话。某商场的部门信息如表2所示。表2部门信息表部门编号部门名称位置分布联系电话DT002财务部商场大楼6层82504342DT007后勤部商场地下副一层82504347DT021安保部商场地下副一层82504358DT005人事部商场大楼6层82504446DT004管理部商场裙楼3层82504668(3)每个部门雇佣多名员工处理日常事务,每名员工只能隶属一个部门(新进员工在培训期不隶属于任何部门)。员工需要记录的信息包括员工编号(集团公司分配)、姓名、岗位、电话号码和工资。员工信息如表3所示。表3员工信息表员工编号姓名岗位电话号码工资XA3310周超理货员136092576381500.00SH1075刘飞防损员134772934871500.00XA0048江雪花广播员152345678931428.00BJ3123张正华部门主管133456984321876.00(4)每个部门的员工中有一名是经理,每个经理只能管理一个部门,系统需要记录每个经理的任职时间。[概念模型设计]根据需求阶段搜集的信息,设计实体联系图(如图所示)和关系模式(不完整)。[关系模式设计]商场(商场编号,商场名称,地址,联系电话)部门(部门编号,部门名称,位置分布,联系电话,{{U}}(a){{/U}})员工(员工编号,员工姓名,岗位,电话号码,工资,{{U}}(b){{/U}})经理({{U}}(c){{/U}},任职时间)
问答题【说明】 有如下关系数据库: S(SNO,SN,STATUS,CITY) P(PNO,PN,COLORS,WEIGHT) J(JNO,JN,CITY) SPJ(SNO,PNO,JNO,QTY) 其中,S为供应单位,P为零件,J为工程项目,SPJ为工程订购零件的订单,其语义为:某供应单位供应某种零件给某个工程,请用SQL完成下列操作。1. 【问题1】 求为工程J1提供红色零件的供应商代号。
问答题【说明】 本程序将两个从小到大的有序链表合成一个新的从小到大的有序链表。链表的每一项由类 Node描述,而链表由List描述,类List的成员函数有以下几个: creatList(): 创建从小到大的有序链表。 multiplyList(List L1, Llst L2): 将链表L1和链表L2合并。 print(): 打印链表。 【C++代码】 #include <iostream> using namespace std; class List; class Node friend class List; public: Node(int data) (1) ; private: int data; Node *next; ; class List public: List()list=NULL; void multiplyList(List L1, List L2); void creatList(); void print(); private: Node *list; ; void List::creatList() Node *p, *u, *pre; int dara; list=NULL; wbile(1) cout<<"输入链表的一项: (小于零,结束链表) "<<endl; cin>>data; if(dara<0)break;//小于零,结束输入 p=list; while(p !=NULL p=p->next; u= (2) ; if(p==list)list=u; else pre->next=u; (3) ; void List::multiplyList(List L1, List L2) Node *pL1, *pL2, *pL, *u; list = NULL; pL1 = L1.list; pL2 = L2.11st; while(pL1 != NULL pL1 = pL1->next; else u = new Node(pL2->data); pL2 = pL2->next; if(list == NULL) list = (4) ; else pL->next=u; pL=u; pL1 = (pL1 != NULL)? pL1:pL2; while(pL1 != NULL) u= (5) ; pL1 = pL1->next; if(list == NULL) list=pL=u; else pL->next=u; pL=u; void List::print() Node *p; p = list; while(p !=NULL) cout<<p->data<<"/t"; p=p->next; cout<<end1; void main() List L1, L2, L; cout<<"创建第一个链表/n";L1.creatList(); cout<<"创建第二个链表/n";L2.creatList(); L1.print();L2.print(); L.multiplyList(L1,L2); L.print();
问答题【说明】“进货库存信息管理系统”是ERP系统中一个重要的子系统,下面是该系统的一个简化了的主结构功能图。其中一些各系统功能描述如下:[进货信息管理系统]①进货单据建立文件维护管理工作。②进货查询统计管理工作。③进货过账工作。在进货管理系统中,要处理“成本计算和费用摊消”的问题。处理方式如下所述。进口货物的成本计算:(1)先算出本次进货货物的原币总成本金额。(2)再依照当时原币(如:美金US$,英镑、港币HK$等)的汇率乘以本次进货原币总成本金额,算出本次进货台币总成本金额。(3)再计算出本次进货所产生的全部费用总金额(包含:关税、报关费、运费、其他费用等费用)。(4)将“本次进货台币总成本金额”加上“全部费用总金额”算出本次实际的“总成本金额”。(5)再利用下述公式算出各单项货物的“单项货物的成本金额”。 (6)最后一个步骤,再将“单项货物的成本金额”除以单项货物本次进货的数量,即可算出“单一货物本次进货实际的成本金额”。【问题1】将此“进口货物的成本计算方式”利用UML的类图米设计结构,要求使用到抽象和继承。写出类1和类2名称(中文、英文皆可,但要说明其主要功能)【问题2】说明类图都包括什么。【问题3】解释依赖与泛化,请举例。
问答题现准备为某银行开发一个信用卡系统CCMS,该系统的基本功能如下。(1)信用卡申请。非信用卡客户填写信用卡申请表,说明所要申请的信用卡类型及申请者的基本信息,提交CCMS。如果信用卡申请被银行接受,CCMS将记录该客户的基本信息,并发送确认函给该客户,告知客户信用卡的有效期及信贷限额;否则该客户将会收到一封拒绝函。非信用卡客户收到确认函后成为信用卡客户。(2)信用卡激活。信用卡客户向CCMS提交激活请求,用信用卡号和密码激活该信用卡。激活操作结束后,CCMS将激活通知发送给客户,告知客户其信用卡是否被成功激活。(3)信用卡客户信息管理。信用卡客户的个人信息可以在CCMS中进行在线管理。每位信用卡客户可以在线查询和修改个人信息。(4)交易信息查询。信用卡客户使用信用卡进行的每一笔交易都会记录在CCMS中。信用卡客户可以通过CCMS查询并核实其交易信息(包括信用卡交易记录及交易额)。图1和图2分别给出了该系统的项层数据流图和0层数据流图的初稿。图1顶层数图20层数据流图
问答题【说明】 “背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1;w2,……,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。 如下程序均能求得“背包问题”的一组解,其中程序4.1是“背包问题”的递归解法,而程序4.2是“背包问题”的非递归解法。 【程序4.1】 #include<stdio.h> #define N 7 #define S 15 int w[N+1]=0,1,4,3,4,5,2,7; int knap(int s,int n) if(s==0)return 1; if(s<0||(s>0& &n<1))return 0; if( (1) ))| printf("%4d",w[n]);return 1; return (2) ; main() if(knap(S,N))printf("OK!/n"); else printf("NO!/n"); 【程序4.2】 #include<stdio.h> #define N 7 #define S 15 typedef struct int s; int n: int job; KNAPTP; int w[N+1]=0,1,4,3,4,5,2,7; int knap(int s,int n); main() if(knap(S,N))printf("OK!/n"); else printf("NO!/n"); int knap(int s,int n) KNAPTP stack[100],x; int top,k,rep; x.s=s;x.n=n; x.job=0; top=|;Stack[top]=x; k=0; while( (3) ) x=Stack[top]; rep=1; while(!k && rep) if(x.s==0)k=1;/*已求得一组解*/ else if(x.s<0||x.n <=0)rep=0; elsex.s= (4) ;x.job=1; (5) =x; if(!k) rep=1; while(top>=1&&rep) x=stack[top--]; if(x.job==1) x.s+=W[x.n+1]; x.job=2; Stack[++top]=x; (6) ; if(k)/*输出一组解*/ while(top>=1) x=staCk[top--]; if(x.job==1) printf("%d/t",w[x.n+1]); return k;
问答题【说明】[程序6说明]单源最短路径的分支限界算法。
const int MAXNUM=29999;
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
template <class VertexType,class EdgeType>
class MinNode { //程序中使用的最小化堆的结点说明
friend class Graph<VertexType,EdgeType>
public:
MinNode (int nl, EdgeType length1)
{ VexNum=nl;
length=length1;
}
bool operator>(const MinNode<VertexType,EdgeType>
//记录源点序号,序号数组p及distance下标相一致。源点为初始扩展顶点
EdgeType length;
//记录源点到本顶点的当前最短路径的长度,源点到自身的长度为0
}
template<class VertexType,classEdgeType>
void Graph<VertexType,EdgeType>:: shortestpath(VertexType start) {
int j,k,source;//source 记录源点的序号。
EdgeType*distance={{U}} (2) {{/U}};
int*p=new int[MaxNumVertex];
vector<MinNode<VertexType,EdgeType> >H;
for(source=0;source<MaxNumVertex;source++)
{ if(NodeList[source]==start)break;}
if (source>=MaxNumVertex){cout<<”This is error!”<<end1;return;}
MinNode<VertexType,Edge Type>{{U}} (3) {{/U}};
for(k=0;k<MaxNumVertex;k++)
{ distance[k]:MAXXUM; //记录源点到本顶点k的最终的最短路径的长度
p[k]=source; //记录最短路径上的本顶点的直接前驱顶点的序号
}
distance[source]=0;p[source]=-1;//m 是源点,前一顶点不存在
vector<MinNode<VertexType, EdgeType>>::iterator q;
while(1){
for(j=0;j<MaxNumVertex;j++)
if((AdjMatrix[E.VexNum* MaxNumVertex+j]<MAXNUM)
&&({{U}} (4) {{/U}}<distance[j]))
{ distance[j]=E.length+AdjMatrix[E.VexNum* MaxNumVertex+j];
p[j]=E. VexNum; //记录顶点j的前一顶点
MinNode<VertexType, EdgeType>{{U}} (5) {{/U}};
H.push_ back(N);
push_heap(H. begin(),H.end(),greater<MinNode<VertexType,
EdgeType>>());
}
if(H.empty()=true)break; //若优先队列为空,那么算法结束
else{
pop_ heap(H.begin(),H. end(),greater<MinNode<VertexType,
EdgeType>>());
q=H.end()-1; //从最小化堆中取路径最短的顶点
E=*q;
H.pop_ back(); //删除从最小化堆中“挤”出的顶点
}
} //end while
for(k=0;k<MaxNumVertex;k++){
cout<<"Shorstest path from vertex"<<k<<"is"<<distance[k]<<end1;
j=k;cout<<"All vertices are:";
while(j!=source){cout<<j<<"->";j=p[j];}
cout<<source<<”.”<<end1;
} //打印顶点的最短路径长度和至源点的最短路径上经过的顶点序列
return;
}
问答题[说明]某图书管理系统的主要功能是图书管理和信息查询。对于初次借书的读者,系统自动生成读者号,并与读者基本信息(姓名、单位和地址等)一起写入读者文件。该系统的图书管理功能主要分为购入新书、读者借书、读者还书及图书注销4个方面。(1)购入新书时需要为该书编制入库单。入库单内容包括图书分类目录号、书名、作者、价格、数量和购书日期,将这些信息写入图书目录文件并修改文件中的库存总量(表示到目前为止,购入此种图书的数量)。(2)读者借书时需填写借书单。借书单内容包括读者号和所借图书分类目录号。系统首先检查该读者号是否有效,若无效,则拒绝借书;若有效,则进一步检查该读者已借图书是否超过最大限制数(假设每位读者能同时借阅的书不超过10本),若已达到最大限制数,则拒绝借书;否则允许借书,同时将图书分类目录号、读者号和借阅日期等信息写入借书文件中。(3)读者还书时需填写还书单。系统根据读者号和图书分类目录号,从借书文件中读出与该图书相关的借阅记录,标明还书日期,再写回到借书文件中,若图书逾期,则处以相应的罚款。(4)注销图书时,需填写注销单并修改图书目录文件中的库存总量。系统的信息查询功能主要包括读者信息查询和图书信息查询。其中,读者信息查询可得到读者的基本信息及读者借阅图书的情况;图书信息查询可得到图书基本信息和图书的借出情况。该图书管理系统的顶层数据流图,如图2-21所示;该图书管理系统的第0层DFD图,如图2-22所示;其中加工2的细化图,如图2-23所示。1.[问题1]请用100字以内的文字简要说明逻辑数据流图(LogicalDataFlowDiagram)和物理数据流图(PhysicalDataFlowDiagram)之间的主要差别。
