Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1733029
  • 博文数量: 42
  • 博客积分: 10036
  • 博客等级: 上将
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 17:08
文章存档

2011年(3)

2010年(3)

2009年(5)

2008年(31)

分类: C/C++

2008-04-17 15:19:35

   *
  ***
 *****
*******
 *****
  ***
   *
利用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{}之后,最后一个}之前就可以了。

如此之小问题,也折腾了好几个钟头,谁让自己当初不懂了呢?但是可以从小程序中悟出大规则!积累的过程便是收获。


阅读(3185) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

yongdi2008-04-25 11:17:55

呵呵,一个经典算法了