>实验报告
一. 实验目的
1.设计数据结构;
2.设计算法完成任意n阶魔方阵的填数; 3.分析算法的时间复杂度。
二. 实验内容
魔方阵,又叫幻方阵,在我国古代称为“纵横图”。它是在一个n*n的矩阵中填入1到n*n的数字(n为奇数),使得每一行,每一列,每条对角线的累加和都相等。
三. 程序代码
源程序:
#include void Square(int n) { int a[9][9];
int p=0, q=(n-1)/2;
a[0][q]=1;
//在第0行的中间位置填1
for (int i=2; i
{
p=(p-1+n) % n;
//求i所在行号
q=(q-1+n) % n;
//求i所在列号
if (a[p][q]>0) {
p=(p+2)%n; q=(q+1)%n;
//这两句进行了修改,否者得不到正确的答案,切记切记!!!!
}//如果位置(p, q)已经有数,填入同一列下一行
a[p][q]=i;
}
for(p=0; p
{for(q=0; q
cout
cout
void main() { int n; cout>n; cout
Square(n); } 四.结果与心得体会
1.程序的测试结果是什么? 答:n=3时
n=5时
2.在调试的过程中遇到了什么问题,是如何解决的?
答:在调试的过程中遇到了以下几个问题:
1.
Square函数的形式参数不可以是(int a[][], int n),因为程序是在编译时就会为数组分配内存,而那样的形式参数是不合理的。在调试程序的过程中,我反复试了好多次,也证明了那是错的。 解决方法:直接将Square函数的形参设为(int n),改在在其函数内定义数组a[9][9],这样就能将问题很好的解决。
2.
在书中提供的Square函数里面,有一个语句是这样的if(a[p][q]>0)
p=(p+1)%n;
,
这个语句是错的。之所以会有这样的错误,是由于错误的理解了“如果位置(p, q)已经有数,填入同一列下一行”这一句的意思,这句的意思是填入原数的下面,而不是即将填入的那个数但又已填入数的那个数的下面。
解决方法:将该语句改成:
if (a[p][q]>0)
{
p=(p+2)%n; q=(q+1)%n;
} ,这样就可以了。
3.由于数组a[][]是在Square函数中定义的,因此将数组数据输出的语句就只能放在Square函数中实现。