一起答
主观

阅读下列说明和数据流图,回答问题1至问题3。将解答填入对应栏内。

【说明】

 某图书馆管理系统的主要功能是图书管理和信息查询。对于初次借书的读者,系统自动生成读者号,并与读者基本信息(姓名、单位、地址等)一起写入读者文件。系统的图书管理功能分为四个方面:购入新书、读者借书、读者还书以及图书注销。

 (1)购入新书时需要为该书编制入库单。入库单内容包括图书分类目录号、书名、作者、价格、数量和购书日期,将这些信息写入图书目录文件并修改文件中的库存总量(表示到目前为止,购入此种图书的数量)。

 (2)读者借书时需填写借书单。借书单内容包括读者号和所借图书分类目录号。系统首先检查该读者号是否有效,若无效,则拒绝借书;若有效,则进一步检查该读者已借图书是否超过最大限制数(假设每位读者能同时借阅的书不超过5本)。若已达到最大限制数,则拒绝借书;否则允许借书,同时将图书分类目录号、读者号和借阅日期等信息写入借书文件中。

 (3)读者还书时需填写还书单。系统根据读者号和图书分类目录号,从借书文件中读出与该图书相关的借阅记录,标明还书日期,再写回到借书文件中。若图书逾期,则处以相应的罚款。

 (4)注销图书时,需填写注销单并修改图书目录文件中的库存总量。

系统的信息查询功能主要包括读者信息查询和图书信息查询。其中读者信息查询可得到读者的基本信息以及读者借阅图书的情况;图书信息查询可得到图书基本信息和图书的借出情况。图书管理系统的顶层图如图13-5所示;图书管理系统的第0层DFD图如图 13-6所示,其中加工2的细化图如图13-7所示。 

数据流图13-6中有两条数据流是错误的,请指出这两条数据流的起点和终点。

