软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷6

0
收藏   分享
  • 卷面总分:75分
  • 试卷类型:模拟考试
  • 测试费用:免费
  • 答案解析:是
  • 练习次数:77次
  • 作答时间:150分钟
试卷简介
试卷预览
1

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

 【程序说明】

 对于一个公司的雇员来说,无非有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,(1.) ,bouns(theBouns) { }

   float getBouns0 const { return bouns; }

   float pay(float hoursWorked) const

   return (2);

 }

 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 (3); }

  protected:,

   string name;   &

1

阅读下列算法说明和算法,将应填入(n)的字句写在答题纸的对应栏内。

 【说明】

 下列最短路径算法的具体流程如下:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通网的最小生成树。该算法的基本思想是:为使生成树上总的权值之和达 到最小,则应使每一条边上的权值尽可能地小,自然应从权值最小的边选起,直至选出n-1条互不构成回路的权值最小边为止。

【算法】

 /*对图定义一种新的表示方法,以一维数组存放图中所有边,并在构建图的存储结构时将它构造为一个“有序表”。以顺序表MSTree返回生成树上各条边。*/

 typedef strnct{

  VertexType vex 1;

  VertexType vex2;

  VRType weight;

 }EdgeType;

 typedef ElemType EdgeType;

 typedefstruct {              // 有向网的定义

  VertexType vexs[MAX_VERTEX_NUM];      // 顶点信息

  EdgeType edge[MAX_EDGE_NUM];     // 边的信息

  Mt vexnum,arcnum;              // 图中顶点的数目和边的数目

    }ELGraph;

 void MiniSpanTree_Kruskal(ELGraph G, SqList& MSTree){

 //G.edge 中依权值从小到大存放有向网中各边

 // 生成树的边存放在顺序表 MSTree 中

 MFSet F;

   InitSet(F, G.vexnum);             // 将森林 F 初始化为 n 棵树的集合

  InitList(MSTree, G.vexaum);           // 初始化生成树为空树

     i=O; k=l;

     while( k<(1)) {

       e = G.edge[i];           // 取第i条权值最小的边

       rl = fix_mfset(F, LocateVex(e.vexl));

       r2 =(2)          // 返回两个顶点所在树的树根

       if(ri (3) r2){        // 选定生成树上第k条边

        if (Listlnsert(MSTree, k, e)) (4);   // 插入生成树

           mix_mfset(F, ri, r2);      // 将两棵树归并为一棵树

 }

  (5);             //继续考察下一条权值最小边

    }

  Destroy Set(F);

 }