阅读以下关于某订单管理系统的技术说明、部分UML类图及C++代码,将C++程序中(1)~(5)空缺处的语句填写完整。[说明]某订单管理系统的部分UML类图如图5-15所示。图5-15中,Product表示产品,ProductList表示产品目录,Order表示产品订单,Orderltem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。请完善类Order的成员函数getOrderedAmount()和类SalesSystem的statistic()

题目

阅读以下关于某订单管理系统的技术说明、部分UML类图及C++代码,将C++程序中(1)~(5)空缺处的语句填写完整。

[说明]

某订单管理系统的部分UML类图如图5-15所示。

图5-15中,Product表示产品,ProductList表示产品目录,Order表示产品订单,Orderltem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。

请完善类Order的成员函数getOrderedAmount()和类SalesSystem的statistic()方法,各个类的属性及部分方法定义参见下面的C++代码。

[C++代码]


相似考题
更多“ 阅读以下关于某订单管理系统的技术说明、部分UML类图及C++代码,将C++程序中(1)~(5)空缺处的语句填写完整。[说明]某订单管理系统的部分UML类图如图5-15所示。图5-15中,Product表示产品,P”相关问题
  • 第1题:

    请阅读以下技术说明、类图及C++代码,根据要求将(1)~(7)空缺处的内容填写完整。

    [说明]

    已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批。主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。

    采用责任链设计模式(Chain of Responsibility)对上述过程进行设计后得到的类图如图3-27所示。

    [C++代码]


    正确答案:考查设计模式中的Chain of Responsibility(职责链)模式的案例分析题Chain of Responsibility(职责链)模式的设计意图是:使多个对象都有机会处理请求从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链并沿着这条链传递该请求直到有一个对象处理它为止。换言之其目的是为了将一个请求发送给一个对象集合对象被组织成一条链而负责处理该请求的对象将获取请求消息并加以处理其余对象则仅仅负责将该请求消息按照责任链的顺序传递到下一个对象。因此责任链模式的关键在于组织不同的对象成为一条链并传递消息。 (1)空缺处位于条件判断if (successor!=NULL)内其功能是判断当前对象是否存在后继对象。如果存在则按照责任链设计模式可以把请求消息进行传递即调用后继对象的ProcessRequest方法。 (2)空缺处要求填写successor的类型因为责任链模式中的每一个对象都继承自同一个父类在本试题中对应于Approver类型。 (3)空缺处位于Congress类的ProcessRequest方法中该方法表示处理外界的请求而else处理模块的功能是表明Congress对象不处理审批金额大于50万元的请求因此Congress对象应该将该请求转发到下一个对象进行处理可以直接调用父类的ProcessRequest方法。 (4)~(6)空缺处则主要用来将各种对象串接成一个链根据题干给出的不同层次主管人员的审批额度“主任:5万元以下副董事长:5万元~10万元董事长:10万元~50万元开会讨论:50万元及以上”对象在责任链中的顺序应该为:Director Larry→Vicepresident Sam→President Tammy→Congress Meeting。由于主任的审批额度最小因此审批的请求应该从主任Lany开始即(7)空缺处所填写的内容是Lany。
    考查设计模式中的Chain of Responsibility(职责链)模式的案例分析题,Chain of Responsibility(职责链)模式的设计意图是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。换言之,其目的是为了将一个请求发送给一个对象集合,对象被组织成一条链,而负责处理该请求的对象将获取请求消息并加以处理,其余对象则仅仅负责将该请求消息按照责任链的顺序传递到下一个对象。因此责任链模式的关键在于组织不同的对象成为一条链并传递消息。 (1)空缺处位于条件判断if (successor!=NULL)内,其功能是判断当前对象是否存在后继对象。如果存在,则按照责任链设计模式,可以把请求消息进行传递,即调用后继对象的ProcessRequest方法。 (2)空缺处要求填写successor的类型,因为责任链模式中的每一个对象都继承自同一个父类,在本试题中对应于Approver类型。 (3)空缺处位于Congress类的ProcessRequest方法中,该方法表示处理外界的请求,而else处理模块的功能是表明Congress对象不处理审批金额大于50万元的请求,因此,Congress对象应该将该请求转发到下一个对象进行处理,可以直接调用父类的ProcessRequest方法。 (4)~(6)空缺处则主要用来将各种对象串接成一个链,根据题干给出的不同层次主管人员的审批额度“主任:5万元以下,副董事长:5万元~10万元,董事长:10万元~50万元,开会讨论:50万元及以上”,对象在责任链中的顺序应该为:Director Larry→Vicepresident Sam→President Tammy→Congress Meeting。由于主任的审批额度最小,因此审批的请求应该从主任Lany开始,即(7)空缺处所填写的内容是Lany。

  • 第2题:

    在某信息管理系统中存在两个类:类“客户”和类“订单”。它们之间的业务关系是:①一个客户提交0个或多个订单:②一个订单由一个且仅由一个客户提交。能够正确表示这个业务关系的UML类图是(47)。

    A.

    B.

    C.

    D.


    正确答案:D
    解析:由试题中的关键信息“①一个客户提交0个或多个订单;②一个订单由一个且仅由一个客户提交”可知,对应每个“订单”类的实例,都必须存在1个“客户”类的实例,对应每个“客户”类的实例,可能存在0个或多个“订单”类的实例。可见,正确表示该信息管理系统中类“客户”和类“订单”之间业务关系,是选项D的UML类图。选项A的图示“”表示的是一种泛化关系(继承关系的反关系):选项B的图示“”表示的是一种聚集关系(一种特殊的关联关系),空心菱形的一端表示整体的概念:选项C的图示“→”也是表示一种关联关系,但该UML类图所表达的关联多重度不符合试题的描述。

  • 第3题:

    阅读以下技术说明及C++代码,将C++程序中(1)~(5)空缺处的语句填写完整。

    [说明]

    在一公文处理系统中,开发者定义了一个公文类OfficeDoc,其中定义了公文具有的属性和处理公文的相应方法。当公文件中内容或状态发生变化时,关注此OfficeDoc类对象的相应的DocExplorer对象都要更新其自身的状态。一个OfficeDoc对象能够关联一组DocExplorer对象。当OfficeDoc对象的内容或状态发生变化时,所有与之相关联的DocExplorer对象都将得到通知,这种应用被称为Observer(观察者)模式。以下代码采用C++语言实现,能够正确编译通过。

    [C++代码]


    正确答案:Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系以便当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。首先DocExplorer需要知道OfficeDoc是一个类但由于OfficeDoc定义在DocExplorer之后因此需要在DocExplorer类的定义前加上class OfficeDoc的声明即(1)空缺处所填写的内容是:class OfficeDoc。 (2)空缺处可根据程序最后的构造函数的实现知道应该填写OfficeDoc。在观察者模式中不同的观察者更新自身的方法不同因此(3)空缺处应填写virtual而且程序最后的“=0”也表明是一个纯虚拟函数。 由(4)空缺处所在行的程序注释说明可知所有与OfficeDoc相关联的对象更新自身状态因此需要使用update函数。但update函数的参数是一个OfficeDoc类的对象所以参数应该为this。 (5)空缺处所在行语句的功能是将OfficeDoc类的对象和DocExplorer类的对象相关联关联的函数是OfficeDoc中的attach方法其参数是一个DocExplorer对象使用this能够表示当前的对象因此该空缺处应填写attach(this)。
    Observer(观察者)模式的设计意图是:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。首先,DocExplorer需要知道OfficeDoc是一个类,但由于OfficeDoc定义在DocExplorer之后,因此需要在DocExplorer类的定义前加上class OfficeDoc的声明,即(1)空缺处所填写的内容是:class OfficeDoc。 (2)空缺处可根据程序最后的构造函数的实现知道,应该填写OfficeDoc。在观察者模式中,不同的观察者更新自身的方法不同,因此(3)空缺处应填写virtual,而且程序最后的“=0”也表明是一个纯虚拟函数。 由(4)空缺处所在行的程序注释说明可知,所有与OfficeDoc相关联的对象更新自身状态,因此需要使用update函数。但update函数的参数是一个OfficeDoc类的对象,所以参数应该为this。 (5)空缺处所在行语句的功能是,将OfficeDoc类的对象和DocExplorer类的对象相关联,关联的函数是OfficeDoc中的attach方法,其参数是一个DocExplorer对象,使用this能够表示当前的对象,因此该空缺处应填写attach(this)。

  • 第4题:

    阅读以下关于某订单管理系统的技术说明、部分UML类图及Java程序,将Java程序中(1)~(5)空缺处的语句填写完整。

    [说明]

    某订单管理系统的部分UML类图如图5-16所示。

    在图5-16中,Product表示产品,ProductList表示所销售产品的列表,Order表示产品订单,Orderltem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。各个类的部分属性和方法说明如表5-23所示。

    可以使用类java.util.ArrayList<E>来实现对象的聚集关系,如图5-16中OrderList与Order之间的聚集关系。

    for-each循环提供了一种遍历对象集合的简单方法。在for-each循环中,可以指定需要遍历的对象集合及用来接收集合中每个元素的变量,其语法如下:

    for(用来接收集合中元素的变量:需要遍历的对象集合)

    如果要使用for-each循环来遍历对象集合,那么包含该对象集合的类必须实现接口java.util.Iterable<T>。

    Java程序7-1和Java程序7-2分别给出了类OrderList和方法statistic的Java代码。


    正确答案:这是一道要求读者掌握Java语言中的java.util.ArrayListE>和for…each循环的程序分析题。本题的解答思路如下。 仔细阅读Java程序7-1——类OrderList的Java代码可知类OrderList中具有一个类型为 ArrayListOrder>的属性。结合图5-16订单管理系统的部分UML类图可知类OrderList和Order之间具有聚集关系。由试题给出的关键信息“可以使用类java.util.ArrayListE>来实现对象的聚集关系”、“如果要使用for…each循环来遍历对象集合那么包含该对象集合的类必须实现接口java.util.IterableT>”可以推理出(1)空缺处所填写的内容是“implements IterableOrder>”。 在定义了ArrayListE>的类中必须实现接口IteratorOrder>中的方法iteratorOrder>∷iterator()因此(2)空缺处所填写的实现体应为:return this.orders.iterator()或return orders.iterator()。 仔细阅读Java程序7-2——方法statistic的Java代码可以初步判断要填写(3)~(5)空缺处首先要将方法statistic的功能及实现流程分析清楚。而且(3)~(5)空缺处所填写的内容与for…each循环的使用有关;使用for…each循环时关键是要确定所遍历的是哪一个对象集合。在类SalesSystem中已经具有两个对象集合即属性catalog和sales。 方法statistic的功能是依次统计产品目录中每个产品的订购总量并打印出每个产品的编号、说明、订购总量和订购金额。若要统计产品目录中每个产品的订购总量需要对3个对象集合进行遍历;产品目录(ProductList)、订单列表(OrderList)及Order(需要对订单中的所有订单项进行查询统计每个订单上所订购的产品的数量)。由此可以得出实现该方法的基本流程是:①从产品目录中取出一个产品→②在订单目录依次查询每张订单→③逐一查询某个订单中的所有订单项。 ①从产品目录中取出一个产品这对应第1条for…each语句此时被遍历的对象集合为ProductList。根据试题给出的for…each循环的语法——“for(用来接收集合中元素的变量:需要遍历的对象集合)”和(3)空歌处前半句的“Productproduct:”可以推断出(3)空缺处应填写ProductList类的对象而类SalesSystem中的catalog就是ProductList的实例。并且结合图5-16的UML类图可知类ProductList和Product之间具有聚集关系。依照Java的程序设计规范引用类的属性时应使用“this.”属性名的形式。因此(3)空缺处的答案为this.catalog(或catalog)。 ②在订单目录依次查询每张订单其对应于第2条for…each语句。根据第(3)空缺处的解题思路可以确定出(4)空缺处应填写OrderList类的对象即类SalesSystem的属性sales。因此(4)空缺处的答案为this.sales(或sales)。 ③逐一查询某个订单中的所有订单项其对应于第3条for…each语句。由图5-16类图上可以看出与类Order具有聚集关系的类是OrderItem。由此可以确定(5)空缺处应填写类OrderItem的对象。由于类SalesSystem中没有这种类型的属性因此需要在这里定义一个临时对象。另外在if语句中出现了一个标识符item但是在上下文中并没有出现对它的定义。由此可以推断item的定义应该在(5)空缺处提供。因此(5)空缺处的答案为OrderItem item。
    这是一道要求读者掌握Java语言中的java.util.ArrayListE>和for…each循环的程序分析题。本题的解答思路如下。 仔细阅读Java程序7-1——类OrderList的Java代码可知,类OrderList中具有一个类型为 ArrayListOrder>的属性。结合图5-16订单管理系统的部分UML类图可知,类OrderList和Order之间具有聚集关系。由试题给出的关键信息“可以使用类java.util.ArrayListE>来实现对象的聚集关系”、“如果要使用for…each循环来遍历对象集合,那么包含该对象集合的类必须实现接口java.util.IterableT>”可以推理出,(1)空缺处所填写的内容是“implements IterableOrder>”。 在定义了ArrayListE>的类中,必须实现接口IteratorOrder>中的方法iteratorOrder>∷iterator(),因此(2)空缺处所填写的实现体应为:return this.orders.iterator(),或return orders.iterator()。 仔细阅读Java程序7-2——方法statistic的Java代码可以初步判断,要填写(3)~(5)空缺处,首先要将方法statistic的功能及实现流程分析清楚。而且(3)~(5)空缺处所填写的内容与for…each循环的使用有关;使用for…each循环时,关键是要确定所遍历的是哪一个对象集合。在类SalesSystem中已经具有两个对象集合,即属性catalog和sales。 方法statistic的功能是依次统计产品目录中每个产品的订购总量,并打印出每个产品的编号、说明、订购总量和订购金额。若要统计产品目录中每个产品的订购总量,需要对3个对象集合进行遍历;产品目录(ProductList)、订单列表(OrderList)及Order(需要对订单中的所有订单项进行查询,统计每个订单上所订购的产品的数量)。由此可以得出实现该方法的基本流程是:①从产品目录中取出一个产品→②在订单目录依次查询每张订单→③逐一查询某个订单中的所有订单项。 ①从产品目录中取出一个产品,这对应第1条for…each语句,此时被遍历的对象集合为ProductList。根据试题给出的for…each循环的语法——“for(用来接收集合中元素的变量:需要遍历的对象集合)”和(3)空歌处前半句的“Productproduct:”可以推断出,(3)空缺处应填写ProductList类的对象,而类SalesSystem中的catalog就是ProductList的实例。并且结合图5-16的UML类图可知,类ProductList和Product之间具有聚集关系。依照Java的程序设计规范,引用类的属性时,应使用“this.”属性名的形式。因此(3)空缺处的答案为this.catalog(或catalog)。 ②在订单目录依次查询每张订单,其对应于第2条for…each语句。根据第(3)空缺处的解题思路,可以确定出(4)空缺处应填写OrderList类的对象,即类SalesSystem的属性sales。因此(4)空缺处的答案为this.sales(或sales)。 ③逐一查询某个订单中的所有订单项,其对应于第3条for…each语句。由图5-16类图上可以看出,与类Order具有聚集关系的类是OrderItem。由此可以确定(5)空缺处应填写类OrderItem的对象。由于类SalesSystem中没有这种类型的属性,因此需要在这里定义一个临时对象。另外在if语句中出现了一个标识符item,但是在上下文中并没有出现对它的定义。由此可以推断item的定义应该在(5)空缺处提供。因此(5)空缺处的答案为OrderItem item。

  • 第5题:

    阅读下列说明、图以及Java程序。

    [说明]

    某订单管理系统的部分UML类图如下图所示。

    上图中,Product表示产品,ProductList表示所销售产品的列表,Order表示产品订单,Orderltem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。各个类的部分属性和方法说明如下表所示。

    可以使用类java.util.ArrayList<E>米实现对象的聚集关系,如上图中OrderList与 Order之间的聚集关系。

    for-each循环提供了一种遍历对象集合的简单方法。在for-each循环中,可以指定需要遍历的对象集合以及用来接收集合中每个元素的变量,其语法如下:

    for(用来接收集合中元素的变量:需要遍历的对象集合)

    如果要使用for-each循环来遍历对象集合,那么包含该对象集合的类必须实现接口 java.util.Iterable<T>。

    Java程序7-1和Java程序7-2分别给出了类OrderList和方法statistic的Java代码

    [Java程序7-1]

    import java.util.*;

    public class OrderList (1) {

    private ArrayList<Order> orders;

    public OrderList0 {

    this.orders = new ArrayList<Order>();

    }

    public void addOrder(Order orde0

    this.orders.add(order);

    }

    public Iterator<Order> iterator() {

    return (2);

    }

    public iht getNumberOfOrders0 {

    return this.orders.size();

    }

    }

    [Java程序7-21]

    import java.u61.*;

    public class SalesSystem {

    private ProductList catalog;

    private OrderList sales;

    private static PrintWriter stdOut = new PrintWriter(System.out, true);

    public void statistic() {

    for (Product product: (3)) {

    iht number = 0;

    for (Order order: (4)) {

    for ((5): order) {

    if (produet.equals(item.getProduct()))

    number += item. getQuantity();

    }

    }

    stdOut.println(product .getCode() +" "

    + product.getDescription() +" "

    + number +" "+ number * product.getPrice());

    }

    }

    //其余的方法末列出

    }


    正确答案:(1) implements IterableOrder> (2) this.orders.iteratorO或 orders.iterator() (3) this.catalog 或 catalog (4) this.sales 或 sales (5) OrderItem item
    (1) implements IterableOrder> (2) this.orders.iteratorO,或 orders.iterator() (3) this.catalog, 或 catalog (4) this.sales, 或 sales (5) OrderItem item 解析:本题考查的是Java语言中的java.util.ArrayListE>和for-each循环。
    java.util.ArrayListE>可以用来实现对象的聚集关系。for-each循环提供了一种遍历对象集合的简单方法。在for-each循环中,可以指定需要遍历的对象集合以及用来接收集合中每个元素的变量,其语法如下:
    for(用来接收集合中元素的变量:需要遍历的对象集合)
    如果要使用for-each循环来遍历对象集合,那么包含该对象集合的类必须实现接口 java.util.IterableT>。由此可以得到第(1)空的答案。因为类OrderList中具有一个类型为 ArrayListOrder>的属性,而且从类图也能看出类OrderList和Order之间具有聚集关系。因此第(1)空应填implementslterableOrder>。
    在定义了AnayListE>的类中,必须实现接口IterableOrder>中的方法Iterator Order>∷iterator(),其实现体应为return this.orders.iterator()。因此第(2)空应填this. orders.iterator()。
    空(3)~(5)考查的是for-each循环的使用。使用for-each循环时,关键是要确定所遍历的是哪一个对象集合。在类SalesSystem中已经具有两个对象集合,即属性catalog和 sales。要填写空(3)~(5),首先要将方法statistic的功能及实现流程分析清楚。
    方法statistic的功能是依次统计产品目录中每个产品的订购总量,并打印出每个产品的编号、说明、订购总量和订购金额。若要统计产品目录中每个产品的订购总量,需要对3个对象集合进行遍历:产品目录(ProductList)、订单列表(OrderList)以及Order (需要对订单中的所有订单项进行查询,统计每个订单上所订购的产品的数量)。由此可以得出实现该方法的基本流程:
    ①从产品目录中取出一个产品,这对应第一条for-each语句,这时被遍历的对象集合为ProductList。根据for-each循环的语法,第(3)空应填写ProductList类的对象,而类 SalesSystem中的catalog就是ProductList的实例。按照Java的程序设计规范,引用类的属性时,应使用this.属性名的形式。因此第(3)空的答案为this.catalog。其实,从前半句 Product product也可以推断出第(3)空的答案,因为从类图上可以看到ProductList和 Product之间具有聚集关系。
    ②在订单目录一次查询每张订单,这里对应第一条for-each语句。根据第(3)空的解题思路,可以很容易地确定第(4)空应填OrderList类的对象,即类SalesSystem的属性 sales。因此第(4)空的答案为this.sales。
    ③逐一查询某个订单中的所有订单项,这里对应第三条for-each语句。由类图上可以看出,与类Order具有聚集关系的类是Orderltem。所以第(5)应填写类OrderItem的对象。类SalesSystem中没有这种类型的属性,在这里定义一个临时对象。另外在if语句中出现了一个标识符item,但是在上下文中并没有出现对它的定义。在这里可以推断item的定义应该在第(5)空提供。因此第(5)空的答案为OrderItem item。

  • 第6题:

    阅读以下函数说明和C代码,将C程序中(1)~(5)空缺处的语句填写完整。

    [说明]

    函数int Toplogical(LinkedWDigraphG)的功能是对图G中的顶点进行拓扑排序,并返回关键路径的长度。其中,图G表示一个具有n个顶点的AOE-网,图中顶点从1~n依次编号,图G的存储结构采用邻接表表示,其数据类型定义如下。

    例如,某AOE-网如图6-22所示,其邻接表存储结构如图6-23所示。

    [函数]


    正确答案:是一道要求读者掌握数据结构中拓扑排序和求关键路径问题的算法分析及设计题。本题的解答思路如下。 AOE网(Activity On Edge network边表示活动的网)是一个带权的有向无环图其中顶点表示事件弧表示活动权表示活动持续的时间。通常AOE网可以用来估算工程的完成时间。 在AOE网中入度为0的顶点为源点出度为0的顶点为汇点。由于有些活动可以并行地执行因此从源点到汇点的路径中长度最长的路径称为关键路径(路径长度即指路径上各种活动持续时间之和)。表示事件的顶点存在最早、最晚发生时间。若以顶点V1表示源点、顶点Vn表示汇点则汇点的最早发生时间和最晚发生时间是一致的并且等于关键路径的长度。 设顶点Vj的最早发生时间用ve(j)表示则ve(j)是指从源点V1到Vj的最长路径长度(时间)。这个时间决定了所有从Vj发出的弧所表示的活动能够开工的最早时间。 ve(j)计算方法为 其中T是所有到达顶点j的弧的集合;dut(Ij>)是弧Ij>上的权值;n是网中的顶点数(即汇点的序号)。 显然上式是一个从源点开始的递推公式。Ve(j)的计算必须在Vj的所有前驱顶点的最早发生时间全部求出后才能进行。这样必须对AOE网进行拓扑排序然后按拓扑有序序列逐个求出各顶点事件的最早发生时间。 拓扑排序是将有向无环图中所有顶点排成一个线性序列的过程并且该序列满足:若在有向图中从顶点Vi到Vj有一条路径则在该线性序列中顶点Vi必然在顶点Vj之前。可见拓扑排序序列是由有向图中的所有顶点构成的一个线性序列在这个序列中体现了所有顶点之间的优先关系。 对AOE网进行拓扑排序的步骤如下: ①首先在AOE网中选择一个入度为0(没有前驱)的顶点且输出它。 ②然后从网中删除该顶点并且删除以该顶点为始点的所有引出边。 ③重复上述两个步骤直至网中不存在入度为0的顶点为止。 在拓扑排序过程中有可能同时存在多个入度为0的顶点函数中用顺序栈Stack[]暂存入度为0且没有进入拓扑序列的顶点。 本试题所给出的算法首先申请了3块连续的地址空间分别用来存放关键路径长度、网中各顶点的入度及入度为0的顶点编号它们的首地址分别存放在指针变量Ve、indegree、Stack中。 算法主体是由3个for循环和3个while循环组成。第1个for循环即for(j=1;j=G.n;j++){ve[j]=0; indegree[j]=O;}主要完成数组初始化的功能。 进行拓扑排序之前应先求出网中每个顶点的入度并存入数组indegree[]中从而将“从网中删除该顶点及其与该顶点有关的所有边”的操作转换为“相关顶点的入度减1”一旦发现某个顶点的入度变为0就将其编号压入堆栈。从而将选择入度为0的顶点转化为从Stack中弹出栈顶元素所代表的顶点。 题目中顶点从1开始编号顶点Vi的编号为i第2个for循环代码主要完成求网中各个顶点的入度的功能。 在有向图中若以V2为尾的弧有V2V4>且权值为30、V2V6>且权值为50则其的邻接表表示形式是:V2→430→650^。 因此扫描顶点V2的邻接表可以将邻接于V2的所有顶点的入度加1即(1)空缺处应填入“indegree[p ->adjvex)++”或其等价形式。 第3个for循环语句主要完成求网中入度为0的顶点并保存其编号的功能。以下代码实现拓扑排序并求解各个顶点时事件的最早发生时间。 由于入度为0的顶点由栈中弹出根据变量w在后续代码中所起的作用——存放网中没有直接前驱的顶点并通过printf语句输出可知(2)空缺处应填入“Stack[top--]”或其等价形式。 然后在网中删除没有直接前驱的顶点和以该顶点为始点的所有引出边并通过内嵌的while循环语句把这些引出边对应的终点的入度减1即将邻接到顶点w的各个顶点(p->adjvex)的入度减1再判断它们是否也是入度为0的顶点。因此(3)空缺处应填入“indegree[p->adjvex]——”或其等价形式。 同时对于顶点p->adjveX而言当删除其所有引入边之后从源点出发到达它的最长路径长度也就计算出来了所以每删除一条到达顶点p->adjvex的引入边都要查看一下最长路径长度是否需要更新。因此(4)空缺处填入“ve[w]+p->weight>ve[p->adjvex]”或其等价形式。 算法程序的最后部分通过return语句返回该图的关键路径长度即汇点的最早发生时间(该AOE网的关键路径长度)。由于AOE网中汇点未必是编号最大的顶点但它必然是从栈中弹出的最后一个顶点因此(5)空缺处填入“ve[w]”或其等价形式。
    是一道要求读者掌握数据结构中拓扑排序和求关键路径问题的算法分析及设计题。本题的解答思路如下。 AOE网(Activity On Edge network,边表示活动的网)是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续的时间。通常,AOE网可以用来估算工程的完成时间。 在AOE网中,入度为0的顶点为源点,出度为0的顶点为汇点。由于有些活动可以并行地执行,因此从源点到汇点的路径中,长度最长的路径称为关键路径(路径长度即指路径上各种活动持续时间之和)。表示事件的顶点存在最早、最晚发生时间。若以顶点V1表示源点、顶点Vn表示汇点,则汇点的最早发生时间和最晚发生时间是一致的,并且等于关键路径的长度。 设顶点Vj的最早发生时间用ve(j)表示,则ve(j)是指从源点V1到Vj的最长路径长度(时间)。这个时间决定了所有从Vj发出的弧所表示的活动能够开工的最早时间。 ve(j)计算方法为 其中,T是所有到达顶点j的弧的集合;dut(I,j>)是弧I,j>上的权值;n是网中的顶点数(即汇点的序号)。 显然,上式是一个从源点开始的递推公式。Ve(j)的计算必须在Vj的所有前驱顶点的最早发生时间全部求出后才能进行。这样必须对AOE网进行拓扑排序,然后按拓扑有序序列逐个求出各顶点事件的最早发生时间。 拓扑排序是将有向无环图中所有顶点排成一个线性序列的过程,并且该序列满足:若在有向图中从顶点Vi到Vj有一条路径,则在该线性序列中,顶点Vi必然在顶点Vj之前。可见,拓扑排序序列是由有向图中的所有顶点构成的一个线性序列,在这个序列中体现了所有顶点之间的优先关系。 对AOE网进行拓扑排序的步骤如下: ①首先在AOE网中选择一个入度为0(没有前驱)的顶点且输出它。 ②然后从网中删除该顶点,并且删除以该顶点为始点的所有引出边。 ③重复上述两个步骤,直至网中不存在入度为0的顶点为止。 在拓扑排序过程中,有可能同时存在多个入度为0的顶点,函数中用顺序栈Stack[]暂存入度为0且没有进入拓扑序列的顶点。 本试题所给出的算法首先申请了3块连续的地址空间,分别用来存放关键路径长度、网中各顶点的入度及入度为0的顶点编号,它们的首地址分别存放在指针变量Ve、indegree、Stack中。 算法主体是由3个for循环和3个while循环组成。第1个for循环,即for(j=1;j=G.n;j++){ve[j]=0; indegree[j]=O;},主要完成数组初始化的功能。 进行拓扑排序之前,应先求出网中每个顶点的入度并存入数组indegree[]中,从而将“从网中删除该顶点及其与该顶点有关的所有边”的操作转换为“相关顶点的入度减1”,一旦发现某个顶点的入度变为0,就将其编号压入堆栈。从而将选择入度为0的顶点转化为从Stack中弹出栈顶元素所代表的顶点。 题目中顶点从1开始编号,顶点Vi的编号为i,第2个for循环代码主要完成求网中各个顶点的入度的功能。 在有向图中,若以V2为尾的弧有V2,V4>且权值为30、V2,V6>且权值为50,则其的邻接表表示形式是:V2→4,30→6,50^。 因此,扫描顶点V2的邻接表可以将邻接于V2的所有顶点的入度加1,即(1)空缺处应填入“indegree[p ->adjvex)++”或其等价形式。 第3个for循环语句主要完成求网中入度为0的顶点并保存其编号的功能。以下代码实现拓扑排序并求解各个顶点时事件的最早发生时间。 由于入度为0的顶点由栈中弹出,根据变量w在后续代码中所起的作用——存放网中没有直接前驱的顶点,并通过printf语句输出,可知(2)空缺处应填入“Stack[top--]”或其等价形式。 然后,在网中删除没有直接前驱的顶点和以该顶点为始点的所有引出边,并通过内嵌的while循环语句把这些引出边对应的终点的入度减1,即将邻接到顶点w的各个顶点(p->adjvex)的入度减1,再判断它们是否也是入度为0的顶点。因此(3)空缺处应填入“indegree[p->adjvex]——”或其等价形式。 同时,对于顶点p->adjveX而言,当删除其所有引入边之后,从源点出发到达它的最长路径长度也就计算出来了,所以每删除一条到达顶点p->adjvex的引入边,都要查看一下最长路径长度是否需要更新。因此,(4)空缺处填入“ve[w]+p->weight>ve[p->adjvex]”或其等价形式。 算法程序的最后部分,通过return语句返回该图的关键路径长度,即汇点的最早发生时间(该AOE网的关键路径长度)。由于AOE网中汇点未必是编号最大的顶点,但它必然是从栈中弹出的最后一个顶点,因此(5)空缺处填入“ve[w]”或其等价形式。

  • 第7题:

    阅读以下关于某绘图系统的技术说明、部分UML类图及C++程序,将C++程序中(1)~(6)空缺处的语句填写完整。

    【说明】

    某绘图系统存在Point、Line和Square这三种图元,它们具有Shape接口,图元的类图关系如图5-10所示。

    现要将Circle图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供XCircle类,且完全满足系统新增的Circle图元所需的功能,但XCircle不是由Shape派生而来,它提供了的接口不被系统直接使用。【C++代码5-1】既使用了XCircle又遵循了Shape规定的接口,即避免了从头开发一个新的Circle类,又可以不修改绘图系统中已经定义的接口。【C++代码5-2】根据用户指定的参数生成特定的图元实例,并对它进行显示操作。

    该绘图系统定义的接口与XCircle提供的显示接口及其功能如表5-13所示。

    【C++代码5-1】

    class Circle: public (1) {

    Private;

    (2) m_circle;

    Public;

    void display(){

    m_circle. (3)

    }

    };

    【C++代码5-2】

    class Factory{

    public;

    (4) getShapeInstance(int type){ //生成特定类实例

    Switch(type){

    case 0: return new Point;

    case 1: return new Rectangle;

    case 2: return new Line;

    case 3: return new Circle;

    default: return NULL;

    }

    }

    };

    void main(int argc, char *argv[]){

    if(argc !=2){

    cout<<"error parameters!"<<endl;

    return;

    }

    int type=atoi(argv[1]);

    Factory factory;

    Shape *s;

    s=factory.(5);

    if(s==NULL){

    cout<<"Error get the instance!"<<endl;

    return;

    }

    s->display();

    (6);

    Return;

    }


    正确答案:(1)Shape (2)XCircle (3)displayIt() (4)Shape* (5)getShapeInstance(type) (6)ddete s
    (1)Shape (2)XCircle (3)displayIt() (4)Shape* (5)getShapeInstance(type) (6)ddete s 解析:这是一道考查用接口实现类的功能扩充的程序分析题。本试题的解答思路如下。
    由于C++具有多继承性,因此在C++实现中,通常采用多继承来代替接口。
    由题干关键信息“某绘图系统存在Point、Line和Square 3种图元,它们具有Shape接口……现要将Circle图元加入此绘图系统以实现功能扩充”可知,试题明确要求Circle具有Shape接口,因此(1)空缺处应填入“Shape”。
    由于【C++代码5-1】既使用了XCircle,又遵循了Shape规定的接口,即重用XCinle类而不用从头开发一个新的Circle类。因此,凡是Circle类实现Shape的接口时,都应调用相应的XCircle类提供的方法。即(2)空缺处应填入“Xcircle”,(3)空缺处应填入“displayIt()”。
    通过阅读【C++代码5-2】程序,由于(5)空缺处调用factory对象的方法,而类Factory只有一个方法为getShapeInstance,因此(5)空缺处应填入“getShapeInstance(type)”。其中,参数type为用户运行程序时指定的参数,表明需要生成哪种类型的对象。
    同理,由于s是Shape*类型,因此(4)空缺处所在的语句“getShapeInstance(int type)”的返回值类型为Shape*,即(4)空缺处应填入“Shape*”。
    由于程序退出前需要释放指针s所占用的内存空间,因此(6)空缺处应填入“delete s”。

  • 第8题:

    阅读下列说明和C++-代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某发票(lnvoice)由抬头(Head)部分、正文部分和脚注(Foot)部分构成。现采用装饰(Decorator)模式实现打印发票的功能,得到如图5-1所示的类图。

    【C++代码】 #include using namespace std; class invoice{ public: (1){ cout<<"This is the content of the invoice!"<

    答案:
    解析:
    (1) virtual void printInvoice() (2) ticket->printInvoice() (3) Decorator::printInvoice() (4) Decorator::printInvoice() (5) &a
    【解析】

    试题分析
    1.Invoice类下,义虛函数,按类图,函数名是printInvoice
    2.前面定义对象名是ticket,那么在ticket不为空的时候调用函数printInvoice
    3.这部分填写发票的抬头,看类图应该实现函数printInvoice ,Decorator装饰模式使用该方法
    4.这部分是发票的脚注,看类图应该实现函数printlnvoice,Decorator装饰模式使用该方法
    5.FootDecorator a(NULL) ;脚步的装饰参数是a,调用a参数,

  • 第9题:

    阅读以下说明,回答问题1至问题2,将解答填入答题纸对应的解答栏内。
    【说明】
    某留言系统采用ASP+Access开发,其后台管理登录页面如图4-1所示。

    【问题1】(9分)
    以下是该后台管理登录页面login.asp的部分代码,请仔细阅读该段代码,根据图4-1 将(1)~(9)的空缺代码补齐。



    【问题2】(6分)
    1.在登录页面 login.asp 中通过<!--#include file=“bbb.asp”-->导入了bbb.asp的代码,以下是bbb.asp的部分代码,请仔细阅读该段代码,将空缺代码补齐。



    答案:
    解析:


  • 第10题:

    阅读下列系统设计说明,回答问题1至问题3,将解答填入答题纸的对应栏内。

    【说明】

    某玩具公司正在开发一套电动玩具在线销售系统,用于向注册会员提供端对端的玩具 定制和销售服务。在系统设计阶段,"创建新订单? (New Order)"? 的设计用例详细描述如表 3-1 所示,候选设计类分类如表 3-2 所示,并根据该用例设计出部分类图如图3-1所示。





    在订单处理的过程中,会员可以点击“取消订单"取消该订单。如果支付失败,该订单将被标记为挂起状态,可后续重新支付,如果挂起超时30分钟未支付,系统将自动取消该订单。订单支付成功后,系统判断订单类型:

    (1)对于常规订单,标记为备货状态,订单信息发送到货运部,完成打包后交付快递发货;

    (2)对于定制订单,会自动进入定制状态,定制完成后交付快递发货。会员在系统中点击”收货"按钮变为收货状态,结束整个订单的处理流程。根据订单处理过程所设计的状态图如图3-2所示。



    图3-2 订单状态图


    ?【问题1】(6分)

    根据表3-1中所标记的候选设计类,请按照其类别将编号 C1~C12 分别填入表 3-2? 中的(a)、(b)和(c)处。

    【问题2】 (4 分)

    根据创建新订单的用例描述,请给出图3-1中X1~X4处对应类的名称。

    【问题3】 (5分)

    根据订单处理过程的描述,在图 3-2 中S1~S5处分别填入对应的状态名称。


    答案:
    解析:
    【问题1】(6分)
    (a):C4、C5、C7、C10、C11
    (b):C3、C8
    (c):C1、C2、C6、C9、C12
    【问题2】 (4 分)
    X1:收货地址
    X2:支付方式
    X3:邮箱地址
    X4:定制属性
    【问题3】 (5分)
    S1:订单挂起
    S2:订单备货
    S3:订单定制
    S4:订单发货
    S5:订单收货

  • 第11题:

    阅读下列说明和 C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    生成器( Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图 5-1 所示为其类图。



    【C++代码】
    #include
    #include
    using namespace std;
    class Product {
    private:? ??
    string partA, partB;
    public:
    Product() {?? }
    ? ? ?void
    setPartA(const string& s) { PartA = s;}
    ???? void
    setPartB(const string& s) { PartB = s;}
    //? 其余代码省略
    };
    class Builder {
    public:
    ??????? (1)?? ;
    virtual void buildPartB()=0;
    ??????? (2)?? ;
    };
    class ConcreteBuilder1 : public Builder {
    private:
    Product*?? product;
    public:
    ConcreteBuilder1() {product = new Product();???? }
    ??? void
    buildPartA() {????? (3)???? ("Component A"); }
    ??? void
    buildPartB() {????? (4)???? ("Component B"); }
    Product* getResult() { return product; }
    //? 其余代码省略
    };
    class ConcreteBuilder2 : public Builder {? ??
    /*??? 代码省略??? */
    };
    class Director {
    private:?
    Builder* builder;
    public:? ?
    Director(Builder* pBuilder) { builder= pBuilder;}
    ???? void
    construct() {
    ? ? ? ? ? ? ? (5)???? ;? ? ?
    //? 其余代码省略
    ????? }
    //? 其余代码省略
    };
    int main() {
    Director* director1 = new Director(new ConcreteBuilder1());?
    director1->construct();? ?
    delete director1;? ??
    return 0;


    答案:
    解析:
    (1) virtual void buildPartA() = 0
    (2) virtual Product * getResult() = 0
    (3) product->setPartA
    (4) product->setPartB
    (5) builder->buildPartA();
    builder->buildPartB();
    Product* p = builder->getResult();

  • 第12题:

    举例说明UML中的时序图、类图的概念和价值?


    正确答案: 时序图(SequenceDiagram)用来显示对象之间的关系,并强调对象之间消息的时间顺序,同时显示了对象之间的交互。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,时序图中的每条消息对应了一个类操作或状态机中引起转换的触发事件。时序图中包括如下元素:类角色,生命线,激活期、消息类图表示不同的实体(人、事物和数据)如何彼此相关;换句话说,它显示了系统的静态结构。该图描述了系统的类别集合,类别的属性和类别之间的关系。

  • 第13题:

    阅读下列说明,回答问题1至问题5,将解答填入答题纸的对应栏内。

    [说明]

    某企业网上销售管理系统的数据库部分关系模式如下所示:

    客户(客户号,姓名,性别,地址,邮编)

    产品(产品号,名称,库存,单价)

    订单(订单号,时间,金额,客户号)

    订单明细(订单号,产品号,数量)

    关系模式的主要属性及约束如下表所示。

    以下是创建部分关系表的SQL语句,请将空缺部分补充完整。

    CREATE TABLE客户(

    客户号 CHAR(5) (a),

    姓名 CHAR(30),

    性别 CHAR(2) (b),

    地址 CHAR(30),

    邮编 CHAR(6));

    CREATE TABLE 订单(

    订单号CHAR(4),

    时间 CHAR(10),

    金额 NUMBER(6,2),

    客户号CHAR(5)NOTNULL,

    PRIMARY KEY(订单号),

    (c);


    正确答案:(a)NOT NULL UNIQUE或NOT NULL PRIMARY KEY 或 PRIMARY KEY (b)CHECK (VALUE IN('男''女')) (c)FOREIGN KEY (客户号) REFERENCES 客户(客户号)
    (a)NOT NULL UNIQUE或NOT NULL PRIMARY KEY 或 PRIMARY KEY (b)CHECK (VALUE IN('男','女')) (c)FOREIGN KEY (客户号) REFERENCES 客户(客户号) 解析:本题考查的是SQL语言中的创建基本表命令。
    SQL中使用CREATE TABLE命令来定义基本表,其一般格式为:
    CREATE TABLE表名>(列名>数据类型>[列级完整性约束条件]
    [,列名>数据类型>[列级完整性约束条件]]...
    [,表级完整性约束条件>]);
    本题着重考查完整性约束的定义。
    . 实体完整性定义。声明主键有两种方法:将PRIMARYKEY保留字加在属性类型之后;在属性列表中引入一个新元素,该元素包含保留字PRIMARY KEY和用圆括号括起的构成主键的属性或者属性组列表。
    . 参照完整性定义。FOREIGNKEY(属性名)REFERFENCES表名(属性名)。参照完整性通过保留字FOREIGNKEY定义哪些列为外码,REFERFENCES指明外码所对应的被参照表的主码。
    . 用户定义完整性定义。用CHECK后增加一条检查子句来完成属性值上的约束。
    根据题目描述,客户号唯一标识一位客户,客户性别取值为“男”或者“女”,一份订单必须且仅对应一位客户。所以,客户号是客户表的主键,客户性别的取值只能为“男”或者“女”,订单中的客户号必须外键依赖于客户。
    因此,客户号应表示为主键:
    (a)NOT NULL UNIQUE或NOT NULL PRIMARY KEY或PRIMARY KEY;
    客户性别的取值只能为“男”或者“女”:
    (b)CHECK (VALUE IN('男','女'))
    订单中的客户号必须外键依赖于客户:
    (c)FOREIGN KEY(客户号)REFERENCES客户(客户号)

  • 第14题:

    对于如图4-3所示的UML类图,正确的描述是(47)。

    图4-3 某UML类图

    A.类O的实例中包含了对类P的实例的引用

    B.类O的实例中包含了对类Q的实例的引用

    C.类P的实例中包含了对类O的实例的引用

    D.类P的实例中包含了对类Q的实例的引用


    正确答案:C
    解析:在图4-3所示的UML类图中,带箭头方向的实线“→”表示类O、P(既可以是相同类也可以是不同类)之间存在着关联关系。根据图中的箭头走向可知,导航方向是P→O,说明可以从类P的实例导航到类O的实例,因此在类P中必然包含一个对类O的实例的引用。在图4-3中,“-Q”表示的是关联一端的角色名称。

  • 第15题:

    请阅读以下技术说明、类图及C++代码,根据要求将(1)~(7)空缺处的内容填写完整。

    [说明]

    已知某企业欲开发一家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器面板如图1-16所示。该遥控器共有4个按钮,编号分别是0至3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如图1-17所示。

    在图1-17中,类RomoteController的方法onPressButton(int button)表示当遥控器按键按下时调用的方法,参数为按键的编号;Command接口中on和off方法分别用于控制电器的开与关;Light中turnLight (int degree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中setChannel(int channel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为1时表示开机并将频道切换为第1频道。

    [C++代码]

    本试题应用命令模式能够有效让类(5)和类(6)、类(7)之间的耦合性降至最小。


    正确答案:考查设计模式中的Command(命令)模式的案例分析题。Command(命令)模式的设计意图是:将一个请求封装为一个对象从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志以及支持可撤销的操作。其中一种应用场合就是抽象出待执行的动作以参数化某种对象可用过程语言中的回调(callback)函数表达这种参数化机制。 Command模式是回调机制的一个面向对象的替代品。设计时为了保证遥控器和家用电器之间的独立性定义了Command类当用户按下遥控器上的按钮时触发Command上的On或者Off方法因此一对按钮分别对应一个Command对象。题目中的LightCommand以及与TVCommand分别为Command的子类该子类用于控制实际的Light以及TV对象将On与Off方法委托给Light以及TV实现。(1)空缺处表示要设置遥控器上按钮控制的对象其参数传递的是某一个命令对象因此只需将该命令对象存储下来即可。(2)空缺处表示关闭电灯根据说明关闭电灯的方法为turnLight(0)。(3)空缺处表示打开电视机因此需要调用打开电视的方法。(4)空缺处表示将按钮0和相应的Command对象相关联根据题目描述按钮0用于控制灯或者电视因此应该设置灯或者电视的命令对象。 本题中应用命令模式的目的是使类RemoteController(遥控器)和类Light、类TV之间的耦合性降至最低。
    考查设计模式中的Command(命令)模式的案例分析题。Command(命令)模式的设计意图是:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。其中一种应用场合就是抽象出待执行的动作以参数化某种对象,可用过程语言中的回调(callback)函数表达这种参数化机制。 Command模式是回调机制的一个面向对象的替代品。设计时,为了保证遥控器和家用电器之间的独立性,定义了Command类,当用户按下遥控器上的按钮时,触发Command上的On或者Off方法,因此,一对按钮分别对应一个Command对象。题目中的LightCommand以及与TVCommand分别为Command的子类,该子类用于控制实际的Light以及TV对象,将On与Off方法委托给Light以及TV实现。(1)空缺处表示要设置遥控器上按钮控制的对象,其参数传递的是某一个命令对象,因此只需将该命令对象存储下来即可。(2)空缺处表示关闭电灯,根据说明,关闭电灯的方法为turnLight(0)。(3)空缺处表示打开电视机,因此需要调用打开电视的方法。(4)空缺处表示将按钮0和相应的Command对象相关联,根据题目描述,按钮0用于控制灯或者电视,因此,应该设置灯或者电视的命令对象。 本题中应用命令模式的目的是,使类RemoteController(遥控器)和类Light、类TV之间的耦合性降至最低。

  • 第16题:

    请认真阅读以下关于某传输系统的技术说明、状态转换图及C++代码,根据要求回答问题1~问题2。

    [说明]

    传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、 StayOpen(保持打开)和Closing(正在关闭)5种状态。触发状态的转换事件有click、complete和timeout3种。事件与其相应的状态转换如图7-15所示。

    下面的[C++代码1]与[C++代码2]分别用两种不同的设计思路对传输门进行状态模拟,请填补代码段中的空缺语句。

    [C++代码1]

    请将以上[C++代码1]与[C++代码2]程序段中的(1)~(7)空缺处的语句填写完整。


    正确答案:这是一道要求读者掌握状态转换图的程序设计与实现的综合题。本试题的解答思路如下。 根据(1)空缺处所在的程序段给出的注释信息“发生crick事件时进行状态转换”可知(1)空缺处所在的方法为click表示当发生crick事件时应该发生什么状态转换。找出传输门响应事件与其状态转换图(见图7-15)与crick事件相关的内容并特别注意箭头所指的方向。由于发生click事件前的状态CLOSED、CLOSING分别跳转到状态OPENING因此(1)空缺处所填写的内容是“state==CLOSED‖state==CLOSING”。 同理由图7-15所示中的状态转换关系可知发生click事件前的状态OPENING、STAYOPEN分别跳转到状态CLOSING即(2)空缺处所填写的内容是“state==OPENING‖state==STAYOPEN”;发生 click事件前的状态OPEN跳转到状态STAYOPEN即(3)空缺处所填写的内容是“state==OPEN”。 仔细阅读[C++代码2]程序段由语句private DoorState state=CLOSED;可知类Door的state成员变量用于记录类Door所处的状态而state变量的类型为Doorstate*。由语句“virtual void click() {}”、“virtual void complete() {}”和“virtual void timeout() {}”可知Doorstate中分别具有click、timeout和 complete方法用来响应对应的事件。根据(4)空缺处所在程序段“void Door∷click()”可得(4)空缺处所填写的内容是“state->click()”。 同理根据(5)空缺处所在程序段“void Door∷timeout()”可得(5)空缺处所填写的内容是“state->timeout()”;根据(6)空缺处所在程序段“void Door∷complete()”可得(6)空缺处所填写的内容是“state->complete()”。 根据(7)空缺处所在程序段给出的注释信息“定义一个基本的Closed状态”和语句“void DoorClosed∷click()”可知(7)空缺处所填写的内容与传输门当前状态为CLOSED且发生Click事件时状态的迁移有关。结合如图7-16所示中的状态转换关系可知在Click事件下CLOSED状态将迁移到 OPENING因此(7)空缺处应该将传输门的状态设置为OPENING。由于Doorstate变量存储了当前其存储的传输门的实例因此可直接调用其方法setState设置状态。同时考虑到传输门的状态采用类的实例变量表示故(7)空缺处所填写的内容为“door->setState(door->OPENING)”。
    这是一道要求读者掌握状态转换图的程序设计与实现的综合题。本试题的解答思路如下。 根据(1)空缺处所在的程序段给出的注释信息“发生crick事件时进行状态转换”可知,(1)空缺处所在的方法为click,表示当发生crick事件时应该发生什么状态转换。找出传输门响应事件与其状态转换图(见图7-15)与crick事件相关的内容,并特别注意箭头所指的方向。由于发生click事件前的状态CLOSED、CLOSING分别跳转到状态OPENING,因此(1)空缺处所填写的内容是“state==CLOSED‖state==CLOSING”。 同理,由图7-15所示中的状态转换关系可知,发生click事件前的状态OPENING、STAYOPEN分别跳转到状态CLOSING,即(2)空缺处所填写的内容是“state==OPENING‖state==STAYOPEN”;发生 click事件前的状态OPEN跳转到状态STAYOPEN,即(3)空缺处所填写的内容是“state==OPEN”。 仔细阅读[C++代码2]程序段,由语句private DoorState state=CLOSED;可知,类Door的state成员变量用于记录类Door所处的状态,而state变量的类型为Doorstate*。由语句“virtual void click() {}”、“virtual void complete() {}”和“virtual void timeout() {}”可知,Doorstate中分别具有click、timeout和 complete方法用来响应对应的事件。根据(4)空缺处所在程序段“void Door∷click()”可得,(4)空缺处所填写的内容是“state->click()”。 同理,根据(5)空缺处所在程序段“void Door∷timeout()”可得,(5)空缺处所填写的内容是“state->timeout()”;根据(6)空缺处所在程序段“void Door∷complete()”可得,(6)空缺处所填写的内容是“state->complete()”。 根据(7)空缺处所在程序段给出的注释信息“定义一个基本的Closed状态”和语句“void DoorClosed∷click()”可知,(7)空缺处所填写的内容与传输门当前状态为CLOSED且发生Click事件时状态的迁移有关。结合如图7-16所示中的状态转换关系可知,在Click事件下CLOSED状态将迁移到 OPENING,因此(7)空缺处应该将传输门的状态设置为OPENING。由于Doorstate变量存储了当前其存储的传输门的实例,因此可直接调用其方法setState设置状态。同时考虑到传输门的状态采用类的实例变量表示,故(7)空缺处所填写的内容为“door->setState(door->OPENING)”。

  • 第17题:

    阅读下列说明、图和c++代码。

    [说明]

    某订单管理系统的部分UML类图如下图所示。

    上图中,Product表示产品,ProductList表示产品目录,Order表示产品订单,OrderItem表示产品订单中的一个条目,OrderList表示订单列表,SalesSystem提供订单管理系统的操作接口。

    请完善类Order的成员函数getOrderedAmount()和类SalesSystem的stafistic()方法,各个类的属性及部分方法定义参见下面的C++代码。

    [C++代码]

    class Product { //产品

    private:

    string pid; //产品识别码

    string description; //产品描述

    double price; ///产品单价

    public:

    void setProductPrice(double price); //设置产品单价

    string getProduetld(); //获取产品识别码

    string getProduetDescriprion 0; //获取产品描述

    double getProductPrice0; //获得产品单价

    //其他成员省略

    };

    class ProductList { //产品列表类

    private:

    vector <Product> products;

    public:

    ProductList();

    Product getProductBylndex(int i); //获得产品列表中的第i件产品

    void addProduct(Product t); //在产品列表中加入一件产品

    Product * getProductByID(string pid); //获得识别码为pid的产品指针

    unsigned iht getProductAmount(); //获得产品列表中的产品娄量

    };

    class OrderItem { //订单条目类

    private:

    Product *productPtr; //指向被订购产品的指针

    int quantity; //订购数量

    public:

    OrderItem (Product *,iht);

    Product * getProductptr O; //获得指向被订购产品的指针

    int getQuantity (); //获取被订刚强产品数量

    };

    class Order { //订单类

    private:

    unsigned int orderid; //订单识别号

    vector<Orderltem> items; //订单内容(订单项)

    public:

    Order(unsigned int orderid); //获得识别码为fid的产品在当前订单中被订购的数量

    int getOrderedAmount(string fid);

    void additem(Product *productPtr,unsigned int n); //在订单中增加一个订单项

    };

    class OrderList { //订单列表类

    private:

    vector<Order> orders;


    正确答案:(1)items[k].getProductptr()->getProductId() (2) items [k].getQuantity() (3) catalog.getProductBylndex(k) (4) it != sales. End() 或 it sales.End() (5) it->getOrderedAmount
    (1)items[k].getProductptr()->getProductId() (2) items [k].getQuantity() (3) catalog.getProductBylndex(k) (4) it != sales. End() , 或 it sales.End() (5) it->getOrderedAmount 解析:本题考查C++程序设计及STL的使用。
    从题中可知,类Order的数据成员orderid表示一份订单的识别号,从题目给出的类图中可知,每份订单上可有多个订单项,因此数据成员items是个类型为Orderltem的向量(数组)。类Order的成员函数getOrderedAmount()的功能是在订单中查找指定识别码的产品的订购数量,其定义如下:
    int Order::getOrderedAmount(string tid)
    { for (int k = O; k items.size(); k++) {
    if ((1)== fid)
    return (2) ;
    }
    remm 0;
    }
    对于每个订单项,显然需要取出对应产品的识别号。从以上代码可以看出,变量k用于遍历并索引一份订单中的每个订单项(items[k])。由于Orderltem类提供的成员函数 getProductptr()可获取指向被订购产品的指针,因此可通过“items[k].getProduetptr() ->getProduetld()”获取被订购产品的识别号,若指定的产品识别号等于该订单项的产品识别号,就通过“items[k].getQuantity()”返回该产品被订购的数量。
    类SalesSystem的成员函数statistic()用于统计产品目录中每个产品的订购总量,并打印输出每个产品的识别码、描述、订购总量和订购金额。若要统计产品目录中每个产品的订购总量,需要对3个对象集合进行遍历:产品目录(ProductList)、订单列表 (OrderList)以及Order(需要对订单中的所有订单项进行查询,统计每个订单上所订购的产品的数量)。由此可以得出实现该方法的基本流程:
    ①从产品目录中取出一个产品。对应语句“for(k=0;kcatalog.getProductAmount(); k++)”用于遍历产品目录中的每件产品。由于存放产品目录(产品列表)的数据成员catalog的类型为ProductList,要取得某产品的相关信息,需要通过ProductList类提供的成员函数getProductBylndex(int i)获得产品目录中的第i件产品,因此空(3)处应填入“catalog.getProductBylndex(k)”。
    ②查询给定产品在每份订单中的订购情况。对应的语句“for(it=sales.Begin();
    (4);it++)”用于遍历所有的订单,对于给定产品和订单,可调用订单类Order的成员函数getOrderedAmount(tid)获得识别码为dd的产品在当前订单中被订购的数量。由于类 OrderList提供的方法Begin()、End()分别指向订单列表的第一个元素和最后一个元素之后,而迭代器变量it实际是指向订单列表(向量sales)中某订单的指针,因此空(4)处应填入“it!=sales.End()”或“itsales.End()”,空(5)处填入“it->getOrderedAmount”。

  • 第18题:

    阅读以下说明和C++代码。

    [说明]

    已知类SubClass的getSum方法返回其父类成员与类SubClass成员j的和,类 SuperClass中的getSum为纯虚拟函数。程序中的第23行有错误,请修改该错误并给出修改后的完整结果,然后完善程序中的空缺,分析程序运行到第15行且尚未执行第15行的语句时成员变量j的值,最后给出程序运行后的输出结果。

    [C++代码]


    正确答案:(1)this->j (2)SuperClass∷ 错误更正结果:SuperClass*s=new SubClass(-3); 变量i的值:0 运行结果:-32
    (1)this->j (2)SuperClass∷ 错误更正结果:SuperClass*s=new SubClass(-3); 变量i的值:0 运行结果:-3,2 解析:本题考查的是面向对象程序设计语言C++。
    考查的主要知识点为C++程序设计语言中类成员变量的初始化、父类成员方法的调用、对象的构造等。第一空要求用用参数j的值更新数据成员,由于成员变量名也为i因此需要明确地指出需要更新的变量j为类中的成员变量,可以在前面加上一个明确的前缀this来表示,因此(1)处应填写this->j:(2)处要求调用父类的成员方法getValue(),为了和子类中的getValue()相区别,需要加上域前缀,因此(2)处应该填写SuperClass∷,表明该函数属于类SuperClass;在程序的第23行,由于SuperClass s表明已经定义了一个对象,因此,后面不应该使用new再次分配一个对象,但是后面的程序代码将s作为一个对象指针使用,因此需要将s定义为一个指针,因此更改后结果应为:SuperClass*s= new SubClass(-3);当程序运行到第15行但是还没有执行15行的语句时,成员变量i的值应为构造函数初始化列表中指定的j的初始化值,本题目为0:最后程序的输出为-3和 2,-3为子类中成员变量j的值,而2表示父类中i的值和子类中i的值的和。

  • 第19题:

    阅读下列说明和c++代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都

    有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌

    灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。Command模式

    的类图如图5-1所示。

    【c++代码】

    }


    正确答案:
    本题考查命令(Command)模式的基本概念和应用。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者之间通常呈现一种紧耦合的关系。但在某些场合,比如要对行为进行记录撤销重做事务等处理,这种无法抵御变化的紧耦合是不合适的。这种情况下,使用Command模式将行为请求者与行为实现者进行解耦。题目中给出了Command模式的类图,其中:Command类为所有命令声明了一个接口。调用命令对象的execute()方法,就可以让接收者进行相关的动作。ConcreteCommand类定义了动作和接收者之间的绑定关系。调用者只要调用execute()就可以发出请求,然后由ConcreteCommand调用接收者的一个或多个动作。Invoker持有一个命令对象,并在某个时间点调用命令对象的execute()方法,将请求付诸实行。Receiver知道如何进行必要的工作,实现这个请求。任何类都可以当接收者。了解了Command模式的内涵之后,下面来看程序。由于Command类的主要作用是为所有的ConcreteCommand定义统一的接口,在c++中通常采用抽象类来实现。C++的抽象类是至少具有一个纯虚拟函数的类。本题中的接口就是execute()方法,所以(1)处要求填写的是纯虚拟函数cxecute的定义方式,即vifrualvoidexecute()=0。类LightOnCammand、LightOfiCommand对应的就是模式中的ConcreteCommand;ConcreteCommand中execute()方法的代码在类图中已经给出,现在需要确定recelver是谁。类Light充当的是Receiver,其中定义了两种action:on和off.所以(2)、(3)对应代码分别为light->on()、light->off()。类RemoteControl对应的是模式中的Invoker,在该类中设置需要控制的命令对象。(4)处对应的代码为onCommands[slot],设置“开灯”命令对象;(5)处对应的代码为affcommands[slot].设置‘关灯”命令对象。类RemoteControl中的方法onButtanWasPushed和offlButtonWasPushed,分别完成对开灯、关灯命令对象的execute方法的调用,所以(6)、(7)处分别对应代码onCommands[slot]->execute()、offCommands[slot]->execute()。试题五参考答案(1)virtualvoidexecute()=0(2)light->on()(3)light->off()(4)onCommands[slot](5)offCommands[slot](6)onCommands[slot]->execute()(7)offCommands[slot]->execute()

  • 第20题:

    阅读以下C++代码,回答问题(1)~(5),将解答填入答题纸的对应栏内。【说明】以下C++代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instrument)进行演奏和调音等操作。对部分乐器进行建模,其类图如题6-1所示,包括:乐器(Instrument)、打击乐器(Percussion)、弦乐器(Stringed)、管乐器(Wind)、木管乐器(Woodwind)、铜管乐器(Brass)。




    答案:
    解析:
    (1)Virtul void play(Note n)=0(2)Public Instrument (3)Public Wind(4)Vector(5)Music*
    【解析】

    1空定义虚方法23空用extends继承对应的类4用容器向量创建Instrument的个各类5创建Music对象

  • 第21题:

    阅读下列说明和C++代码,回答问题,将解答填入答题纸的对应栏内。
    【说明】某航空公司的会员积分系统将其会员划分为:普卡 (Basic)、银卡(Silver)和金卡 (Gold) 三个等级。非会员 (NonMember) 可以申请成为普卡会员。会员的等级根据其一年内累积 的里程数进行调整。描述会员等级调整的状态图如图 5-1 所示。现采用状态 (State) 模式实现上述场景,得到如图 5-2 所示的类图。




    【问题1】(15分)阅读上述说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。


    答案:
    解析:
    注意:原版的题目应该是Cbasic、CSilve。(1) virtual double travel(int miles,FrequentFlyer* context)=0(2)context->setState(context->Cbasic)(3)context->setState(context->CSilve)(4)context->setState(context->Cbasic)(5)context->setState(context->CSilve)

  • 第22题:

    阅读下列说明和C++代码,将应填入
    (n)
    处的字句写在答题纸的对应栏内。
    【说明】
      某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表5-1所示。表5-1



     为支持将来模拟更多种类的飞机,采用策略设计模式(Strategy)设计的类图如图5-1所示。



    图5-1中,AirCraft为抽象类,描述了抽象的飞机,而类Helicopter、AirPlane、Fighter和Harrier分别描述具体的飞机种类,方法fly()和takeOff()分别表示不同飞机都具有飞行特征和起飞特征;类FlyBehavior与TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类SubSonicFly与SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。 【C++ 代码】 #include


    答案:
    解析:
    (1)FlyBehavior*flyBehavior      
    (2)TakeOffBehavior*takeOffBehavior

  • 第23题:

    阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】 某文件管理系统中定义了类OfficeDoc和DocExplorer,当类OfficeDoc发生变化时,类DocExplorer的所有对象都要更新其自身的状态,现采用观察者(Observer)设计模式来实现该需求,所设计的类图如图6-1所示。



    答案:
    解析:
    1: void update()2: Observer3: obs.update()4: Subject5: Attach(this)