110104 LC-Display


#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 2

class 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值