多重循环-讲解

多重循环-请教高手讲解
请大侠帮我分析以下题目的求解过程,谢谢。

void   main(){
int   i,j,k;
for(i=1;i <=3;i++)
{   for(j=1;j <=3-i+5;j++)
printf( "   ");
for(k=1;k <=2*i-1+5;k++)
{
if(k <=5)   printf( "   ");
else   printf( "* ");
}
printf( "\n ");
}
}


------解决方案--------------------
int main()
{
int i,j,k;
for(i=1;i <=3;i++) // 共三行
{
for(j=1;j <=3-i+5;j++) // 补齐前面的空格,第一行7个,第二行6个,第三行5个
printf( " ");

for(k=1;k <=2*i-1+5;k++)
{
if(k <=5) // 第一行5空1* ,第二行5空3*, 第三行5空5*
printf( " ");
else
printf( "* ");
}

printf( "\n "); // 打回车换行
}
getch();
return 0;
}

------解决方案--------------------
void main(){
int i,j,k;
for(i=1;i <=3;i++)
{
for(j=1;j <=3-i+5;j++)//打印空格,数量是i=1时7个,i=2时6,i=3时5个
printf( " ");
for(k=1;k <=2*i-1+5;k++)
{//数量是i=1时5个空格2个*,i=2时5个空格3个*,i=3时5个空格5个*
if(k <=5)
printf( " ");
else
printf( "* ");
}
printf( "\n ");//下一行
}
}
顺便说一下,你的代码格是要改进一下,看一下代码规范
------解决方案--------------------
先说里面的循环:
for(j=1;j <=3-i+5;j++)
printf( " ");
这个循环表示:每次输出8-i个空格

for(k=1;k <=2*i-1+5;k++)
{
if(k <=5) printf( " ");
else printf( "* ");
}
k取1到5时,都输出一个空格;
从6取到2*i-1+5,输出*
也就是,每次先输出5个空格,再输出(2*i-1)个*

再看外面的循环:
for(i=1;i <=3;i++)
{
//先执行j循环
//再执行k循环
printf( "\n ");
}
j循环每次输出8-i个空格
k循环每次先输出5个空格,再输出(2*i-1)个*
所以i循环每次先输出8-i+5个空格,再输出(2*i-1)个*,最后输出一个换行
即:
i=1时,先输出12个空格,再输出1个*,最后输出一个换行
i=2时,先输出11个空格,再输出3个*,最后输出一个换行
i=3时,先输出10个空格,再输出5个*,最后输出一个换行

所以结果为:
第一行12个空格,然后1个*
第二行11个空格,然后3个*
第三行10个空格,然后5个*