[c++] 实验七 类(静态+友元+运算符重载+继承与派生)

时间:2025-01-23 06:58:46

目录

    • 实验7-1:零件类(静态成员)(A)
    • 实验7-2:狮子与老虎的朋友(友元函数)(B)
    • 实验7-3:集合(运算符重载)(C)
    • 实验7-4:矩形类(继承与派生)(D)
    • 实验7-5:员工类(继承与派生)(E)


实验7-1:零件类(静态成员)(A)

【题目描述】
定义一个 Lingjian 类,拥有整型的数据成员 Weight 和静态数据成员 AllWeights(初始化为 0)
每定义一个对象时, 在AllWeights 中增加该零件的重量 Weight;在析构函数中减去 Weight;
静态成员函数 GetAllWeights()获取AllWeights。
设计程序,定义两个对象之后, 输出类的 AllWeights。其中 Weight 是通过成员函数输入对单个零件重量赋值。

【输入形式】
两个整数。 分别为两个对象的重量
【输出形式】
输出一行,是AllWeights的值
【样例输入】

12 24 

【样例输出】

36 
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
class Lingjian
{
		int Weight;
	public:
		Lingjian(int w):Weight(w){
			AllWeights+=Weight;
		}
		static int AllWeights;	
		~Lingjian(){
			AllWeights-=Weight;
		}
};
int Lingjian::AllWeights=0;

int main()
{
	int a,b;
	cin>>a>>b;
	Lingjian lj1(a),lj2(b);
	cout<<Lingjian::AllWeights<<endl;
}

实验7-2:狮子与老虎的朋友(友元函数)(B)

【题目描述】
定义狮子 Lion 与老虎 Tiger 两个类,二者都有 weight 私有整型属性,
定义二者的一个友元函数 totalWeight(参数表),计算二者的重量和。
设计程序,定义狮子与老虎两个对象之后,调用 totalWeight(参数表),计算二者的重量和,然后输出。其中狮子与老虎的 Weight 是在各自的类成员函数中读数赋值。
【输入形式】
两个整数。分别为狮子与老虎对象的重量
【输出形式】
输出一个整数,是两个对象重量之和。
【样例输入】

240 280

【样例输出】

520
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
class Tiger;
class Lion
{
	private:
		int weight;
	public:
		Lion(int w):weight(w){}
		friend int totalWeight(Lion &l,Tiger &t);
};
class Tiger
{
	private:
		int weight;
	public:
		Tiger(int w):weight(w){}
		friend int totalWeight(Lion &l,Tiger &t);
};
int totalWeight(Lion &l,Tiger &t)
{
	return t.weight+l.weight;
}


int main()
{
	int a,b;
	cin>>a>>b;
	Lion l(a);
	Tiger t(b);
	cout<<totalWeight(l,t)<<endl;
}

实验7-3:集合(运算符重载)(C)

【题目描述】
集合是由一个或多个确定的元素所构成的整体。集合的运算有并、交、相对补等。

  • 集合A和集合B的交集:由属于A且属于B的相同元素组成的集合。
  • 集合A和集合B的并集:由所有属于集合A或属于集合B的元素所组成的集合。
  • 集合B关于集合A的相对补集,记做A-B:由属于A而不属于B的元素组成的集合。

假设集合A={10,20,30},集合B={1,10,50,8}。
则A与B的并是{10,20,30,1,50,8},A与B的交是{10},B关于A的相对补集是{20,30}。

定义整数集合类CSet,属性包括:集合中的元素个数n,整型指针data存储集合中的元素
主函数输入集合A、B的数据,计算集合的并、交、相对补
可根据题目,为CSet类添加需要的成员函数。
方法有:

  • 重载输出,按样例格式输出集合中的元素。
  • 重载+运算符,求集合A和集合B的并集,并返回结果集合。
  • 重载-运算符,求集合B关于集合A的相对补集,并返回结果集合。
  • 重载*运算符,求集合A和集合B的交集,并返回结果集合。

【输入形式】
测试次数
每组测试数据两行,格式如下:

  • 第一行:集合A的元素个数和元素
  • 第二行:集合B的元素个数和元素

【输出形式】
每组测试数据输出如下:

  • 第一行:集合A
  • 第二行:集合B
  • 第三行:A和B的并
  • 第四行:A和B的交
  • 第五行:B关于A的相对补集 与 A关于B的相对补集的并,即(A-B)+(B-A)

每组测试数据间以空行分隔。
【样例输入】

2
3 10 20 30
4 10 1 2 3
5 100 2 3 4 -10
6 -34 12 2 4 90 100

【样例输出】

A:10 20 30
B:10 1 2 3
A+B:10 20 30 1 2 3
A*B:10
(A-B)+(B-A):20 30 1 2 3

