如何打印菱形 (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、付费专栏及课程。

余额充值