第12周基础练习
1.形状类虚函数(10分)
题目内容:
定义SHAPE类,表示几何图形,x,y位置坐标为其私有数据成员,double;成员函数有:默认构造设置位置坐标为(0,0);两参数构造函数设置x,y;set()函数设置x,y坐标;area()返回面积,虚函数,返回0。成员函数均为公有。
定义派生类——圆类CIRCLE,继承上面的SHAPE类,增加数据成员radius表示半径,double,私有。成员函数有:默认构造函数,设置圆心半径均为0;三参数构造函数初始化圆心和半径;set()设置圆心和半径;area()返回圆的面积,pai取3.14。
编写主程序,(1)定义基类对象sp,初始化位置为(1,2);定义CIRCLE类对象c,初始化位置、半径为(3,4,5);定义SHAPE指针p,定义SHAPE类型的c的引用sp2。p指向sp对象,计算并显示面积;p指向派生类对象c,计算并显示面积;通过引用sp2计算并显示面积。主函数如下:
输入:无
输出:固定值
0
78.5
78.5
样例1输入:
样例1输出:
0
78.5
78.5
【注意】本题的结果不是问题,关键是使用虚函数,并且观察和理解基类指针指向派生类对象时访问的是哪个成员函数;通过基类对派生类的引用访问的是哪个成员函数。下面提供了完整源程序,完成后,试试在类中去掉virtual看运行结果。
//形状类虚函数
#include<iostream>
using namespace std;
#define PI 3.14
class Shape
{
private:
double x, y;
public:
Shape();
Shape(double, double);
void set(double, double);
virtual double area() { return 0; }
};
Shape::Shape()
{
x = 0;
y = 0;
}
Shape::Shape(double a, double b)
{
x = a;
y = b;
}
void Shape::set(double a, double b)
{
x = a;
y = b;
}
/*-------------------------------------*/
class Circle :public Shape
{
private:
double radius;
public:
Circle();
Circle(double a, double b, double r);
void set(double a, double b, double r);
virtual double area();
};
Circle::Circle()
{
Shape::set(0, 0);
radius = 0;
}
Circle::Circle(double a,double b,double r)
{
Shape::set(a, b);
radius = r;
}
void Circle::set(double a, double b, double r)
{
Shape::set(a, b);
radius = r;
}
double Circle::area()
{
return PI * radius * radius;
}
/*--------------------------------------*/
int main()
{
Shape sp(1, 2), * p;
Circle c(3, 4, 5);
Shape& sp2 = c;//Shape类型的c的引用
p = &sp;
cout << p->area() << endl;
p = &c;
cout << p->area() << endl;
cout << sp2.area() << endl;
return 0;
}
2.形状类纯虚函数(10分)
题目内容:
定义SHAPE类,表示几何图形,x,y位置坐标为其私有数据成员,double;成员函数有:默认构造设置位置坐标为(0,0);两参数构造函数设置x,y;set()函数设置x,y坐标;area()返回面积,纯虚函数(纯虚函数的类称为抽象类)。成员函数均为公有。
定义派生类——圆类CIRCLE,继承上面的SHAPE类,增加数据成员radius表示半径,double,私有。成员函数有:默认构造函数,设置圆心半径均为0;三参数构造函数初始化圆心和半径;set()设置圆心和半径;area()返回圆的面积,pai取3.14。
编写主程序,定义CIRCLE类对象c,初始化位置、半径为(3,4,5);定义SHAPE指针p,定义SHAPE类型的c的引用sp2。p指向派生类对象c,计算并显示面积;通过引用sp2计算并显示面积。主函数如下:
输入:无
输出:固定值
78.5
78.5
样例1输入:
样例1输出:
78.5
78.5
//形状类纯虚函数
#include<iostream>
using namespace std;
#define PI 3.14
class Shape
{
private:
double x, y;
public:
Shape();
Shape(double, double);
void set(double, double);
virtual double area() = 0;//纯虚函数
};
Shape::Shape()
{
x = 0;
y = 0;
}
Shape::Shape(double a, double b)
{
x = a;
y = b;
}
void Shape::set(double a, double b)
{
x = a;
y = b;
}
/*-------------------------------------*/
class Circle :public Shape
{
private:
double radius;
public:
Circle();
Circle(double a, double b, double r);
void set(double a, double b, double r);
virtual double area();
};
Circle::Circle():Shape()
{
radius = 0;
}
Circle::Circle(double a, double b, double r):Shape(a,b)
{
radius = r;
}
void Circle::set(double a, double b, double r)
{
Shape::set(a, b);
radius = r;
}
double Circle::area()
{
return PI * radius * radius;
}
/*--------------------------------------*/
int main()
{
Circle c(3, 4, 5);
Shape* p;
Shape& sp2 = c;//Shape类型的c的引用
p = &c;
cout << p->area() << endl;
cout << sp2.area() << endl;
return 0;
}
3.三维空间向量类重载加法运算(10分)
题目内容:
定义空间向量类VECTOR3D,x,y,z坐标分量为其私有数据成员,double;成员函数有:默认构造设置三个分量为(0,0,0);三参数构造函数设置x,y,z;set()函数设置x,y,z坐标;show()函数显示向量为(x,y,z)的形式;重载加运算实现和另一个VECTOR3D对象的加操作。成员函数均为公有。
编写主程序,(1)定义对象a,初始化为(1,2,3);定义对象b,初始化(3,4,5);定义对象c,初始化为(0,0,0),依次显示三个对象。输入三个实数,重新设置b,令c=a+b,再显示a,b,c。主函数如下:
输入:一行三个实数,用空格隔开。
输出:6行,6个向量信息,每个向量用小括号扩起来,分量用空格隔开。
样例1输入:
1 2 1
样例1输出:
(1 2 3)
(3 4 5)
(0 0 0)
(1 2 3)
(1 2 1)
(2 4 4)
//三维空间向量类重载加法运算
#include<iostream>
using namespace std;
class Vector
{
private:
double x, y, z;
public:
Vector();
Vector(double, double, double);
void set(double, double, double);
void show();
Vector operator+(Vector&);
};
Vector::Vector()
{
x = 0;
y = 0;
z = 0;
}
Vector::Vector(double x, double y, double z)
{
this->x = x;
this->y = y;
this->z = z;
}
void Vector::set(double x, double y, double z)
{
this->x = x;
this->y = y;
this->z = z;
}
void Vector::show()
{
cout << '(' << x << ' ' << y << ' ' << z << ')' << endl;
}
Vector Vector::operator+(Vector& a)
{
Vector temp;
temp.x = x + a.x;
temp.y = y + a.y;
temp.z = z + a.z;
return temp;
}
/*******************************************************/
int main()
{
double x, y, z;
cin >> x >> y >> z;
Vector a(1, 2, 3), b(3, 4, 5), c;
a.show();
b.show();
c.show();
b.set(x, y, z);
c = a + b;
a.show();
b.show();
c.show();
return 0;
}
4.复数类重载乘法(10分)
题目内容:
定义复数类COMPLEX,实部、虚部为其私有数据成员,double;成员函数有:默认构造设置设置实部、虚部为(0,0);两参数构造函数设置实部、虚部为x,y;set()函数设置实部、虚部为x,y;show()函数显示复数为x+yj的形式(如0+0j,0+1j);重载乘法运算实现和另一个复数对象的乘操作。成员函数均为公有。
编写主程序,(1)定义对象a,初始化为(1,2);定义对象b,初始化(3,4);定义对象c,初始化为(0,0),依次显示三个对象。输入两个实数,重新设置b的实部虚部,令c=a+b,再显示a,b,c。主函数如下:
输入:两个实数,用空格隔开。
输出:6行,6个复数值。
样例1输入:
1 2
样例1输出:
1+2j
3+4j
0+0j
1+2j
1+2j
-3+4j
//复数类重载乘法
#include<iostream>
using namespace std;
class Complex
{
private:
double x, y;
public:
Complex();
Complex(double, double);
void set(double, double);
void show();
Complex operator*(Complex&);
};
Complex::Complex()
{
x = 0;
y = 0;
}
Complex::Complex(double x, double y)
{
this->x = x;
this->y = y;
}
void Complex::set(double x, double y)
{
this->x = x;
this->y = y;
}
void Complex::show()
{
if (y >= 0)
cout << x << "+" << y << "j" << endl;
if (y < 0)
cout << x << "-" << -y << 'j' << endl;
}
Complex Complex::operator*(Complex& a)
{
double real, imag;
real = this->x * a.x - (this->y * a.y);
imag = this->x * a.y + this->y * a.x;
Complex temp(real, imag);
return temp;
}
/***********************************************/
int main()
{
double x, y;
cin >> x >> y;
Complex a(1, 2), b(3, 4), c;
a.show();
b.show();
c.show();
b.set(x, y);
c = a * b;
a.show();
b.show();
c.show();
return 0;
}