输入若干个几何形体的参数,要求按面积从小到大输出,并在输出中指明几何形体类型。
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
class CShape{
public:
virtual double Area()=0; //存虚函数,无函数体
virtual void PrintInfo()=0;
};
class CRectangle:public CShape{
public:
int w,h;
virtual double Area();
virtual void PrintInfo();
};
class CCircle:public CShape{
public:
int r;
virtual double Area();
virtual void PrintInfo();
};
class CTriangle:public CShape{
public:
int a,b,c;
virtual double Area();
virtual void PrintInfo();
};
double CRectangle::Area(){
return w*h;
}
void CRectangle::PrintInfo(){
cout<<"Rectangle:"<<Area()<<endl;
}
double CCircle::Area(){
return 3.14*r*r;
}
void CCircle::PrintInfo(){
cout<<"Circle:"<<Area()<<endl;
}
double CTriangle::Area(){
double p=(a+b+c)/2.0;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
void CTriangle::PrintInfo(){
cout<<"Triangle:"<<Area()<<endl;
}
CShape* pShapes[100];
int MyCompare(const void* s1,const void* s2);
int MyCompare(const void* s1,const void* s2)
{
double a1,a2;
CShape** p1; //s1,s2是void*,
CShape** p2;
p1=(CShape**)s1; //s1,s2指向pShape数组中的元素,数组元素是CShape*,因此p1,p2是
p2=(CShape**)s2; //指向指针的指针,CShape**
a1=(*p1)->Area(); //*p1的类型是CShape*,是基类的指针,因此是多态
a2=(*p2)->Area();
if(a1<a2)
return -1;
else if(a2<a1)
return 1;
else
return 0;
}
int main()
{
int i,n;
CRectangle *pr; CCircle *pc;CTriangle *pt;
cin>>n;
for(i=0;i<n;i++)
{
char c;
cin>>c;
switch(c)
{
case 'R':
pr=new CRectangle();
cin>>pr->w>>pr->h;
pShapes[i]=pr;
break;
case 'C':
pc=new CCircle();
cin>>pc->r;
pShapes[i]=pc;
break;
case 'T':
pt=new CTriangle();
cin>>pt->a>>pt->b>>pt->c;
pShapes[i]=pt;
break;
}
}
qsort(pShapes,n,sizeof(CShape*),MyCompare);
for(i=0;i<n;i++)
{
pShapes[i]->PrintInfo(); //多态
}
return 0;
}
输入样例:
输出样例:
案例来自北京大学网络课堂《C++程序设计》