2010年4月27日 星期二

Problem 706 LCD Display,LCD 顯示字

此題輸入數字的大小與數字串,將此數字串依照數字的大小印出來。

首先,我是將所有的數字都放到一個二維的字元陣列裡,再一次印出。我們可以利用題目給的公式算出一個字的長度 col 與寬度 row,還有整個數字串需要用到多少長度 len。所以寫成 C 與程式碼如下:
col = size + 2, row = size * 2 + 3;
int len = strlen(numStr);
len = (len - 1) + len * col;
其中,size 為數字的大小,numStr 為數字串。將每個數字傳入一函式 putPrint(int num, int site) 可以將字擺到正確位置,這函式會在每一個數字之間加一個空格。 C 語言程式碼如下:
char printArray[25][120];
void line(int sRow, int sCol)
{
int i;
for (i = 1; i < col - 1; i ++)
printArray[sRow][sCol + i] = '-';
}

void space(int sRow, int sCol)
{
int i;
for (i = 1; i < col - 1; i ++)
printArray[sRow][sCol + i] = ' ';
}

void putPrint(int num, int site)
{
int i, nowSite = site * (col + 1) - 1, j;
if (nowSite > 0)
for (i = 0; i < row; i ++)
printArray[i][nowSite] = ' ';
int sCol = nowSite + 1, sRow = 0;
if (num == 0)
{
printArray[sRow][sCol] = ' ', line(sRow, sCol), printArray[sRow][sCol + col - 1] = ' ', sRow ++;
for (i = 0; i < size; i ++)
printArray[sRow][sCol] = '|', space(sRow, sCol), printArray[sRow][sCol + col - 1] = '|', sRow ++;
printArray[sRow][sCol] = ' ', space(sRow, sCol), printArray[sRow][sCol + col - 1] = ' ', sRow ++;
for (i = 0; i < size; i ++)
printArray[sRow][sCol] = '|', space(sRow, sCol), printArray[sRow][sCol + col - 1] = '|', sRow ++;
printArray[sRow][sCol] = ' ', line(sRow, sCol), printArray[sRow][sCol + col - 1] = ' ', sRow ++;
return;
}
if (num == 1)
{
printArray[sRow][sCol] = ' ', space(sRow, sCol), printArray[sRow][sCol + col - 1] = ' ', sRow ++;
for (i = 0; i < size; i ++)
printArray[sRow][sCol] = ' ', space(sRow, sCol), printArray[sRow][sCol + col - 1] = '|', sRow ++;
printArray[sRow][sCol] = ' ', space(sRow, sCol), printArray[sRow][sCol + col - 1] = ' ', sRow ++;
for (i = 0; i < size; i ++)
printArray[sRow][sCol] = ' ', space(sRow, sCol), printArray[sRow][sCol + col - 1] = '|', sRow ++;
printArray[sRow][sCol] = ' ', space(sRow, sCol), printArray[sRow][sCol + col - 1] = ' ', sRow ++;
return;
}
else if (num == 2)
{
...
...
...
}
...
...
...
}

num 為此次數字,site 為此次數字的位置,site * (col + 1) - 1 即為空格列的位置,因為每個數字之間要加行空白,所以它如果小於 0,就代表它是第一個數字,也就不需要空格列,而 site * (col + 1) 則為每個字要印出的行。再接下來就利用 line(int sRow, int sCol) 函式與 space(int sRow, int sCol) 函式來控制每一個字要印出些甚麼。我只列出 0 和 1 的方法,剩下就請大家去玩玩看吧。還不錯玩。
最後,主程式內只需這樣呼叫:
for (i = 0; i < strlen(numStr) ; i ++)
putPrint(numStr[i] - '0', i);
for (i = 0; i < row; i ++)
printArray[i][len] = '\0';
for (i = 0; i < row; i ++)
puts(printArray[i]);
printf("\n");

By David.K

p706題目連結
回ACM題庫目錄
回首頁

沒有留言: