kelvar 发表于 2009-5-17 13:17:28

用简单的二元一次方程组解释菱形打印程序

前天看这个Nisy老大打印这东西的时候写的很轻松,自己看完视频写了下发现还是自己对于菱形中, "*"这个小东西的相互位置关系还是
不能很清晰的把握。所以自己就用数学的关系来好好的解释下。自己的数学比较菜,也算是对自己思路的一种梳理。
这里首先还是定义两个变量: i,j。分别代表行号和列号;同时定义行中间的行号为F,为了适应其他的奇数,所以定义变量N
昨天论坛里的一朋友说i,j变量定义从0开始比较好计算关系。所以我们就用i=1;j=1为起始(这里起始用0也是同理可以推出)
这里我们另外设两个变量x,y,让他们帮助确定i,j之间的关系。先取N=5的情形作为实例,其他奇数可以类推。
我们先算下各个位置下的i,j的关系(依据图 1),


                      菱形左边            菱形右边
第一行    i=1时,      j=3            j=3
第二行    i=2时,      j=2            j=4
第三行    i=3时,      j=1            j=5
第四行    i=4时,      j=2            j=4
第五行    i=5时,      j=3            j=3
我们注意菱形左面和右面j相加的结果为一个定值N+1.
好了,相当于我们知道了10个坐标(i,j),我们来引进我们的数学关系式来确定i与j的关系
中间行号F的值为(N/2+1)
设 j=abs(F-i+x)+y,然后把F,i和j的值带进去,得到的二元一次方程组为:
3=abs(3-1+x)+y    即 3=abs(2+x)+y
2=abs(3-2+x)+y    即 2=abs(1+x)+y
1=abs(3-3+x)+y    即 1=abs(0+x)+y
2=abs(3-4+x)+y    即 2=abs(-1+x)+y
3=abs(3-5+x)+y    即 3=abs(-2+x)+y
计算下就可以发现取 x=0,y=1可以满足上面的等式。所以
计算得出了,菱形左边的i,j之间的关系为:j=abs(F-i)+1
所以菱形右面的i,j之间的关系随之确定j=(N+1)-(abs(F-i)+1),即j=N-abs(F-i)


源程序就是下面的了

/* Note:i,j start from 1 */
#define N 13
#define F (N/2+1)
#include "math.h"
#include "stdio.h"
main()
{
    int i,j;
   
    for(i=1;i<=N;i++)
    {
       for(j=1;j<N+1;j++)
       {
               if((j==(abs(F-i)+1))||(j==(N-abs(F-i))))
                 printf("*");
               else
                 printf(" ");
                 
                 if(j==N)
                 printf("\n");
              
               }       
    }
}


[ 本帖最后由 kelvar 于 2009-5-18 13:02 编辑 ]

zjid520 发表于 2009-5-17 13:30:37

占个沙发学习下

HDd1145 发表于 2009-5-17 13:31:36

coke_cz 发表于 2009-5-18 09:12:19

这样解释一下就好弄明白了,谢谢。/:good

sdprtf 发表于 2009-5-18 12:00:03

:victory: 很好,学习一下

温柔 发表于 2009-5-21 14:47:16

谢谢楼主了,仔细体味

小试锋芒 发表于 2009-10-11 11:29:13

越是简单的东西越不简单~
页: [1]
查看完整版本: 用简单的二元一次方程组解释菱形打印程序