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) 的操作顺序描述如下:

  1. 首先已输入的 d1d2 来构造 Point 对象 p,并将 p<< 写入文本文件 s3.txt 中。
  2. 再将文本文件 s3.txt 打开,应用 >> 操作将里面的数据读入到 Point 对象 p 中。
  3. 利用 Point 对象 p 的数据设置 Circle 对象 c,设置要求:
    • c 的圆心 X 坐标设置为 p 的 Y 坐标。
    • c 的圆心 Y 坐标设置为 p 的 X 坐标。
    • c 的半径设置为 p 的 Y 坐标与 X 坐标的和。
    • 并将设置好的 c 写入二进制文件 b3.dat 中。
  4. 再将二进制文件 b3.dat 打开,将里面的数据读入到 Circle 对象 c 中。
  5. 最后以 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);
C++ 点类 (Point) 和圆类 (Circle) 的实现与应用

原文地址: https://www.cveoy.top/t/topic/ok3H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录