【问题标题】:print empty asterisk triangle c打印空星号三角形 c
【发布时间】:2015-09-30 05:18:54
【问题描述】:

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

给定一个 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");
    }

}

【问题讨论】:

  • 请尝试做你自己的工作。 Stackoverflow 不是代码编写服务。如果您的代码有任何具体困难,请发布(作为MCVE),解释问题并提出具体问题。
  • 我已经尝试过了
  • “发布代码并提出具体问题”部分怎么样?
  • 对不起,只是我觉得我的代码太糟糕了,不能给你们看,但还是把它贴出来......效率低下
  • 如果这不是您的意图,我深表歉意。但是你需要从读者的角度来看待它。您转储了一个作业问题,没有尝试代码,也没有具体问题。你希望人们得出什么结论?即使到现在你还没有问过一个问题。您是说代码太长,还是运行时间太长,或者只是通常如何更好地编写代码,或者......?我猜是后者……但只是试图解释清楚问题是你的工作,而不是我们的猜测。

标签: c loops printing draw


【解决方案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 条件。

输出

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      这个问题的更长版本,可以进行大量优化

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

      【讨论】:

        【解决方案4】:

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

        您可以将您的问题划分为这样的模块

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

        【讨论】:

        • 谢谢,我想也许我可以创建一个函数,打印一行,每边有两个 *(星号),指定大小,如:1 * *,2 将打印 * *,3 * * 你知道吗?
        • 一个函数,它接受一个整数,该整数将是两个星号之间的空格数
        • @LeonardoDias 是的,可以有多种解决方法。如果复杂性不重要,您可以选择最喜欢的一种。
        【解决方案5】:

        正在绘制的三角形是一个二维图形,因此可以使用两个嵌套的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' );
        

        仅此而已。

        【讨论】:

          猜你喜欢
          • 2014-12-08
          • 1970-01-01
          • 1970-01-01
          • 2016-02-05
          • 1970-01-01
          • 2018-08-26
          • 2020-10-06
          • 1970-01-01
          • 2016-07-17
          相关资源
          最近更新 更多