粗一看无从下手,好像颇有规律,但又没法简单地总结出打印规律。算法
把“*”号用数字表示,规律开始变得明显,咱们采用补全法,把这个三角形补成一个矩形让规律更明显。编程
假设打印的行数为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函数中,可是会出现重复代码,嵌套层数也会增长,不符合增量式开发的原则。最后的打印结果为: