在一个大学里,有若干教师和学生。根据这个信息设计三个类University、Teacher、Person和Student,一个接口Learnable。要求:
(1) 设计University类,里面使用常量属性:NAME,其值为NUIST。
(2) 设计Person类,属性包括姓名name和年龄age,添加无参和全参构造方法,并封装。
(3) 写出Learnable接口,里面包含study()和exercise()两个方法。
(4) 设计Teacher类(增加工号teacherID属性和工资salary属性)和Student类(增加学号studentID属性和专业major属性),它们继承Person类。
(5) University添加一个数组,里面存有所有教师和学生对象。
该类中有如下方法:
1)void register(Person person) 注册某人
2)void fire(Person person) 开除一个人
3)Person[] searchPerson(String name)根据名字查出所有与此名相同的Person,得到一个数组。
4)double getTotalSalary() 计算大学里面所有教师的工资总和。
题目应该是不全,有些要求提的也不对。
参考如下:
#include <iostream>
#include <string>
using namespace std;
class Person;
class Teacher;
class Student;
class Person
{
protected:
string name;
int age;
public:
Person(){name="";age=0;}
Person(string n,int a){name = n;age = a;}
virtual int getType()=0;
void setName(string na){name = na;}
void setAge(int a){age = a;}
string getName(){return name;}
int getAge(){return age;}
};
//这个接口没啥用啊
class Learnable
{
public:
static void study(){cout <<"study"<<endl;}
static void exercise(){cout << "exercise"<<endl;}
};
class Teacher :public Person
{
private:
int teacherId;
double salary;
public:
void setTeacherId(int id){teacherId = id;}
void setSalary(double s){salary = s;}
int getTeacherId(){return teacherId;}
double getSalary(){return salary;}
int getType(){return 1;} //用1表示Teacher类
};
class Student:public Person
{
private:
int studentID;
string major;
public:
void setStuId(int id){studentID = id;}
void setMajor(string m){major = m;}
int getStuId(){return studentID;}
string getMajor(){return major;}
int getType(){return 2;} //用2表示Student类
};
class University
{
private:
const string NAME;
Person* mArray[20]; //定义一个数组
int mCount; //数组中元素的实际个数
public:
University():NAME("NUIST"),mCount(0)
{
//
}
//注册某人
void regeist(Person* person)
{
mArray[mCount] = person;
mCount++;
}
//开除一个人
void fire(Person* person)
{
int i=0;
for ( i = 0;i<mCount;i++)
{
if (mArray[i]==person)
{
for (int j=i;j<mCount-1;j++)
{
mArray[j] = mArray[j+1];
}
mCount--;
break;
}
}
}
//根据名字查出所有与此名相同的Person,得到一个数组。
Person** searchPerson(string name,int &nmb)
{
nmb = 0;
Person** array = new Person*[mCount];
for (int i = 0;i<mCount;i++)
{
if (mArray[i]->getName().compare(name)==0)
{
array[nmb++] = mArray[i];
}
}
return array;
}
//计算大学里面所有教师的工资总和。
double getTotalSalary()
{
double sum=0;
for (int i = 0;i<mCount;i++)
{
//string claname = typeid(*mArray[i]).name();
if(mArray[i]->getType() == 1)
{
Teacher* t = (Teacher*) mArray[i];
sum += t->getSalary();
}
}
return sum;
}
};
int main()
{
Teacher* t1 = new Teacher();
t1->setName("张三");
t1->setAge(34);
t1->setTeacherId(1234);
t1->setSalary(5000);
Teacher* t2 = new Teacher();
t2->setName("李四");
t2->setAge(38);
t2->setTeacherId(1235);
t2->setSalary(6000);
Student* stu1 = new Student();
stu1->setName("张三");
stu1->setAge(18);
stu1->setStuId(11111);
stu1->setMajor("物理系");
Student* stu2 = new Student();
stu2->setName("学生2");
stu2->setAge(19);
stu2->setStuId(11112);
stu2->setMajor("生物系");
Student* stu3 = new Student();
stu3->setName("学生3");
stu3->setAge(20);
stu3->setStuId(11113);
stu3->setMajor("生物系");
//注册
University ut;
ut.regeist(t1);
ut.regeist(t2);
ut.regeist(stu1);
ut.regeist(stu2);
ut.regeist(stu3);
//开除
ut.fire(stu2);
//查询
int nmb=0;
Person** p = ut.searchPerson("张三",nmb);
cout << "找到名字为张三的人数:"<<nmb<<endl;
//计算工资
double ss = ut.getTotalSalary();
cout << "所有教师的工资为:"<<ss;
return 0;
}