题目描述
在习题4-3的基础上,编程实现:本题的类间关系如图5-1所示(学习通中的实验5文档中)。
定义一个人员类Person,数据成员包括编号、姓名、性别、家庭住址、联系电话。性别用char型实现,’f’表示女性,’m’表示男性,其它用string类型。成员函数包括:(1)构造函数;(2)输出函数print(),输出一个人员的全部描述信息,并定义为虚函数。
定义一个学生类Student,为Person类的公有派生类。新增的数据成员包括数学、物理、英语、程序设计四门课成绩,各门课成绩为整型。新增的成员函数包括:(1)设置数学、物理、外语、程序设计四门课成绩,函数原型为void setScore(char tag, int score);当tag的值分别为’m’、’p’、’e’和’c’时,分别设置数学、物理、英语、程序设计四门课成绩。1)构造函数;(2) 输出函数print(),输出一个学生的全部信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。
定义一个教师类Teacher,为Person类的公有派生类。新增的数据成员包括:职称、工资(职称为string类型,工资为double型)。新增的成员函数包括:(1) 构造函数;(2) 输出函数print(),输出一个教师的全部描述信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。
由Student类和Teacher类公有派生子类TA(助教博士生)类,添加数据成员:专业(string类型),添加构造函数、输出函数(输出一个TA对象的全部信息)。
定义一个普通函数fun(),形参为Person类的指针,利用C++的多态性,调用虚函数实现输出各对象的信息。
主函数中定义分别Student、Teacher、TA类的对象各一个,其各数据成员的初始值由键盘输入,调用fun()输出Student对象的全部信息;修改Student对象的成绩,数据由键盘输入,再调用fun()输出Student对象的全部信息。调用fun()输出Teacher、TA类的对象的全部信息。
注意虚基类的使用。
输入描述
四行
学生类对象的全部初值
成绩修改的代号和成绩
教师类对象的全部初值
TA类对象的全部初值
输出描述
学生对象的全部信息
学生对象修改成绩后的全部信息
教师对象的全部信息
TA对象的全部信息
输入样例
1001 刘玄德 m 河北涿州 12345678999 87 90 85 88
m 92
2031001 诸葛亮 m 徐州琅琊 13344556677 副教授 5500
3045866 赵子龙 m 常山真定 12345678988 87 90 85 88 讲师 3500 计算机科技与技术
输出样例
学生信息:
编 号:1001
姓 名:刘玄德
性 别:m
家庭住址:河北涿州
联系电话:12345678999
数 学:87
物 理:90
英 语:85
程序设计:88
编 号:1001
姓 名:刘玄德
性 别:m
家庭住址:河北涿州
联系电话:12345678999
数 学:92
物 理:90
英 语:85
程序设计:88
教师信息:
编 号:2031001
姓 名:诸葛亮
性 别:m
家庭住址:徐州琅琊
联系电话:13344556677
职 称:副教授
工 资:5500
TA信息:
编 号:3045866
姓 名:赵子龙
性 别:m
家庭住址:常山真定
联系电话:12345678988
数 学:87
物 理:90
英 语:85
程序设计:88
职 称:讲师
工 资:3500
专 业:计算机科技与技术(中文冒号)
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(string a, string b, char c, string d, string e);
void set_number(string a);
void set_name(string b);
void set_sex(char c);
void set_address(string d);
void set_phone_number(string e);
virtual void print()
{
cout << "编 号:" << number << endl;
cout << "姓 名:" << name << endl;
cout << "性 别:" << sex << endl;
cout << "家庭住址:" << address << endl;
cout << "联系电话:" << phone_number << endl;
}
private:
string number;
string name;
char sex;
string address;
string phone_number;
};
Person::Person(string a, string b, char c, string d, string e)
{
number = a;
name = b;
sex = c;
address = d;
phone_number = e;
}
void Person::set_number(string a)
{
number = a;
}
void Person::set_name(string b)
{
name = b;
}
void Person::set_sex(char c)
{
sex = c;
}
void Person::set_address(string d)
{
address = d;
}
void Person::set_phone_number(string e)
{
phone_number = e;
}
class Student :virtual public Person
{
public:
Student(string a, string b, char c, string d, string e, int f, int g, int h, int i);
void setScore(char tag, int score);
virtual void print()
{
Person::print();
cout << "数 学:" << math << endl;
cout << "物 理:" << physical << endl;
cout << "英 语:" << english << endl;
cout << "程序设计:" << c_lan << endl;
}
void cj()
{
cout << "数 学:" << math << endl;
cout << "物 理:" << physical << endl;
cout << "英 语:" << english << endl;
cout << "程序设计:" << c_lan << endl;
}
private:
int math, physical, english, c_lan;
};
Student::Student(string a, string b, char c, string d, string e, int f, int g, int h, int i) :Person(a, b, c, d, e)
{
math = f;
physical = g;
english = h;
c_lan = i;
}
void Student::setScore(char tag, int score)
{
switch (tag)
{
case 'm':math = score; break;
case 'p':physical = score; break;
case 'e':english = score; break;
case 'c':c_lan = score; break;
}
}
class Teacher :virtual public Person
{
public:
Teacher(string a, string b, char c, string d, string e, string f, double g);
void set_title(string f);
void set_wages(double g);
virtual void print();
void cz()
{
cout << "职 称:" << title << endl;
cout << "工 资:" << wages << endl;
}
private:
string title;
double wages;
};
Teacher::Teacher(string a, string b, char c, string d, string e, string f, double g) :Person(a, b, c, d, e)
{
title = f;
wages = g;
}
void Teacher::set_title(string f)
{
title = f;
}
void Teacher::set_wages(double g)
{
wages = g;
}
void Teacher::print()
{
Person::print();
cout << "职 称:" << title << endl;
cout << "工 资:" << wages << endl;
}
class Ta : virtual public Student, Teacher {
public:
Ta(string a, string b, char c, string d, string e, int f, int g, int h, int i, string ch, double gz, string zh) :Student(a, b, c, d, e, f, g, h, i), Teacher(a, b, c, d, e, ch, gz), Person(a, b, c, d, e)
{
zhuan = zh;
}
virtual void print()
{
Person::print();
Student::cj();
Teacher::cz();
cout << "专 业:" << zhuan << endl;
}
private:
string zhuan;
};
void fun(Person *a)
{
a->print();
}
int main()
{
string number_1;
string name_1;
char sex_1;
string address_1;
string phone_number_1;
string number_2;
string name_2;
char sex_2;
string address_2;
string phone_number_2;
int math, physical, english, c_lan;
string number_3;
string name_3;
char sex_3;
string address_3;
string phone_number_3;
int math_2, physical_2, english_2, c_lan_2;
string title, title1, zhuan;
double wages, wages1;
char tag;
int sc;
string phone_number;
cin >> number_1 >> name_1 >> sex_1 >> address_1 >> phone_number_1;
cin >> math >> physical >> english >> c_lan;
Student zp(number_1, name_1, sex_1, address_1, phone_number_1,
math, physical, english, c_lan);
cout << "学生信息:"<<endl;
zp.print();
cin >> tag >> sc;
zp.setScore(tag, sc);
zp.print();
cin >> number_2 >> name_2 >> sex_2 >> address_2 >> phone_number_2;
cin >> title >> wages;
Teacher ls(number_2, name_2, sex_2, address_2, phone_number_2, title, wages);
cout << "教师信息:" << endl;
ls.print();
cin >> number_3 >> name_3 >> sex_3 >> address_3 >> phone_number_3;
cin >> math_2 >> physical_2 >> english_2 >> c_lan_2;
cin >> title1 >> wages1;
cin >> zhuan;
Ta zhujiao(number_3, name_3, sex_3, address_3, phone_number_3,
math_2, physical_2, english_2, c_lan_2, title1, wages1, zhuan);
cout << "TA信息:" << endl;
zhujiao.print();
}