C02-程序设计基础提高班(C++)第12周上机任务-类的继承

Posted sxhelijian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C02-程序设计基础提高班(C++)第12周上机任务-类的继承相关的知识,希望对你有一定的参考价值。


12周:阅读教材第11章(p347-394),主要内容是类的继承,完成第12周上机任务;

(回到​​C02-程序设计基础提高班(C++)学习安排​​)


【任务1】定义一个名为CPerson的类,有以下私有成员:姓名、身份证号、性别和年龄,成员函数:构造函数、析构函数、输出信息的函数。并在此基础上派生出CEmployee类,派生类CEmployee增加了两个新的数据成员,分别用于表示部门和薪水。要求派生类CEmployee的构造函数显示调用基类CPerson的构造函数,并为派生类CEmployee定义析构函数,定义输出信息的函数。

#include <iostream>
#include <string.h>
#include <iomanip>//setw:设置输出数据的宽度,使用时应#include <iomanip.h>
using namespace std;
class CPerson

protected:
char *m_szName;
char *m_szId;
int m_nSex;//0:women,1:man
int m_nAge;
public:
CPerson(char *name,char *id,int sex,int age);
void Show1();
~CPerson(); //需要释放建立对象时动态分配的内存
;


class CEmployee:public CPerson

private:
char *m_szDepartment;
float m_Salary;
public:
CEmployee(char *name,char *id,int sex,int age,char *department,float salary);
void Show2();
~CEmployee();
;


int main()

char name[10],id[19],department[10];
int sex,age;
float salary;
cout<<"input employees name,id,sex(0:women,1:man),age,department,salary:\\n";
cin>>name>>id>>sex>>age>>department>>salary;
CEmployee employee1(name,id,sex,age,department,salary);
cout<<
employee1.Show2();
system("pause");
return 0;

参考的运行结果:

input employees name,id,sex(0:women,1:man),age,department,salary:
Tom 370102198703255357 0 25 computer 2345.6
show employee information: 
      name                     id    sex    age        department    salary
       Tom     370102198703255357  women     25        computer      2345.6
请按任意键继续. . .

