谭浩强的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”)
}
}
程序到此结束,但执行不出正确结果。尽管我写的程序繁琐,但我仍想知道为什么结果不对呢?
>> 本文固定链接: http://www.vcgood.com/archives/1986
谭浩强的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;
}