您的位置:首页 > 编程语言

110104 LC-Display

2013-08-30 14:34 253 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程