定义抽象基类Shape,由它派生出3个派生类:Circle(圆形)、Rectangle( 长方形)、和Triangle (三角形),用虚函数分别计算面积。编写求面积和函数double TotalArea (const vector<Shape *> &),该函数利用基类指针向量,它的每一个元素指向一个派生类的图形对象。编写测试解释器,读入各种图形信息,动态生成各种图形对象,由vector<Shape *>管理。利用求面积虚函数,输出面积总和,要求正确释放空间。PI取3.1416。内存泄漏最多扣20%
输入描述
circle 后跟半径 rectangle后跟长和宽 triangle后跟三条边
输出描述
结果保留小数点后4位
样例输入
circle 5.2 circle 6.0
rectangle 3.4 2
triangle 3 4 5
rectangle 4.4 10
样例输出
254.8465
参考代码
#include <iostream>
#include <vector>
#include <iomanip>
#include <cmath>
#include <string>
using namespace std;
const double PI = 3.1416;
class CShape {
public :
virtual double GetArea () const = 0;
virtual ~CShape() {}
};
class CCircle : public CShape {
double m_radius;
public :
CCircle (double radius);
virtual double GetArea () const;
};
CCircle::CCircle (double radius) : m_radius (radius) {}
double CCircle::GetArea () const{
return PI * m_radius * m_radius;
}
class CTriangle : public CShape {
double m_a, m_b, m_c;
public :
CTriangle (double a, double b, double c);
virtual double GetArea () const;
};
CTriangle::CTriangle (double a, double b, double c) : m_a (a), m_b(b), m_c (c) {}
double CTriangle::GetArea () const {
return sqrt ((m_a+m_b+m_c) * (m_a+m_b-m_c) * (m_a+m_c-m_b) * (m_b+m_c-m_a)) /4.0;
}
class CRectangle : public CShape {
double m_a, m_b;
public :
CRectangle (double a, double b);
virtual double GetArea () const;
};
CRectangle::CRectangle (double a, double b) : m_a (a), m_b(b) {}
double CRectangle::GetArea () const {
return m_a * m_b;
}
double TotalArea (const vector<CShape *> &vecShapes)
{
double dSum = 0;
for (unsigned int i = 0; i < vecShapes.size (); ++ i) {
dSum += vecShapes [i]->GetArea ();
}
return dSum;
}
int main()
{
vector<CShape *> vecShapes;
string strShape;
while (cin >> strShape) {
if (strShape == "circle") {
double radius;
cin >> radius;
vecShapes.push_back (new CCircle (radius));
} else if (strShape == "triangle") {
double a,b,c;
cin >> a>>b>> c;
vecShapes.push_back (new CTriangle (a,b,c));
} else if (strShape == "rectangle") {
double a,b;
cin >> a>>b;
vecShapes.push_back (new CRectangle (a,b));
} else {
}
}
cout << fixed << setprecision (4) << TotalArea (vecShapes) << endl;
for (unsigned int i = 0; i < vecShapes.size (); i++) {
delete vecShapes[i];
}
return 0;
}
我的卑微的代码
#include<bits/stdc++.h>
using namespace std;
class Shape{
public:
virtual double totalarea()const=0 ;
virtual ~Shape(){
}
};
class circle : public Shape{
private:double R;
public:
circle(double r): R(r){
}
~circle(){
}
double totalarea()const
{
return R*R*3.1416;
}
};
class rectangle : public Shape{
private: double a,b;
public:
rectangle(double x,double y):a(x), b(y){
}
~rectangle()
{
}
double totalarea()const
{
return a*b;
}
};
class triangle : public Shape{
private: double a,b,c;
public:
triangle(double x,double y ,double z):a(x),b(y),c(z){
}
~triangle(){
}
double totalarea()const
{
double p=(a+b+c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
};
void ans(const vector<Shape*>&t)
{
double sum=0;
for(int i=0;i<t.size();i++)
{
sum+=t[i]->totalarea();
}
printf("%.4f",sum);
}
int main()
{
vector<Shape *>p;
string s;
double a,b,c;
while(cin>>s)
{
if(s=="circle")
{
cin>>a;
p.push_back(new circle(a));
}else if(s=="rectangle")
{
cin>>a>>b;
p.push_back(new rectangle(a,b));
}else
{
cin>>a>>b>>c;
p.push_back(new triangle(a,b,c));
}
}
ans(p);
for(int i=p.size()-1;i>=0;i--)
{
delete p[i];
}
return 0;
}
感觉宽容自己就是罪恶的开始。。。。
老师写的智能指针版的
#include <iostream>
#include <vector>
#include <iomanip>
#include <cmath>
#include <string>
#include <memory>
using namespace std;
const double PI = 3.1416;
class CShape {
public :
virtual double GetArea () const = 0;
virtual ~CShape() {}
};
class CCircle : public CShape {
double m_radius;
public :
CCircle (double radius);
virtual double GetArea () const;
};
CCircle::CCircle (double radius) : m_radius (radius) {}
double CCircle::GetArea () const{
return PI * m_radius * m_radius;
}
class CTriangle : public CShape {
double m_a, m_b, m_c;
public :
CTriangle (double a, double b, double c);
virtual double GetArea () const;
};
CTriangle::CTriangle (double a, double b, double c) : m_a (a), m_b(b), m_c (c) {}
double CTriangle::GetArea () const {
return sqrt ((m_a+m_b+m_c) * (m_a+m_b-m_c) * (m_a+m_c-m_b) * (m_b+m_c-m_a)) /4.0;
}
class CRectangle : public CShape {
double m_a, m_b;
public :
CRectangle (double a, double b);
virtual double GetArea () const;
};
CRectangle::CRectangle (double a, double b) : m_a (a), m_b(b) {}
double CRectangle::GetArea () const {
return m_a * m_b;
}
double TotalArea (const vector<unique_ptr<CShape>> &vecShapes)
{
double dSum = 0;
for (unsigned int i = 0; i < vecShapes.size (); ++ i) {
dSum += vecShapes [i]->GetArea ();
}
return dSum;
}
int main()
{
vector<unique_ptr<CShape> > vecShapes;
string strShape;
while (cin >> strShape) {
if (strShape == "circle") {
double radius;
cin >> radius;
unique_ptr<CShape> ptrCircle (new CCircle (radius));
vecShapes.push_back (std::move (ptrCircle));
} else if (strShape == "triangle") {
double a,b,c;
cin >> a>>b>> c;
unique_ptr<CShape> ptrTriangle (new CTriangle (a,b,c));
vecShapes.push_back (std::move (ptrTriangle));
} else if (strShape == "rectangle") {
double a,b;
cin >> a>>b;
vecShapes.push_back (unique_ptr<CShape> (new CRectangle (a,b)));
} else {
}
}
cout << fixed << setprecision (4) << TotalArea (vecShapes) << endl;
return 0;
}