C++习题(04)派生类与继承

一.根据给出的基类编程

题目描述
给出下面的基类:
class AreaC1{
public:
	AreaC1(double h, double w)	{
		height = h;		width = w;
	}
	double area(){		return 0;	}
protected:
	double height;
	double width;
};
创建AreaC1的两个公有派生类矩形类和三角形类,每个派生类中都包含一个函数area() ,分别求矩形和三角形的面积,其中基类中的width表示三角形的底。
主函数中分别定义一个矩形类和三角形类的对象,其height和width均由键盘输入。输出各对象的面积。 
输入描述
从键盘输入height和width 
输出描述
两行:矩形的面积和三角形的面积 
输入样例
10 5 
输出样例
矩形的面积:50
三角形的面积:25(中文冒号)
#include<iostream>
#include <cmath>

using namespace std;

class AreaC1{
public:
	AreaC1(double h=0, double w=0)	
	{
		height = h;		
		width = w;
	}
	double area()
	{		
		return 0;	
	}
protected:
	double height;
	double width;
};

class Rectangle : public AreaC1
{
public: 
	void SetRectangle(double h=0, double w=0)	
	{
		height = h;		
		width = w;
	}
	double area()
	{
		return (height*width);
	}
};


class Triangle : public AreaC1
{
public: 
	void SetTriangle(double h=0, double w=0)	
	{
		height = h;		
		width = w;
	}
	double area()
		{
			return (1.0/2*height*width);
		}
};


int main()
{
	double h,w;
	Rectangle  A;
	Triangle   B;
	cin>>h>>w;
	A.SetRectangle(h,w);
	B.SetTriangle(h,w);
	cout<<"矩形的面积:"<<A.area()<<endl;
	cout<<"三角形的面积:"<<B.area()<<endl;
	return 0;
}

二.继承与派生 银行存款类

题目描述
定义银行账户类Account,数据成员包括:账号(unsigned型)、姓名(string类型)、余额(float型),有成员函数:deposit(存款)、withdraw(取款,在Account类中什么都不干)、getBalance(获取账户中的余额)、getAccNo(获取银行账号)、显示函数(显示银行账户中全部信息)、构造函数。
定义银行存款类Savings(储蓄类)和Checking(结算类),均由银行账户类公有派生。Savings类中重新定义withdraw函数(判断账户余额是否大于取款数额,若大于,则余额中减去取款数,否则,提示余额不足)。Checking类中重新定义withdraw函数(在结算账户类中,假定账户取款采用邮汇方式,每汇出一笔款项,不论汇出数额大小,一律收30元手续费,同样需要判断余额是否不足,不足则提示。)
主函数中,定义一个Savings类对象,初始值由键盘输入,(1)显示账户信息;(2)从键盘输入取款数额,取款后再显示账户信息;(3)从键盘输入存款信息,存款后再显示账户信息;(4) 从键盘再输入取款数额,取款后再显示账户信息;
定义一个Checking类对象,初始值由键盘输入,(1)显示账户信息;(2)两次汇款:从键盘输入汇款数额,每次汇款后都显示账户信息。 
输入描述
7行数据
Savings类对象的账号 姓名 余额
取款数据
存款数据
取款数据
Checking类对象的账号 姓名 余额
第一次汇款数据
第二次汇款数据 
输出描述
对于每个对象,先显示对象的全部数据信息,每进行一次存取款操作,都显示相应信息 
输入样例
1001 赵云 6000
4500
6700
10000
2001 何太冲 10000
11000
9000 
输出样例
账号:1001 姓名:赵云 余额:6000元(中文冒号)
您本次取款:4500元
账号:1001 姓名:赵云 余额:1500元
您本次存款:6700元
账号:1001 姓名:赵云 余额:8200元
您本次取款:10000元
余额为:8200元,您的账户余额不足!
账号:1001 姓名:赵云 余额:8200元

账号:2001 姓名:何太冲 余额:10000元
您本次汇款11000元 手续费:30元
账户余额不足,账户余额:10000元 取款数额:11000元
账号:2001 姓名:何太冲 余额:10000元
您本次汇款9000元 手续费:30元
账号:2001 姓名:何太冲 余额:970元
#include <iostream>
#include <string>
using namespace std;

class Account
{
public:
	Account(unsigned a = 0, string b = " ", float c = 0)
	{
		AccNo = a;
		Name = b;
		Balance = c;
	}
	void deposit(float n)
	{
		cout << "您本次存款:" << n <<"元"<< endl;
		Balance = Balance + n;
	}
	void withdraw()
	{
		;
	}
	float  getBalance()
	{
		return Balance;
	}
	unsigned getAccNo()
	{
		return AccNo;
	}
	void show()
	{
		cout <<"账号:"<< AccNo << " " <<"姓名:"<< Name << " " << "余额:" << Balance<<"元"<<endl;
	}

protected:
	unsigned AccNo;
	string Name;
	float Balance;

};

