定义抽象基类Shape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、Rectangle( 长方形)、Trapezoid (梯形)和Triangle (三角形),用虚函数分别计算各种图形的面积,输出它们的面积和。要求用基类指针数组,每一个数组元素指向一个派生类的对象。PI=3.14159f,单精度浮点数计算。
输入格式:
输入在一行中,给出9个大于0的数,用空格分隔,分别代表圆的半径,正方形的边长,矩形的宽和高,梯形的上底、下底和高,三角形的底和高。
输出格式:
输出所有图形的面积和,小数点后保留3位有效数字。
输入样例:
12.6 3.5 4.5 8.4 2.0 4.5 3.2 4.5 8.4
输出样例:
578.109
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
#define PI 3.14159;
double sum=0;
class Shape
{
//private:
//double a;
public:
virtual void are(){
}
};
class Circle:public Shape
{
private:
double r1;
public:
Circle(){};
Circle(double r):r1(r){
}
void are()
{
sum+=pow(r1,2)*PI;
}
};
class Square:public Shape
{
private:
double a1;
public:
Square(){}
Square(double b1):a1(b1)
{
}
void are()
{
sum+= this->a1*this->a1;
}
};
class Rectangle:public Shape
{
private:
double a1,a2;
public:
Rectangle(){}
Rectangle(double b1,double b2):a1(b1),a2(b2)
{
}
void are()
{
sum+= this->a1*this->a2;
}
};
class Trapezoid:public Shape
{
private:
double a1,a2,a3;
public:
Trapezoid(){}
Trapezoid(double b1,double b2,double b3):a1(b1),a2(b2),a3(b3)
{
}
void are()
{
sum+= (this->a1+this->a2)*a3/2.0;
}
};
class Triangle:public Shape
{
private:
double a1,a2;
public:
Triangle(){}
Triangle(double b1,double b2):a1(b1),a2(b2)
{
}
void are()
{
sum+= this->a1*this->a2/2.0;
}
};
int main()
{
double p1,p2,p3,p4,p5,p6,p7,p8,p9;
cin>>p1;
Circle c(p1);
Circle(&a)=c;
a.are();
cin>>p2;
Square S(p2);
Square(&b)=S;
b.are();
cin>>p3>>p4;
Rectangle R(p3,p4);
Rectangle(&r)=R;
r.are();
cin>>p5>>p6>>p7;
Trapezoid T(p5,p6,p7);
Trapezoid(&t)=T;
t.are();
cin>>p8>>p9;
Triangle l(p8,p9);
Triangle(&q)=l;
q.are();
cout<<fixed<<setprecision(3)<<sum;
return 0;
}