C語言之格式化屏幕輸出詳解
在一些問題中,問題經常規定瞭屏幕輸出的格式,讓我們以固定的格式編程輸出某些圖案或表格。我們分別以下面三個例子來說明格式化屏幕輸出的方法。
題目1:請打印輸出以下圖案。
我們當然可以用最笨的方法,直接按照題目樣式暴力輸出:
printf(" *\n"); printf(" ***\n"); printf(" *****\n"); printf("*******\n"); printf(" *****\n"); printf(" ***\n"); printf(" *\n");
那多沒意思啊😅,玩不起嗎?
如果題目要求輸出菱形的大小可以改變,那不就寄瞭嗎?
仔細思考,這種格式化輸出的圖案都是非常整齊的,我們當然需要用到循環語句。
首先,兩層for循環是跑不掉的,最外層的for循環用來控制輸出行數,內層的for循環用來控制空格以及’*’。剛開始的時候,我們最好先自己動手畫一下,分析一下圖案的組成。
我們發現,前四行中,’*’的個數是以奇數往下遞增的,而後四行’*’的個數是逐行往下遞減的,那麼我們隻要先處理好前4行的圖案,後3行稍加修改即可得到。
首先我們看看空格與’*’以及行數之間的數量關系:
行數 | 空格 | * |
1 | 3 | 1 |
2 | 2 | 3 |
3 | 1 | 5 |
4 | 0 | 7 |
…… | …… | …… |
n | N-n(N為遞增總行數) | 2*n-1 |
很顯然,現在問題就變成瞭一個小學生的找規律問題,因此我們可以編寫以下代碼:
for (int n=1; n<=4; n++)//n為行數,4為總行數N { for (int i=1; i<=4-n; i++)//輸出'*'前的空格 { printf(" "); } for (int i=1; i<=2*n-1; i++)//輸出'*' { printf("*"); } printf("\n");//輸出完一行後要換行 }
運行結果為:
說明我們的想法是對的!那麼剩下的3行(N-1行)隻需要對以上代碼稍加修改就行瞭。修改過後,我們可以得到:
for (int n=1; n<=4; n++)//n為行數,4為遞增總行數N { for (int i=1; i<=4-n; i++)//輸出'*'前的空格 { printf(" "); } for (int i=1; i<=2*n-1; i++)//輸出'*' { printf("*"); } printf("\n");//輸出完一行後要換行 } for (int n=1; n<=3; n++)//n為行數,3為遞減總行數N-1 { for (int i=1; i<=n; i++)//輸出'*'前的空格 { printf(" "); } for (int i=1; i<=7-2*n; i++)//輸出'*',7為遞增行中最後一行(第N行)的'*'的數量2*N-1 { printf("*"); } printf("\n");//輸出完一行後要換行 }
運行結果為:
好耶!現在我們已經得到瞭我們想要的結果。那麼隨著菱形的大小改變時,我們隻要相應地改變N的大小,即可輸出對應的圖案。
題目2:分別按如下三種形式,編程輸出九九乘法表。
同樣,暴力方法是肯定可以做出來的😅,這裡就不再贅述。
首先第一步,我們要用暴力方法把九九乘法表的表頭輸出出來:
printf("1 2 3 4 5 6 7 8 9\n"); printf("- - - - - - - - -\n");
這三個表應該是第一種格式比較簡單,因為他沒有過多的較難處理的空格。
事實上,我們隻要用兩層循環,讓九九乘法表的行和列的表頭遍歷1~9,並把他們相乘即可得到表中的每一個值(這裡行的表頭隱藏瞭)。(我所說的行和列的表頭的意思是下表中的這些數字):
123456789123456789
因此我們有:
for (int i=1; i<=9; i++)//行的表頭遞增 { for (int j=1; j<=9; j++)//列的表頭遞增 { printf("%3d", i * j); } printf("\n");//每輸出完一行後要換行 }
這樣我們就能得到第一個表:
我們來看第二個表:第二個表為左下三角形,右上三角形無輸出(或輸出為空格)。
尋找一下規律,不難發現,當列的表頭小於等於行的表頭(j<=i)時,才會輸出數字。
因此我們可以在第一種情況下稍作修改:
for (int i=1; i<=9; i++)//行的表頭遞增 { for (int j=1; j<=9; j++)//列的表頭遞增 { if (j<=i) { printf("%3d", i * j); } } printf("\n");//每輸出完一行後要換行 }
即可得到第二個表:
類似地,第三個表是當列的表頭大於等於行的表頭(j>=i)時才輸出數字,當列的表頭小於行的表頭(j<i)時輸出空格。值得註意的是,因為我們用的是%3d,所以每次應輸出3個空格。在第一種情況下稍作修改,得到如下代碼:
for (int i=1; i<=9; i++)//行的表頭遞增 { for (int j=1; j<=9; j++)//列的表頭遞增 { if (j>=i) { printf("%3d", i * j); } else { printf(" "); } } printf("\n");//每輸出完一行後要換行 }
即可得到第三個表:
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!