奇数阶幻方C++(调用函数,输出三阶的)为何结果是8,1,6,3,5,7,3,9,2?哪里错了?急求修改!

2025-06-26 14:52:17
推荐回答(1个)
回答1:

#include
using namespace std;

void squart(int n,int a[][3])//这个函数有问题
{
int i=0,x,y,j=(n-1)/2,k=2,t;
//int i_prev,j_prev ;//用i_prev和j_prev变量记录i和j未发生变化前的值
for(i=0;i {
for(j=0;j a[i][j]=0;
}
i=0;j=n/2;a[0][j]=1;//这里i=0,不是i=1,j=n/2,不是(n+1)/2,a[0][j]=1,不是a[1][j]=1
for(t=0;t {
x=i;y=j;i=i-1;j=j+1;//这里x和y分别是i和j为发生变化前的值
if(i<0) i=i+3;//这里错误,应该是if(i<0)或者if(i==-1),数组中出现下标为-1的时候出界
if(j>2) j=j-3;//这里错误,应该是if(j>2)或者if(j==3),数组中出现3的时候出界(下标是从0到2的)
if(a[i][j]==0)
{
a[i][j]=k;
}
else
//这里有问题,else说明a[i][j]!=0,也就是说这个位置在之前已经被存放上数值了,
//那么按道理说应该把这个数字放到正下方的位置上去,但是有一种特殊情况,
//那就是如果这个位置出现在最后一行的话,那么正下方是没有位置的,
//这个时候应该放到该列的第一行上去
//例如:
//x y x
//x x x
//x 5 x
//上面的假设中,放完5之后要放6,可是发现右上角已经有数字x了,因此呢应该放在5的正下方,
//但是5又正好出现在最后一行,所以6不应该放在5的正下方,而是y所在的位置
{
if (x == 2)//说明是最后一行
{
x = -1 ;//把x设置成-1行,这样下面x+1后正好为第一行
}
a[x+1][y]=k;
i=x+1;j=y;
}
k=k+1;
}
}
int main( )
{
int i,j;
int a[3][3]; squart(3,a);
for(i=0;i<3;i++)//这里,数组没有a[3][3]这个,最多到a[2][2],因为是从a[0][0]开始的
{
for(j=0;j<3;j++)
cout< cout << endl ;//换行应该出现在这里,每打印完一行才换行,并不是每打印一个数字就换行
}
return 0;
}

你里面出现最大的问题应该不是关于程序逻辑的问题,而是数组越界的问题,你错误的认为数组下标是从1开始的,其实是从0开始的。花了不少功夫帮你改的,好好看一下吧!如果满意记得采纳,谢了。