如何打印菱形 (for循环)

 
初学编程的时候(学到循环)遇到一个比较典型的问题:就是如何打印菱形,如下图:   
    
          *   
    
        ***   
    
      *****   
    
    *******   
    
  *********   
    
    *******   
    
      *****   
    
        ***   
    
          *   
    
  我们当然不能用printf来一行行打印,这样多笨,再说也为了理解for循环的意思,我   们干脆用for   循环来打印菱形。我们先来思考一个简单点的问题,比如要打印:   
    
  *   
    
  **   
    
  ***   
    
  ****   
    
  *****   
    
  我们怎么用for来实现呢?可以用一个for循环来打印多少行,一个for来打印星号就可以了。给出源程序如下:   
    
  #include   <stdio.h>   
    
  //#include   <conio.h>   
    
      
    
  main()   
    
  {   
    
        int   i,j;   
    
      
    
        //clrscr();   
    
        for(i=1;i<=5;i++){   
    
              for(j=1;j<=i;j++)   
    
              printf("*");   
    
              printf("\n");}   
    
  }   
    
    也就是说一个for做了一件事情,虽然我们的菱形复杂得多,但我们认真在纸上划划分析一下,就不难发现规律:从第一行到第5行,星号得数目一直在增加,而到了第6行却开始减少。而且星号和两边的空格减少都是有规律可循的。再分析一下,我们要打印每   行星号前面的空格不难,打印后面的空格却麻烦,但我们可以通过打印前面的空格和控   制好星号的数目来完成菱形的打印(忽略每行星号后的空格),眉头一皱,计上心来:)   完成这个任务分两步:一是打印前5行,用两个for来控制星号和空格;二是打印后4行,   同样是用两个for来控制星号和空格。一共是6个for!   进一步缕清思路,在前5行,i   from   1   to   5(用来控制行),j   from   4   to   0(用来控制   空格,因为要先打印空格),k   from   1   to   9(用来控制星号,变化规律是从1到9);再来写后面的4行:m   from   1   to   4,n   from   1   to   4,o   from   7   to   1。再求精:前5行,分   析变化规律:   
    
      
    
  i                         j                       k   
    
  1                         4                       1   
    
  2                         3                       3   
    
  3                         2                       5   
    
  4                         1                       7   
    
  5                         0                       9   
    
      
    
                                    
    
  我们要找,当i=1时,j=4,k=1......再用数学的方法思考:使当i等于1的时候j等于4,   i等于2的时候j等于3......i等于5的时候,j等于0。比如我们可以用2n+2=4(n=1),下个呢?因为我们要找递归关系(所以习惯用n   )2n+2-3=3(n=2),2n+2-6=2(n=3),2n+2-9=1   (n=4),2n+2-12=0(n=5)满足了i和j的关系!再发现:(2n+2)后的每个数都是有规律的!   0,3,6,9,12!都是3的倍数!我们终于找到了递归关系:(2n+2)-3(n-1),n属于[1,   5],化简得5-n。以此类推,完成了所有的递归关系!你疑惑地问,我不用2n+2找递归   关系,用n+3找,或者用3n+1,或用4n,你可以试试,结果都是一样地,那用哪个最方便?当然是(n+3)-2(n-1)   n属于[1,5],记住咱们地推论了!费那么大工夫,终于完成   了如下的源程序:   
    
  main()   
    
  {   
    
        int   i,j,k,m,n,o;   
    
      
    
        clrscr();   
    
      
    
        for(i=1;i<=5;i++){                             
    
              for(j=1;j<=5-i;j++)   
    
                      printf("   ");   
    
              for(k=1;k<=2*i-1;k++)   
    
                      printf("*");   
    
              printf("\n");}   
    
      
    
        for(m=1;m<=4;m++){   
    
              for(n=1;n<=m;n++)   
    
                      printf("   ");   
    
              for(o=1;o<=9-2*m;o++)   
    
                      printf("*");   
    
              printf("\n");}   
    
  }   
    
      
    
  我们看变量的定义多了,去掉m,n,o:     
    
  #include   <stdio.h>   
    
  //#include   <conio.h>   
    
  main()   
    
  {   
    
        int   i,j,k;   
    
      
    
        //clrscr();   
    
      
    
        for(i=1;i<=5;i++){   
    
              for(j=1;j<=5-i;j++)   
    
                      printf("   ");   
    
              for(k=1;k<=2*i-1;k++)   
    
                      printf("*");   
    
              printf("\n");}   
    
      
    
        for(i=1;i<=4;i++){   
    
              for(j=1;j<=i;j++)   
    
                      printf("   ");   
    
              for(k=1;k<=9-2*i;k++)   
    
                      printf("*");   
    
              printf("\n");}   
    
  }   
    
      
    
  *****************上面所有的源程序在turbo   c   2.0编译下通过!***********************************   我当初学的时候可是迷茫了很久啊,现在终于懂了!对于打印菱形什么的,我再也不会迷茫了!   总结:我们通过这个程序学到了什么?   
    
  一是不要看老谭(谭浩强)写的程序而非要和他   写的一模一样!我们要自己动脑找规律。不要迷信他人,我们自己慢慢也能写出程序!以后读任何人的程序都是一样,先自己想程序的要实现的功能,自己写写看,实在不行   再看他的程序,如果一次理解不了就多来几回!一直到我们自己对这个程序的思想能把   握了为止!   
    

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值