参考答案
查看试卷详情
相关试题
  1. 阅读下列说明与相关类图,填空并回答问题。

      【说明】

     装饰者模式动态地给一个对象添加一些额外的职责,就扩展功能而言,该模式比生成子类方式更加灵活。装饰模式的提出有助于解决滥用继承的问题。

     例如,一个名叫星巴兹(Starbuzz)的咖啡连锁店提供多种多样的咖啡,最朴素的设计就是采用继承,即设计一个饮料抽象基类Beverage,让不同种类的咖啡HouseBlend、 Decaf、Espresso、DarkRoast继承Beverage类,如图13-23所示。Beverage类的cost()方法是抽象方法,每个子类的cost()方法实现即返回具体咖啡种类的价钱,Beverage类的 description实例变量由每个子类设置,用来描述该类饮料,Beverage类的getDescription()方法用来返回此描述。

                   

     客户在点咖啡时还可以要求添加各种各样的调料(Condiment),加入的调料不同所收取的费用也是不同的,让各种加了调料的不同咖啡都继承基类Beverage,当咖啡种类和调料种类很多时,组合种类的数量就会急剧增长,就会发生“类数量爆炸”现象,如图13-24所示。

                 

     显然,采用这种设计方式会使得代码的维护变得十分困难,可以采用装饰者模式来解决这个问题。软件设计师蝴蝶飞根据装饰者模式的思想设计了如图13-25所示的类图。

                  

     在图13-25中,将各种调料Milk、Mocha、Soy、Whip作为装饰者来装饰House- Blend、Decal、Espresso、DarkRoast等各种咖啡。下面的Java程序(代码13-6)对应其具体实现。

      【代码13-6】

     import java.io.* ;

     abstract class Beverage{

       String description="Unknown Beverage";

       public String getDescription(){

         return description;

        }

       public (1) double cost();

     }

     abstract class CondimentDecorator (2) Beverage {

       public abstract Strmg getDescription();

     }

     class Decafextends Beverage {

       public Decaf(){

         description="Decaf Coffee";

       }

       public double cost(){

         return 1.05;

       }

     }

     class Espresso extends Beverage {

       public Espresso() {

         description="Espresso";

       }

       public double cost(){

         return 1.99;

       }

     }

     class HouseBlend extends Beverage{

       public HouseBlend(){

         description="House Blend Coffee";

       }

       public double cost(){

         return.89;

       }

     }

     class DarkRoast extends Beverage{

       public DarkRoast(){

         description="Dark Roast Coffee";

       }

       public double cost(){

         return.99;

       }

     }

     class Mocha extends CondtmentDecorator{

       Beverage (3);

       public Mocha(Beverage beverage){

         this.beverage=beverage;

       }

       public String getDescription(){

         return beverage.getDescription()+", Mocha";

        }

       public double cost(){

         return.20+beverage.cost();

       }

     }

     Class Soy extends CondimentDecorator{

       Beverage beverage;

       public Soy(Beverage beverage) {

         this.beverage=beverage;

       }

       public Strillg getDescription(){

        

  2. 阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。

      【说明】

     一棵非空二叉树中“最左下”结点定义为:若树根的左子树为空,则树根为“最左下”结点;否则,从树根的左子树根出发,沿结点的左孩子分支向下查找,直到某个结点不存在左孩子时为止,该结点即为此二叉树的“最左下”结点。例如:图13-26所示的以A为根的二叉树的“最左下”结点为D,以C为根的子二叉树中的“最左下”结点为C。

                

     二叉树的结点类型定义如下:

     typedef struct BSTNode{

     int data;

     struct BSTNode * lch,* rch;//结点的左、右孩子指针

     } * BSTree;

     代码13-7中,函数BSTree Find_Del(BSTreeroot)的功能是:若root指向一棵二茶树的根结点,则找出该结点的右子树上的“最左下”结点*p,并从树中删除以*p为根

    的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在“最左下”结点,则返回空指针。

     【代码13-7】

     BSTree Find_Del(BSTree root)

     {

       BSTree p,pre;

       If(! root)  / * root指向的二叉树为空树*/

       return NULL;

        (1);  / * 令p指向根结点的右子树*/

       if( ! p)

         return NULL;

        (2);  / * 设置pre的初值*/

       while(p->lch) {/ * 查找“最左下”结点*/

         pre=p;

         p=(3);

       }

       if((4)==root) / * root的右子树根为“最左下”结点*/

         pre->rch=NULL;

       else

        (5)=NULL;/ * 删除以“最左下”结点为根的子树*/

       return p;

     }

  3. 请至少写出4种服务器端实现技术。

  4. 阅读以下说明和C++程序代码,将程序填充完整。

      【说明】

     有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。

     一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画二个边框)。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的功能。

     装饰对象结构模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。其示意类图如图13-22所示。

              

     程序代码13-5是该模式的一个示例,说明了如何实现用户接口装饰,函数的实现全部省略。程序中定义了VisualComponent的一个子类Decorator,我们将生成Decorator的子类以获取不同的装饰。VisualComponent类是一个描述可视对象的抽象类,它描述了绘制和事件处理的接口。Decorator的子类定义了特殊的装饰功能,BorderDecorator子类给可视组件添加一个边框,ScrollDecorator给可视组件添加滚动功能。

     【程序代码13-5】

      (1);

     class Window

     {

     public:

        roid SetContents (VisualComponent * contents);

     };

     //VisualComponent类是一个描述可视对象的抽象类

     class VisllalComponent

     {

     public:

       VisualComponent(){};

        (2) void Draw(){};

     Virtual void Resize(){};

     };

     class Decorator:public VisualComponent

     {

     public:

       Decorator()

       {

         //…

       };

       Decorator(VisualComponent * vcom)

       {

         //…

       };

       virtual vold Draw();

       virtual vold Resize();

     private:

       /* Decorator装饰由VisualComponent的指针实现,其在Decorator的构造函数中初始化*/

       VisualComponent (3) ;

     };

     vold Decorator::Draw()

     {

         (4);//缺省实现

     }

     void Decorator::Resize()

     {

       component->Resize();//缺省实现

     }

     //BorderDecorator 子类为它所包含的组件添加一个边框

     class BorderDecorator:public Decorator

     {

     public:

       BorderDecorator(VisualComponent * vcom,int borderWidth)

     {

       //…

        };

       Virtual Void Draw();

     private:

       void DrawBorder(int);

     private:

       int borderWidth;

     };

       void BorderDecorator::Draw()

     {

       Decorator::Draw();

       DrawBorder(_width);

     }

     Void BorderDecorator::DrawBorder(int Width)

     {

       //…

     )

     Void Window::SetConterlts(VlsualComponent * contents)

     {

       //…

     }

     //SerollDecorat 给可视组件添加滚动功能

     class ScroliDecoratOr:public Decorator

     {

     public:

       ScrollDecorator(VlsualComponent * vcom)

       {

         //…

       };

         //…

     );

     class TextView:public VisualComponent

     {

       //…

     };

     void main(void)

     {

       //创建一个正文视图以及放入这个正文视图的窗口

       Window * window=new Window;

       TcxtView * textView=new TextView;

        //TextView是一个VisualComponent,它可以放入窗口中

       window->SetContents(textView);

       //得到一个有边界的和可以滚动的TextView,边界宽为1

       window->SetContents((5));

     }

  5. 请至少写出ASP的5个特点。

  6. 阅读以下说明及图,回答问题。

    【说明】

     Web页面与数据库的连接是Web数据库的基本要求。目前基于Web数据库的连接方案主要有服务器端方案和客户端方案两种类型。服务器端方案的实现技术有ASP等,客户端方案的实现技术有JDBC、DHTML等。其中,ASP是微软开发的脚本语言技术,嵌入在 IIS中,因此,ASP成为大部分用户的首选脚本语言。图13-10给出了ASP的工作原理。

    ASP属于服务器端方案还是客户端方案?ASP的工作原理图中(1)、(2)应是什么?

  7. 在A的初值给定为0时,是否存在能够产生正确结果,而且又是不可串行化的调度?若有请举例说明。

  8. 阅读下列说明,回答问题。

    【说明】

     现有事务T1,T2、L3它们对数值型数据A执行的操作分别如下:

     T1;将A加1。

     T2:将A加倍。

     T3:输出A的值,并将A置为1。

    假设T1、T2、T3可以并发执行。若A的初值为0,那么存在多少种可能的正确结果?

  9. 各个事务内部的结构如表13-4所示,若事务执行不施加任何锁,则有多少种不同的调度方式?写出简要的计算过程。

       

     在A的初值给定为0时,是否存在能够产生正确结果,而且又是不可串行化的调度?若有请举例说明。

  10. 类通常不会单独存在,因此当对系统建模时,不仅要识别出类,还必须对类之间的相互关系建模。在面向对象建模中提供了4种关系:依赖(dependency)、概括(generalization )、关联(association)和聚集(aggregation)。请分别说明这4种关系的含义,并说明关联和聚集之间的主要区别。