1. 程式人生 > >(考試)2017年大一下學期C++期末考試題目一

(考試)2017年大一下學期C++期末考試題目一

4001:工資調整:虛基類應用

Problem Description
學校員工有三類:教師、行政人員和雙肩挑人員(既擔任行政職務又教書的員工)。現對員工工資進行調整,確定增幅規則如下:

教師按職稱確定增幅:Lecturer(10%),AssociateProfessor(8%),Professor(6%);
行政人員按級別確定增幅:keji(9%),fuchu(7%),chuji(5%);

雙肩挑人員按職稱和級別中較高的增幅確定。如職稱為AssociateProfessor級別為keji人員按9%增加工資,而職稱為AssociateProfessor級別為fuchu按8%增加工資。
類的部分定義如下,請將繼承關係及各個類的成員函式補充完整但不能增加新的資料成員,使之能通過main()函式測試。

class Employee   //員工類
{
protected:
 string name;  //姓名
 double salary; //工資

};

class Teacher   //教師
{
protected:
 string title; //職稱


};

class Staff          //行政人員類
{
protected:
 string level;  //級別

};

class StaffTeacher                //雙肩挑人員類
{

};

int main()
{
     int flag;       //人員類別,0:教師,1:行政人員,2:雙肩挑人員
string name; //姓名 string title; //職稱 string level; //級別 double salary; //工資 while(cin>>flag) { if(flag==0) //教師 { cin>>name>>title>>salary; Teacher t(name,title,salary); t.show(); } else if(flag==1) //行政人員 { cin>>name>>level>>salary; Staff s(name,level,salary); s.show(); } else
//雙肩挑人員 { cin>>name>>title>>level>>salary; StaffTeacher st(name,title,level,salary); st.show(); } } }

Input
輸入資料有多行。每行代表一個員工的資訊。
每行第一個整數代表員工類別,0:教師,1:行政人員,2:雙肩挑人員
教師的資訊依次為:姓名、職稱、工資;職稱名如題目中所描述的英文;
行政人員的資訊依次為:姓名、級別、工資;級別名如題目中所描述的英文
雙肩挑人員的資訊依次為:姓名、職稱、級別、工資。
工資均為實數。具體格式見示例。

output
輸出各類人員增加工資後的資訊,以空格隔開。
教師的資訊依次為:姓名、職稱、工資;
行政人員的資訊依次為:姓名、級別、工資;
雙肩挑人員的資訊依次為:姓名、職稱、級別、工資。
具體格式見示例。

Sample input

0 zhangsan  Lecturer 3000
1 linqing  fuchu 4000
2 hechong Professor keji 5000

Sample output

zhangsan Lecturer 3300
linqing fuchu 4280
hechong Professor keji 5450

心得

這個題目沒什麼難度,只要按照題目的要求往下打就可以了(畢竟老師都貼心的幫你把類的大概內容給打出來了),注意繼承時要加上關鍵字virtual。

答案

#include <iostream>
#include <string>
using namespace std;
class Employee   //員工類
{
protected:
    string name;  //姓名
    double salary; //工資
public:
    Employee(string name,double salary):name(name),salary(salary) {}
};

class Teacher:virtual public Employee  //教師類,虛基類繼承加上virtual
{
protected:
    string title; //職稱
public:
    Teacher(string name,string title,double salary):
        Employee(name,salary),title(title) {}
    void show()
    {
        if(title=="Lecturer") salary*=1.1;
        else if(title=="AssociateProfessor")salary*=1.08;
        else salary*=1.06;
        cout<<name<<" "<<title<<" "<<salary<<endl;
    }
};

class Staff :virtual public Employee //行政人員類,虛基類繼承加上virtual
{
protected:
    string level;  //級別
public:
    Staff(string name,string level,double salary):
        Employee(name,salary),level(level) {}
    void show()
    {
        if(level=="keji")salary*=1.09;
        else if(level=="fuchu")salary*=1.07;
        else salary*=1.05;
        cout<<name<<" "<<level<<" "<<salary<<endl;
    }
};

class StaffTeacher:public Teacher,public Staff                //雙肩挑人員類
{
private:
    double count;
public:
    StaffTeacher(string name,string title,string level,double salary):
        Employee(name,salary),Teacher(name,title,salary),Staff(name,level,salary) {}
    void show()
    {
        if(title=="Lecturer")count=1.1;
        else if(title=="AssociateProfessor")count=1.08;
        else count=1.06;

        if(level=="keji")count=(count>1.09?count:1.09);
        else if(level=="fuchu")count=(count>1.07)?count:1.07;
        else count=(count>1.05?count:1.05);

        salary*=count;
        cout<<name<<" "<<title<<" "<<level<<" "<<salary<<endl;
    }
};

int main()
{
    int flag;       //人員類別,0:教師,1:行政人員,2:雙肩挑人員
    string name; //姓名
    string title;   //職稱
    string level;   //級別
    double salary;  //工資
    while(cin>>flag)
    {
        if(flag==0)  //教師
        {
            cin>>name>>title>>salary;
            Teacher t(name,title,salary);
            t.show();
        }
        else if(flag==1)   //行政人員
        {
            cin>>name>>level>>salary;
            Staff s(name,level,salary);
            s.show();
        }
        else               //雙肩挑人員
        {
            cin>>name>>title>>level>>salary;
            StaffTeacher st(name,title,level,salary);
            st.show();
        }
    }
}