n阶奇数魔方阵课程设计说明书_第1页
n阶奇数魔方阵课程设计说明书_第2页
n阶奇数魔方阵课程设计说明书_第3页
n阶奇数魔方阵课程设计说明书_第4页
n阶奇数魔方阵课程设计说明书_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、塔里木大学信息工程学院课程设计届课程设计n阶奇数魔方阵问题课程设计论文学生姓名 学 号 所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机 指导教师 教师职称 讲师 塔里木大学教务处制目录前言1正文22.1设计思路与方案22.1.1算法22.2详细实现22.2.1数据结构与数据存储表示22.2.2功能函数32.2.3 函数逻辑功能调用图52.2.4 程序执行流程图52.3运行环境与结果62.3.1 程序运行结果62.4改进程序分析82.5小结9参考文献10附录114.1二维数组概述114.2二维数组基本运算算法11前言本课程设计主要解决设计一个n×n的方阵中填入1到n2

2、(n为奇数)的数字,使得每一行、每一列、每条对角线上各个数字累加的和都相等的问题。1.1 课程设计目的通过这次课程设计进一步了解了二维数组的使用方法和一些基本的设计思路。对于一个n×n的方阵,其中n为奇数,在n×n的魔方阵中,填入1到n2的整数,使得其各每一行、每一列、每条对角线上各个数字累加和皆相等1。1.2 课程设计内容本次课程设计内容主要是利用二维数组输出正确的n阶魔方矩阵。n阶魔方,又叫幻方阵,在我国古代称为“纵横图”,是一个比较有趣的游戏。2n阶魔方就是用1到n2的数字不重复的填入方阵中。每一行中n个数之和,共得n个和;每一列中n个数之和,共得n个和;每一条对角线

3、n个数之和,共得两个和,每一个和称为魔数。魔方阵中的每个魔数都相等。如图1.2就是一个3阶魔方阵,它是用数字1到9不重复的填入3*3的方阵中,使得各行、各列及对角线的魔数都等于15。3618753294 图1.1 3阶魔方阵正文2.1设计思路与方案首先,输入一个数字n(1n99),则输出对应的n阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。 若输入数字n超出要求范围,则提醒用户重新输入n。 但若输入数字0时,操作结束,退出程序。 使用多维数组输出魔方阵,分别用3个子函数实现相应的功能。 输入形式:数字n(1n99)。 输出形式:(1)以矩阵形式输出n(1n99)阶魔方阵; (2)

4、输出每一行、每一列、每条对角线上各个数字累加和; (3)输出程序运行时间。2.1.1算法(1)将1填入第一行中间; (2)将每个数填在前一个数的右上方。 (3)若该位置超出最上行,则改填在最下行的对应位置; (4)若该位置超出最右列,则该填在最左列的对应行位置; (5)若某元素填在第一行最右列,下一个数填在该数同列的下一行; (6)若某数已填好,但其右上角已填了其他数据,则下一个数填在该数同列的下一行位置。2.2详细实现2.2.1数据结构与数据存储表示这方面使用二维数组nMAXMAX来静态存储不超过MAX行MAX列的数组方阵,其中n(1<=n<=99)为满足条件的数。2.2.2功能

5、函数主要使用与实现如下函数: (1)void main()函数,主函数,调用以下子函数,实现魔方阵填充与输出,实现问题要求功能; (2)#include<time.h>函数,用以计算程序运行时间函数;(3)void jishu(int n)函数,n为奇数实现n阶魔方阵,实现思想如下;a.在1到n2的数字中,选择1开始填充魔方,将数字1填入第一行的中间方格中,即(0,n/2)的位置。b.向已填充的前一个数字位置(p,q)的左上角(p-1,q-1)填入下一个数字,如果出现以下情况,则修改填充位置:i)若填充位置超出上边界,则修改为下边界的相应位置,即把p-1修改为n-1;ii)若填充位

