#include <stdio.h>
int main ()
{
int i,j;
for(i=1;i<=6;i++)
{
for (j = 1; j <=6-i ; j++)
{
printf(" ");
}
for(j = 1; j <=2*i-1 ; j++)
{
printf("*");
}
printf("\n");
}
for(i=1 ;i<=6 -1;i++)
{
for (j =1; j <=i ; j++)
{
printf(" ");
}
for(j = 1; j <=2*(6-i)-1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
先放代码,这其实是俩个问题,一个属于数学找规律的问题,另一个属于嵌套循环的问题,难点在数学规律而非循环。
我们分为上半部分和下半部分打印,以打印6行的菱形为例。
*
***
*****
*******
*********
***********
*********
*******
*****
***
*
请按任意键继续. . .
先讲规律:菱形的上半部分与下半部分显然不能共用一串代码,所以我们先做分割,把菱形分为上半部分和下半部分,先分析上半部分。
上半部分+最长的那根线:我们知道计算机是从第一行第一列作为第一个元素然后第一行第二列作为第二个元素依次打印,不能跳跃打印,所以没有显示出来的实际上是打印的空格,以第一行为例,在第一个*出来之前一共有5个空格,第二行,在第一个*出来之前一共有4个空格,第三行,在第一个*出来之前一共有3个空格.
空格规律如下:1行 5空格
2行 4空格
3行 3空格
i行 6-i空格
再看*,*其实是对称分布的,所以算出一半的再乘以2再减去1就是*的总数(减1是因为中间*多计算了一次),类似于空格找规律,不难看出*的规律是2*i-1.
下半部分(不包含最长的那根线):下半部分的空格数是依次递增的,第一行是一个,第二行是2个,类似的,我们找到如下规律,第i行的规律是有i个空格;类似的,第i行有2*(6-i)-1.
再看代码:我们定义i代表行,(所以上半部分范围是从1到你定义的行数(本例子是6),下半部分是从1到定义的行数再减1(本例子是5))j代表随着行的变换空格或者*的数量(范围是我们前文找的规律).因为我们把菱形分为了上下俩部分,所以有俩个大的for循环,再在这里面进行嵌套。
上述只是以6为菱形的行数举例,如果我们想自己定义一个行数的话,需要做如下变化:
1 读取,读取行数,这里用到scanf和取地址
2 将上面的行数6换为新定义的line。
(主要是scanf的运用)
代码如下:
#include <stdio.h>
int main ()
{
int line =0;
int i,j;
printf("请输入你想要打印的行数\n");
scanf("%d",&line);
for(i=1;i<=line;i++)
{
for (j = 1; j <=line-i ; j++)
{
printf(" ");
}
for(j = 1; j <=2*i-1 ; j++)
{
printf("*");
}
printf("\n");
}
for(i=1 ;i<=line -1;i++)
{
for (j =1; j <=i ; j++)
{
printf(" ");
}
for(j = 1; j <=2*(line-i)-1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
新手,欢迎大家批评指正~~