试题五(共15分)阅读以下说明和C++代码,填补C++代码中的空缺(1)~(6),将解答写在答题纸的对应栏内。【说明】已知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放(每年按52周计算);另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。下面是实现该工资系统的C++代码,其中定义了四个类:工资系统类PayRoll,员工类Employee,正式工类Salaried和计时工类Hourly,Salaried和Hourly是Emp

题目

试题五(共15分)

阅读以下说明和C++代码,填补C++代码中的空缺(1)~(6),将解答写在答题纸的对应栏内。

【说明】

已知某公司按周给员工发放工资,其工资系统需记录每名员工的员工号、姓名、工资等信息。其中一些员工是正式的,按年薪分周发放(每年按52周计算);另一些员工是计时工,以小时工资为基准,按每周工作小时数核算发放。

下面是实现该工资系统的C++代码,其中定义了四个类:工资系统类PayRoll,员工类Employee,正式工类Salaried和计时工类Hourly,Salaried和Hourly是Employee的子类。

【C++代码】

//头文件和域名空间略

const int EMPLOYEE_NUM=5;

class Employee{

protected:

int empCode; ∥员工号

string name; ∥员工姓名

double salary; ∥周发放工资

public:

Employee( const int empCode, const string &name){

this->empCode= empCode; this->name= name;

}

virtual~Employee(){}

virtual void pay()=0;

double getSalary(){ return this->salary; }

};

class Salaried (1){

private: double payRate; //年薪

public:

Salaried(const int empCode,const string &name,double payRate)

:Employee(empCode,name){

this->payRate= payRate;

}

void pay(){

this->salary=(2) ;//计算正式员工的周发放工资数

cout<<this->name<<":"<<this->salary<<endl;

}

};

class Hourly (3) {

private:

double payRate; //小时工资数

int hours; //周工作小时数

public:

Hourly(const int empCode, const string &name, int hours, double payRate)

:Employee(empCode,name){

this->payRate= payRate; this->hours= hours,

}

void pay(){

this->salary= (4) ;//计算计时工的周发放工资数

cout<<this->name<<":"<<this->salary<<endl;

}

};

class PayRoll{

public:

void pay(Employee* e[]){

for (int i=0;i<EMPLOYEE_ NUM; i++){

e[i]->pay();

}

}

};

