用C语言打印一个菱形-公式法

作者: ldsea 分类: 程序生活 发布时间: 2010-03-05 12:43

今天和我新浪微博的一位好友Misacat聊起了C语言,用C语言打印一个菱形,今天上午抽空写了写,好久没有写C语言,竟生疏了很多…
其实这些打印类的问题,都能用一个固定的方法来做,我把它叫做“公式法”,打印类的题目都可归结为在一个平面打印一个图形,这个图形由星号组号。再进一步说,无非就是两种情况,打印一个空格,或者打印一个星号。不同的打印空格和星号的规则不同,就打印成了不同的图形。说到这里就更好理解了,一个平面图形是由什么构成的?就是纵坐标和横坐标,将它们定义为两个变量,i和j.这样任何的打印问题都可以由两个for循环来做
for(int i=0;i<M;i++){//这个是扫描i即纵坐标,就构成了一条线
   for(int j=0;j<N;j++){//这个是在定了一个i的情况下,再扫描横坐标,
                         //这样就构成了一个面
       method(){}:
    }
}
那个method()方法其实在定义了一个i即横坐标之后,相应的纵坐标的规则,一般的打印都是有规则的,有了i,一定有个相应的规则来求出j。不会有人无聊到打印一个毫无规律的东东吧。即一定可以写出 j = getJMethod(i);这样的一个方法。
有了j=getJMethod(i);的方法就好办了,在内层循环里一个一个匹配吧,如果符合j=getJMethod(i)的,就打印一个星号,如果不符合,就打印一个空格。如下所示:
for(int i=0;i<M;i++){//这个是扫描i即综坐标,就构成了一条线
   for(int j=0;j<N;j++){//这个是在定了一个i的情况下,再扫描横坐标,
                         //这样就构成了一个面
       method(){
          if(j==getJMethod(i)) print("*");
          else print(" ";)
       }
    }
    print("\n");//打印完一整行后,别忘了打印一个换行符。    
}
下面我们就可以套用这个公式来完成这个题目了,完整C语言代码如下,相信聪明的你一定可以读懂的:)
#include <stdio.h>

int main()
{
  int i;
  int j;
  for(i=1;i<=7;i++)
  {
     if(i<=4){//前4行
         for(j=1;j<=7;j++){//打印每一行的星号或者空格
             int temp=i-1;
             /*
             *找规律,i=1时,即第一行,是第4个位置星号,其他地方空格
             *第二行,是4,5,6三个位置星号,其他地方空格
             *第三行,是2,3,4,5,6五个位置星号,其他地方空格
             *所以j应该满足,j>=(4-(i-1))并且j<=(4+(i-1))时是星号,其他空格
             */
             if(j>=4-temp&&j<=4+temp) printf("*");
             else printf(" ");
         }
         /**打印完以后有回车*/
         printf("\n");
     }
     else //后三行
     {
         for(j=1;j<=7;j++){
             int temp=7-i;
             /*
             找规律,i=5时,即第五行,是第3,4,5个位置星号,其他地方空格
             第二行,是4,5,6三个位置星号,其他地方空格
             第三行,是2,3,4,5,6五个位置星号,其他地方空格
             所以j应该满足,j>=(4-(i-1))并且j<=(4+(i-1))时是星号,其他空格
             */
             if(j>=4-temp&&j<=4+temp) printf("*");
             else printf(" ");
         }
         printf("\n");
     }            
  }
  system("PAUSE");    
  return 0;
}打印完的界面如下:

这时一定有朋友说了,“这个太复杂了,打印菱形我有更好的办法,比这个简洁多了”,没错,你说的是对的。我只是抽象出了一种公共的方法,以后无论任何打印的问题,都是可以这么做的,可谓是个万能方法。
我之前写过一篇“用java打印一个圆”,用的就是这个方法。
好了,希望我这个公式法可以对你有所帮助:-)

发表回复

您的电子邮箱地址不会被公开。