第十四天第二个问题

发布时间 2023-05-04 18:11:52作者: 序章0

问题描述:

以人类Person为基类公有派生学生类Student和教师类Teacher,main(void)函数完成对其的测试。

Person类结构说明:

 
Person类的数据成员包括:
①私有数据成员:身份证号no(char [20]型),姓名name(char [20]型)。
Person类成员函数包括:
①有参构造函数Person(char *, char *)和拷贝构造函数Person(const  Person  &),其中有参构造函数参数默认值为空串或0(当参数为NULL时视为空串处理),输出信息“Person Constructor run”,拷贝构造函数输出信息“Person CopyConstructor run”
②析构函数,析构函数输出信息“Person Destructor run”
③公有函数成员:void  setNo(char *)和char * getNo()分别返回和设置身份证号no(当参数为NULL时视为空串处理)
④公有函数成员:void  setName(char *)和char*  getName()分别返回和设置姓名name(当参数为NULL时视为空串处理)
⑤公有成员函数void show() const用于显示人的基本信息,显示格式为:
No=身份证号,Name=姓名
 

Student类结构说明:

 
公有派生学生类Student以人类Person为基类,Student类的结构说明如下:
Student类的数据成员包括:
①私有数据成员:身份证号no继承自Person类,姓名name继承自Person类。
②私有数据成员:学号sNo(char [10]型)
③私有数据成员:班级className(char [20]型)
④私有数据成员:成绩score(double型)
Student类成员函数包括:
①有参构造函数Student(char *, char *, char *,char *, double)和拷贝构造函数Student(const  Student  &),其中有参构造函数参数默认值为空串或0.0(当参数为NULL时视为空串处理),输出信息“Student Constructor run”,拷贝构造函数输出信息“Student CopyConstructor run”
②析构函数,析构函数输出信息“Student Destructor run”
③公有函数成员:void  setSNo(char *)和char * getSNo()分别返回和设置学号sNo(当参数为NULL时视为空串处理)
④公有函数成员:void  setClassName(char *)和char*  getClassName()分别返回和设置班级className(当参数为NULL时视为空串处理)
⑤公有函数成员:void  setScore(double )和double  getScore()分别返回和设置成绩score(当参数缺省时视为0.0)
⑥公有成员函数void show() const用于显示学生的基本信息,显示格式为:
No=身份证号,Name=姓名
SNo=学号,ClassName=班级,Score=成绩
其中,成绩四舍五入取整。
 

Teacher类结构说明:

 
公有派生教师类Teacher以人类Person为基类,Teacher类的结构说明如下:
Teacher类的数据成员包括:
①私有数据成员:身份证号no继承自Person类,姓名name继承自Person类。
②私有数据成员:工号tNo(char [10]型)
③私有数据成员:部门班级departmentName(char [20]型)
④私有数据成员:工资wages(double型)
Teacher类成员函数包括:
①有参构造函数Teacher(char *, char *, char *,char *, double)和拷贝构造函数Teacher(const  Teacher  &),其中有参构造函数参数默认值为空串或0.0(当参数为NULL时视为空串处理),输出信息“Teacher Constructor run”,拷贝构造函数输出信息“Teacher CopyConstructor run”
②析构函数,析构函数输出信息“Teacher Destructor run”
③公有函数成员:void  setTNo(char *)和char * getTNo()分别返回和设置工号tNo(当参数为NULL时视为空串处理)
④公有函数成员:void  setDepartmentName(char *)和char*  getDepartmentName()分别返回和设置部门departmentName(当参数为NULL时视为空串处理)
⑤公有函数成员:void  setWages(double )和double  getWages()分别返回和设置工资wages(当参数缺省时视为0.0)
⑥公有成员函数void show() const用于显示教师的基本信息,显示格式为:
No=身份证号,Name=姓名
TNo=工号,DepartmentName=部门,Wages=工资
其中,工资四舍五入取整。
 

裁判测试程序样例:

 
#include <iostream>
using namespace std;
//Person类
class Person{
protected:
    char no[20];                   //身份证号
    char name[20];                //姓名
public:
    Person(char *str1=0,char *str2=0);//有参构造
    Person(const Person &p);        //拷贝构造
    ~Person();                    //析构函数
    void show() const;             //显示Person信息
    void setNo(char *str);          //设置身份证号
    void setName(char *str);        //设置姓名
    char *getNo();                //获取身份证号
    char* getName();              //获取姓名
};
//有参构造
Person::Person(char *str1,char *str2){
    int i;
    i=0;
    if(str1!=0)
        while(str1[i]!='\0'){
            no[i]=str1[i];
            i++;
        }
    no[i]='\0';
    i=0;
    if(str2!=0)
        while(str2[i]!='\0'){
            name[i]=str2[i];
            i++;
        }
    name[i]='\0';
    cout<<"Person Constructor run"<<endl;
}
//拷贝构造
Person::Person(const Person &p){
    int i=0;
    while(p.no[i]!='\0'){
        no[i]=p.no[i];
        i++;
    }
    no[i]='\0';
    i=0;
    while(p.name[i]!='\0'){
        name[i]=p.name[i];
        i++;
    }
    name[i]='\0';
    cout<<"Person CopyConstructor run"<<endl;
}
//析构函数
Person::~Person(){
    cout<<"Person Destructor run"<<endl;
}
//显示Person
void Person::show() const{
    cout<<"No="<<no<<",Name="<<name<<endl;
}
//设置身份证号
void Person::setNo(char *str){
    int i=0;
    if (str)
        while(str[i]!='\0'){
            no[i]=str[i];
            i++;
        }
    no[i]='\0';
}
//设置姓名
void Person::setName(char *str){
    int i=0;
    if (str)
        while(str[i]!='\0'){
            name[i]=str[i];
            i++;
        }
    name[i]='\0';
}
//获取身份证号
char* Person::getNo(){
    return no;
}
//获取姓名
char* Person::getName(){
    return name;
}

