基于Point类和Plane类设计圆类Circle并重载运算符实现文件读写操作
基于Point类和Plane类设计圆类Circle并重载运算符实现文件读写操作
本文介绍了基于Point类和Plane类设计圆类Circle的步骤,并重载了运算符'<<'和'>>'以实现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坐标>),<半径>)
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;
}
输入样例
1.0 2.1
输出样例
30.1907
19.4779
参考答案
// 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;}/*设置X坐标*/
void setY(double yv){y=yv;}/*设置Y坐标*/
double getX() const{return x;}/*获取X坐标*/
double getY() const{return y;}/*获取Y坐标*/
friend ostream & operator << (ostream &out, const Point &p) { //运算符<<重载
out<<'('<<p.x<<','<<p.y<<')';
return out;
}
friend istream & operator >> (istream &in, Point &p) { //运算符>>重载
char ch;
in>>ch>>p.x>>ch>>p.y>>ch;
return in;
}
};
// Plane类代码
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):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) { //运算符<<重载
out<<'('<<c.getX()<<','<<c.getY()<<'),'<<c.radius;
return out;
}
friend istream & operator >> (istream &in, Circle &c) { //运算符>>重载
char ch;
in>>ch>>c.x>>ch>>c.y>>ch>>c.radius>>ch;
return in;
}
};
const double Circle::PI=3.14159;
// main函数代码
int main(void)
{
double d1,d2;
cin>>d1>>d2;
Point p(d1,d2);
ofstream fout('s3.txt');
if(fout.is_open())
fout<<p;
fout.close();
Point p1;
ifstream fin('s3.txt');
if(fin.is_open())
fin>>p1;
fin.close();
Circle c(p.getY(),p.getX(),p.getY()+p.getX());
ofstream fout1('b3.dat',ios::binary);
if(fout1.is_open())
fout1.write(reinterpret_cast<char*>(&c),sizeof(c));
fout1.close();
Circle c1;
ifstream fin1('b3.dat',ios::binary);
if(fin1.is_open())
fin1.read(reinterpret_cast<char*>(&c1),sizeof(c1));
fin1.close();
f(c1);
return 0;
}
注意点
- 文件读写时,需要进行文件打开、关闭等操作。
- 注意二进制文件的读写方式。
- 注意友元函数的写法和调用方式。
- 注意数据类型的匹配和强制类型转换。
原文地址: https://www.cveoy.top/t/topic/okCs 著作权归作者所有。请勿转载和采集!