魔方阵

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告

魔方阵

学生姓名:

专业:

班级:

学号:

指导教师:

2017年4月12日

目录

一、实验题目 (2)

二、实验目的 (2)

三、实验要求 (2)

四、实现过程 (3)

1、总体设计: (3)

2、详细设计: (5)

3、调试分析: (9)

4、运行结果: (9)

5、实验总结: (10)

五、参考文献 (10)

六、附录 (10)

一、实验题目

魔方阵

二、实验目的

本次课程设计的主要目的是综合运用所学的数据结构知识解决奇数魔方阵问题,侧重对二维数组等相关内容的综合应用,使自己能进一步熟悉掌握数据结构的基础知识,进一步提升自己的解决问题和编程调试能力,为后续专业课程的学习打下良好的基础。

三、实验要求

1.[问题描述]:

魔方阵时一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示:

2.[设计要求]:

(1)输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息

(2)实现魔方阵

(3)输出魔方阵

3.[数据结构]

本课程设计使用的数据结构是数组。

四、实现过程

1、总体设计:

1.主流程图:

2.填数流程图

2、详细设计:

1.奇数阶幻方(劳伯法)

填写的方法是:把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:

(1)每一个数放在前一个数的右上一格;

(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;

(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;

(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;

(5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

2.以3*3魔方阵为例,说明其填数过程,如下图:

(a)(b)(c)

(d)(e)(f)

(g)(h)(i)

由三阶魔方阵的生成过程可知,某一位置(i,j)的左上角的位置是(i-1,j-1),如果i-1≥0,不用调整,否则将调整i-1+size;同理,如果j-1≥0,不用调整,否则将其调整为j-1+size,所以位置(i,j)左上角位置可以用三元运算符获得,即:

row=i-1<0 ? size-1 : i-1

clum=j-1<0 ? size-1 : j-1

如果所求位置已经有数据了,将该数据填入同一列下一行的位置,即:if(square[row][cloum])

i++;

else

{

i=row;

j=cloum;

}

3.程序实现

(1)输入魔方阵阶数并判断

printf("请输入一个大于1的奇数:\n");

scanf("%d",&size);

while(size%2==0||size<3)

{

printf("输入错误,请重新输入:\n");

scanf("%d",&size);

}

(2)根据算法构造魔方阵

for(i=0;i

{

for(j=0;j

{

square[i][j]=0;

}

}

i=0;

j=(size-1)/2;

square[i][j]=1;

for(count=2;count<=size*size;count++)

{

row=i-1<0?(size-1):(i-1);

//cloum=j+1>=(size)?(0):(j+1);//右循环

cloum=j-1<0?(size-1):(j-1);//左循环

if(square[row][cloum])

{

i++;

}

else

{

i=row;

j=cloum;

}

square[i][j]=count;

}

(3)输出结果

printf("\n%d阶魔方阵为:\n",size);

for(i=0;i

{

for(j=0;j

{

printf(" %4d ",square[i][j]);

}

printf("\n\n");

}

3、调试分析:

程序的编写和调试基本正常。遇到的问题主要是:矩阵的边界问题。本实验采用二维数组,思路清晰,实验时调试顺利,各模块具有很好的可重用性,得到了一次良好的程序设计训练。

本实验算法是使用二维数组遍历,由于遍历第一层循环只是在遍历矩阵的第一维度,长度为n,遍历第二层循环是在遍历数组第一维度对应下标下的一维数组,长度为n,因此都要用O(n²)的时间。

4、运行结果:

(1)获取阶数并给出错误提示

(2)获取正确阶数并输出结果

5、实验总结:

本实验采用数据结构为二维数组,在使用过程中巩固了学习的知识,在用C语言实现魔方阵算法时对C语言的使用更加熟悉。同时使我对数据结构又有了许多新的深刻认识,更深的理解了数据结构的难点,并且通过这次课程设计,我把以前认为没有实际用途的知识转化为了实际问题来解决,非常有意思,同时也觉得这种学习方法,更好的提高学习的效率。

五、参考文献

[1] 严蔚敏,吴伟民,《数据结构》,北京:清华大学出版社,2006年

[2]苏小红,《C语言程序设计》(第3版)2015年

六、附录

#include

#define N 100

void main()

{

int i,j,row,cloum,size,square[N][N],count;

int p=1;

while(p==1)

{

printf("请输入一个大于1且小于100的奇数:\n");

相关文档
最新文档