問題描述:寫一程式依據輸入印出圖形.

當輸入 3 時,印出
aaa

bb
c
bb
aaa


【將複雜或抽象問題轉成基本模式】
若將 a 轉換成 1、b 轉換成 2、c 轉換成 3,
則輸出應該是
111
22
3
22
111

【恢復 n 值為定值,並修改原程式結構】
思考上一題,輸出字元數是依據 x 的絕對值
,x 主要目的是表達該列的字元數,而 y 值
是依據 x 值大小輸出字元數,3 字、2 字、1字、
1 字、2 字、3字,因此 abs(x)+1 模式不變。

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");
}


修正輸出的資料,依題意應輸出每列字元數
333
22
1
22
333

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",t);
     }
     printf("\n");
}


轉換輸出資料
原值
3
2
1
2
3
新值
1
2
3
2
1
4
4
4
4
4

原值+新值 = 4 = n+1
新值 = n+1-原值
調整公式
新值 = n+1-t

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",n+1-t);
     }
     printf("\n");
}


【將 123 轉換成 abc】
檢查 a 之 ASCII 碼為 97,B 為 98,依此類推,
因此 輸出之 1、2、3 每位數字加上 96,就成為
97、98、99 了,再將此數字轉型成字元即為所求了。

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("%c",n+1-t+96);
     }
     printf("\n");
}


【修飾一下程式碼】
printf("%c",n+1-t+96); 變成
printf("%c",n-t+97); 再變成
printf("%c",n-t+"a");
因此最後程式碼為:

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("%c",n-t+"a");
     }
     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("%c",n-t+"a");
     }
     printf("\n");
}