
这我想的办法需要的变量太多,很绕,头都绕昏了,思路理不清楚,想看看大家对这遍写出的代码学习一下
解题思路:拆分,拆成打印多少行+每一行打印的内容
(1)for循环:打印多少行,看规律得,行数=最长行个数,且上下对称
所以,最简单理解分为2部分:上面+下面(包括最长行)
for (int i=1; i<maxLen; i+=2) {
printCurrentLine(i, maxLen) //打印当行
}
//打印行
for (int i=maxLen; i>0; i-=2) {
printCurrentLine(i, maxLen) //打印当行
}
(2)每一行打印的图案
a.思路:因为要打印出当前行的内容,内容跟最长行个数和当前行需要打印的个数有关,故而
定义方法printCurrentLine(int num, int maxLen)来打印,传入参数:这一行需要输出的*号个数num,菱形最长行的个数maxLen
b.然后计算*号的起始和结尾下标,利用中心法,(整体长度-当前行个数)/2=起始下标,结尾下标=起始下标+当前行个数-1
c.实现如下
int start = (maxLen-num)/2; //*号输出起始下标
int end = start + num; //*号结束下标
//故而[0--start)为空格,[start,end)为*号,[end,maxLen)为空格
//开始打印
for(int i=0; i<start; i++) {
//打印空格
}
for(int i=start; i<end; i++) {
//打印*号
}
//若无特殊要求,后面的空格也可以不输出
for(int i=end; i<maxLen; i++) {
//打印空格
}
//输出换行符
#include <stdio.h>
int main()
{
int n = 7, i, j, m, t;
scanf("%d", &n);
t = n / 2;
for (i = 0, m = 0; i <= t && m < n; i++)
{
m = 2 * i + 1;
for (j = 0; j < t - i; j++)
printf(" ");
for (j = 0; j < m; j++)
printf("* ");
printf("\n");
}
for (i = t - 1; i >= 0; i--)
{
for (j = 0; j < t - i; j++)
printf(" ");
for (j = 0; j < 2 * i + 1; j++)
printf("* ");
printf("\n");
}
return 0;
}

#include <stdio.h>
int main( )
{
int i,j,n=6; //n代表上三角行数
//先输出上三角
for(i=1;i<=n;++i) //输出n行
{
//输出第i行
for(j=1; j<=n-i; ++j) //输出n-i个空格
printf(" ");
for(j=1; j<=2*i-1; ++j) //输出2*i-1个星号
printf("*");
printf("\n");
}
//下面输出下三角
for(i=1;i<=n-1;++i) //输出n-1行
{
//输出第i行
for(j=1; j<=i; ++j) //输出i个空格
printf(" ");
for(j=1; j<=2*(n-i)-1; ++j) //输出2*i-1个星号
printf("*");
printf("\n");
}
return 0;
}