在C中看起来像三角形的输出

时间:2011-11-02 00:44:23

标签: c loops for-loop

我写了这个程序,

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

它应该像

那样形成一个三角形
*********
 *******
  *****
   ***
    *

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

非常感谢!

5 个答案:

答案 0 :(得分:2)

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 :(得分:1)

更改

if(col<=size){

if((row % size) > 0){

也会产生同样的效果。

答案 2 :(得分:0)

如何打印这样的*

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

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

答案 3 :(得分:0)

将您的问题纳入相关变量并为其提供有意义的名称。这将提高代码可读性并使错误更容易修复,例如:

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

答案 4 :(得分:0)

没有人提出递归?它不是很纯粹,因为你必须追踪深度。我称它为金字塔(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;
}