110104 LC-Display

来源:互联网 发布:数据分析生命周期模型 编辑:程序博客网 时间:2024/04/18 11:35


#include <iostream>#include <stdlib.h>#include <malloc.h>#include <stdio.h>#include <string.h>#include <vector>using namespace std;typedef unsigned int SIZE_t;typedef char DATA_t;static char s_Elems[] = {' ', '-', '|'};static bool s_Properties[][7] ={    // top, topLeft, topRight, middle, bottomLeft, bottomRight, bottom    {true, true, true, false, true, true, true},    {false, false, true, false, false, true, false},    {true, false, true, true, true, false, true},    {true, false, true, true, false, true, true},    {false, true, true, true, false, true, false},    {true, true, false, true, false, true, true},    {true, true, false, true, true, true, true},    {true, false, true, false, false, true, false},    {true, true, true, true, true, true, true},    {true, true, true, true, false, true, true}};#define HOR_LINE 1#define VER_LINE 2class Digital{public:    Digital(SIZE_t size, bool* pProperty) :        m_Size(size),         m_pProperty(pProperty)    {        Init();    }    ~Digital()    {        SIZE_t height = GetHeight();        for(SIZE_t i = 0; i < height; ++i)            free(m_pData[i]);        delete[] m_pData;    }    void OutputLine(int lineNo)    {        SIZE_t width = GetWidth();        for (SIZE_t i = 0; i < width; ++i)            cout << s_Elems[m_pData[lineNo][i]];    }    SIZE_t GetHeight()    {        return 1 + m_Size + 1 + m_Size + 1;    }protected:    SIZE_t GetWidth()    {        return 1 + m_Size + 1;    }    void Init()    {        SIZE_t height = GetHeight();        SIZE_t width = GetWidth();        m_pData = new DATA_t*[1 + m_Size + 1 + m_Size + 1];        for(SIZE_t i = 0; i < height; ++i)            m_pData[i] = (DATA_t*)calloc(width, sizeof(DATA_t));        DrawSelf();    }    void DrawSelf()    {        SIZE_t height = GetHeight();        SIZE_t width = GetWidth();        int i = -1;        if (m_pProperty[++i])        {            for (SIZE_t i = 1; i <= m_Size; ++i)                m_pData[0][i] = HOR_LINE;        }        if (m_pProperty[++i])        {            for (SIZE_t i = 1; i <= m_Size; ++i)                m_pData[i][0] = VER_LINE;        }        if (m_pProperty[++i])        {            for (SIZE_t i = 1; i <= m_Size; ++i)                m_pData[i][width - 1] = VER_LINE;        }        if (m_pProperty[++i])        {            for (SIZE_t i = 1; i <= m_Size; ++i)                m_pData[1 + m_Size][i] = HOR_LINE;        }        if (m_pProperty[++i])        {            for (SIZE_t i = m_Size + 2; i <= height - 2; ++i)                m_pData[i][0] = VER_LINE;        }        if (m_pProperty[++i])        {            for (SIZE_t i = m_Size + 2; i <= height - 2; ++i)                m_pData[i][width - 1] = VER_LINE;        }        if (m_pProperty[++i])        {            for (SIZE_t i = 1; i <= m_Size; ++i)                m_pData[height - 1][i] = HOR_LINE;        }    }private:    SIZE_t m_Size;    DATA_t** m_pData;    bool* m_pProperty;};typedef vector<Digital*> Number;void DisplayNumber(Number& number){    SIZE_t lines = number[0]->GetHeight();    size_t cnt = number.size();    for (SIZE_t i = 0; i < lines; ++i)    {        for(size_t j = 0; j < cnt; ++j)        {            number[j]->OutputLine(i);            if (j < (cnt - 1))                cout << ' ';        }        cout << endl;    }    cout << endl;}void DisplayAllNumbers(const vector<Number*>& allNumbers){    size_t cnt = allNumbers.size();    for(size_t i = 0; i < cnt; ++i)    {        DisplayNumber(*(allNumbers[i]));    }}void ClearNumber(Number& nums){    size_t cnt = nums.size();    for(size_t j = 0; j < cnt; ++j)    {        delete nums[j];    }    nums.clear();}void ClearAllNumbers(vector<Number*>& allNumbers){    size_t cnt = allNumbers.size();    for(size_t i = 0; i < cnt; ++i)    {        ClearNumber(*(allNumbers[i]));        delete allNumbers[i];    }    allNumbers.clear();}void Input(vector<Number*>& allNumbers){    SIZE_t size;    char strNo[9];    while(true)    {        cin >> size >> strNo;        if (size == 0)            return;        int len = strlen(strNo);        Number* pNumber = new Number();        for (int i = 0; i < len; ++i)        {            pNumber->push_back(new Digital(size, s_Properties[strNo[i] - '0']));        }        allNumbers.push_back(pNumber);    }}void DoJob(){    vector<Number*> allNumbers;    Input(allNumbers);    DisplayAllNumbers(allNumbers);    ClearAllNumbers(allNumbers);}int main(int argc, char* argv[]){    DoJob();    return 0;}


原创粉丝点击