前言
上一篇《C算法編程題(二)正螺旋》
寫東西前還是喜歡吐槽點東西,要不然寫的真還沒意思,一直的想法是在博客園把自己上學和工作時候整理的東西寫出來和大家分享,就像前面寫的《T-Sql學習系列》,當然這些只是適合初學者,之后還有很多系列,寫這些東西的目的:一是真的可以幫到那些初學者;二是自己回過頭去回憶那些曾經的記憶,畢竟工作了,也沒那個時間了。
說到時間,真的還沒時間,這段時間公司的項目要上線,都比較忙,真的好后悔前段時間沒有去好好看看書,前兩天買了兩本書《CLR VIA C#》和《漫談設計模式》,我的想法是現在學習設計模式的,說實話是真的想學,以后的路也是想走這一條。但是在博園看了一些設計模式相關的文章,發現設計模式有時候會涉及到底層的東西,大學時候只是學的C#這門語言,沒怎么講framework相關的東西,所以才買了那本書,希望可以惡補下,還有學習那個權限管理系統系列的計划,現在發現真的有很多事要做,不多說了,希望自己可以熬過這段時間。
發現自己現在還真是有點啰嗦,打住~~~。
今天說的這個題目和上一個差不多,也是通過一定的邏輯輸出東西的。
程序要求
程序描述:
在中文Windows環境下,控制台窗口中也可以用特殊符號拼出漂亮的表格來。
比如:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
└─┴─┘
其實,它是由如下的符號拼接的:
左上 = ┌
上 = ┬
右上 = ┐
左 = ├
中心 = ┼
右 = ┤
左下= └
下 = ┴
右下 = ┘
垂直 = │
水平 = ─
本題目要求編寫一個程序,根據用戶輸入的行、列數畫出相應的表格來。
例如用戶輸入:
3 2
則程序輸出:
┌─┬─┐
│ │ │
├─┼─┤
│ │ │
├─┼─┤
│ │ │
└─┴─┘
用戶輸入:
2 3
則程序輸出:
┌─┬─┬─┐
│ │ │ │
├─┼─┼─┤
│ │ │ │
└─┴─┴─┘
程序實現
看到這個題目,我們可能首先想到的是,這些符號用數組存儲,我也是這樣考慮的,就像上個正螺旋有四個方向一樣,這個題目我們可以這樣考慮,這個表格可以分為四個區域,上、中、下和中間空白區域,那我們可以用數組這樣表示:
1 char *on[4] = { "┌", "─", "┬", "┐" }; 2 char *center[4] = { "├", "─", "┼", "┤" }; 3 char *down[4] = { "└", "─", "┴", "┘" }; 4 char *space[2] = { "│", " " };
符號我們表示好了,這樣我們就可以通過表格把區域分掉,來發現其中的規律。
就會發現,其實輸出的時候我們也可以分區域輸出:頂部區域、中部區域和底部區域。頂部和底部區域是比較好輸出的,我先貼下這兩個區域的輸出代碼:
1 //輸出頂部字符 2 for (i = 0; i < 2 * lines + 1; i++) 3 { 4 if (i == 0) 5 printf("%s",on[0]); 6 else if (i == 2 * lines) 7 printf("%s",on[3]); 8 else 9 { 10 if (i % 2 == 0) 11 printf("%s",on[2]); 12 else 13 printf("%s",on[1]); 14 } 15 } 16 printf("\n"); 17 //輸出底部字符 18 for (i = 0; i < 2 * lines + 1; i++) 19 { 20 if (i == 0) 21 printf("%s",down[0]); 22 else if (i == 2 * lines) 23 printf("%s",down[3]); 24 else 25 { 26 if (i % 2 == 0) 27 printf("%s",down[2]); 28 else 29 printf("%s",down[1]); 30 } 31 } 32 printf("\n");
rows和lines分別表示的是輸出表格的行數和列數,頂部和底部區域輸出的代碼我就不多說了,大家結合表和代碼就可以理解了,這里我說下中部區域。
其實中部和上下區域差不多,只不過是中部和空白交替的,比如行數是3,那中部區域就是:空、中、空、中、空;如果行數是2,中部區域為:空、中、空;
發現這個規律我們代碼可以這樣寫;
1 //輸出中間字符 2 for (i = 0; i < 2 * rows - 1; i++) 3 { 4 if ((i + 1) % 2 == 0) 5 { 6 for (j = 0; j < 2 * lines + 1; j++) 7 { 8 if (j == 0) 9 printf("%s",center[0]); 10 else if (j == 2 * lines) 11 printf("%s",center[3]); 12 else 13 { 14 if (j % 2 == 0) 15 printf("%s",center[2]); 16 else 17 printf("%s",center[1]); 18 } 19 } 20 } 21 else 22 { 23 for (k = 0; k < 2 * lines + 1; k++) 24 { 25 if ((k + 1) % 2 == 0) 26 printf("%s",space[1]); 27 else 28 printf("%s",space[0]); 29 } 30 } 31 printf("\n"); 32 }
中和空的輸出邏輯和頂部和底部的輸出邏輯是差不多的。
這個題目如果你思路清晰的話,是很簡單的。如果大家也有更好的實現方法,歡迎交流。。。
完成程序代碼:

1 #include "stdio.h" 2 #include "string.h" 3 4 void main() 5 { 6 char *on[4] = { "┌", "─", "┬", "┐" }; 7 char *center[4] = { "├", "─", "┼", "┤" }; 8 char *down[4] = { "└", "─", "┴", "┘" }; 9 char *space[2] = { "│", " " }; 10 int rows, lines; 11 int i, j, k; 12 //printf("%c",on[0]); 13 scanf("%d",&rows); 14 scanf("%d",&lines); 15 16 //輸出頂部字符 17 for (i = 0; i < 2 * lines + 1; i++) 18 { 19 if (i == 0) 20 printf("%s",on[0]); 21 else if (i == 2 * lines) 22 printf("%s",on[3]); 23 else 24 { 25 if (i % 2 == 0) 26 printf("%s",on[2]); 27 else 28 printf("%s",on[1]); 29 } 30 } 31 printf("\n"); 32 33 //輸出中間字符 34 for (i = 0; i < 2 * rows - 1; i++) 35 { 36 if ((i + 1) % 2 == 0) 37 { 38 for (j = 0; j < 2 * lines + 1; j++) 39 { 40 if (j == 0) 41 printf("%s",center[0]); 42 else if (j == 2 * lines) 43 printf("%s",center[3]); 44 else 45 { 46 if (j % 2 == 0) 47 printf("%s",center[2]); 48 else 49 printf("%s",center[1]); 50 } 51 } 52 } 53 else 54 { 55 for (k = 0; k < 2 * lines + 1; k++) 56 { 57 if ((k + 1) % 2 == 0) 58 printf("%s",space[1]); 59 else 60 printf("%s",space[0]); 61 } 62 } 63 printf("\n"); 64 } 65 66 //輸出底部字符 67 for (i = 0; i < 2 * lines + 1; i++) 68 { 69 if (i == 0) 70 printf("%s",down[0]); 71 else if (i == 2 * lines) 72 printf("%s",down[3]); 73 else 74 { 75 if (i % 2 == 0) 76 printf("%s",down[2]); 77 else 78 printf("%s",down[1]); 79 } 80 } 81 printf("\n"); 82 }
運行結果: