第三十一天
问题描述:
基于Point类及平面基类Plane类,设计圆类Circle,并为Point类和Circle重载实现<<和>>运算符,main(void)函数实现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
代码:
#include <iostream>
#include <fstream>
using namespace std;
class Point {
private:
double x;
double y;
public:
Point(double xv = 0, double yv = 0);
void setX(double xv);
void setY(double yv);
double getX() const;
double getY() const;
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;
};
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(const Plane &p)
{
cout << p.area() << endl;
cout << p.length() << endl;
}
void f(const Plane &p);
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 ch1, ch2, ch3;
double x, y;
in >> ch1 >> x >> ch2 >> y >> ch3;
p.setX(x);
p.setY(y);
return in;
}
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 ch1, ch2, ch3;
double x, y, r;
in >> ch1 >> x >> ch2 >> y >> ch3 >> r >> ch1;
c.setX(y);
c.setY(x);
c.setR(r);
return in;
}
int main(void) {
double d1, d2;
cin >> d1 >> d2;
Point p(d1, d2);
Circle c;
ofstream ofs("s3.txt");
ofs << p << endl;
ofs.close();
ifstream ifs("s3.txt");
ifs >> p;
ifs.close();
c.setX(p.getY());
c.setY(p.getX());
c.setR(p.getX() + p.getY());
ofstream ofs1("b3.dat", ios::binary);
ofs1.write((char*)&c, sizeof(c));
ofs1.close();
ifstream ifs1("b3.dat", ios::binary);
Circle c1;
ifs1.read((char*)&c1, sizeof(c1));
ifs1.close();
f(c);
return 0;
}

浙公网安备 33010602011771号