1. 程式人生 > >C語言中輸出菱形圖的一點感悟

C語言中輸出菱形圖的一點感悟

C語言輸出菱形圖的一點感悟

有這麼一道題:編制輸出以下圖案的的程式。

                                                                           

或許對於剛學過C語言的新手朋友來說,這是一個很簡單的題,編寫多個printf輸出語句不就能夠得到它嘛,不錯,的確如此,但當我問你當我們中間最長的那排數字很大時,是不是也用同樣的方法去獲得呢?上述方法顯然是不可取的,我們有多重方法可以實現它,這就是C的靈活性,這裡介紹一個很簡單的方法,廢話不多說,首先貼出原始碼,咱們再依照他解釋:


下面對程式碼進行解釋:

首先定義兩個巨集用MIDDLE

值得第一個*40列出輸出,而STAR則代表多個“*”或“0”的字元,11行輸入n值,則輸出的行數為和中間最寬的那一行均為2*n-1,第一個for迴圈用於輸出上三角,第二個則輸出下三角。相對應的輸出sp-1個空白符的時候,同時輸出2*i-1個“*”或“0”字元,這個有我們自己定,這裡有必要解釋一下,關於17行語言的程式碼:

printf("%*c  %.*s\n",  sp - 1, '  ',  2*i-1,  STAR);

首先說一下關於%*中的*號,在這裡叫做賦值抑制符。他的作用是:標準說法:星號(賦值抑制符)對贏的輸入項按要求被掃視輸入,但結果不存貯,帶星號的說明不對應輸入資料存貯地址,用它來跳出一個輸入資料項(這是向對於scanf

輸入來說的),

在這裡,對於printf來說,以11行程式碼為例,%*c字元“*”表示輸出域由對應的輸出項來確定,上述“*”對應的輸出項是sp-1(假設sp-1等於4),那麼%*c就相當於%4c,那麼他就以%4c的格式輸出'  ' (空格)。 同樣的對應%.*s也相類似,但這裡注意了為%.*s而非%*s

(裡面有點'.'如果你誤寫成後者,這樣會得不到正確的結果哦!那麼%.*s %*s到底有什麼區別呢?%*s用法類似於%*c

c輸出元值為其ASCII碼的字元,而s則代表輸出的一個字串,

(1)用格式符“%c”輸入或輸出一個字元,即逐個字元輸入輸出。

(2)用“%s”,則將整個字串一次輸入或輸出。

舉例:如果S = ABCDEF

那麼對於printf"%3s,  %4.2s,  %-7.4s,  %.5s", s, s, s, s);則輸出

 ABCDEF,  AB,ABCD   ,ABCDE

如果懂了這個,相信大家也就知道%.*s怎麼用了吧!

這裡值得一提的是,對於巨集STAR的定義裡面的字元數必須做夠多,否則當我們把n輸入很多後,可能自得不到我們預期的結果,即輸出的可能就不會是菱形了,這個大家可以驗證一下,那麼這是為什麼了,因為%.*s的輸出總要依賴於STAR,當前要求輸入很大時,而STAR有不夠提供,那麼當然會出現問題了,

利用STAR的字元數多少,我們還可以相應的變換輸出的圖案,可以實現多種不同的圖形哦,有興趣不妨試一下。