C++大作业–图形容器管理类GraphManage

头文件 GraphManage.h

/********************************************
  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;};
};

实现文件 GraphManage.cpp


/********************************************
    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<<"清空完毕!";
}

测试程序main.cpp

/********************************************
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;

}

Leave a Reply

Your email address will not be published.