目录
- 实验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();
}