C++ 面向对象编程:基于Point类设计圆类Circle并实现文件读写

本代码实现了一个Point类和Circle类,并使用文件读写操作对这两个类进行数据存储和读取。其中,Point类表示一个点,Circle类继承了Point类,并添加了半径属性,用于表示一个圆。代码中还重载了'<<'和'>>'运算符,方便对Point和Circle对象的输出和输入。

Point类结构说明

Point类的数据成员包括:

  1. 私有数据成员:X坐标x(double型),Y坐标y(double型)。

Point类成员函数包括:

  1. 有参构造函数Point(double, double),其中参数分别为X坐标和Y坐标,默认值均为0。

  2. 公有函数成员void setX(double)和double getX() const分别返回和设置X坐标。

  3. 公有函数成员void setY(double)和double getY() const分别返回和设置Y坐标。

  4. 重载运算符'<<'以实现Point对象的格式输出,输出格式要求:

    '(<X坐标>,<Y坐标>) 例如:(1.0,2.0)等。

  5. 重载运算符'>>'以实现Point对象的格式输入,输入格式要求:

    '(<X坐标>,<Y坐标>) 例如:(1.0,2.0)等。

Plane类结构说明

Plane类的成员函数包括:

  1. 纯虚函数virtual double length()const用于计算平面图形的周长。
  2. 纯虚函数virtual double area()const用于计算平面图形的面积。

Circle类结构说明

公有派生圆类Circle以点类Point、平面图形类Plane为基类,Circle类的结构说明如下:

Circle类的数据成员包括:

  1. 圆心坐标继承自Point类。
  2. 保护静态数据常量PI(double型),其值为3.14159。
  3. 私有数据成员:半径radius(double型)。

Circle类成员函数包括:

  1. 有参构造函数Circle(double, double, double),其中函数参数包括圆心坐标和半径,圆心调用Point类构造函数进行构造,各参数默认值为0。

  2. 公有函数成员void setR(double)和double getR()const分别返回和设置radius。

  3. 重载double area()const用于计算圆的面积。

  4. 重载double length()const用于计算圆的周长。

  5. 重载运算符'<<'以实现Circle对象的格式输出,输出格式要求:

    '((<X坐标>,<Y坐标>),<半径>) 例如:((1.0,2.0),3.0)等。

  6. 重载运算符'>>'以实现Circle对象的格式输入,输入格式要求:

    '((<X坐标>,<Y坐标>),<半径>)

main(void)说明

main(void)的操作顺序描述如下:

  1. 首先已输入的d1、d2来构造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;
}

输入样例

1.0 2.1

输出样例

30.1907
19.4779

解题思路

题目中给出了三个类:Point、Plane、Circle。

Point 类有两个数据成员:x、y,表示坐标值。有四个成员函数:构造函数、setX()、setY()、getX()、getY(),分别用来构造对象、设置坐标值、获取坐标值。还有两个友元函数:'<<' 和 '>>',分别用来输出和输入 Point 对象。

Plane 类是一个抽象类,有两个纯虚函数:length() 和 area(),分别用来计算周长和面积。

Circle 类继承了 Point 和 Plane 类,新增了数据成员 radius 表示圆的半径。有五个成员函数:构造函数、setR()、getR()、area()、length(),用来构造对象、设置和获取半径、计算面积和周长。还有两个友元函数:'<<' 和 '>>',分别用来输出和输入 Circle 对象。

最后,将 Point 和 Circle 对象输出到文件中,并从文件中读取数据,再调用 Circle 对象的成员函数计算面积和周长。

这道题需要注意的是,Point 类的 '<<' 和 '>>' 运算符重载中,输入和输出的格式需要与题目要求保持一致;Circle 类的 '<<' 和 '>>' 运算符重载中,需要输出 (x, y) 和 radius,其中 x 和 y 分别是 Circle 对象中从 Point 类继承而来的坐标。

参考代码

以下为参考代码。

#include <iostream>
#include <fstream>
using namespace std;
//点类Point
class Point
{
private:
    double x;
    double y;
public:
    Point(double xv=0,double yv=0):x(xv),y(yv){}
    void setX(double xv){x=xv;}
    void setY(double yv){y=yv;}
    double getX() const{return x;}
    double getY() const{return 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=3.14159;
public:
    Circle(double xv=0,double yv=0,double r=0):Point(xv,yv),radius(r){}
    void setR(double r){radius=r;}
    double getR() const{return radius;}
    double area()const{return PI*radius*radius;}
    double length()const{return 2*PI*radius;}
    friend ostream & operator << (ostream &out, const Circle &c);
    friend istream & operator >> (istream &in, Circle &c);
};
ostream & operator << (ostream &out, const Point &p)
{
    out<<'('<<p.getX()<<','<<p.getY()<<')';
    return out;
}
istream & operator >> (istream &in, Point &p)
{
    char c1,c2,c3;
    in>>c1>>p.x>>c2>>p.y>>c3;
    return in;
}
ostream & operator << (ostream &out, const Circle &c)
{
    out<<'('<<c.getX()<<','<<c.getY()<<')'<<','<<c.getR();
    return out;
}
istream & operator >> (istream &in, Circle &c)
{
    char c1,c2,c3,c4,c5;
    in>>c1>>c.x>>c2>>c.y>>c3>>c.radius>>c4>>c5;
    return in;
}
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;
    ofstream outfile('s3.txt');
    outfile<<p<<endl;
    outfile.close();
    ifstream infile('s3.txt');
    infile>>p;
    infile.close();
    c.setX(p.getY());
    c.setY(p.getX());
    c.setR(p.getY()+p.getX());
    ofstream outfile2('b3.dat',ios::binary);
    outfile2<<c;
    outfile2.close();
    ifstream infile2('b3.dat',ios::binary);
    infile2>>c;
    infile2.close();
    f(c);
    return 0;
}
C++ 面向对象编程:基于Point类设计圆类Circle并实现文件读写

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

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