这代码该怎么写,想了好多,头都大了

img


这我想的办法需要的变量太多,很绕,头都绕昏了,思路理不清楚,想看看大家对这遍写出的代码学习一下


解题思路:拆分,拆成打印多少行+每一行打印的内容

(1for循环:打印多少行,看规律得,行数=最长行个数,且上下对称
 所以,最简单理解分为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;
}

img

#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;

}