6、置超出左边界,则修改为最右边的相应位置,即把q-1改为n-1;iii)若填充位置已有数字,则填充位置修改为下一行的同一位置。c.重复以上步骤,直至将n2个数字全部填入魔方中。最后调用函数函数out(n,a)和check(n,a),实现魔方阵的输出,检验魔方阵的准确性。具体实现代码如下:void jishu(int n)/*奇数*/ int p,q,i,aMAXMAX; p=0; q=(n-1)/2; a0q=1;/*第一个数字的填入位置*/ for(i=2;i<=n*n;i+) p=(p-1+n)%n;/*计算填入的位置*/ q=(q-1+n)%n; if(apq>0)/*如果填入

7、位置已有数字,则重新计算填入位置*/ p=(p+2)%n;/*由于前面p减了1,因此p应该加1,才能表示下一行*/ q=(q+1)%n;/*由于前面q减了1,因此q应该加1,才能表示同一列*/ apq=i;/*填入数字*/ out(n,a);/*调用输出函数*/ check(n,a);/*调用验证函数*/(4)void out(int n,int aMAXMAX)函数,此函数用以调整方阵元素位置,实现魔方阵n*n形式输出。具体实现代码如下:void out(int n,int aMAXMAX)/*魔方矩阵输出函数*/ int p,q; for(p=0;p<=n-1;p+) for(q=0

8、;q<=n-1;q+) Printf(setw(4),apq) /*输出魔方矩阵的结果*/ Printf(endl,endl); (5)void check(int n,int aMAXMAX)函数,计算并输出n阶魔方阵每行、每列以及每条对角线上各个数字的累加和,同时验证魔方阵的准确性。具体实现代码如下:void check(int n,int aMAXMAX)/*魔方矩阵验证函数*/ int p,q,sum1=0,sum2=(n*n+1)*n/2,k; printf("此魔方阵的每行、每列、两条对角线的和为:"(sum2,endl);/*输出标准魔方阵的每行、每列、

9、两条对角线的和*/ for(p=0;p<n;p+) for(q=0;q<n;q+) sum1=apq+sum1;/*计算矩阵横行纵行的和*/ if(sum1!=sum2)/*判断矩阵横行纵行的和是否与标准相同*/ Printf("横行纵行计算结果与标准不符,请修改程序错误",endl); break; sum1=0; for(k=0;k<n;k+) sum1=akk+sum1;/*计算矩阵主对角线的和*/ if(sum1!=sum2)/*判断矩阵主对角线的和是否与标准相同*/ printf("主对角线计算结果与标准不符,请修改程序错误"

10、,endl); sum1=0; for(k=0;k<n;k+) sum1=akn-k-1+sum1;/*计算矩阵次对角线的和*/ if(sum1!=sum2)/*判断矩阵次对角线的和是否与标准相同*/ printf("次对角线计算结果与标准不符,请修改程序错误",endl);2.2.3 函数逻辑功能调用图void main()void jishu(int n)check(n,a)out(n,a)图3.1 逻辑功能调用图2.2.4 程序执行流程图开始输入nNn在允许的范围内Y调用jishu(int n)调用check(n,a)调用out(n,a)输出n阶魔方阵每行、每列

11、以及每条对角线上各数字的累加和结束 图3.2 程序流程图2.3运行环境与结果2.3.1 程序运行结果 (1)运行程序,根据提示输入指令,当n=3时,程序运行结果如图4.2.1所示图4.1 n=3阶魔方阵 (2)当n=7时即n为奇数时,程序运行结果如图4.2.2所示 图4.2 n=7阶魔方阵 (3) 当输入n=101即n超出所给范围1到99时,运行结果如图4.2.3所示图4.3 n=101阶魔方阵 (4) 当输入n=0时,程序运行结束,运行结果如图4.2.4所示图4.4 n=0程序结束 2.4改进程序分析if(i<1)&&(j>n) /*上一个数是第一行第n列时,则把

12、下一个数放在上一个数的下面*/ i=i+2; j=j-1; else if(i<1) i=n; /*上一个数的行数为1,则下一个数的行数为n,上一个数的列数的n时,下一个数的列数为1*/ if(j>n) j=1; if(aij=0) aij=k; else i=i+2; /*如果按上面的规则确定的位置上已有数,则把下一个数放在上一个数的下面*/ j=j-1; aij=k; 2.5小结本次课程设计我选择了一个古老的书序趣味问题魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法左上斜行法。在编程实现的过程中,我进一步掌握和熟悉了而为数组的应用,并熟悉了将问题分解在组装的解决方法和

13、函数的调用。编程过程中,使用另外完成输出功能的子函数void out(int n,int a),通过对其调用,大大节省了程序编写的复杂度,提高了效率。在实现奇数阶魔方阵时,遇到了一点问题,请教了同学,一起进行了讨论研究,最终解决了问题。通过这次课程设计,使我们学到了一些以前没有学过的知识,使我们对程序设计有了更深层次的认识和理解,懂得了灵活运用。最后,由衷的向我的指导老师表示衷心的感谢,是她的指导和要求,才使我的课程设计有了较为完善的一面,才有了我能力的提高,并使我得到了充分的锻炼,同时也感谢我的同学,是他们帮助我解决了一些问题。 参考文献1 严蔚敏,吴伟民.数据结构.北京:清华大学出版社,2

14、007.42耿国华等.数据结构,西安:西安电子科技大学出版社,2002 3许卓群等.数据结构与算法,北京:高等教育出版社,2005 4张乃孝等.算法与数据结构,北京:高等教育出版社,2001 5范策等编著.算法与数据结构,北京:机械工业出版社,20046黎明志. 数据结构用C语言描述. 北京:中国水利水电出版社,2006,7ice7733. 魔方阵(magic square). 人教论坛,2010,78winice82. 谁对魔方阵感兴趣. Csdn,2010,7附录4.1二维数组概述二维数组A&#91;m&#93;&#91;n&#93;,每个元素的长度为t个字

15、节,设a&#91;p&#93;&#91;q&#93;为A的第一个元素,即二维数组的行下标从p到m,列下标从q到n,按“行优先顺序”存储时则元素a&#91;i&#93;&#91;j&#93;的地址计算为: LOC(a&#91;i&#93;&#91;j&#93;) = LOC(a&#91;p&#93;&#91;q&#93;) + (i &#8722; p) * n + (j &#8722; q) * t 按“列优先顺序”存储时,地址计算为: LOC(a&a

16、mp;#91;i&#93;&#91;j&#93;) = LOC(a&#91;p&#93;&#91;q&#93;) + (j &#8722; q) * m + (i &#8722; p) * t 存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节 二维数组又称为矩阵,行列数相等的矩阵称变方阵。对称矩阵a&#91;i&#93;&#91;j&#93; = a&#91;j&#93;&#91;i&#93;,对角矩阵:n阶方阵的所有非零元素都集

17、中在主对角线上.4.2二维数组基本运算算法(1)转置矩阵:/其中A, B是m*n矩阵: void tramat(matrix A,matrix B) int i,j; for(i=0; i&lt;m; i+) for(j=0;j&lt;n;j+) B&#91;j&#93;=A&#91;j&#93; (2)矩阵相加:/其中A,B,C是m*n矩阵: void addmat(matrix C, matrix A, matrix B) int i, j; for(i=0; i&lt;m; i+) for(j=0;j&lt;n;j+) c&#91;j&#93; = A&#91;j&#93; + B&#91;j&#93; (3)矩阵相乘:/其中A是m*n矩阵,B是n*1矩阵,C为m*1矩阵

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论