【问题标题】:Output that looks like a triangle in C输出看起来像 C 中的三角形
【发布时间】:2011-11-02 00:44:23
【问题描述】:

我写了这个程序,

include <stdio.h>

int main(){
int size = 5;

int row;
int col;

  for (col=0; col<size; col++){
    for (row=0; row<col;row++){
      printf(" ");
    }

    for (row=0; row <(size-col) ; row++){
      printf("*");
    if(col<=size){
      printf("*");
      }
    }
    printf("\n");
  }
  return 0;
}

它应该是一个三角形

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

但是每一行都有一个额外的 *。有什么问题?

非常感谢!

【问题讨论】:

  • 您对colrow 变量的使用都是倒退的。我只是指出这一点,因为您似乎正在学习 C
  • 真的吗?我完全同意将它们称为专门指行或列的东西似乎很愚蠢,而实际上它们只是帮助您更改空格和星号数量的变量。如果你能详细说明我会非常感激。该死的,虽然我提交了它,但我真的很震惊,我想知道我是否会得到它的风格点。谢谢
  • @colle:我会更害怕从沉睡中激怒不一致凹痕的古神。
  • 嘿missingno,我从来没有设法在Blue 中抓到你。有一天……说真的,我希望你不是指这个程序!缩进对我来说似乎是合法的,至少如果它错了,我在整个程序中保持错误的一致性。如果有问题,请告诉我如何改进。谢谢
  • @colle:是的,你的程序的缩进是......对不起......可怕。无论如何,我所说的colrow 的意思是你在外循环中迭代rows,但你调用的是迭代器变量col。然后,在内部循环中,迭代某一特定行的列,调用迭代器变量row

标签: c loops for-loop


【解决方案1】:

Mystical 为您在一次迭代中打印两个星号的方式提供了解决方案。在您的示例中使用标识符 rowcol 也会使事情比仅使用 ij 更令人困惑,尤其是因为外部循环实际上是您的当前行。

你的混乱的另一种选择是(我希望这不是家庭作业,因为它没有被标记为这样):

int main(void)
{
   int size = 5;
   int i, j;

   for (i = size; i > 0; i--) {

      for (j = i; j < size; j++)
         putchar(' ');

      for (j = 0; j < i*2 - 1; j++)
         putchar('*');

      putchar('\n');
   }

   return 0;
}

您还可以将i*2 - 1 放入一个变量中,这样就不会在循环的每次迭代中计算它(除非编译器发现您没有修改i)。

【讨论】:

  • +1 用于将程序重组为更清晰的格式!
【解决方案2】:

变化

if(col<=size){

if((row % size) > 0){

也会有同样的效果。

【讨论】:

    【解决方案3】:

    这样打印 * 怎么样

    for (row=0; row<(9-2*col); row++)
      printf("*");
    printf("\n");
    

    这将打印第一行的九个,第二行的七个,等等。

    【讨论】:

      【解决方案4】:

      将您的问题分解为相关变量,并给它们起有意义的名称。这将提高代码的可读性并使错误更容易修复,例如:

      #include <stdio.h>
      
      void triangle(int height)
      {
          int row, col;
          int width = (2 * height) - 1;
      
          for (row = 0 ; row < height ; row++)
          {
              for (col = 0 ; col < width ; col++)
              {
                  if (row > col)
                  {
                      putchar(' ');
                  }
                  else if (col < width - row)
                  {
                      putchar('*');
                  }
              }
              puts("\r");
          }
      }
      
      int main(void)
      {
          triangle(5);
          return 0;
      }
      

      【讨论】:

        【解决方案5】:

        没有人提出递归?它不是很纯粹,因为您必须跟踪深度。我称它为金字塔 (pyr_) 而不是三角形:

        #include <stdio.h> 
        #include <stdlib.h>
        
        static void pyr_line(int depth, int nrows) {
            int i;
        
            if (nrows == 0) return;
        
            for (i=0; i<depth; i++)
                    printf(" ");
        
            for(i=0; i<(2*(nrows-1)+1); i++)
                    printf("*");
        
            printf("\n");
            pyr_line(depth+1, nrows-1);
        }
        
        int main(int argc, char ** argv)
        {
            pyr_line(0, atoi(argv[1]));
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-07
          • 2012-08-31
          • 2011-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多