打印*来组成各种各样的形状题目中,这道题目真的对我这个萌新来说太要老命了,不过在看了一位大佬博主
小白程序员丶钟同学(非常非常感谢您的思想 但是这篇文章我会用自己的思路写一遍 如有抄袭文本内容我会删除的)的先用数学知识解决,再将代码开始编写,我的思路确实清晰了一点。下面我将这道题目每一步的代码,都在这里解释一下。
第一步 先将图像分开来
很明显,无论,无论用什么循环,都不如把这个图像变为两个图像。
那么接下来就要简单了,我们只需要用两个大的for循环,把倒三角形的打法和三角形的打法打出来就行了。
第二步 分析上半部分形状
从1个*开始算,我们可以得出以下几个函数关系
空格数=所在行数-1
所在行数的*数量=2*(总行数-(所在行数-1))-1(总行数不算下半图片,以后所有的总行数都是这个意思)
我们得到了可以循环的公式,那么接下来就是简单的for循环的使用了
#include<stdio.h>
#include<math.h>
int main()
{
int i;//所在行数
int j;//空格数
int k;//所在的行数的*数量
int num;//*数量
scanf("%d", &num);
int hangshu;//总行数
for (i = 1; i <= hangshu; i++)
{
for (j = 0; j < i-1 ; j++)
{
printf(" ");
}
for (k = 0; k < 2 * (hangshu - (i-1)) - 1;k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
为什么是所在行数的大循环套了打出所在行数空格和*号的循环呢
这其实就是一种先后思想 无论是输出空格还是输出* 都是在所在行数的坏境下做的事情
所有写代码前就要分清楚for循环的主次之分
第三步 计算总行数的表达
我们输出的是num总*的数目,自然,总行数的表达式自然和num脱不开关系
所有上半部分代码变为了
#include<stdio.h>
#include<math.h>
int main()
{
int i;//所在行数
int j;//空格数
int k;//所在的行数的*数量
int num;//*数量
scanf("%d", &num);
int hangshu;//总行数
hangshu = (int)(sqrt)((num + 1) / 2);
for (i = 1; i <= hangshu; i++)
{
for (j = 0; j < i-1 ; j++)
{
printf(" ");
}
for (k = 0; k < 2 * (hangshu - (i-1)) - 1;k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
第四步 下半部分代码的编写
这个就相对于上半来说非常的简单了
#include<stdio.h>
#include<math.h>
int main()
{
int i;//所在行数
int j;//空格数
int k;//所在的行数的*数量
int num;//*数量
scanf("%d", &num);
int hangshu;//上半总行数
hangshu = (int)(sqrt)((num + 1) / 2);
for (i = 1; i <= hangshu; i++)
{
for (j = 0; j < i-1 ; j++)
{
printf(" ");
}
for (k = 0; k < 2 * (hangshu - (i-1)) - 1;k++)
{
printf("*");
}
printf("\n");
}
int underhangshu = hangshu - 1;// underhangshu为下半总行数
for (i = 1; i <= underhangshu; i++)
{
for(j = 0; j <underhangshu-i; j++)
{
printf(" ");
}
for (k = 0; k <(i+1)*2-1; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
当然 虽然此时代码基本成型 但是还是不符合题目的要求的 但是核心部分已经完成 本篇文章更侧重讲述代码是如何打出来的,再次感谢博主小白程序员丶钟同学提供的思路