class Savings : public Account
{
public:
	void SetSavings(unsigned a = 0, string b = " ", float c = 0)
	{
		AccNo = a;
		Name = b;
		Balance = c;
	}
	void withdraw(float m)
	{
		if (m < getBalance())
		{
			cout << "您本次取款:" << m << "元"<<endl;
			Balance = Balance - m;
		}
		else
		{
			cout << "您本次取款:" << m << "元" << endl;
			cout << "余额为:" << getBalance() << "元,"<<"您的账户余额不足!" << endl;
		}
	}
};

class Checking : public Account
{
public:
	void SetChecking(unsigned a = 0, string b = " ", float c = 0)
	{
		AccNo = a;
		Name = b;
		Balance = c;
	}
	void withdraw(float m)
	{
		if ((m+30) < getBalance())
		{
			cout << "您本次汇款" << m << "元 手续费:30元" << endl;
			Balance = Balance - m-30;
		}
		else
		{
			cout << "您本次汇款" << m << "元 手续费:30元" << endl;
			cout << "账户余额不足,账户余额:" << getBalance() << "元" << " 取款数额:" <<m<<"元"<< endl;
		}
	}
};
int main()
{
	
	unsigned AccNo1, AccNo2;
	string Name1, Name2;
	float Balance1, Balance2, n1,n2,n3,n4,n5;
	Savings A;
	Checking B;
	cin >> AccNo1 >> Name1 >> Balance1>>n1>>n2>>n3;
	cin >> AccNo2 >> Name2 >> Balance2 >> n4 >> n5;
	A.SetSavings(AccNo1, Name1, Balance1);
	B.SetChecking(AccNo2, Name2, Balance2);
	A.show();
	A.withdraw(n1);
	A.show();
	A.deposit(n2);
	A.show();
	A.withdraw(n3);
	A.show();
	cout << "\n";
	B.show();
	B.withdraw(n4);
	B.show();
	B.withdraw(n5);
	B.show();
	return 0;
}

三.继承与派生 Person及其子类

题目描述
定义一个人员类Person,数据成员包括编号、姓名、性别、家庭住址、联系电话。性别用char型实现,’f’表示女性,’m’表示男性,其它用string类型。成员函数包括:(1)设置编号;(2)设置姓名;(3)设置性别;(4)设置家庭住址;(5)设置联系电话;(6)构造函数;(7)输出一个人员的全部描述信息。
定义一个描述学生的类Student,为Person类公有派生而来。新增的数据成员包括数学、物理、英语、程序设计四门课成绩,各门课成绩为整型。注意继承来的编号成员在此处的意义是学号。新增的成员函数包括:(1)设置数学、物理、外语、程序设计四门课成绩,函数原型为void setScore(char tag, int score);当tag的值分别为’m’、’p’、’e’和’c’时,分别设置数学、物理、英语、程序设计四门课成绩。(2)构造函数;(3)输出一个学生的全部信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。
定义一个描述教师的类Teacher,为Person类公有派生而来。新增的数据成员包括:职称、工资(职称为string类型,工资为double型),注意继承来的编号在此处的意义为工号。新增的成员函数包括:(1)设置职称;(2)设置工资;(3)构造函数;(4)输出一个教师的全部描述信息,注意在此函数中调用基类中输出人员的全部描述信息的函数。
主函数中:(1)定义一个Person类对象,数据成员值由键盘输入,输出对象的全部描述信息;然后设置Person类对象的联系电话,值由键盘输入;输出设置后的全部描述信息。
(2)定义一个Student类对象,数据成员值由键盘输入,输出对象的全部描述信息;然后设置Student类对象的相应课程成绩,课程标识和成绩由键盘输入;输出设置后的全部描述信息。
(3)定义一个Teacher类对象,数据成员值由键盘输入,输出对象的全部描述信息;然后设置Teacher类对象的工资,工资值由键盘输入;输出设置后的全部描述信息。 
输入描述
6行数据
Person对象的信息
修改的电话号码
Student对象的信息
修改的课程标识和成绩
Teacher对象的信息
修改的工资 
输出描述
各对象的初始全部信息
修改后的对象全部信息 
输入样例
1001 刘玄德 m 四川成都 123456789
987654321
201620011001 张春华 f 江苏南京 987654321 87 90 85 88
c 90
3025123 马龙 m 浙江温州 987654321 副教授 3500
4000 
输出样例
编    号:1001
姓    名:刘玄德
性    别:m
家庭住址:四川成都
联系电话:123456789

编    号:1001
姓    名:刘玄德
性    别:m
家庭住址:四川成都
联系电话:987654321

编    号:201620011001
姓    名:张春华
性    别:f
家庭住址:江苏南京
联系电话:987654321
数    学:87
物    理:90
英    语:85
程序设计:88

编    号:201620011001
姓    名:张春华
性    别:f
家庭住址:江苏南京
联系电话:987654321
数    学:87
物    理:90
英    语:85
程序设计:90

编    号:3025123
姓    名:马龙
性    别:m
家庭住址:浙江温州
联系电话:987654321
职    称:副教授
工    资:3500

