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

我写了这个程序,

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

它应该像三角形一样

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

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

非常感谢!

神秘有一个解决方案,你打印两个星号的方式迭代。 在你的例子中使用标识符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 )。

更改

 if(col<=size){ 

 if((row % size) > 0){ 

也会产生同样的效果。

如何打印*这样的

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

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

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

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

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

 #include  #include  static void pyr_line(int depth, int nrows) { int i; if (nrows == 0) return; for (i=0; i