打印空星号三角形c

时间:2015-09-30 05:18:55

标签: c loops printing draw

所以我抬起头来,只找到了正常的三角形问题。 这个有点棘手。

  

给定一个N,你的程序应该创建一个带有N边大小的星号未填充三角形。

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");
    }

}

5 个答案:

答案 0 :(得分:1)

我只是为你提供一个逻辑,你可以解决它。 你可以采取三个循环。一行表示i,第二表示*(星号)表示j,第三表示空白(空三角)表示k。现在,我希望你知道如何使用i,j制作一个三角形。 k的逻辑可能是它应该比行的循环(即第j个)少1并且应该打印一个空格(“”)。

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

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

答案 1 :(得分:1)

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

  1. 一排满是N个星号
  2. 开头有星号的行,末尾有一个星号,中间有N-2个空格。
  3. 一行带有1个星号(只是#1的一个子集)。
  4. 第1步 - 找出如何打印出上述行

    第2步 - 在打印出上述行时计算

答案 2 :(得分:1)

这个问题的较长版本可以大大优化

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

答案 3 :(得分:1)

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

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

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

接下来是内循环。内循环需要计算每行上的字符数。我们安排了一些东西,以便外循环中的row变量等于字符数。因此,内循环只是

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

现在我们来做决定。鉴于rowcol,我们应该打印星号还是空格?好吧,我们应该始终在第一行打印一个星号,即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' );

这就是它的全部内容。

答案 4 :(得分:1)

你只需要认为第一行应填充* 第二件事是每行的第一个字符应该是* 最后一个字符也应该是*。在你之间你需要填补空间。

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时生成最后一个字符*,这是我们运行循环的最后一个索引。所以在最后一个索引它将打印* 对于所有其他值,它将打印空间,因为它将运行else条件。

输出

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