编    号:3025123
姓    名:马龙
性    别:m
家庭住址:浙江温州
联系电话:987654321
职    称:副教授
工    资:4000 

#include <iostream>
#include <string>
using namespace std;

class Person
{
public:
	Person(string a=" ", string b = " ", char c = ' ', string d = " ", string e = " ")
	{
		Num=a;
		Name = b;
		Sex = c;
		Adr = d;
		Tel = e;
	}
	void SetNum(string a)
	{
		Num = a;
	}
	void SetName(string a)
	{
		Name = a;
	}
	void SetNum(char a)
	{
		Sex = a;
	}
	void SetAdr(string a)
	{
		Adr = a;
	}
	void SetTel(string a)
	{
		Tel = a;
	}
	void output()
	{
		cout <<"编    号:"<< Num << endl;
		cout <<"姓    名:"<<  Name << endl;
		cout <<"性    别:"<<  Sex << endl;
		cout << "家庭住址:" << Adr << endl;
		cout << "联系电话:" <<  Tel << endl;
		
		
	}
protected:
	string Num;
	string Name;
	char Sex;
	string Adr;
	string Tel;
};
class Student:public Person
{
public:
	Student(int a=0,int b = 0,int c = 0,int d = 0)
	{
		mScore = a;
		pScore = b;
		eScore = c;
		cScore = d;
	}
	void setScore(char tag, int score)
	{
		switch (tag)
		{
		case 'm':mScore = score; break;
		case 'p':pScore = score; break;
		case 'e':eScore = score; break;
		case 'c':cScore = score; break;
		}

	}
	void output1()
	{
		cout << "编    号:"  <<Num << endl;
		cout << "姓    名:" <<  Name << endl;
		cout << "性    别:" << Sex << endl;
		cout << "家庭住址:" << Adr << endl;
		cout << "联系电话:" << Tel << endl;
		cout << "数    学:" <<  mScore << endl;
		cout << "物    理:" <<  pScore << endl;
		cout << "英    语:" <<  eScore << endl;
		cout << "程序设计:" <<  cScore << endl;
	}
protected:
	int mScore;
	int pScore;
	int eScore;
	int cScore;
};

class Teacher :public Person
{
public:
	Teacher(string a=" ",double b=0)
	{
		ZhiCheng=a;
		GongZi=b;
	}
	void SetZhiCheng(string a)
	{
		ZhiCheng = a;
	}
	void SetGongZi(double a)
	{
		GongZi = a;
	}
	void output2()
	{
		cout << "编    号:" <<  Num << endl;
		cout << "姓    名:" <<  Name << endl;
		cout << "性    别:" <<Sex << endl;
		cout << "家庭住址:" <<  Adr << endl;
		cout << "联系电话:" <<  Tel << endl;
		cout << "职    称:" << ZhiCheng << endl;
		cout << "工    资:" << GongZi << endl;
	}
protected:
	string ZhiCheng;
	double GongZi;
};
int main()
{
	Person A;
	string Num1;
	string Name1;
	char Sex1;
	string Adr1;
	string Tel1;
	string Tel11;

	string Num2;
	string Name2;
	char Sex2;
	string Adr2;
	string Tel2;
	int mScore;
	int pScore;
	int eScore;
	int cScore;
	char op;
	int opScore;

	string Num3;
	string Name3;
	char Sex3;
	string Adr3;
	string Tel3;
	string ZhiCheng;
	double GongZi;
	double opGongZi;

	cin >> Num1 >> Name1 >> Sex1>>Adr1 >> Tel1>> Tel11  ;
	cin >> Num2 >> Name2 >> Sex2 >> Adr2 >> Tel2 >> mScore>> pScore>> eScore>> cScore>>op>> opScore;
	cin >> Num3 >> Name3 >> Sex3 >> Adr3 >> Tel3 >> ZhiCheng>> GongZi>> opGongZi;
	A.SetNum(Num1);
	A.SetName(Name1);
	A.SetNum(Sex1);
	A.SetAdr(Adr1);
	A.SetTel(Tel1);
	A.output();
	cout << "\n";
	A.SetTel(Tel11);
	A.output();
	cout << "\n";

	Student B;
	B.SetNum(Num2);
	B.SetName(Name2);
	B.SetNum(Sex2);
	B.SetAdr(Adr2);
	B.SetTel(Tel2);
	B.setScore('m', mScore);
	B.setScore('p', pScore);
	B.setScore('e', eScore);
	B.setScore('c', cScore);
	B.output1();
	cout << "\n";
	B.setScore(op, opScore);
	B.output1();
	cout << "\n";

	Teacher C;
	C.SetNum(Num3);
	C.SetName(Name3);
	C.SetNum(Sex3);
	C.SetAdr(Adr3);
	C.SetTel(Tel3);
	C.SetZhiCheng(ZhiCheng);
	C.SetGongZi(GongZi);
	C.output2();
	cout << "\n";
	C.SetGongZi(opGongZi);
	C.output2();
	return 0;
}


  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bmNkotc2AECynaY6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值