int main(){

PayRoll* payRoll= new PayRoll;

(5)employees[EMPLOYEE_ NUM]={

new Salaried(l00l,"Zhang San", 58000.00),

//此处省略对其他职工对象的生成

new Hourly(1005,"L1", 12, 50.00),

};

payRoll->pay ( (6) );

double total= 0.0;

for (int i=0;i< EMPLOYEE_NUM; i++)

{ total+=employees[il->getSalary(); } //统计周发放工资总额

cout<<"总发放额="<<total<<endl;

delete payRoll; retum 0;

}


相似考题
更多“试题五(共15分)阅读以下说明和C++代码,填补C++代码中的空缺(1)~(6),将解答写在答题纸的对应栏内。 ”相关问题
  • 第1题:

    请认真阅读以下关于某传输系统的技术说明、状态转换图及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)”。

  • 第2题:

    阅读以下关于软件测试的说明,回答司题l至问题3,将解答填入答题纸的对应

    栏内。

    【说明】

    使用在汽车、飞机中的嵌入式软件, 日于直接影响人的生命及财产安全,测试要求

    更为严格。语句覆盖、判定覆盖、条件覆盖和MC/DC覆盖是通常对这类软件的要求。

    以下是一段C语言代码,请仔细阅读并回答相关问题:

    【问题1】(6分)

    请根据测试要求,简要说明语句覆盖、判定覆盖、条件覆盖和MC/DC覆盖的含义。

    将答案填写在答题纸的对应栏中。

    【问题2】(5分)

    画出以上代码的流程图,将答案填写在答题纸的对应栏中。

    【问题3】(4分)

    请根据【说明】中的C语言代码,计算满足MC/DC覆盖要求的用例数量及条件取

    值范围,将答案填写在答题纸的对应栏中.


    正确答案:
    试题三分析
    本题考查嵌入式软件测试的基本知识.
    语句覆盖要求设计足够多的测试用例,运行被测程序,使得程序中每条语句至少被
    执行一次。定覆盖(分支覆盖)要求设计足够多的测试用例,运行被测程序,使得程序
    中的每个判断的“真”和“假”都至少被执行一次。条件覆盖要求设计足够多的测试用
    例,运行被测程序,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一
    次为真值,有一次为假值。MC/DC覆盖要求每个条件的取值都有覆盖,每个判定值都有
    覆盖且每个条件都能独立影响判定结果,各覆盖率的含义如表2.5所示。

    【问题2]
    本问题考查程序流程图的画法。注意开始、结束的符号。
    根据源代码,程序流程图如下。

    【问题3]
    本问题考查MC/DC覆盖率判定的综合运用。
    MC/DC与代码中的逻辑运算有关。本题代码中的逻辑运算为x>0&&y>0。根据
    MC/DC的定义,MC/DC覆盖要求每个条件的取值都有覆盖,每个判定值都有覆盖且每
    个条件都能独立影响判定结果。对于a&&b这样的逻辑运算,真值表如下。

    对测试用例1和测试用例2,条件a不变,因为条件b的不同而导致结果的不同,
    因此条件b独立影响判定的结果。对测试用例2和测试用例3,因为条件b不变,条件a
    的不同而导致结果的不同,因此条件a独立影响判定的结果。综合以上,对逻辑运算a&&
    b应产生三个测试用例,包括:(True,False)、(True,True)、(False,True)。
    所以本题用例数量:3个;条件取值范围:(x>0andy<=0)、(x<=0andy>0)及(x>0
    andy>0)。
    参考答案

    【问题2]
    【问题3]
    用例数量:3个;
    条件取值范围:
    (x>0andy<=0)、(x<=0andy>0)及(x>0andy>0)

  • 第3题:

    阅读以下说明和Java程序,填补代码中的空缺(1)~(6),将解答填入答题纸的

    对应栏内。

    【说明】

    很多依托扑克牌进行的游戏都要先洗牌。下面的Java代码运行时先生成一副扑克

    牌,洗牌后再按顺序打印每张牌的点数和花色。

    【Java代码】


    正确答案:
    本题考查Java语言程序设计的能力,涉及类、对象、方法的定义和相关操作。要求考生根据给出的案例和代码说明,认真阅读,理清程序思路,然后完成题目。先考查题目说明。本题目中涉及到扑克牌、牌桌、玩家等类以及洗牌和按点数排序等操作。根据说明进行设计。Card类内定义了两个static枚举类型,Face枚举扑克牌点数,Suit枚举扑克牌花色。Card类有两个枚举类型的属性,face和suit,而且值不再变化,故用final修饰。在使用构造方法publicCard(Faceface,Suitsuit)新建一个Car:d的对象时,所传入的参数指定face和suit这两个属性值。因为参数名称和属性名称相同,所以用this前缀区分出当前对象。在类Card中包含方法getFace()和getSuit(),分别返回当前对象的face和suit属性值。getCard()方法返回string来表示一张牌,包括扑克牌点数和花色。牌桌类Deckofcands包含持有Card类型元素的List类型对象的声明List,用以存储牌。List是Java中的一种集合接口,是Collection的子接口。构造方法中用Card对象填充牌桌并进行洗牌。先用Card对象填充牌桌,即创建52个Card对象加入deck数组,表示牌桌上一副牌(52张)。然后洗牌,即将数组中的Card对象根据花色和点数随机排列,使用集合工具类Collechons中的shuffle方法,对以List类型表示的deck数组进行随机排列。Collectians是Java集合框架中两个主要工具类之一,用以进行集合有关的操作。printCards()方法将所有Card对象打印出来,按4列显示52张牌。每张拍的打印用list.get(i)获得list表示的deck中的第i个Card对象,然后进一步调用此对象的getCard()方法,得到String表示的当前一张牌。玩家类中包括启动发牌洗牌等操作,主入口方法main中实现创建牌桌对象,并调用按4列显示52张牌。在main()中,先初始化Deckofcards类的对象player,即生成一个牌桌:Deckofcardsplayer=newDeckofcards()并发牌,即调用player的printCards()方法,实现按4列显示52张牌打印一副扑克牌中每张牌的点数和花色。在pnntCards()方法体内部,用list调用每个数组元素,井为每个数组元素调用getCard()返回当前对象所表示一张牌的花色和点数。用格式化方法进行打印,即:因此,主(1)和(2)需要表示当前对象的this.;空(3)需要牌桌上纸牌对象,并将数组元素下标加1,即数组元素deck[count++];空(4)也需要用list对象获得纸牌对象的字符串表示,即list后的get(1)getCard();空(5)处为创建DeckOf℃ards类的对象指针player的newDeckOfCards();空(6)需要用对象player调用打印所有纸牌的printCards()函数,即player.。试题六参考答案(l)this(2)this.(3)deck[count++]或等价表示(4)get(i)getCard()(5)newDeckOfCards()(6)player.

  • 第4题:

    试题三(共 15 分)

    阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


    正确答案:

  • 第5题:

    从下列2道试题(试题五至试题六)中任选 1道解答。如果解答的试题数超过1道,则题号小的1道解答有效。

    试题五(共15分)

    阅读以下说明、图和C++代码,填补C++代码中的空缺(1)~(5),将解答写在答题纸的对应栏内。

    【说明】

    已知对某几何图形绘制工具进行类建模的结果如图5.1所示,其中Shape为抽象类(应至少包含一个纯虚拟( virtual)函数),表示通用图形,Box表示矩形,Ellipse表示椭圆,Circle表示圆(即特殊的椭圆),Line表示线条。

    下面的C++代码用于实现图5-1所给出的设计思路,将其空缺处填充完整并编译运行,输

    出结果为:

    Ellipse

    Circle

    Ellipse

    C

    E

    【C++代码】

    include <string>

    include <iostream>

    using namespace std;

    class Shape{

    public:

    Shape(const string& name){

    m_name= name;

    }

    ~Shape(){}

    (1) void paint() = 0;

    stringgetName()const {

    retumm name;

    }

    Private:

    string m_name;

    };

    //Box和 Line类的定义与 Ellipse类似,其代码略

    classEllipse (2) {

    public:

    Ellipse(const string& name) : Shape(name){ cout<<"Ellipse" <<endl; }

    Voidpaint() { cout<<getName()<<endl;}

    };

    classCircle (3) {

    public:

    Circle(const string& name) : Ellipse(name){ cout<<"Circl"<<endl; }

    };

    class Diagram {

    public:

    void drawAShap(Shape* shape){ shape->paint(); }

    void drawShapes() {

    shapes[0] = new Circle("C");

    shapes[l] = new Ellipse("E");

    for (int i=O;i<2; ++1) {

    drawAShap(shapes[i]);

    }

    }

    void close (){ /*删除形状,代码略 */ }

    private:

    Shape* shapes[2];

    };

    int main( )

    {

    Diagram* diagram = (4)

    diagram->drawShapes();

    diagram->close ();

    (5) diagram;

    }


    正确答案:
    试题五分析
    本题考查C++语言程序设计的能力,涉及类和抽象类、对象、函数和虚函数的定义和相关操作,以及继承关系。要求考生根据给出的案例和执行过程说明,认真阅读理清程序思路,然后完成题目。
    先考查类图整体结构。本题中根据类图定义了类:Diagram、Shape、 Box、 Ellipse、Line和Circle。其中Shape为抽象类,表示通用图形,抽象类中应至少包含一个纯虚拟( virtual)函数。Box表示矩形,Ellipse表示椭圆,Line表示线条,三者都是Shape的子类,继承了Shape类,Circle表示圆(即特殊的椭圆),继承了Ellipse。抽象类Shape的定义中,需要通过使用virtual标识虚函数,void paint()=0;表示paint()是纯虚函数,其定义前必须添加virtual进行表示。类Ellipse为Shape的子类,Circle为Ellipse的子类,需要在代码中体现出继承。另外,在子类的构造函数中,调用父类的构造函数,所以继承的权限为public。其语法为:public后加类名。
    类Diagram中没有定义构造函数,编译器生成一个缺省的构造函数,调用是采用new关键字加类名。使用完成之后,通过delete进行释放。
    因此空(1)需要表现出paint()函数为纯虚函数,即为virtual;空(2)和空(3)处添力口继承父类,并且权限为public,即为:public Shape和:public Ellipse;空(4)处补充通过使用编译器生成的缺省构造函数创建对象,即new Diagram;空(5)处通过delete释放new创建的对象diagram。
    参考答案
    (1) virtual
    (2):public Shape
    (3): public Ellipse
    (4) new Diagram
    (5) delete

  • 第6题:

    阅读下列说明和 C ++代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某软件公司欲开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎急刹车时在路面上留 下的不同痕迹,并考虑后续能模拟更多种轮胎急刹车时的痕迹。现采用策略(Strategy)设计模式来实现该需求,所设计的类图如图 6-1 所示。

    【C++ 代码】#includeusing namespace std;class BrakeBehavior{public:(1) ; /*其余代码省略*/};class LongWheelBrake : public BrakeBehavior{public:void stop(){cout <<"模拟长轮胎刹车痕迹! "<< end1;} /*其余代码省略*/};class ShortWheelBrake : public BrakeBehavior{public:void stop(){cout<"模拟短轮胎刹车痕迹! "<< end1;} /*其余代码省略*/};class Car{protected: (2) wheel;public:void brake(){ (3) ; } /*其余代码省略*/};class ShortWheelCar : public Car{public:ShortWheelCar(BrakeBehavior* behavior){ (4);} /*其余代码省略*/};int main(){BrakeBehavior* brake= new ShortWheelBrake();ShortWheelCar car1(brake):car1. (5) ;return 0;}


    答案:
    解析:
    1. virtual void stop( )=02. BrakeBehavior*3. Wheel->stop( )4. wheel=behavior5. brake( )

  • 第7题:

    阅读下列说明和C++代码,填写程序中的空(1)~(6),将解答写入答题纸的对应栏内。 【说明】以下C++代码实现一个简单绘图工具,绘制不同形状以及不同颜色的图形。部分类及其关系如图6-1所示。

    【C++代码】#include #include using namespace std;class DrawCircle { //绘制圆形,抽象类 public: (1) ;//定义参数为 int radius, int x, int y virtual~DrawCircle() { }}; class RedCircle:public DrawCircle { //绘制红色圆形 public: void drawCircle(int radius, int x, int y) { cout << "Drawing Circle[red,radius: " < drawCircle = drawCircle; } virtual~shape() { } public: virtual void draw() = 0;}; class Circle:public Shape { //圆形 private: int x,y,radius; public: Circle(int x,int y,int radius,DrawCircle *drawCircle) (3) { this->x = x; this->y = y; this->radius = radius; } public: void draw() { drawCircle -> (4) ; }}; int main(){ Shape *redCircle=new Circle(100,100,10, (5) );//绘制红色圆形 Shape *greenCircle=new Circle(100,100,10, (6) );//绘制绿色圆形 redCircle ->draw(); greenCircle ->draw(); return 0;}


    答案:
    解析:
    (1)void drawCircle (int radius,int x,int y)(2)DrawCircle*drawCircle(3)drawcircle(4)drawCircle(radius,x,y)(5)new redCircle()(6)new greenCircle()
    【解析】

    第一空是填接口里面的方法,在接口的实现里面找,可以发现应该填void drawCircle (int radius,int x,int y)。第二空可以根据后面this drawCircle=drawCircle判断,这里应该有一个drawCircle属性,因此应该填)DrawCircle drawCircle。第三空这里填drawcircle,用-> drawcircle来引用父类的成员。第四空调用drawCircle(radius,x,y)方法。第五、六空分别创建一个红色圆形对象和一个绿色圆形对象作为Circle里面的实参。

  • 第8题:

    试题六(共 15 分)阅读下列说明和 C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下 C++代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户 (User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。 类图如图 6-1 所表示。

    【C++代码】#include#include using namespace std; class User {private:string name; public:User(string name){ (1) =name;}~User(){}
    void setName(string name) {this->name=name; } string getName(){return name;}void sendMessage(string message); }; class ChatRoom { . public:static void showMessage(User* user, string message) { cout<<"["<getName()"] : "< zhang->sendMessage("Hi! Leo!");li_>sendMessage("Hi! John!"); }void join(User* user) { (3) ("HeIIoEveryone!l am"+user->getName()); . ;} . };int main(){ChatRoomSystem*crs= (4) ; crs->startup();crs->join( (5) ("Wayne")); delete crs; }/* 程序运行结果: [John]:Hi! Leol [Leo]:Hi! John![Wayne】:Hello Everyone!Iam Wayne/*


    答案:
    解析:
    1、this->name
    2、ChatRoom::showMessage
    3、user->sendMessage
    4、new ChatRoomSystem()
    5、new User

  • 第9题:

    阅读以下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对象

  • 第10题:

    阅读以下说明和流程图,填写流程图中的空缺,将解答填入答题纸的对应栏内。【说明】设[a1b1],[a2b2],...[anbn]是数轴上从左到右排列的n个互不重叠的区间(a1


    答案:
    解析:
    1.A2.ai3.bi4.A 、B5.B
    【解析】

    若A≤ai则输出A,反之输出ai。若A≤bi不满足则输出bi,依次类推。

  • 第11题:

    阅读下列说明,回答问题1和问题2,将解答写在答题纸的对应栏内。
    【说明】
    Windows 系统的用户管理配置中,有多项安全设置,如图2-1 所示。





    答案:
    解析:
    【问题1】(3分)属于账号策略。 账户策略主要包括密码策略和账户锁定策略两种安全设置。
    【问题 2】(3分)Abcd321 test123! 123@host 密码必须符合复杂性要求:启用此策略,用户账户使用的密码必须符合复杂性的要求。 密码复杂性必须符合下列最低要求: 不能包含用户的账户名; 不能包含用户姓名中超过两个连续字符的部分; 至少有六个字符长; 密码总必须包含一下4类字符中的三类字符: 1、英文大写字母(A-Z) 2、英文小写字母(a-z) 3、10个基本数字(0-9) 4、特殊符号(!@#¥%等)

  • 第12题:

    阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
    【说明】
    以下C++代码实现一个超市简单销售系统中的部分功能,顾客选择图书等物品(Item)加入购物车(ShoppingCart),到收银台(Cashier)对每个购物车中的物品统计其价格进行结账,设计如图6-1所示类图。



    【C++代码】
    using namespace std;class Book;class Visitor {public: virtual void visit(Book* book)=0; //其它物品visit方法}; class Item {public:virtual void accept(Visitor* visitor)=0; virtual doublegetPrice()=0;};class Book (1){private: double price;public: Book (double price){ //访问本元素 (2); } void accept(Visitor* visitor) { (3); }double getPrice(){ returnprice; }};class Cashier(4){private; double totalForCart;public: //访问Book类型对象的价格并累加 (5){ //假设Book类型的物品价格超过10元打8折 if(book->getPrice()getPrice(); } else totalForCart+=book->getPrice()*0.8; } //其它visit方法和折扣策略类似,此处略 double getTotal() { return totalForCart; }};class ShoppingCart {private: vectoritems;public: double calculatePrice() { Cashier* visitor=new Cashier(); for(int i=0;i getTotal(); return total; } void add(Item*e) { items.push_back(e); }};


    答案:
    解析:
    (1):public Item
    (2)this->price=price
    (3)visitor->visit(this)
    (4)public visitor
    (5)void visit(Book*book)
    (6)item->accept(visitor)
    【解析】
    这里考察的是访问者模式。其定义如下:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作

  • 第13题:

    阅读下列说明和C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 ‘ 以下C++代码实现一个简单的聊天室系统(ChatRoomSystem),多个用户(User)可以向聊天室(ChatRoom)发送消息,聊天室将消息展示给所有用户。类图如图6-1所表示。图6-1 类图

    【C++代码】 include<iostream> include <string> using namespace std; class User { private: string name; public: User(string name){ (1) =name; } ~User(){} void setName(string name) { this->name=name; } string getName(){ return name; } void sendMessage(string message); }; class ChatRoom { . public: static void showMessage(User* user, string message) { cout<<"["<<user->getName()<<"] : "<<message<<endl; } }; void User::sendMessage(string message) { (2) (this,message); } class ChatRoomSystem{ public: . . void startup() { User* zhang = new User(“John"); User* li = new User("Leo"); zhang->sendMessage("Hi! Leo!"); li_>sendMessage("Hi! John!"); } void join(User* user) { (3) ("HeIIo Everyone! l am"+user->getName()); } . }; int main(){ ChatRoomSystem*crs= (4) ; crs->startup(); crs->join( (5) ("Wayne")); delete crs; } /* 程序运行结果: [John]:Hi! Leo! [Leo]:Hi! John! [Wayne]:Hello Everyone! I am Wayne /*


    正确答案:1、this->name
    2、ChatRoom::showMessage
    3、user->sendMessage
    4、new ChatRoomSystem()
    5、new User

  • 第14题:

    阅读下列说明、c++代码和运行结果,填补代码中的空缺(1)~(6),将解答填入

    答题纸的对应栏内。

    【说明】

    很多依托扑克牌进行的游戏都要先洗牌。下面的c++程序运行时先生成一副扑克牌,

    洗牌后再按顺序打印每张牌的点数和花色。

    【c++代码】

    inciude <iostream>

    4Finclude <stdlib. h>

    include <ctime>

    inciude <aigorithm>

    include <string>

    Using namespace std

    Const string Rank[13]={”A”,”2”,”3”,”4“,“5”,”6,”’“7”8“,9”,”10,”J”,

    ”Q”,”K”}j//扑克牌点数


    正确答案:
    分析本题考查c-++语言程序设计能力,涉及类、对象、函数的定义和相关操作。要求考生根据给出的案例和代码说明,认真阅读,理清程序思路,然后完成题目。本题目中涉及到扑克牌、牌桌等类以及洗牌和按点数排序等操作。根据说明进行设计。定义了两个数组,Rank表示扑克牌点数,Suits表示扑克牌花色,定义时进行初始化,而且值不再变化,故用const修饰。Card类有两个属性,rank和suit,在使用构造函数Card(intrankintsuit)新建一个Card的对象时,所传入的参数指定rank和suit这两个属性值。因为参数名称和属性名称相同,所以用this->前缀区分出当前对象。在类Card中包含方法getRank()和getSuit(),分别返回当前对象的rank和suit属性值。printCard()函数打印扑克牌点数和花色。DeckOfCards类包含Card类型元素的数组deck[52],表示牌桌上一副牌(52张)。构造函数中对牌桌进行初始化并进行洗牌。先用Card对象填充牌桌,即创建52个Card对象并加入deck数组。然后洗牌,即将数组中的Card对象根据花色和点数随机排列。printCards0函数将所有Card对象打印出来。主控逻辑代码在main函数中实现。在main()函数中,先初始化DeckOfcards类的对象指针d,即生成一个牌桌:Deckofcards*d=newdeckofcards()并发牌,即调用d的printCards()函数,实现打印一副扑克牌中每张牌的点数和花色。在printCards()函数体内部,为每个数组元素调用当前对象的pnntCard()一张牌。Main()函数中使用完数组对象之后,需要用delete操作进行释放对象,对d对象进行删除,即deleted。因此,空(1)和(2)需要表示当前对象的this->;空(3)需要牌桌上纸牌对象,即数组元素deck[i]:空(4)也需要纸牌对象调用printCard(),即数组元素deck[i].:空(5)处为创建DeckOfCards类的对象指针d的newDeckofcards0;空(6)需要用对象指针d调用打印所有纸牌的pnntCards()函数,即d->printCards0.试题五参考答案(1)this->(2)this->(3)deck[i]或*(deck+i)或等价表示(4)deck[i]或*(deck+i)或等价表示(5)newDeckOfCards()(6)d->printCards0或等价表示

  • 第15题:

    阅读下列说明和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()

  • 第16题:

    试题六(共 15 分)

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

    [说明]

    C++标准模板库中提供了 vector 模板类,可作为动态数组使用,并可容纳任意数据类型,其所属的命名空间为 std。vector模板类的部分方法说明如下表所示:

    [C++代码]

    include <iostream>

    include <vector>

    using namespace (1) ;

    typedef vector< (2) > INTVECTOR;

    const int ARRAY_SIZE = 6;

    void ShowVector(INTVECTOR &theVector);

    int main(){

    INTVECTOR theVector;

    // 初始化 theVector,将 theVector的元素依次设置为 0 至 5

    for (int cEachItem = 0; cEachItem < ARRAY_SIZE; cEachItem++)

    theVector.push_back( (3) );

    ShowVector(theVector); // 依次输出 theVector中的元素

    theVector.erase(theVector.begin() + 3);

    ShowVector(theVector);

    }

    void ShowVector(INTVECTOR &theVector) {

    if (theVector.empty()) {

    cout << "theVector is empty." << endl; return;

    }

    INTVECTOR::iterator (4) ;

    for (theIterator = theVector.begin(); theIterator != theVector.end(); theIterator++){

    cout << *theIterator;

    if (theIterator != theVector.end()-1) cout << ", ";

    }

    cout << endl;

    }

    该程序运行后的输出结果为:

    0, 1, 2, 3, 4, 5

    (5)


    正确答案:


  • 第17题:

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

    【说明】

    在下面的C++代码中,类SalesTicket能够完成打印票据正文的功能,类HeadDec- orator与FootDecorator分别能够完成打印票据的台头和脚注的功能。

    已知该程序运行后的输出结果如下所示,请填补该程序代码中的空缺。

    这是票据的台头!

    这是票据正文!

    这是票据的脚注!

    ---------------

    这是票据的台头!

    这是票据的脚注!

    【C++程序代码】

    #include

    using namespace std;

    class SalesTicket {

    public:

    (1) printTicket() { cout << " 是票据正文!" << endl;}

    class Decorator : public SalesTicket{

    SalesTicket *ticket;

    public:

    Decorator(SalesTicket *t){ ticket = t; }

    void printTicket(){

    if(ticket != NULL)

    ticket->printTicket();

    }

    };

    class HeadDecorator : public Decorator{

    public:

    HeadDecorator(SalesTicket *t): (2) { }

    void printTicket() {

    sour << "这是票据的台头!" << endl;

    Decorator::printTicket();

    }

    };

    class FootDecorator :public Decorator{

    public:

    FootDecorator(SalesTicket *t): (3)

    void printTicket() {

    Decorator::printTicket();

    cout << "这是票据的脚注!" << endl;

    }

    };

    void main(void) {

    SalesTicket t;

    FootDecorator f(&t);

    HeadDecorator h( (4) );

    h.printTicket();

    cout << "-------------------------"<< endl;

    FootDecorator a(NULL);

    HeadDecorator b( (5) );

    b.printTicket();

    }


    正确答案:(1)virtual void (2)Decorator(t) (3)Decorator(t) (4)&f (5)&a
    (1)virtual void (2)Decorator(t) (3)Decorator(t) (4)&f (5)&a 解析:本题实际上使用了设计模式中的Decorator模式。
      从代码可以分析得出,类SalesTicket完成了票据正文的输出,FootDceorator和 HeadDecorator类都继承了Decorator,Decorator继承SalesTicket,FootDecorator和HeadDe- corator类在构造函数的时候都需要对其父类进行初始化,因此,空(2)和(3)应为 Decorator(t);这些类中都具有printTicket方法,根据SalesTicket类中方法的定义可以得出,此方法的返回值为void类型,分析主程序中h.printTicket()可以输出“这是票据的台头!这是票据正文!这是票据的脚注!”的结果,并且考虑到h.printTieket()的执行路径为先执行cout<<"这是票据的台头!"<

  • 第18题:

    阅读下列说明和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参数,

  • 第19题:

    阅读以下C代码,回答问题1和问题2,将解答填入答题纸的对应栏内。【C代码1】


    【问题2】写出【代码2】的运行时的输出结果。


    答案:
    解析:
    (1)输入-1331的结果是:Palindromic number.a=-1331 b=1331 输入795的结果是:a=795 b=597(2) Passed,point=4 Passed,point=1 Passed,point=1Passed,point=1 Failed

  • 第20题:

    试题六(共 15 分)阅读下列说明和 C++代码,填补代码中的空缺,将解答填入答题纸的对应栏内。【说明】以下 C++代码实现一个简单客户关系管理系统(CrM)中通过工厂(Customerfactory)对象来创建客户(Customer)对象的功能。客户分为创建成功的客户(realCustomer)和空客户(NullCustomer)。空客户对象是当不满足特定条件时创建或获取的对象。类间关系如图6-1 所示。

    【C++代码】#include#includeusing namespace std; class Customer{protected:string name;public:(1) boll isNil()=0;(2) string getName()=0;﹜; class realCustomer (3){public:realCustomer(string name){this->name=name;﹜bool isNil(){ return false;﹜string getName(){ return name;﹜﹜; class NullCustomer (4) {public:bool isNil(){ return true;﹜string getName(){ return 〝Not Available in Customer Database〞; ﹜﹜;class Customerfactory{public:string names[3]={〝rob〞, 〝Joe〞,〝Julie〞﹜;public:Customer*getCustomer(string name){for (int i=0;i<3;i++){if (names[i].(5) ){return new realCustomer(name);﹜﹜return (6);﹜﹜; class CrM{public:void getCustomer(){Customerfactory*(7);Customer*customer1=cf->getCustomer(〝rob〞);Customer*customer2=cf->getCustomer(〝Bob〞);Customer*customer3=cf->getCustomer(〝Julie〞);Customer*customer4=cf->getCustomer(〝Laura〞); cout<<〝Customers〞<getName() <getName() <getName() <getName() <getCustomer();delete crs;return 0;﹜ /*程序输出为:CustomersrobNot Available in Customer DatabaseJulieNot Available in Customer Database*/


    答案:
    解析:
    1)virtual2)virtual3):public Customer4):public Customer5)compare(name)==06)new Null Customer()7)cf=New CustomerFactory();
    【解析】

    本题考察使用C++代码实现实际问题。在C++中,动态绑定是通过虚函数来实现的。此题中用到了虚函数,所以要在成员函数原型缺钱加一个关键字virtual。类RealCustomer和类NullCustomer是类Customer的派生类,因此3、4空都填public Customer。进行对比数据库中的人名compare(name)==0第6空与前面语句是相反的,一个是返回new RealCustomer(name),那么此处应填:new Null Customer()第7空,用工厂创建对象,cf=New CustomerFactory();

  • 第21题:

    阅读下列说明,补充(1)-(9),将解答填入答题纸的对应栏内。


    答案:
    解析:

  • 第22题:

    阅读以下说明,回答问题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的部分代码,请仔细阅读该段代码,将空缺代码补齐。



    答案:
    解析:


  • 第23题:

    阅读下列说明和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)

  • 第24题:

    阅读下列说明和?C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    阅读下列说明和?Java代码,将应填入?(n)?处的字句写在答题纸的对应栏内。
    【说明】
    某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种
    类可能不同,但其制作过程相同。前台服务员?(Waiter)?调度厨师制作套餐。现采用生成器?(Builder)?模式实现制作过程,得到如图?6-1?所示的类图。






    答案:
    解析: