问答题

阅读下列说明和图,回答问题1至问题3。
【说明】
某图书管理系统的主要功能如下:
1.图书管理系统的资源目录中记录着所有可供读者借阅的资源,每项资源都有一个唯一的索引号。系统需登记每项资源的名称、出版时间和资源状态(可借阅或已借出)。
2.资源可以分为两类:图书和唱片。对于图书,系统还需登记作者和页数;对于唱片,还需登记演唱者和介质类型(CD或者磁带)。
3.读者信息保存在图书管理系统的读者信息数据库中,记录的信息包括:读者的识别码和读者姓名。系统为每个读者创建了一个借书记录文件,用来保存读者所借资源的相关信息。
现采用面向对象方法开发该图书管理系统。识别类是面向对象分析的第一步。比较常用的识别类的方法是寻找问题描述中的名词,再根据相关规则从这些名词中删除不可能成为类的名词,最终得到构成该系统的类。表10-4给出了[说明]中出现的所有名词。
                           表10-4

图书管理系统 资源目录 读者 资源
索引号 系统 名称 出版时间
资源状态 图书 唱片 作者
页数 演唱者 介质类型 CD
磁带 读者信息 读者信息数据库 识别码
姓名 借书记录文件 信息  

  通过对表10-4中的名词进行分析,最终得到了图10-4所示的UML类图(类的说明如表10-5所示)。
                           表10-5
 

类名 说明
 LibrarySystem  图书管理系统
 BorrowerDB  保存读者信息的数据库
 CatalogItem  资源目录中保存的每项资源
 Borrower  读者
 BorrowerItems  为每个读者创建的借书记录文件

 

【问题2】
根据【说明】中的描述,给出图10-4中的类CatalogItem以及(b)、(c)处所对应的类的关键属性(使用表10-4中给出的词汇),其中,CamlogItem有4个关键属性;(b)、 (c)处对应的类各有两个关键属性。

【参考答案】

CatalogItem的属性:索引号、名称、出版时间、资源状态
图书的属性:作者、页数
唱片的属性:演唱者、介质类型

热门 试题

问答题
【说明】 在一个分布网络中,资源(石油、天然气、电力等)可从生产地送往其他地方。在传输过程中,资源会有损耗。例如,天然气的气压会减少,电压会降低。我们将需要输送的资源信息称为信号。在信号从信源地送往消耗地的过程中,仅能容忍一定范围的信号衰减,称为容忍值。分布网络可表示为一个树型结构,如图10-9所示。信号源是树根,树中的每个节点(除了根)表示一个可以放置放大器的子节点,其中某些节点同时也是信号消耗点,信号从一个节点流向其子节点。 每个节点有一个d值,表示从其父节点到该节点的信号衰减量。例如,在图10-9中,节点w、p、q的d值分别为2、1、3,树根节点表示信号源,其d值为0。 每个节点有一个M值,表示从该节点出发到其所有叶子的信号衰减量的最大值。显然,叶子节点的M值为0。对于非叶子节点j,M(j)=max{M(k)+d(k)|k是j的孩子节点}。在此公式中,要计算节点的M值,必须先算出其所有子节点的M值。 在计算M值的过程中,对于某个节点i,其有一个子节点k满足d(k)+M(k)大于容忍值,则应在k处放置放大器,否则,从节点i到某叶子节点的信号衰减量会超过容忍值,使得到达该叶子节点时信号不可用,而在节点i处放置放大器并不能解决到达叶子节点的信号衰减问题。 例如,在图10-9中,从节点p到其所有叶子节点的最大衰减值为4。若容忍值为3,则必须在s处放置信号放大器,这样可使得节点p的M值为2。同样,需要在节点小v处放置信号放大器,如图10—10阴影节点所示。若在某节点放置了信号放大器,则从该节点输出的信号与信号源输出的信号等价。 函数placeBoosters(TreeNode*root)的功能是:对于给定树型分布网络中各个节点,计算其信号衰减量的最大值,并确定应在树中的哪些节点放置信号放大器。 全局变量Tolerance保存信号衰减容忍值。 树的节点类型定义如下: typedef struct TreeNode{ int id; *当前节点的识别号* int ChildNum; *当前节点的子节点数目* int d; *父节点到当前节点的信号衰减值* struct TreeNode **childptr; *向量,存放当前节点到其所有子节点的指针* int M; *当前节点到其所有子节点的信号衰减值中的最大值* bool boost; *是否在当前节点放置信号放大器的标志* }TreeNode; 【C语言函数】 void placeBoosters(TreeNode *root) { * 计算root所指节点处的衰减量,如果衰减量超出了容忍值,则放置放大器* TreeNode *p; int i,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->boost=true; p->M = 0; } if (p->d + p->M > degradation) degradation = p->d + p->M; } root->M = (5) ; } }
问答题
【说明】 某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表10-6所示: 表10-6 为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图10-11所示: 其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、 CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与 QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为:类FlyNoWay与 FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与 QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。 【C++代码】 #include<iostream> using namespace (1) ; class FlyBehavior{ public: (2) fly()=0; }; class QuackBehavior{ public: (3) quack() = 0; }; class FlyWithWings:public FlyBehavior{ public:void fly(){ cout<< “使用翅膀飞行 ! ” <<endl; } }; class FlyNoWay:public FlyBehavior{ public:void fly(){ cout<< “不能飞行!”<<endl;} }; class Quack:public QuackBehavior{ public:void quack(){ cout<<“发出 ‘嘎嘎 ’声 !”<<endl; } }; class Squeak:public QuackBehavior{ public:void quack(){cout<<“发出空气与橡皮摩擦声!”<<endl; } }; class QuackNoWay:public QuackBehavior{ public:void quack (){ cout<<“不能发声 !”<<endl; } }; class Duck{ protected: FlyBehavior* (4) ; QuackBehavior* (5) ; public: void fly(){ (6) ; } void quack(){ (7) ;); virtual void display()=0; }; class RubberDuck:public Duck{ public: RubberDuck(){ flyBehavior=new (8) ; quackBehavior=new (9) ; } ~RubberDuck(){ if(!flyBehavior)delete flyBehavior; if(!quackBehavior) delete quackBehavior; } void display(){ *此处省略显示橡皮鸭的代码* } }; 其他代码省略