/* 请在这里填写答案 */

//主函数
int main(){
    char s1[19]="130502190001010332";
    char s2[20]="doublebest";
    char s3[19]="20181234";
    char s4[20]="铁1801";
    double value=60.67;
    Student stu1(s1,s2,s3,s4,value);
    stu1.show();
    Student stu2=stu1;
    cin.getline(s3,10,'\n');
    cin.getline(s4,20,'\n');
    cin>>value;
    stu2.setSNo(s3);
    stu2.setClassName(s4);
    stu2.show();
    Teacher t1(s1,s2,s3,s4,value);
    t1.show();
    Teacher t2=t1;
    t2.setTNo(s3);
    t2.setDepartmentName(s3);
    t2.show();
    return 0;
}
 

输入样例:

20181234
铁1801
45.45
 

输出样例:

Person Constructor run
Student Constructor run
No=130502190001010332,Name=doublebest
SNo=20181234,ClassName=铁1801,Score=61
Person CopyConstructor run
Student CopyConstructor run
No=130502190001010332,Name=doublebest
SNo=20181234,ClassName=铁1801,Score=61
Person Constructor run
Teacher Constructor run
No=130502190001010332,Name=doublebest
TNo=20181234,DepartmentName=铁1801,Wages=45
Person CopyConstructor run
Teacher CopyConstructor run
No=130502190001010332,Name=doublebest
TNo=20181234,DepartmentName=20181234,Wages=45
Teacher Destructor run
Person Destructor run
Teacher Destructor run
Person Destructor run
Student Destructor run
Person Destructor run
Student Destructor run
Person Destructor run

代码:

int round(double n)
{
if(n>0)
return n-int(n)>=0.5?int(n)+1:int(n);
else
return -n-int(-n)>=0.5?-(int(-n)+1):-(int(-n));
}
class Student:public Person
{
private:
char sNo[10];
char className[20];
double score;
public:
Student(char * a,char * b,char * c,char * d,double e=0.0):Person(a,b)
{
int i;
score=e;
i=0;
if(c!=0)
while(c[i]!='\0'){
sNo[i]=c[i];
i++;
}
sNo[i]='\0';
i=0;
if(d!=0)
while(d[i]!='\0'){
className[i]=d[i];
i++;
}
className[i]='\0';
cout<<"Student Constructor run"<<endl;
}
Student(const Student &p):Person(p)
{
int i;
score=p.score;
i=0;
while(p.sNo[i]!='\0'){
sNo[i]=p.sNo[i];
i++;
}
sNo[i]='\0';
i=0;
while(p.className[i]!='\0'){
className[i]=p.className[i];
i++;
}
className[i]='\0';
cout<<"Student CopyConstructor run"<<endl;
}
~Student()
{
cout<<"Student Destructor run"<<endl;
}
void setSNo(char * c)
{
int i=0;
if (c)
while(c[i]!='\0'){
sNo[i]=c[i];
i++;
}
sNo[i]='\0';
}
char * getSNo()
{
return sNo;
}
void setClassName(char * d)
{
int i=0;
if (d)
while(d[i]!='\0'){
className[i]=d[i];
i++;
}
className[i]='\0';
}
char* getClassName()
{
return className;
}
void setScore(double e)
{
score=e;
}
double getScore()//分别返回和设置成绩score(当参数缺省时视为0.0)
{
return score;
}
void show()const
{
cout<<"No="<<no<<",Name="<<name<<endl;
cout<<"SNo="<<sNo<<",ClassName="<<className<<",Score="<<round(score)<<endl;
}
};
class Teacher:public Person
{
private:
char tNo[10];
char departmentName[20];
double wages;
public:
Teacher(char * a, char * b, char * c,char * d, double e=0.0):Person(a,b)
{
int i;
wages=e;
i=0;
if(c!=0)
while(c[i]!='\0'){
tNo[i]=c[i];
i++;
}
tNo[i]='\0';
i=0;
if(d!=0)
while(d[i]!='\0'){
departmentName[i]=d[i];
i++;
}
departmentName[i]='\0';
cout<<"Teacher Constructor run"<<endl;
}

Teacher(const Teacher &p):Person(p)
{
int i;
i=0;
while(p.tNo[i]!='\0'){
tNo[i]=p.tNo[i];
i++;
}
tNo[i]='\0';
i=0;
while(p.departmentName[i]!='\0'){
departmentName[i]=p.departmentName[i];
i++;
}
departmentName[i]='\0';
wages=p.wages;
cout<<"Teacher CopyConstructor run"<<endl;
}
~Teacher()
{
cout<<"Teacher Destructor run"<<endl;
}
void setTNo(char * c)
{
if(c==NULL)
{
*tNo='\0';
}
int i=0;
if (c)
while(c[i]!='\0'){
tNo[i]=c[i];
i++;
}
tNo[i]='\0';
}
char * getTNo()
{
return tNo;
}
void setDepartmentName(char * d)
{
if(d==NULL)
{
*departmentName='\0';
}
int i=0;
if (d)
while(d[i]!='\0'){
departmentName[i]=d[i];
i++;
}
departmentName[i]='\0';

}
char* getDepartmentName()
{
return departmentName;
}
void setWages(double e)
{
wages=e;
}
double getWages()
{
return wages;
}
void show() const
{
cout<<"No="<<no<<",Name="<<name<<endl;
cout<<"TNo="<<tNo<<",DepartmentName="<<departmentName<<",Wages="<<round(wages)<<endl;
}
};