我写了这个程序,
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;
}
它应该像
那样形成一个三角形*********
*******
*****
***
*
但是每一行都有一个额外的*。有什么问题?
非常感谢!
答案 0 :(得分:2)
Mystical有一个解决方案,你打算两个星号的迭代。在示例中使用标识符row
和col
也会使事情变得更加混乱,而不仅仅是i
和j
,尤其是因为外部循环实际上是您当前的行。
你的混乱的另一种选择是(我希望这不是作业,因为它没有标记为这样):
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;
}