• 自考新教材-p255


    使用多态处理图形示例

    源程序:

    #include <iostream>

    #include <cmath>

    using namespace std;

    class CShape

    {

    protected:

      double acreage;

    public:

      CShape()

       {

        //cout<<"基类构造函数"<<endl;

      };

       virtual ~CShape()

       {

        //cout<<"基类析构函数"<<endl;

      }

      virtual double CalAcr()

      {

        return 0;

       };

       virtual void setAcreage(double acre){};

       virtual void PrintInfo(){};

    };

    class CRectangle:public CShape

    {

       double width,high;

    public:

       CRectangle(double w,double h)

      {

         //cout<<"矩形带参构造函数"<<endl;

         width = w;

         high = h;

      };

      CRectangle()

      {

        //cout<<"矩形无参构造函数"<<endl;

        width = 0;

         high = 0;

       };

       ~CRectangle()

      {

        //cout<<"矩形析构函数"<<endl;

      }

      virtual double CalAcr();

      virtual void PrintInfo();

      virtual void setAcreage(double);

    };

    class CCircle:public CShape

    {

      double radius;

    public:

      CCircle(double r)

      {

      //cout<<"圆形带参构造函数"<<endl;

      radius = r;

      };

      CCircle()

      {

        //cout<<"圆形无参构造函数"<<endl;

        radius = 0;

      };

      ~CCircle()

      {

        //cout<<"圆形析构函数"<<endl;

      }

      virtual double CalAcr();

      virtual void PrintInfo();

      virtual void setAcreage(double);

    };

    class CTriangle:public CShape

    {

      double a,b,c;

    public:

      CTriangle(double a,double b,double c)

       {

        //cout<<"三角形带参构造函数"<<endl;

        this->a=a;

        this->b=b;

        this->c=c;

      };

      CTriangle()

      {

        //cout<<"三角形无参构造函数"<<endl;

        a=0;

        b=0;

        c=0;

      };

      ~CTriangle()

       {

        //cout<<"三角形析构函数"<<endl;

      };

       virtual double CalAcr();

       virtual void PrintInfo();

      virtual void setAcreage(double);

    };

    double CRectangle::CalAcr()

    {

       return width*high;

    }

    void CRectangle::PrintInfo()

    {

       cout<<"矩形. 宽度="<<this->width<<",高度 ="<<this->high<<", 面积"<<this->acreage<<endl;

    }

    void CRectangle::setAcreage(double acre)

    {

      acreage = acre;

    }

     

    double CCircle::CalAcr()

    {

      return 3.14*radius*radius;

    }

    void CCircle::PrintInfo()

    {

      cout<<"圆. 半径="<<this->radius<<",面积"<<this->acreage<<endl;

    }

    void CCircle::setAcreage(double acre)

    {

      acreage = acre;

    }

     

    double CTriangle::CalAcr()

    {

      double p = (a+b+c)/2.0;

      return sqrt(p*(p-a)*(p-b)*(p-c));

    }

    void CTriangle::PrintInfo()

    {

      cout<<"三角形.三条边分别是: "<<this->a<<","<<this->b<<","<<this->c<<",面积="<<this->acreage<<endl;

    }

    void CTriangle::setAcreage(double acre)

    {

      acreage = acre;

    }

    CShape * pShapes[100];

     

    int main()

    {

      int i,n;

       double temp1,temp2,temp3;

       CRectangle *pr;CCircle *pc;CTriangle *pt;

       cin>>n;

       for(i=0;i<n;++i)

       {

        char c;

         cin>>c;

        switch(c)

         {

        case'R':case'r':

          cin>>temp1>>temp2;

          pr=new CRectangle(temp1,temp2);

          pr->setAcreage(pr->CalAcr());

          pShapes[i]=pr;

          break;

        case'C':case'c':

          cin>>temp1;

          pc=new CCircle(temp1);

          pc->setAcreage(pc->CalAcr());

          pShapes[i]=pc;

           break;

        case'T':case't':

          cin>>temp1>>temp2>>temp3;

          pt=new CTriangle(temp1,temp2,temp3);

          pt->setAcreage(pt->CalAcr());

          pShapes[i]=pt;

          break;

        }

      }

      if(n==1)

        cout<<"共有 "<<n<<"种图形,它是"<<endl;

      else

        cout<<"共有 "<<n<<"种图形,分别是"<<endl;

      for(i=0;i<n;++i)

       {

        //cout<<"1"<<endl;

        pShapes[i]->PrintInfo();

        delete pShapes[i];

       }

       system("pause");

      return 0;

    }

    运行结果:

  • 相关阅读:
    NOIP 2008 立体图
    JDOJ 1606 数字三角形
    JDOJ 1133 分段公司利润
    NOIP 2011 选择客栈
    NOIP 2014 无线网络发射器选址
    USACO Party Invitations
    NOI 2001 食物链
    NOI 2002 银河英雄传说
    BOI 2003 团伙
    NOIP 2017 奶酪
  • 原文地址:https://www.cnblogs.com/duanqibo/p/12183280.html
Copyright © 2020-2023  润新知