打印空的星号三角形 c

print empty asterisk triangle c

所以我查了一下,只发现了正常的三角形问题。 这个有点棘手。

Given a N, your program should create an asterisk unfilled triangle with a N side size.

Example 1 
Inform N: 1 
*

Example 2:
Inform N: 2
**
*
Example 3:
Inform N: 3
***
**
*
Example 4:
Inform N: 4
****
* *
**
*
Example 5:
Inform N: 5
*****
*  *
* *
**
*

这是我的尝试,我只能低效地制作一个实心三角形

void q39(){
    int n,i,b;
    printf("Inform N: ");
    scanf ("%i",&n);
    for ( i = 0; i < n; ++i)
    {
    printf("*");
    for ( b = 1; b < n; ++b)
    {
        if (i==0)
        {
        printf("*");
        }
        else if (i==1 && b>1)
        {
            printf("*");
        }
        else if (i==2 && b>2)
        {
            printf("*");
        }
        else if(i==3 && b>3){
            printf("*");
        }
        else if(i==4 && b>4){
            printf("*");
        }
        else if(i==5 && b>5){
            printf("*");
        }
        else if(i==6 && b>6){
            printf("*");
        }
        else if(i==7 && b>7){
            printf("*");
        }
        else if (i==8 && b>8){
            printf("*");
        }
    }
        printf("\n");
    }

}

我只是为您提供一个逻辑,您可以根据它进行操作。 你可以走三个循环。一个代表行说 i ,第二个代表 * (星号)说 j ,第三个代表白色 spaces (空三角形)说 k 。现在,我希望您知道如何使用 i,j 制作三角形。 k 的逻辑可能是它应该比行循环(即第 j 个循环)少执行 1,并且应该打印空白 space(" ")。

你可以像这样在模块中划分你的问题

print_asterisk(n);
print_hollow_asterisk();
print_asterisk(1);

你需要考虑打印三角形的算法。您(可能)需要绘制三种不同类型的线条:

  1. 一行满N个星号
  2. 一行开头有一个星号,结尾有一个星号,中间有 N-2 个空格。
  3. 一行有 1 个星号(这只是 #1 的子集)。

第 1 步 - 找出如何打印出以上行

第 2 步 - 算出何时打印出以上行

此问题的较长版本,可以进行大量优化

 void print_start_and_end_asterix( int n )
    {
            int i = 0;
            for ( ; i < n ; i ++ )
            {
                    if( i == 0 || i == n-1 )
                            printf("*");
                    else
                            printf(" ");
            }
            printf("\n");
    }


void print_full_row( int n )
{
        int i = 0;
        for ( ; i < n ; i ++ )
                printf("*");
        printf("\n");
}

int main (){
        int n;
        scanf("%d", &n);
        int row = 0 , col = n;
        for ( row = 0 ; row < n ; row ++ , col--) {
                if( row == 0 )
                        print_full_row(col);
                else
                        print_start_and_end_asterix(col);
        }


        return 0;
}

绘制的三角形是一个二维图形,因此可以用两个嵌套的for循环来绘制。外循环跟踪正在绘制的行。内部循环跟踪该列。对于 rowcol 的每个组合,必须做出一个非常简单的决定,我们是输出一个星号,还是输出一个 space.

从外循环开始。外循环从 N 倒数到 1 是有意义的,因为一行中的字符数从 N 开始递减直到达到 1。所以外循环是

for ( row = N; row >= 1; row-- )

接下来是内循环。内循环需要计算每一行的字符数。我们已经安排好外层循环中的 row 变量等于字符数。因此,内循环就是

for ( col = 0; col < row; col++ )

现在我们做出决定。给定一个 row 和一个 col,我们应该打印星号还是 space?好吧,我们应该总是在第一行打印一个星号,也就是 row == N。我们还应该在左边缘打印一个星号,其中 col == 0。最后,我们需要在右边缘添加一个星号,其中 col == row-1。因此,决策代码是

if ( row == N || col == 0 || col == row-1 )  // top or left or right
    putchar( '*' );
else
    putchar( ' ' );

最后,当内层循环结束后,我们需要输出一个换行符作为下一行的开始

putchar( '\n' );

仅此而已。

你只需要认为第一行应该填写 *.
第二件事是每行的第一个字符应该是 *.
最后一个字符也应该是 *。在两者之间你需要填写 spaces.

int main()
{
    int n=6;
    for(int i=n-1;i>=0;i--) // using n-1, bcz loop is running upto 0
    {
        for(int j=0;j<=i;j++)
        {
            if(i==n-1 || j==0 ||i==j)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");      
    }
    return 0;
}

条件if(i==n-1 || j==0 ||i==j)
这里使用 i==n-1 以便第一行应该填充 *.
j==0 用于使每行的第一个字符 *。每次新行开始时,即 j=0 它将打印一个 * 字符。
i==j 这用于使最后一个字符 * 当 i==j 是我们正在 运行ning 循环的最后一个索引。所以最后索引它会打印一个 *.
对于所有其他值,它将打印 space ,因为它会 运行 else condition.

输出

******
*   *
*  *
* *
**
*