利用C語言中的基本FOR迴圈列印出一菱形, 如下所示: (假定邊長為3, 實心菱形與空心菱形)
若遇到類似這種幾合問題的列印, 通常可以利用分解方式來作處理(將菱形拆解為上三角形與下三角形輸出). 在此小弟分享了一個無須分解菱形的一次列印方式, 以簡單的FOR迴圈即可處理.
首先以簡單的邊長為3作例子, 該菱形的除了星號的呈現外, 最重要的空白的使用. 在邊長為3的菱形中, 共跳5次行, 依各行來看皆有一對應的空格數與星號格數, 如下所示: (BS=Blank Space, S=Star)
第1行: 2 BS, 1 S
第2行: 1 BS, 3 S
第3行: 0 BS, 5 S
第4行: 1 BS, 3 S
第5行: 2 BS, 1 S
假設 i 控制行數, j 控制空白數, k 控制星號數.
從上述數字可看出彼此的規律, 以行數對空百數來看, 可發現絕對值 i-3 會等於 j.
第1行: |1-3| BS, 1 S
第2行: |2-3| BS, 3 S
第3行: |3-3| BS, 5 S
第4行: |4-3| BS, 3 S
第5行: |5-3| BS, 1 S
在第3行中星號為最多, 共5個, 依此為上限值, 以行數對星號數來看, 可發現絕對值 i-3之兩倍與5相差位數為星號個數, 以第一行為例, 2*|1-3|-5=1, 其差值為1剛好就代表星號個數, 其餘各行依此類推.
第1行: |1-3| BS, 5-2*|1-3| S
第2行: |2-3| BS, 5-2*|2-3| S
第3行: |3-3| BS, 5-2*|3-3| S
第4行: |4-3| BS, 5-2*|4-3| S
第5行: |5-3| BS, 5-2*|5-3| S
從上述就可以看出一個基本通式, 紅色的3剛好為一開始設定的邊長數, 藍色的5則為2倍的邊長數-1. 進一步假設 i 控制行數, j 控制空白數, k 控制星號數, e為預設菱形邊長數, 其中 i 的初始值為0, 其中還可以額外發現行數的上限值為則為2倍的邊長數-1, 故通式為,
第 i+1 行: |i+1-e| BS, 2*e-1-2*|i+1-e| S
第 i+2 行: |i+2-e| BS, 2*e-1-2*|i+2-e| S
第 i+3 行: |i+3-e| BS, 2*e-1-2*|i+3-e| S
第 i+4 行: |i+4-e| BS, 2*e-1-2*|i+4-e| S
第 i+2*e-1 行: |i+5-e| BS, 2*e-1-2*|i+5-e| S
其程式碼如下:
#include < stdio.h >stdio.h>#include < stdlib.h > #include < math.h > int main(){ int i,j,k,e; //i 控制行數, j 控制空白數, k 控制星號數, e為預設菱形邊長數 printf("input a number:"); //輸入菱形邊長數 scanf("%d",&e); for(i=1;i<=2*e-1;i++) //行數從1開始, 上限為2倍的邊長數-1 { for(j=abs(i-e);j>0;j--) //控制各行的空白數, 須列印abs(i-e)個 { printf(" "); } for(k=abs(i-e)*2;k<2*e-1;k++) //控制各行的星號數, 須列印2*e-1-2*abs(i-e)個 { printf("*"); } printf("\n"); } system("PAUSE"); return 0;}
如果要列印空心菱形, 其實只要在星號列印時,作個小小的微調即可, 星號數下限為2*abs(i-e), 上限為2*z-1, 故在星號列印上加入上下值限制式. 如下所示.
for(k=abs(i-z)*2;k<2*z-1;k++) { if(k==abs(i-z)*2||k==2*z-2) // 加入星號數上, 下限值 printf("*"); else printf(" "); }
綜合上述程式, 即可在不用拆解菱形情況下, 以4變數 (邊長, 行數, 空白數, 星號數) 一次到位直接列印輸出任意邊長的實心菱形與空心菱形.
沒有留言:
張貼留言
請留下大名與意見