菱形打印代码如下:
#include<stdio.h>
int main()
{
int i = 0; int j = 0;
int line = 0;
printf("输入上半部分的行数:");
scanf("%d", &line);
//上半部分打印区域
for (i = 0; i < line ; i++)
{
for (j = 0; j < line - 1 - i; j++)
{
printf(" ");
}
for (j = 0; j < 2*i+1; j++)
{
printf("*");
}
printf("\n");//换行操作
}
//下半部分打印区域
for (i = 0; i < line - 1; i++)
{
for (j = 0; j <= i; j++)
{
printf(" ");
}
for (j = 0; j < 2 * line - 3 - 2 * i; j++)
{
printf("*");
}
printf("\n");//换行操作
}
return 0;
}
菱形是一种较为规则的几何图形,由于其明显的对称特征,也无疑可以利用C语言中的循环语句实现。
对于菱形的打印,设计的循环次数,循环的限制条件较多较为复杂,笔者认为采用带入特殊值这种方法可以较为清晰的获得我们想要的循环控制表达式。本次分析依托于一个五行小菱形进行分析。
五行组成的小菱形:
第一行:两个空格,一个*; 第二行:一个空格,三个*; 第三行:零个空格;五个*;
第五行:两个空格,一个*; 第四行:一个空格,三个*;
根据简单的分析,不难看出上下之间*和空格的数目有密切的联系,且第三行较为突兀,为单独成对的一行。因此不妨以第三行为分割点进行分割,分割为上下两部分 分别进行打印。
我们采用特殊值法:
此时的 line=3(由于整个大菱形一定是奇数行,因此将line定义为上半部分行数,避免因为行数导致程序出现问题);
并定义两个循环变量i与j:i用于控制每一行的遍历,j用于控制每行中的空格与*的打印。
(一)上层菱形的打印:
①宏观层面的遍历每一行
上层菱形不难看出一共有三行,由此循环应写作:for(i=0;i<3;i++)
对于限制条件i<3中的三,我们不免联想到line=3;由此进行推广为->for(i=0;i<line;i++)
line是一个定值,且推及到其他层数,i<line也同样成立,因此暂时保留这一循环条件。
②微观层面的打印空格与*
空格 ~:
1.第一行有2个空格,第二行有1个空格,第三行空格消失;不难看出这是一个递减的打印次数。
即:第一次打印了两次for(j=0;j<2;j++),第二次打印一次for(j=0;j<1;j++),第三次不循环for(j=0;j<0;j++)
2.这一次j的循环条件在动态变化中,并不是一个固定的值,因此我们开始考虑变量“i”的存在可能。经过简单的数学归纳不难发现规律为line-1-i;即:for(j=0;j<line-1-i;j++)
星号*~:
1.第一行有1个,第二行有3个,第三行5个;明显这是一个动态的,递增的打印过程。简单整理我们不难得到如下规律:
第一次打印:for(j=0;j<1;j++); 第二次打印:for(j=0;j<3;j++); 第三次打印:for(j=0;j<5;j++)
1 3 5-->递增且动态,尝试利用line与i进行组合:
经过简单的数学分析不难发现:2*i+1是我们想要的限制条件。
(二)下层菱形的打印
下层菱形的行数要比上层少一行,通过刚才得出的结论不难得出:for(i=0;i<line-1;i++)的循环条件
整体分析思路与上层基本一致,简单的归纳与总结之后得出想要的限制条件。
由于下层菱形中空格与星形的打印也是动态变化的,一定要引入i这一变量的参与。
因此对于空格的限制条件:for(j=0;j<=i;j++)
对于星号的限制条件为:for(j=0;j<2*line-3-2*i)
注意:每次循环后的换行操作必不可少,否则会打出来一坨*,根本没有菱形的样子。
最终成品: