效果如下:
我是怎么想的:
總共需要打印6行字母,那么就需要一個循環來控制打印第幾行,大概代碼如下:
for(int i=0;i<6;i++)
{
}
每行都會打印字母,而且循環越往后,需要打印的字母越多,那么每行打印字母也需要一個循環,比如打印F到A這需要一個循環,其它也是同樣的道理。每行打印完都需要輸出一個換行,所以代碼變成下面這樣
for(int i=0;i<6;i++)
{
for(char j='F';XXXXX;j--)
{
}
printf("%c",j);
}
因為每行都是從F開始打印的,所以j的初始值肯定是F,有因為每次是從F往A這個方向打印的,那么肯定有j--這個操作,上面的代碼不難理解。
真正難的是j=‘F’后面這個進入循環的條件,這個怎么想。
用列舉法推出來的。
當i=0的時候,需要打印第一行字母,此時j='F',那么我們給j一個什么樣的關系表達式,才能夠讓j只能取到'F'這一個值呢?
是不是j>'F'-1
char j='F',j>'F'-1;j-- j的定義域只能取到‘F’
當i=1的時候,需要打印第二行字母,也就是需要里面的循環執行兩次,那么給j一個什么樣的表達式,才能夠讓j的值渠道'F'和‘E’呢? 是不是j>'F'-2;
我們不能直接把'F'-1和'F'-2這兩個表達式直接寫進去,不然輸出的是固定值,我們想要這兩個值和i發生一定的關系
當i=0時候,我們希望j>'F'-1='F'-(0+1)
當i=1時候,我們希望j>'F'-2='F'-(1+1)
當i=3時候,我們希望j>'F'-4='F'-(3+1)
所以通項公式就是j>'F'-(i+1)
最后代碼如下:
int main(void) { for (int i = 0; i < 6; i++) { for (char j = 'F'; j > 'F'-(i+1); j--) { printf("%c",j); } printf("\n"); } return 1; }
update:2018.10.2
這次思考過程和上次完全不一樣。
首先需要一個外層循環來控制打印的行,共需要打印6行,每循環一次打印一行數據。還需要一個內層循環控制要打印的字符
由於,內存循環每次都是從F開始打印的,所以內存循環每次都要初始化變量為F,每次打印一個字符后就讓字符減去1,這樣就可以打印比F小的那個字符了,那要打印多少個字符呢?我們需要用一個變量來記錄,然后每進行一次外層循環這個變量的值都要+1,因為第二行要比第一行多打印一個字符。
int main(void) { char ch ;//當前要打印的字符 int row_count=1;//每行需要打印額字符個數,從第一行開始 int count;//打印了幾個字符了 for (int i = 0; i < 6; i++,row_count++) { for (ch='F',count = 0; count < row_count; count++,ch--) { printf("%c",ch); } printf("\n"); } return 1; }