A:100 2 3 4 -10
B:-34 12 2 4 90 100
A+B:100 2 3 4 -10 -34 12 90
A*B:100 2 4
(A-B)+(B-A):3 -10 -34 12 90
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
class CSet
{
	public:
		int *data;
		int n;
		CSet(int n_=0,int *a=0):n(n_){
			data = new int[n];
			data = a; 
		}
		CSet operator + (CSet );
		CSet operator - (CSet );
		CSet operator * (CSet );
};
CSet CSet::operator + (CSet c)
{
	int a[1000],t=0,j;
	for (int i=1;i<=n;i++) a[++t]=*(data+i);
	for (int i=1;i<=c.n;i++)
	{
		j=1;
		while (*(c.data+i)!=a[j]&&j<=t) j++;
		if (j>t) a[++t]=*(c.data+i);
	}
	CSet res(t,a);
	return res;
}
CSet CSet::operator * (CSet c)
{
	int a[1000],t=0,j;
	for (int i=1;i<=n;i++)
	{
		j=1;
		while (j<=c.n){
			if (*(data+i)==*(c.data+j)) a[++t]=*(data+i);
			j++;
		}
	}
	CSet res(t,a);
	return res;
}
CSet CSet::operator - (CSet c)
{
	int *a,t=0,j;
	a = new int[n+c.n];
	for (int i=1;i<=n;i++)
	{
		j=1;
		while (*(data+i)!=*(c.data+j)&&j<=c.n) j++;
		if (j>c.n) {*(a+(++t))=*(data+i);}
	}
	CSet res(t,a);
	return res;
}
void display(CSet c)
{
	for (int j=1;j<=c.n;j++) {
		if (j!=1) cout<<" ";
		cout<<*(c.data+j);
	}
	cout<<endl;
}
void getin(int *a,int m)
{
	for (int j=1;j<=m;j++){
		cin>>*(a+j);
		if (j!=1) cout<<" ";
		cout<<*(a+j);
	}
	cout<<endl;
}
int main()
{
	int n,a[1000],b[1000],m1,m2;
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		cin>>m1;
		cout<<"A:";	getin(a,m1);
		cin>>m2;
		cout<<"B:";	getin(b,m2);
		CSet c1(m1,a),c2(m2,b),c3,c4,c;
		c=c1+c2;
		cout<<"A+B:"; display(c);
		c=c1*c2;
		cout<<"A*B:"; display(c);
		c3=c1-c2;c4=c2-c1;
		c=c3+c4;
		cout<<"(A-B)+(B-A):"; display(c);
		cout<<endl;
	}
}

实验7-4:矩形类(继承与派生)(D)

【题目描述】
要求定义一个基类Point,它有两个私有的float型数据成员X,Y;一个构造函数用于对数据成员初始化;有一个成员函数void Move(float xOff, float yOff)实现分别对X,Y值的改变,其中参数xOff和yOff分别代表偏移量。另外两个成员函数GetX() 、GetY()分别返回X和Y的值。
Rectangle类是基类Point的公有派生类。它增加了两个float型的私有数据成员W,H; 增加了两个成员函数float GetH() 、float GetW()分别返回W和H的值;并定义了自己的构造函数,实现对各个数据成员的初始化。
编写主函数main()根据以下的输入输出提示,完成整个程序。

【输入形式】
6个float型的数据,分别代表矩形的横坐标X、纵坐标Y、宽度W,高度H、横向偏移量的值、纵向偏移量的值;每个数据之间用一个空格间隔
【输出形式】
输出数据共有4个,每个数据之间用一个空格间隔。分别代表偏移以后的矩形的横坐标X、纵坐标Y、宽度W,高度H的值
【样例输入】

5 6 2 3 1 2

【样例输出】

6 8 2 3
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
class Point
{
	private:
		float X;
		float Y;
	public:
		Point(float x,float y):X(x),Y(y){}
		void Move(float xOff, float yOff)
		{
			X+=xOff;
			Y+=yOff;
		}
		float GetX(){return X;}
		float GetY(){return Y;}
};

class Rectangle:public Point
{
	private:
		float W;
		float H;
	public:
		Rectangle(float x,float y,float w,float h):Point(x,y),W(w),H(h){}
		float GetW(){return W;}
		float GetH(){return H;}
};

int main()
{
	float a,b,c,d,e,f;
	cin>>a>>b>>c>>d>>e>>f;
	Rectangle r(a,b,c,d);
	r.Move(e,f);
	cout<<r.GetX()<<" "<<r.GetY()<<" "<<r.GetW()<<" "<<r.GetH()<<endl;
}

实验7-5:员工类(继承与派生)(E)

【题目描述】
定义一个基类Person,它有3个protected的数据成员:姓名name(char *类型)、性别 sex(char类型)、年龄age(int类型);一个构造函数用于对数据成员初始化;有一个成员函数show()用于输出数据成员的信息。
创建Person类的公有派生类Employee,增加两个数据成员 基本工资 basicSalary(int类型) 请假天数leaveDays(int型);为它定义初始化成员信息的构造函数,和显示数据成员信息的成员函数show()。
【输入形式】
共5个数据,分别代表姓名、性别、年龄、基本工资、请假天数。
【输出形式】
如示例数据所示,共5行,分别代表姓名、年龄、性别、基本工资、请假天数
【样例输入】

zhangsan m 30 4000 2

【样例输出】

name:zhangsan
age:30
sex:m
basicSalary:4000
leavedays:2
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
class Person
{
	protected:
		char* name;
		char sex;
		int age;
	public:
		Person(char *name_,char sex_,int age_):name(name_),sex(sex_),age(age_){}
		void show();
};
void Person::show()
{
	cout<<"name:"<<name<<endl;
	cout<<"age:"<<age<<endl;
	cout<<"sex:"<<sex<<endl;
}

class Employee:public Person
{
	public:
		int basicSalary;
		int leaveDays;
		Employee(char *name_,char sex_,int age_,int bs,int ld):Person(name_,sex_,age_),basicSalary(bs),leaveDays(ld){}
		void show();
};
void Employee::show()
{
	Person::show();
	cout<<"basicSalary:"<<basicSalary<<endl;
	cout<<"leavedays:"<<leaveDays<<endl;
}

int main()
{
	char name_[1000],sex_;
	int age_,bs_,ld_;
	cin>>name_>>sex_>>age_>>bs_>>ld_;
	Employee someone(name_,sex_,age_,bs_,ld_);
	someone.show();
}