1、问题
有一个问题需要大家来想一下,用C语言怎么打印菱形图案呢?
好的,经过大家的思考,应该都有思路或者答案了吧,那么请大家跟我一起往下看。
2、思路和解析
其实这个问题很简单,首先我们先整理一下思路:
首先观察图案,从第一行开始直到第七行每一行都会在上一行的基础上增加两个“*”,从第七行到最后一行每一行在上一行的基础上减少两个“*”。
假设我们把这个图形分为上下两个部分,分别打印,上半部分由第一行到第七行组成,下半部分由第八行到第十三行组成。此时我们可以把总行数定义为7或者line
#define line 7
上半部分
接着开始开始打印上半部分图形。根据上面的思路
由此我们可以写出以下代码:
#define line 7
int main()
{
for(int i=1;i<=line;i++) //初始化i=1,表示从第一行开始计算
{
for(int j=1;j<=2*i-1;j++) //为什么是 j<=2*i-1 呢? 因为用该式子可以表示每一行需要的*号的数量、、、比如第一行需要一个*号,根据式子 2*i-1==2*1-1=1
{
printf("*");
}
printf("\n");
}
}
但是我们最后得出的结果是下图这个图形
这是为什么呢???
原因是通过以上的代码我们只求出每一行需要打印的“*”的个数,然鹅忽略了每一行“*”之前还有空白的存在,所以导致最后出现的结果不是我们预期中的样子。
那么该怎么解决呢?
既然我们找到了原因就是每一行“*”之前的空白我们没有处理,那我们可以在每次打印“*”之前先打印对应的空格数量就可以解决了。
由此我们可以对上面的代码将进行补充:
#define line 7
int main()
{
for(int i=1;i<=line;i++) //初始化i=1,表示从第一行开始计算
{
//首先打印空格
for(int j=1;j<=line-i;j++) //为什么是j<=line-i呢?因为要先打印空格,所以根据规律就可以得知,每一行要打印的空格的个数(就是每一行,要循环的列的数)。、、、在第一行,有六个空格就要循环六次列,每一次循环列都打印一次空格,所以第一行可以打印六次空格。以此类推
{
printf(" ");
}
//然后打印“*”号
for(int j=0;j<2*i-1;j++) //为什么是 j<=2*i-1 呢? 因为用该式子可以表示每一行需要的*号的数量、、、比如第一行需要一个*号,根据式子 2*i-1==2*1-1=1
{
printf("*");
}
printf("\n");
}
}
接下来我们就可以打印完整的上半部分:
下半部分
上半部分已经打印完成,接下来我们打印下半部分的图形
下半部分应该如何打印呢?可以参考上半部分的步骤,下半部分也可以先打印“*”之前的空格,然后再打印“*”。
全部都整理完成后,我们可以把代码补充完整
#define line 7
int main()
{
for(int i=1; i<=line; i++) //初始化i=1,表示从第一行开始计算
{
//首先打印空格
for(int j=1; j<=line-i; j++) //为什么是j<=line-i呢?因为要先打印空格,所以根据规律就可以得知,每一行要打印的空格的个数(就是每一行,要循环的列的数)。、、、在第一行,有六个空格就要循环六次列,每一次循环列都打印一次空格,所以第一行可以打印六次空格。以此类推
{
printf(" ");
}
//然后打印“*”号
for(int j=1; j<=2*i-1; j++) //为什么是 j<=2*i-1 呢? 因为用该式子可以表示每一行需要的*号的数量、、、比如第一行需要一个*号,根据式子 2*i-1==2*1-1=1
{
printf("*");
}
printf("\n");
}
for (int i = 1; i <= line - 1; i++)
{
//打印空格
for (int j = 1; j <= i; j++) //此步骤同上
{
printf(" ");
}
//打印“*”号
for (int j = 1; j <= 2 * (line - i) - 1; j++) //此步骤同上
{
printf("*");
}
printf("\n");
}
}
通过以上代码可以得到结果:
这就是菱形的打印方法,感谢大家的观看,如果有错误欢迎大家纠正和补充,我一定会纠正和反思,感谢!!!😎😎😎😎😍😍😘