题目要求:
输入line(菱形上半部分的行号,包括最中间的一行),对应打印一个完整的菱形
思路:
先打印菱形的上半部分,再打印下半部分。即使上下部分所用到循环的数据不同,但是原理基本相同。
这个思路是建立在菱形的图上的,可以先看一下面的菱形图
每一行都是用空格和*组成的,除了最中间的那一行不是,所以我们可以观察每一行的规律,实现菱形
对于每一行:
1、利用for循环打印空格
2、每一行紧跟着使用for循环打印*号,使有菱形形状,然后一直打印line行(上半段就完成打印了)
3、上半部分打印出来后,下半部分同理,其中这里面打印*的时候有一个重要思想就是把下半段的 ,行数转为上半段的行数,接着用上半段的思路打印,因为上半段打印星号对应公式已经知道了,那么求下半段的打印多少星,就先把他转为上半段,再利用上半段的公式就可以了
关于下段代码的理解:
#include<stdio.h>
int main()
{
int line = 0;
scanf("%d", &line);//line是上半段要打印几行
for (int i = 0; i < line; i++)
{
int j = 0;
for (j = 0; j < line - 1 - i; j++)//line-1因为上半部分有几行,这一行就会打印line-1个空格。line-1-i是因为没下一行空格递减1
{
printf(" ");
}
for (j = 0; j < 2 * i + 1; j++)//i=0一个星,i=1 三个星,i=2五个星--所以星和i的关系 星的个数=2*i+1,循环几次打印几个*
{
printf("*");
}
printf("\n");
}
for (int i = 0; i < line - 1; i++)
{
int j = 0;
for (j = 0; j <= i; j++)
{
printf(" ");
}
for (j = 0; j < 2 * (line - 1 - i) - 1; j++)//找行数与星的关系line输入为7,则下半部分为line-1行,每往下一行line-1-i
{//若输入line=7,第一行2*6-1个* 第二行2*5-1个* 第三行2*4-1个星
printf("*");
}
printf("\n");
}
return 0;
}
最后注意一下:
下半段打印*是2*(line-1-i)-1因为*在下半段,从上到下是递减的,正好与上半段形成对称
2*(line-1-i)是对应上半段*相同数量的某一行,上半段从上到下*递增,下半段从上到下*递减,所以是-1