图形管理容器–c++描述

实现原理:虚函数

/********************************************
  CopyRight 200 北京交通大学 计科0601 李赫元…
  程序名称:  图形管理容器
  文件名:    GraphManage.h
  修改日期:  2007-4-7 19:31:01
  描述:      定义了容器类及相关图形类
 ********************************************/

#include <iostream>
#include <vector>
using namespace std;

//基态类 Container
class Container
{
public:
 Container(int ID,int Type);
 int virtual GetArea()=0;
 int virtual GetGirth()=0;
 virtual ~Container(){};
 void ShowInfo();
 int GetId(){return m_nID;}
protected:
 int m_nID;
 int m_nType;
};

//直线类 Line
class Line:public Container
{
public:
 Line(int ID);
 int GetArea();
 int GetGirth();
protected:
 int m_nLength;
};

//三角类 Triangle
class Triangle:public Container
{
public:
 Triangle(int ID);
 int GetArea();
 int GetGirth();
protected:
 int m_a,m_b,m_c;
};

//椭圆类型 Ellipse
class Ellipse:public Container
{
public:
 Ellipse(int ID);
 int GetGirth();
 int GetArea();
protected:
 int m_a,m_b;
};

//矩阵类 Matrix
class Matrix:public Container
{
public:
 Matrix(int ID);
 int GetArea();
 int GetGirth();
protected:
 int m_a,m_b;
};

//容器管理类 Manager
class Manager
{
private:
 vector<Container*> m_vecGraph;
 int m_num;
public:
 Manager():m_num(0){};
 void AddGraph(int type);
 void DelGraph(int ID);
 void Clear();
 void ShowAll();
 int Get_Num(){return m_num;};
};

 

/********************************************
  CopyRight 2007 北京交通大学 计科0601 李赫元
  程序名称:  图形管理容器
  文件名:    GraphManage.cpp
  修改日期:  2007-4-7 20:13:48
  描述:      菜单实现及容器测试主程序
 ********************************************/

 

#include <iostream>
#include "GraphManage.h"
#include <list>
#include <cmath>

using namespace std;

void Container::ShowInfo()
{
 cout<<"编号:"<<m_nID<<endl<<"类型:";
 switch(m_nType)
 {
 case 1:
  cout<<"直线";
  break;
 case 2:
  cout<<"三角形";
  break;
 case 3:
  cout<<"矩形";
  break;
 case 4:
  cout<<"椭圆";
  break;
 }
 cout<<endl;
 cout<<"面积:"<<this->GetArea()<<endl<<"周长:"<<this->GetGirth()<<endl<<endl;

}

Container::Container(int ID,int Type)
{
 this->m_nID=ID;
 this->m_nType=Type;
}

int Line::GetArea()
{
 return 0;
}

int Line::GetGirth()
{
 return this->m_nLength;
}

Line::Line(int ID):
Container(ID,1)
{
 int Length=0;
 do
 {
  cout<<"请输入直线长度:";
  cin>>Length;
 }while(Length<=0);
 this->m_nLength=Length;
}

Triangle::Triangle(int ID)
:m_a(0),m_b(0),m_c(0),Container(ID,2)
{
 cout<<"请依次输入三边长度:";
 cin>>m_a>>m_b>>m_c;
}

Triangle::GetArea()
{
 double s=static_cast<double>((m_a+m_b+m_c)/2);
 return sqrt(s*(s-m_a)*(s-m_b)*(s-m_c));
}

Triangle::GetGirth()
{
 return m_a+m_b+m_c;
}

Matrix::Matrix(int ID)
:m_a(0),m_b(0),Container(ID,3)

 do
 {
  cout<<"请输入两个边长:";
  cin>>m_a>>m_b;
 }while(m_a<0||m_b<0);
 
}

int Matrix::GetArea()
{
 return m_a*m_b;
}

int Matrix::GetGirth()
{
 return (m_a+m_b)*2;
}

Ellipse::Ellipse(int ID)
:m_a(0),m_b(0),Container(ID,4)
{
 do{
  cout<<"请输入椭圆的长半轴与短半轴长度:";
  cin>>m_a>>m_b;
 }while(m_a<0||m_b<0||m_a<m_b);
}

