金字塔/菱形打印方法

1、金字塔打印算法原理與實現

粗一看無從下手,好像頗有規律,但又沒法簡單地總結出打印規律。算法

把「*」號用數字表示,規律開始變得明顯,咱們採用補全法,把這個三角形補成一個矩形讓規律更明顯。編程

假設打印的行數爲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)個星號

2、金字塔打印算法源碼

 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 }

3、金字塔打印算法總結

 核心算法

1         //rows表示總行數  i表示當前是第幾行
2         //空格個數
3         int space = rows - i;
4         //*個數
5         int star = 2*i -1 ;

4、菱形打印

菱形打印其實金字塔打印的進階版,等於 正向金字塔 + 反向金字塔。(一站式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函數中,可是會出現重複代碼,嵌套層數也會增長,不符合增量式開發的原則。最後的打印結果爲:

相關文章
相關標籤/搜索