首页 > 用户发贴区 > 编程问题提问区 > 关于谭浩强的c语言教材上一道魔方阵的习题
2007
12-02

关于谭浩强的c语言教材上一道魔方阵的习题

谭浩强的C程序设计第3版习题7.7答案错,得不到正确结果。
以下是我自己所编的程序,但结果也不对,我也查不出错误,请大家帮忙指正。


题目:输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为


8 1 6


3 5 7


4 9 2


要求输出由1~n*n之间的自然数构成的魔方阵(n为奇数)


分析:
魔方阵中各数的排列规律如下:
1、将1放在第一行中间一列;
2、从2开始直到n*n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减一,列数加一(例如上面的三阶魔方阵,5在4的上一行


后一列);
3、如果上一行的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则2应放在最下一行,列数同样加1;
4、当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列;
5、如果按照上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放


在第1行第二列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
按此方法可以得到任何阶的魔方阵。


我写的程序:


#include<stdio.h>
void main()
{
int l,m,k,j=1,n,temp1,temp2,flag1=0,flag2=0,i=1,a[16][16];
scanf(“%d”,&n);
j=n/2+1;
for(l=1;l<=n;l++)
 for(m=1;m<=n;m++)
 a[l][m]=0;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
if(j==1){temp1=i;i=n+1;flag1=1;}
if(j==n){temp2=j;j=0;flag2=2;}
if(a[i-1][j+1]==0)
{
a[i-1][j+1]=k;
i=i-1;j=j+1;
}
else
{
if(flag1==0&&flag2==0)
{
if(i==n)i=0;a[i+1][j]=k;i=i+1;
}
if(flag1==1&&flag2==2)
{
a[temp+1][temp2]=k;
i=temp+1;j=temp2;
}
if(flag1==1&&flag2==0)
{
a[temp1+1][j]=k;
i=temp1+1;flag1=0;
}
if(flag1==0&&flag2==2)
{
if(i==n)i=0;
a[i+1][temp2]=k;j=temp2;flag2=0;
}
}
}
for(i=1;i<=n;i++)
{
 for(j=1;j<=n;j++)
 printf(“%d\t”,a[i][j]);
printf(“\n”)
}
}


 


程序到此结束,但执行不出正确结果。尽管我写的程序繁琐,但我仍想知道为什么结果不对呢?


 


 


 


 


关于谭浩强的c语言教材上一道魔方阵的习题》有 1 条评论

  1. superguest 说:

    谭浩强的C程序设计第3版习题7.7答案,应该上是对的,可得到正确结果.

    以下是我的录入TC的编码,你试一试可知,你得不到正确结果可能是哪个细节出错了.

     

    # include <stdio.h>
    void main()
    {int a[16][16],i,j,k,p,n;
      p=1;
      while(p==1)
       {printf(“enter n(n=1 to 15):”);
        scanf(“%d”,&n);
        if ((n!=0)&&(n<=15)&&(n%2!=0))
         p=0;
       }
    /* 444 */
       for (i=1;i<=n;i++)
          for (j=1;j<=n;j++)
          a[i][j]=0;
    /* 444  */
       i=1;
       j=n/2+1;
       a[i][j]=1;
       for (k=2;k<=n*n;k++)
         {i=i-1;j=j+1;
          if ((i<1)&&(j>n))
           {i=i+2;j=j-1;
           }
          else
           {if ( i<1 ) i=n;
     if ( j>n ) j=1;
           }
          if (a[i][j]==0)
       a[i][j]=k;
          else
           {i=i+2;j=j-1;
     a[i][j]=k;
           }
        }
        for(i=1;i<=n;i++)
         { for (j=1;j<=n;j++)
     printf(“%5d”,a[i][j]);
           printf(“\n\n”);
         }
         return 0;
    }

留下一个回复