[ 参考:CEmployee类继承CPerson类 - ​



【任务2】


(1)先建立一个Point(点)类,包含数据成员x,y(坐标点);


(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员 (半径);


(3)再以Circle类为直接基类,派生出一个Cylinder(圆柱体)类,再增加数据成员h(高)。


要求编写程序,设计出各类中基本的成员函数(包括构造函数、析构函数、修改数据成员和获取数据成员的公共接口、用于输出的重载运算符“<<”函数等),使之能用于处理以上类对象,最后求出圆格柱体的表面积、体积并输出。


(提示:此任务可以分为三个子任务分成若干步骤进行。先声明基类,再声明派生类,逐级进行,分步调试。——这种方法适用于做任何的项目)


[ 参考:由点到圆再到圆柱体 - ​




【任务3】(教材P394习题9)分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)。要求: 


(1)在两个基类中都包含姓名、年龄、性别、地址电话等数据成员。 


(2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。 


(3)对两个基类中的姓名、年龄、性别、地址电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。 


(4)在类体中声明成员函数,在类外定义成员函数。 


(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址电话,然后再用cout语句输出职务与工资。


[ 参考:双肩挑干部 - ​





【任务4】在下面一段类的定义中,自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承。


(1)根据上面各类间关系的描述,补全下面程序段中空缺的代码


(2)实现程序中声明的成员函数,注意相应操作中的动作发生的条件不能满足时应给出提示。


(3)运行程序,享受开摩托的过程。(下载文件中提供了一个可执行文件"开摩托.exe",可以先运行再编程。不必申请驾照,这个摩托车很安全。)


(4)在报告中回答问题:本题中使用虚基类的好处是什么?


#include <iostream>
#include<conio.h>
#include <windows.h>
using namespace std;
enum vehicleStaus rest, running; //车辆状态:泊车、行进
class vehicle //车辆类

protected:
int maxSpeed; //最大车速
int currentSpeed; //当前速度
int weight; //车重
vehicleStaus status; //rest-泊车状态;running-行进状态
public:
vehicle(int maxS, int w); //构造函数,初始时,当前速度总为0且处在停车状态
void start(); //由rest状态到running, 初速为1
void stop(); //由running状态到rest, 当前速度小于5时,才允许停车
void speed_up(); //加速,调用1次,速度加1
void slow_down(); //减速,调用1次,速度减1,速度为0时,停车
;


class bicycle :_____(1)_________//(1)自行车类的虚基类为车辆类

protected:
double height; //车高
public:
bicycle(int maxS=10, int w=50, int h=0.7); //定义构造函数
;


class motorcar : ______(2)__________//(2)机动车类的虚基类也为车辆类

protected:
int seatNum; //座位数
int passengerNum; //乘客人数
public:
motorcar(int maxS=150, int w=1500, int s=5, int p=1); //定义构造函数
void addPassenger(int p=1); //增加搭载的乘客,超员要拒载,有人下车时,p为负数。当然车上乘客至少有1个(司机)。只有车停稳后才能上下客。
;


class motorcycle: ______(3)_________ //(3)摩托车类的基类为自行车类和机动车类

public:
//定义构造函数
motorcycle(int maxS=90, int w=100, int s=3, int p=1, int h=0.7);
void show(); //显示摩托车的运行状态
;


int main( )

motorcycle m;
bool end=false;
while (!end)
cout<<"请操作:1-启动 2-加速 3-减速 4-有人上车 5-有人下车 6-停车 0-结束"<<endl;
char keydown= _getch(); //_getch()返回键盘上读取的字符
switch(keydown)

case 1:
cout<<"操作(启动)\\t"; m.start(); break;
case 2:
cout<<"操作(加速)\\t"; m.speed_up(); break;
case 3:
cout<<"操作(减速)\\t"; m.slow_down(); break;
case 4:
cout<<"操作(有人上车)\\t"; m.addPassenger(); break;
case 5:
cout<<"操作(有人下车)\\t"; m.addPassenger(-1); break;
case 6:
cout<<"操作(停车)\\t"; m.stop(); break;
case 0:
end=true; break;

m.show();
cout<<endl;
Sleep(200); //要包含头文件<windows.h>

system("pause");
return 0;

[ 参考:做个摩托车开一开 - ​




【任务5】类的组合与继承


(1)先建立一个Point(点)类,包含数据成员x,y(坐标点);


(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心;


(3)编写上述两类中的构造、析构函数及必要的输入输出函数


(4)定义友元函数int locate,判断点p在圆c上、圆c内或圆c外,返回值<0圆内,==0圆上,>0 圆外;


(5)重载关系运算符(6种)运算符,使之能够按圆的面积比较两个圆的大小;


(6)给定一点p,求出该点与圆心相连成的直线与圆的两个交点并输出


下面给出用于测试的main()函数,涉及到的类请自行定义。


int main( )

Circle c1(3,2,4),c2(4,5,5); //c2应该大于c1
Point p1(1,1),p2(3,-2),p3(7,3); //分别位于c1内、上、外


cout<<"圆c1: "<<c1;
cout<<"点p1: "<<p1;
cout<<"点p1在圆c1之"<<((locate(p1, c1)>0)?"外":((locate(p1, c1)<0)?"内":"上"))<<endl;
cout<<"点p2: "<<p2;
cout<<"点p2在圆c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"内":"上"))<<endl;
cout<<"点p3: "<<p3;
cout<<"点p3在圆c1之"<<((locate(p3, c1)>0)?"外":((locate(p3, c1)<0)?"内":"上"))<<endl;
cout<<endl;


cout<<"圆c1: "<<c1;
if(c1>c2) cout<<"大于"<<endl;
if(c1<c2) cout<<"小于"<<endl;
if(c1>=c2) cout<<"大于等于"<<endl;
if(c1<=c2) cout<<"小于等于"<<endl;
if(c1==c2) cout<<"等于"<<endl;
if(c1!=c2) cout<<"不等于"<<endl;
cout<<"圆c2: "<<c1;
cout<<endl;


Point p4,p5;
crossover_point1(p1,c1, p4, p5);


cout<<"点p1: "<<p1;
cout<<"与圆c1: "<<c1;
cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;
cout<<"交点: "<<p4;
cout<<"交点: "<<p5;
cout<<endl;


system("pause");
return 0;





以上是关于C02-程序设计基础提高班(C++)第12周上机任务-类的继承的主要内容,如果未能解决你的问题,请参考以下文章

寒假作业2

暑假第五周学习进度报告

12周上机(5.21)

20145309信息安全系统设计基础第12周学习总结后篇

课程总结

JAVA第六周上机练习