int Ellipse::GetArea()
{
 return 3.14*m_a*m_b;
}

int Ellipse::GetGirth()
{
 return 2*3.14*m_b+4*(m_a-m_b);
}
void Manager::AddGraph(int type)
{
 Container *ptr=NULL;
 
 switch(type)
 {
 case 1:
  ptr=new Line(++this->m_num);
  break;
 case 2:
  ptr=new Triangle(++this->m_num);
  break;
 case 3:
  ptr=new Matrix(++this->m_num);
  break;
 case 4:
  ptr=new Ellipse(++this->m_num);
  break;
 }

 if(ptr)
 {
  this->m_vecGraph.push_back(ptr);
  cout<<"成功写入容器!"<<endl;
 }
 else
  cout<<"内存分配失败!"<<endl;
 
}

void Manager::ShowAll()
{
    cout<<endl<<"————–"<<endl<<"开始遍历容器:"<<endl<<endl;
 vector<Container*>::iterator itCur=m_vecGraph.begin();
 while(itCur!=m_vecGraph.end())
 {
  (*itCur)->ShowInfo();
  itCur++;
 }
 cout<<"遍历结束!\n————–"<<endl;
}

void Manager::DelGraph(int ID)
{
 vector<Container*>::iterator itCur=m_vecGraph.begin();
 bool flag=false;
 while(itCur!=this->m_vecGraph.end())
 {
  if((*itCur)->GetId()==ID)
  {
   flag=true;
   cout<<"成功从容器中清空"<<(*itCur)->GetId()<<"号图形"<<endl;
   delete (*itCur);
   itCur = m_vecGraph.erase(itCur);
  }
  else
   itCur++;
 }
}

void Manager::Clear()
{
 vector<Container*>::iterator itCur=m_vecGraph.begin();
 while(itCur!=this->m_vecGraph.end())
 {
  if(*itCur)
   delete (*itCur);
  itCur++;  
 } 
 this->m_vecGraph.clear();

 cout<<"清空完毕!";
}

 

/********************************************
  CopyRight 2007 北京交通大学 计科0601 李赫元
  程序名称:  图形管理容器
  文件名:    main.cpp
  修改日期:  2007-4-7 19:29:32
  描述:      测试容器类Manager及菜单实现
 ********************************************/

#include <iostream>
#include "GraphManage.h"

using namespace std;

class Menu
{
public:
 void Choice();
 Menu():m_Choice(-1){};
 ~Menu(){cout<<"感谢使用本容器!!";};
private:
 void Show();
 int m_Choice;
 Manager m_Manage;
};

void Menu::Choice()
{
 while(m_Choice)
 {
  Show();
  cin>>m_Choice;
  switch(m_Choice)
  {
   case 1:
   {
    int type=0;
    cout<<"请选择添加类型:";
    cout<<"1.直线 2.三角形 3.矩形 4.椭圆形"<<endl;
    do
    {
     cin>>type;
    }while(type < 1 || type > 4);
    
    m_Manage.AddGraph(type);
   }
   break;
   case 2:
    {
     
     int id=0;
     do
     {
      cout<<"请输入1~"<<this->m_Manage.Get_Num()<<"之间的一个ID(0推出):";
      cin>>id;
      if(id==0)
       break;
     }while(id>this->m_Manage.Get_Num()||id<1);
     if(id)
      this->m_Manage.DelGraph(id);
     else
      break;
    }
    break;
   case 3:
    this->m_Manage.Clear();
    break;
   case 4:
   {
    this->m_Manage.ShowAll();
   }
   break;
   
   case 5:
    m_Choice=0;
  }

 }
}

void Menu::Show()
{
 cout<<"**容器测试程序***"<<endl;
 cout<<"1.为容器添加对象"<<endl;
 cout<<"2.删除容器中对象"<<endl;
 cout<<"3.清空容器"<<endl;
 cout<<"4.遍历容器"<<endl;
 cout<<"5.退出程序"<<endl;

}

int main()
{
 cout<<"\n图形容器 计科0601 李赫元 06281010\n\n";
 Menu m1;
 m1.Choice();
 return 0;
}

Leave a Reply

Your email address will not be published.