比如要打印的图形如下
*
* *
* * *
* * * *
首先观察图形一共有四行,每行都有星号,可以考虑用一个循环语句先打印四行星号
for(i=0;i<4;i++)
{
printf("*\n");
}
得到图形如下
*
*
*
*
星号的个数每行都不止一个,可以考虑在加一个循环,再给234列每一列打上1个星号,得到的应该是个4行4列都是星号的图形,由于循环执行的顺序,实际上第一个for循环打印星号在最后执行,第二个for循环可以看作给123列每一列打上1个星号。
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
printf("*");
}
printf("*\n");
}
****
****
****
****
观察到星号之间有一个空格,并且每行星星的个数都是星星所在行数,可以在打印出来的*后添加空格,上面的程序是不管哪一行,每行都打印4列,现在只打印星星所在行数的列数,改动第二个for循环即打印列的语句,使其循环次数不得超过所在行数。
for(i=0;i<4;i++)
{
for(j=0;j<i;j++)
{
printf("* ");
}
printf("*\n");
}
*
* *
* * *
* * * *
此时已经与所要求打印的图形十分接近了,考虑到图形右边的空格都已经打印出来,只剩图形左边的空格未打印,观察图形左边空格的规律,第1行打印3个,第2行打印2个,第3行打印1个,第4行打印0个,可以得到所在行数加上空格数等于总行数,由于i从0开始计数而不是从1开始计数,总行数相应减少1,上面说过要打印列就需多添加一条循环语句,这里打印的空格在打印的星号空格之前,因此在打印列星号循环之前加上循环。
for(i=0;i<4;i++)
{
for(k=0;k<3-i;k++)
{
printf(" ");
}
for(j=0;j<i;j++)
{
printf("* ");
}
printf("*\n");
}
要推广到打印任意行任意列的上述图形,所需做的改动是行循环的限制条件和列循环的限制条件。