粗一看無從下手,好像頗有規律,但又沒法簡單地總結出打印規律。算法
把「*」號用數字表示,規律開始變得明顯,咱們採用補全法,把這個三角形補成一個矩形讓規律更明顯。編程
假設打印的行數爲6,*號之外地方(上圖綠色區域)用空格表示。函數
第一行:(6-1)*2 個空格 ========= 1個星號spa
第二行:(6-2)*2個空格==========3個星號3d
第三行:(6-3)*2個空格==========5個星號code
第四行:(6-4)*2個空格==========7個星號blog
第五行:(6-5)*2個空格==========9個星號開發
第六行:(6-6)*2個空格(即沒有空格)==========11個星號input
咱們能夠獲得如下規律:源碼
第N行:(ROWS-N)*2個空格 =====(2N-1)個星號
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int rows; 6 7 printf("Please input rows:\n"); 8 scanf("%d",&rows); 9 10 for(int i=1;i<=rows;++i) 11 { 12 int star = 2*i -1 ; //星號個數 13 int space = rows - i; //空格個數 14 15 //左邊空格 16 for(int j=0;j<space;++j) 17 printf(" "); 18 19 //中間 * 20 for(int j=0;j<star;++j) 21 printf("*"); 22 23 //右邊空格 24 for(int j=0;j<space;++j) 25 printf(" "); 26 27 //換行 28 printf("\n"); 29 } 30 31 return 0; 32 }
核心算法
1 //rows表示總行數 i表示當前是第幾行 2 //空格個數 3 int space = rows - i; 4 //*個數 5 int star = 2*i -1 ;
菱形打印其實金字塔打印的進階版,等於 正向金字塔 + 反向金字塔。(一站式C語言編程 6.5小節 習題二答案)
1 #include <stdio.h> 2 3 int diamond(int, char); 4 int draw(int, int, char); 5 6 int main(int argc, char *argv[]) 7 { 8 diamond(3, '*'); 9 diamond(4, '*'); 10 diamond(5, '+'); 11 return 0; 12 } 13 14 int diamond(int lines, char mask) 15 { 16 int rows; 17 if (lines % 2 == 0) 18 { 19 printf("輸入值%d爲偶數,打印錯誤\n", lines); 20 return 0; 21 } 22 else 23 rows = (lines + 1) / 2; 24 25 // 分兩部分打印,上半部分爲rows行,下半部分爲(rows - 1)行; 26 for (int i = 1; i <= rows; ++i) 27 draw(i, rows, mask); 28 29 //下半部分反向打印,因此是逆序循環 30 for (int i = rows - 1; i >= 0; i--) 31 draw(i, rows, mask); 32 } 33 34 int draw(int i, int rows, char mask) 35 { 36 int star = 2 * i - 1; //star個數 37 int space = rows - i; //space個數 38 39 for (int j = 0; j < space; ++j) //左邊空格 40 printf(" "); 41 42 for (int j = 0; j < star; ++j) //中間 * 43 printf("%c", mask); 44 45 for (int j = 0; j < space; ++j) //右邊空格 46 printf(" "); 47 48 printf("\n"); //分行 49 }
能夠把draw函數代碼放進diamond函數中,可是會出現重複代碼,嵌套層數也會增長,不符合增量式開發的原則。最後的打印結果爲: