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

头文件 GraphManage.h

/********************************************
CopyRight 200 北京交通大学
程序名称: 图形管理容器
文件名: 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 北京交通大学
程序名称: 图形管理容器
文件名: 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 北京交通大学
程序名称: 图形管理容器
文件名: 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. Required fields are marked *