看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《shile775 (笑看人生)》之銘言: (恕刪) 我的概念是這樣, 將每一個要顯示的元件稱為Cell, 依Cell顯示的 內容, 可分為兩種: 1. Numeric Cell : 顯示數字 2. Text Cell : 顯示字串 原表每種Cell的分布情形如下: | 1 2 3 4 5 6 7 8 9 -- - -- -- - -- - -- - -- - -- - -- - -- - -- -- 1 | 1 2 3 4 5 6 7 8 9 2 | 2 4 6 8 10 12 14 16 18 3 | 3 6 9 12 15 18 21 24 27 4 | 4 8 12 16 20 24 28 32 36 (以下略...) Text Cell可分為 : ---| 5種 Numeric Cell內容皆為數字, 寬度至多為2, 有向左/右對齊兩種 我的 struct 定義如下: struct Cell { union Content { char text[2 + 1]; unsigned value; }content; void (*Print)( struct Cell const*, FILE* ); }; 舉個產生Cell的例子: void PrintText( struct Cell const *this, FILE *stream ) { fprintf( stream, "%s", this->content.text ); } struct Cell * MakeTextCell( char const *text ) { struct Cell *cell = calloc( 1, sizeof(struct Cell) ); strncpy( cell->content.text, text, 2 ); cell->Print = &PrintText; return cell; } 然後創建一個11×20的Cell*陣列, 再初始化它: struct Cell *table[ 11 ][ 19 ]; // 填入 Text Cell for( size_t col = 4; col < 19; col += 2 ) table[ 0 ][ col ] = MakeTextCell( " " ); for( size_t row = 2; row < 11; ++row ) for( size_t col = 4; col < 19; col += 2 ) table[ row ][ col ] = MakeTextCell( " " ); // 填入 Text Cell | table[ 0 ][ 1 ] = MakeTextCell( "|" ); for( size_t row = 2; row < 11; ++row ) table[ row ][ 1 ] = MakeTextCell( "|" ); // other works... 完整程式碼: http://codepad.org/MiXq3o1U 這樣對我來說比較直覺啦, 一些魔數都可以用巨集來取代, 要客製化 某區塊也比較容易, 只填好部份表格也可以馬上測試. 進階一點指標還可以共用記憶體, 不過這樣刪除就會比較麻煩, 先不 做了. -- ★ ★ ███ ███ █▌█ ██◣ ███ ▋▋█ █▂█ █▃█ ███ █▆█ █▄█ ███ █ ◣ █ █ ▋██ █▆◤ ███ ███ Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook φwindyhorse No Eul Oh Seung A Jung Yoon Hye -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
purpose:你好用心 08/03 01:45
tropical72: 你好神 08/03 01:50
ericinttu:快2點來推一下 08/03 01:56
james732:版主超級用心 08/03 02:35
shadowjohn:請問一下這個要用什麼compiler? 我的gcc都過不了@_@? 08/03 04:05
shadowjohn:OK~ 編過了 :D 08/03 04:09
gcc 4.5.0 with options : -std=c99 -ftrapv -pedantic -Wall
shadowjohn:你的第一欄跟第二欄之間多了一個空白 08/03 04:30
那就變成11×19了,改起來也很快^^ http://codepad.org/a0RcepB9
xatier:推版主用心 08/03 10:08
shadowjohn:雖然你往前移了一格,但 - 少了一個 08/03 15:41
雖然可以把字串的長度限制增大, 然後判斷: if( cell != NULL ) cell->Print( cell, stdout ); 這樣即使第 1 列只有一個 TextCell, 也是可以正常運作; 不過我還 是喜歡作比較整齊的分割, 所以對付這樣較沒規律的分布, 程式碼會 多一些: http://codepad.org/JzWRenlS 再者是加上 Modifiers 對少量例外的 TextCell作修改, 也可以減少 很多碼. ※ 編輯: loveme00835 來自: 140.121.197.115 (08/03 16:37)