/************************************************
 *   File name      :magic_square.c
 *   CopyRight      :2011-03-25,All rights Reserved.
 *   Module name    :...
     *
 *   CPU            :ARM7
 *   RTOS           :....
     *
 *   Create Date    :2011-03-25

 *   Author/Corporation:  hackerling/maple Corporation
 *
 *   Abstract Description :
 *
 *
 *   ---------------Revision History--------------
 *   No  Version  Date       Revised By   Item      * 
 *    1        1.0       2011-3-25        王小毛                                             *

奇阶魔方阵的程序,已调试成功 

注:这是个老程序了,很多人都会写,我很菜,好久没玩C了,最近学习了陈正冲老师的《c语言深度解剖》,很不错的一本书,推荐阅读!!!

故写了一些小程序,仅当联系,奇阶魔方阵是实现从1到n*n的自然数,形成一个矩阵,使每行每列都加起来为一个固定的数,都相等.
 **************************************************************/

#include
#include
#define  MAXSIZE 20
//魔方阵的入口函数,实现每行每列之和相加全等
void main()  //声明变量不会分配内存,c++中默认初始值为-858993460
{
 int magicsqr[MAXSIZE][MAXSIZE];  //魔方阵数组
 int i,j;  //做数组下表的处理
 int num;  //num就是用来作为要填充的具体数据
 int n;   //n表示你输入的魔方阵阶数
 for(i=1;i  {
  for(j=1;j     {
   magicsqr[i][j]=0; 
  }
 }
 printf("Please input n(1~19,It must be odd):");
 scanf("%d",&n);
 while(!(n>0 && n< MAXSIZE) || n%2==0) //输入数据限制
 {
  printf("The number you input is invalid,please input agian!");
  scanf("%d",&n);
 }
 j=n/2+1;
 magicsqr[1][j]=1;
 i=1;
 for(num=2;num  {
  i=i-1;               //规则1:普通输入规则,加入到上一行的右一列
  j=j+1;
  if(i==0&&j==n+1)   //规则2:对数组下表进行处理if-else结构,如果越界,即不在本数组下方
  {
   i=i+2;
   j=j-1;
  }
  else    //规则3:其余的单边越界(所谓单边越界:就是说或者行或者列超过了魔方阵数组届)
  {
   if(i==0)  {i=n;}
   if(j==n+1)  {j=1;}
  }
  if(magicsqr[i][j]==0)  //数据写入魔方阵,if-else结构
  {
   magicsqr[i][j]=num;
  }
  else   //规则4:如果该数在输入下一个要填入的数字时,它的右上角存在数字,即不为0,作如下处理,放在它自己下方
  {
   i=i+2;                                                                                                      
   j=j-1;
   magicsqr[i][j]=num;
  }
 }
 for(i=1;i  {
   for(j=1;j    {
    printf("%4d",magicsqr[i][j]);
   }
   printf("\n\n");
 }
 return;
}