問題描述:寫一程式依據輸入印出圖形.
當輸入 3 時,印出
123
12
1
12
123

當輸入 4 時,印出
1234
123
12
1
12
123
1234

【解題步驟一】
分析問題,大方向思考。
當 n=3 時,必須輸出 5 列,
當 n=4 時,必須輸出 7 列,
所以列數為 2n-1 .

int x,y,n,t;
n=3;
for(x=1 ; x<=2*n-1 ; x++){
     printf("%d\n",x);
}



【解題步驟二】
思考每一列的字元數與輸出的列值有何關聯?
列值
該列字元數
1
3
2
2
3
1
4
2
5
3

考慮下列一維座標的範圍轉換



若 x 為列值,則 x = -(n-1) 至 n-1,
可以將列值轉成字元數。

列值
-(n-1) 至 n-1
1
-2
2
-1
3
0
4
1
5
2

思考如何將 -2、-1、0、1、2 轉換成
每一列的字元數 3、2、1、2、3
如下表格為正解

列值
-(n-1) 至 n-1
取絕對值
絕對值+1
1
-2
2
3
2
-1
1
2
3
0
0
1
4
1
1
2
5
2
2
3

int x,y,n,t;
n=3;
for(x=-(n-1) ; x<=n-1 ; x++){
     t=abs(x)+1;
     printf("%d\n",t);
}



使用 abs() 絕對值函數必須 #include <math.h>

當 x 所表達的值為每一列的字元數以後,
就可以使用重複結構輸出字元。

int x,y,n,t;
n=3;
for(x=-(n-1) ; x<=n-1 ; x++){
     t=abs(x)+1;
     for(y=1;y<=t;y++){
          printf("%d",y);
     }
     printf("\n");
}



【解題步驟三】
修改 n 值輸入方式並重複測試

int x,y,n,t;
printf("Input the n : ");scanf("%d",&n);
for(x=-(n-1) ; x<=n-1 ; x++){
     t=abs(x)+1;
     for(y=1;y<=t;y++){
          printf("%d",y);
     }
     printf("\n");
}

【類似範例練習】
1.寫一程式依據輸入印出圖形.
當輸入 4 時,印出
1
12
123
1234
123
12
1

解答
2.寫一程式依據輸入印出圖形.
當輸入 4 時,印出
aaaa
bbb
cc
d
cc
bbb
aaaa

解答