C++ 点类 (Point) 和圆类 (Circle) 的实现与应用
C++ 点类 (Point) 和圆类 (Circle) 的实现与应用
Point 类
Point 类表示二维平面上的一个点,其数据成员包括:
- 私有数据成员:
- X 坐标 x (double 型)
- Y 坐标 y (double 型)
Point 类的成员函数包括:
- 有参构造函数
Point(double, double),其中参数分别为 X 坐标和 Y 坐标,默认值均为 0。 - 公有函数成员
void setX(double)和double getX() const分别返回和设置 X 坐标。 - 公有函数成员
void setY(double)和double getY() const分别返回和设置 Y 坐标。 - 重载运算符
<<以实现 Point 对象的格式输出,输出格式要求:(<X坐标>,<Y坐标>)- 例如:
(1.0,2.0)等。
- 重载运算符
>>以实现 Point 对象的格式输入,输入格式要求:(<X坐标>,<Y坐标>)- 例如:
(1.0,2.0)等。
Plane 类
Plane 类是平面图形的基类,其成员函数包括:
- 纯虚函数
virtual double length()const用于计算平面图形的周长。 - 纯虚函数
virtual double area()const用于计算平面图形的面积。
Circle 类
Circle 类是公有派生类,以点类 Point 和平面图形类 Plane 为基类。Circle 类的结构说明如下:
- Circle 类的数据成员包括:
- 圆心坐标继承自 Point 类。
- 保护静态数据常量
PI(double 型),其值为 3.14159。 - 私有数据成员:半径
radius(double 型)。
- Circle 类成员函数包括:
- 有参构造函数
Circle(double, double, double),其中函数参数包括圆心坐标和半径,圆心调用 Point 类构造函数进行构造,各参数默认值为 0。 - 公有函数成员
void setR(double)和double getR()const分别返回和设置radius。 - 重载
double area()const用于计算圆的面积。 - 重载
double length()const用于计算圆的周长。 - 重载运算符
<<以实现 Circle 对象的格式输出,输出格式要求:((<X坐标>,<Y坐标>),<半径>)- 例如:
((1.0,2.0),3.0)等。
- 重载运算符
>>以实现 Circle 对象的格式输入,输入格式要求:((<X坐标>,<Y坐标>),<半径>)- 例如:
((1.0,2.0),3.0)等。
- 有参构造函数
main(void) 说明
main(void) 的操作顺序描述如下:
- 首先已输入的
d1、d2来构造 Point 对象p,并将p用<<写入文本文件s3.txt中。 - 再将文本文件
s3.txt打开,应用>>操作将里面的数据读入到 Point 对象p中。 - 利用 Point 对象
p的数据设置 Circle 对象c,设置要求:- 将
c的圆心 X 坐标设置为p的 Y 坐标。 - 将
c的圆心 Y 坐标设置为p的 X 坐标。 - 将
c的半径设置为p的 Y 坐标与 X 坐标的和。 - 并将设置好的
c写入二进制文件b3.dat中。
- 将
- 再将二进制文件
b3.dat打开,将里面的数据读入到 Circle 对象c中。 - 最后以
c对象为参数调用f函数。
代码示例
#include <iostream>
#include <fstream>
using namespace std;
// 点类 Point
class Point
{
private:
double x;
double y;
public:
Point(double xv=0,double yv=0);
/*构造函数*/
void setX(double xv);
/*设置X坐标*/
void setY(double yv);
/*设置Y坐标*/
double getX() const;
/*获取X坐标*/
double getY() const;
/*获取Y坐标*/
friend ostream & operator << (ostream &out, const Point &p); //运算符<<重载
friend istream & operator >> (istream &in, Point &p); //运算符>>重载
};
class Plane /*平面图形基类*/
{
public:
virtual double length()const=0;
/*周长*/
virtual double area()const=0;
/*面积*/
};
// 圆类 Circle
class Circle:public Point,public Plane
{
private:
double radius;
protected:
static const double PI;
public:
Circle(double xv=0,double yv=0,double r=0);
/*构造函数*/
void setR(double r);
/*设置半径*/
double getR() const;
/*获取半径*/
double area()const;
/*面积*/
double length()const;
/*周长*/
friend ostream & operator << (ostream &out, const Circle &c); //运算符<<重载
friend istream & operator >> (istream &in, Circle &c); //运算符>>重载
};
/*请在这里填写第一部分答案*/
void f(Plane const &p)
{
cout<<p.area()<<endl;
cout<<p.length()<<endl;
}
//主函数
int main(void)
{
double d1,d2;
cin>>d1>>d2;
Point p(d1,d2);
Circle c;
/*请在这里填写第二部分答案*/
f(c);
return 0;
}
第一部分答案
#include "Point.h"
#include <iostream>
using namespace std;
Point::Point(double xv, double yv):x(xv),y(yv){}
void Point::setX(double xv)
{
x = xv;
}
void Point::setY(double yv)
{
y = yv;
}
double Point::getX() const
{
return x;
}
double Point::getY() const
{
return y;
}
ostream & operator << (ostream &out, const Point &p)
{
out << "(" << p.x << "," << p.y << ")";
return out;
}
istream & operator >> (istream &in, Point &p)
{
char ch;
in >> ch >> p.x >> ch >> p.y >> ch;
return in;
}
Plane类是个纯虚基类,不需要实现。
#include "Circle.h"
#include <cmath>
#include <iostream>
using namespace std;
const double Circle::PI = 3.14159;
Circle::Circle(double xv, double yv, double r):Point(xv, yv), radius(r){}
void Circle::setR(double r)
{
radius = r;
}
double Circle::getR() const
{
return radius;
}
double Circle::area() const
{
return PI * radius * radius;
}
double Circle::length() const
{
return 2 * PI * radius;
}
ostream & operator << (ostream &out, const Circle &c)
{
out << "(" << c.getX() << "," << c.getY() << ")," << c.radius;
return out;
}
istream & operator >> (istream &in, Circle &c)
{
char ch;
double x, y, r;
in >> ch >> x >> ch >> y >> ch >> ch >> r >> ch;
c.setX(y);
c.setY(x);
c.setR(y + x);
return in;
}
第二部分答案
// 在main函数中,先输入两个double类型的数据d1和d2,用它们构造一个Point对象p,并将p写入文本文件s3.txt中:
ofstream ofs("s3.txt");
ofs << p << endl;
ofs.close();
// 再将文本文件s3.txt打开,将里面的数据读入到Point对象p中:
ifstream ifs("s3.txt");
ifs >> p;
ifs.close();
// 利用Point对象p的数据设置Circle对象c,设置要求:将c的圆心X坐标设置为p的Y坐标,将c的圆心Y坐标设置为p的X坐标,将c的半径设置为p的Y坐标与X坐标的和。并将设置好的c写入二进制文件b3.dat中:
c.setX(p.getY());
c.setY(p.getX());
c.setR(p.getY() + p.getX());
ofstream ofs2("b3.dat", ios::binary);
ofs2.write((char*)&c, sizeof(Circle));
ofs2.close();
// 再将二进制文件b3.dat打开,将里面的数据读入到Circle对象c中:
ifstream ifs2("b3.dat", ios::binary);
ifs2.read((char*)&c, sizeof(Circle));
ifs2.close();
// 最后以c对象为参数调用f函数:
f(c);
原文地址: https://www.cveoy.top/t/topic/ok3H 著作权归作者所有。请勿转载和采集!