*
***
*****
*******
*****
***
*
利用C语言,将如上菱形输出到终端。
程序分析:
如果直接printf的话也是可以实现的,不过那不是一个学语言的人的最基本的需求。刚好看到了循环的章节,那么就试图用for来实现。
我们知道终端的输出是从左向右,由上到下的,所以我们不去考虑此菱形所有右边的空白部分,只需考虑其左边的空白及其本身。星号输出最多的那一行为7个,由于用循环控制,不可能先大后小(条件无法同时满足)。我们将之分成两部分来分析,前4行为递增,后三行为递减。
分析规律
第一次输出时 3空格 1*
第二次输出时 2空格 3*
第三次输出时 1空格 5*
第四次输出时 0空格 7*
设输出次数为x,则空格循环为4-x次,*号为3+x次循环。
下面我们编写一个程序,实现上面的想法:
/*this is just test*/
#include
void main()
{
int i,j,k;
for (i=1;i<=4;i++)
{
for(j=1;j<=4-i;j++)
printf(" ");
for(k=1;k<=3+i;k++)
printf("*");
printg("\n");
}
}
编译执行,却发现是这么一个东西。
****
*****
******
*******
看来还是循环*的时候,没有控制好。是我把刚才的分析看错行了,我将*的输出看成是空格+*的整体循环。。呵呵。。
*号的规律是这样的,它应该是每次行循环的2倍减去1。修改程序如下:
#include
void main()
{
int i,j,k;
for (i=1;i<=4;i++)
{
for(j=1;j<=4-i;j++)
printf(" ");
for(k=1;k<=2*i-1;k++)
printf("*");
printg("\n");
}
}
重新编译,即输出开头菱形的上半部分。接下来,我们考虑下半部分。有了上半部,下半部我们逆向而行即可。
规律:
第一次输出时 1空格 5*
第二次输出时 2空格 3*
第三次输出时 3空格 1*
设行输出循环次数为y,则空格数也为y,*号的规律不好找,但是有了前面的部分,我们就可以将循环逆着进行。即当输出第一行时,我需要循环*为5次,预设第一行的输出为3,则*号满足2*y-1.
先看个实例:
int a,b,c;
for(a=3;a>0;a--)
{
for(b=3;b>=a;b--)
printf(" ");
for(c=0;c<2*a-1;c++)
printf("*");
printf("\n");
}
则一切就迎刃而解了!
如需要整体运行,只需将下面的这段粘贴到上面那一段for{}之后,最后一个}之前就可以了。
如此之小问题,也折腾了好几个钟头,谁让自己当初不懂了呢?但是可以从小程序中悟出大规则!积累的过程便是收获。
阅读(3205) | 评论(1) | 转发(0) |