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