中易网

编写一个程序计算“三角形、正方形、圆形"三种图形的面积,求:a)抽象出一个基类base b)在其中

答案:1  悬赏:20  
解决时间 2021-02-03 22:43
编写一个程序计算“三角形、正方形、圆形"三种图形的面积,求:a)抽象出一个基类base b)在其中说明一个虚函数来球面积; c)利用派生类定义“三角形,正方形、圆形"d)缩写主函数并测试
最佳答案
用C++写的,代码如下:

#include <string>
#include <vector>
#include <iostream>
#include <math.h>
using namespace std;

//存放一个点
struct Point
{
Point ():
x(0.0),
y(0.0)
{
}

Point(double _x, double _y):
x(_x),
y(_y)
{
}

//计算两个点之间的距离
double distance(Point point)
{
return sqrt((point.x - x) * (point.x - x) + (point.y - y) * (point.y - y));
}

double x;
double y;
};

//基类
class Base
{
public:
virtual double getArea() = 0;

//设置点的集合
void setPoint(const vector<Point>& pointSet)
{
m_pointSet = pointSet;
}
protected:
vector<Point> m_pointSet;
};

//三角形
class Triangle : public Base
{
public:

//根据三个点的坐标计算面积
virtual double getArea()
{
if (m_pointSet.size() < 3)
return 0.0;

//海伦公式
Point pointA = m_pointSet.front();
Point pointB = *(m_pointSet.begin() + 1);
Point pointC = *(m_pointSet.begin() + 2);

double a = pointB.distance(pointC);
double b = pointA.distance(pointC);
double c = pointB.distance(pointA);

double p = (a + b + c) / 2.0;
return sqrt(p * (p-a) * (p-b) * (p-c));
}
};

//正方形
class Rectangle : public Base
{
public:

//根据两个点的坐标计算正方形边长,然后计算面积
virtual double getArea()
{
if (m_pointSet.size() < 2)
return 0.0;

Point pointA = m_pointSet.front();
Point pointB = *(m_pointSet.begin() + 1);
double edgeLength = pointA.distance(pointB);
return edgeLength * edgeLength;
}
};

//圆
class Circle : public Base
{
public:

//根据两个点的坐标计算圆的半径,然后计算面积
virtual double getArea()
{
if (m_pointSet.size() < 2)
return 0.0;

Point pointA = m_pointSet.front();
Point pointB = *(m_pointSet.begin() + 1);
double length = pointA.distance(pointB);
return 3.141592653 * length * length;
}
};

int main()
{
vector<Point> point;
point.push_back(Point(0, 0));
point.push_back(Point(0, 50));

//圆,放入圆心和圆上的一个点
Circle circle;
circle.setPoint(point);
double area = circle.getArea();
cout << "Circle : "<< area << endl;

//正方形,放入相邻的两个点
Rectangle rectangle;
rectangle.setPoint(point);
area = rectangle.getArea();
cout << "Rectangle : "<< area << endl;

point.push_back(Point(50, 50));
//三角形,放入三个顶点
Triangle triangle;
triangle.setPoint(point);
area = triangle.getArea();
cout << "Triangle : "<< area << endl;

return 0;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
褒禅山度假村地址在什么地方,想过去办事
我一玩腾讯的游戏就显示游戏环境异常,然后我
有关测定空气中氧气的体积分数的实验的几点问
邹平瑞康服装有限公司地址有知道的么?有点事
阿里巴巴详情页可以放微信二维码吗
雪佛兰乐风与别克凯越哪个比较好
兴安街道西关社区居委会在哪里啊,我有事要去
六级通过之后能不能再考
农业银行卡封存以后还可以再申请使用吗?
云南云超园林绿化工程有限公司地址有知道的么
我的电脑屏幕为什么会闪,有时它闪着闪着屏幕
书柜和衣柜的连接处怎么收口,或怎么处理较好?
be an injury to sb/sth翻译
龙亭区开封翻糖先生西点咖啡地址在哪,我要去
淄博市公安局交通警察支队张店大队祥瑞花园社
推荐资讯
左边上面第二双尖牙吃硬物左边两半牙齿开了,
另一个房间里面乱七八糟又没空调.我现在住的
淘宝上买的东西,快递给寄丢了,可以要求赔偿
cad怎么导出矢量图
玉柴柴油机打不燃,加大油门打十次左右,可以
dell230 开机警告前置usb检测不到,按F1进系
国四柴油车会变成黄标么
求银临的且邀江山共白首
神奇宝贝里小光的圆企鹅是男的还是女的?
广东海洋大学寸金学院有饮用开水喝吗?
万花筒怎么取消
总是无法追上你 这样的你 是什么歌
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?