1、幻方 C+课程设计报告淮阴工学院C+程序设计课程设计报告选题名称: 幻 方 系(院): 计 算 机 工 程 系 专 业: 通 信 工 程 班 级: 通 信 XXXXX 姓 名: XXX 学 号: XXXXXXXXXXXXX 指导教师: 戴峻峰 赵建洋 学年学期: 200X 200X 学年 第 X学期 200X 年 XX 月 XXX 日设计任务书课题名称幻方设计目的1.调研并熟悉幻方的基本功能、数据流程与工作规程;2.学习与幻方相关的参考资料和基于VC+集成环境的编程技术;3.通过实际编程加深对基础知识的理解,提高实践能力;4.学习开发资料的收集与整理,学会撰写课程设计报告。实验环境1.微型电子
2、计算机(PC);2.安装Windows 2000以上操作系统,Visual C+6.0开发工具。任务要求1.利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;2.在第16周末之前完成预设计,并请指导教师审查,通过后方可进行下一步工作;3.本课题主要实现奇、偶幻方的制作,要求输入幻方的阶数n,n的取值范围为3-10,输入n后,首先判断是否存在对应阶的幻方,如果存在,则显示幻方制作效果。4.结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、结论正确,正文字数不少于3000字(不含代码)。工作进度计划序号起止日期工 作 内 容12009.
3、06.72009.06.7在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。22009.06. 72009.06.10设计总体方案,构建、绘制流程框图,编写代码,上机调试。32009.06.112009.06.12测试程序,优化代码,增强功能,撰写设计报告。42009.06.122009.06.13提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。指导教师(签章): 年 月 日 摘要:幻方是一个非常神秘的课题,它有着悠久的历史文明。我们这些炎黄子孙对它有着很深入的了解和研究。幻方就是一个方阵,它有着自己的规则和定义。就象你玩游戏一样,你要遵从游戏规则才能去完成
4、它。幻方可分为奇阶幻方和偶阶幻方,同时偶阶幻方又可以分为双偶阶和单偶阶。奇阶幻方比偶阶幻方简单一些。幻方要运用到数组的知识,首先我要把数组的赋值,输出等。首先我要回顾一下这些知识,进而全面的讨论了幻方操作的基本理论。幻方还运用到循环体结构等知识。我要先把这些看明白,才可以完成这个程序设计。在这过程中我要多思考多总结,善于去研究去探索,这样才能把这个课题完成好。幻方的规则就是它每一行和每一列的和及两条对角线的和要相等,每列,每行,每条对角线的和称之为幻和。这样你排出来的才叫幻方,否则没有条理,那样就没有意义了。幻方中所排的数就是从1开始到N的平方结束。所谓双偶阶就是指N能被4整除,单偶阶就是指能
5、被2整除但不能被4整除。给出主要的流程图,最后编写软件代码。关键词:连续摆数法;阶梯法;对称法;斯特雷奇法;LUX方法;奇阶幻方;双偶阶幻方;单偶阶幻方2.1涉及的知识基础12.2总体方案.33课题内容 33.1奇数阶幻方的制作.33.2偶数阶幻方的制作.53.3流程图 .114代码和解析 11 5程序的运行与测试 21总结 24致谢 26参考文献 271 课题综述1.1 课题来源 幻方又称为魔方,方阵或厅平方,它最早起源于我国。宋代数学家杨辉称之为纵横图。所谓纵横图,它是由1到n 2,这n 2个自然数按照一珲的规律排列成N行、N列的一个方阵。它具有一种厅妙的性质,在各种几何形状的表上排列适当
6、的数字,如果对这些数字进行简单的逻辑运算时,不论采取哪一条路线,最后得到的和或积都是完全相同的。关于幻方的起源,我国有“河图”和“洛书”之说。相传在远古时期,伏羲氏取得天下,把国家治理得井井有条,感动了上花于是黄河中跃出一匹龙马,背上驮着一张图,反作为礼物献给他,这就是“河图”,了是最早的幻方伏羲氏赁借着“河图”而演绎出了八卦,后来大禹治洪水时,咯水中浮出一只大乌龟,它的背上有图有字,人们称之为“洛书”。“洛书”所画的衅中共有黑、白圆圈45个。把这些连在一起的小圆和数目表示出来,得到九个。这九个数就可以组成一个纵横图,人们把由九个数3行3列的幻方称为3阶幻方,除此之外,还有4阶、5阶后来,人们
7、经过研究,得出计算任意阶数幻方的各行、各列、各条对角线上所有数的和的公式为:Nn=1/2n(n 2+1)其中n为幻方的阶数,所求的数为Nn。 幻方最早记载于我国公元前500年的春秋时期大戴礼中,这说明我国人民早在2500年前就已经知道了幻方的排列规律。而在国外,公元130年,希腊人塞翁才第一次提起幻方。我国不仅拥用幻方的发明权,而且是对幻方进行深入研究的国家。公元13世纪的数学家杨辉已经编制出310阶幻方,记载在他1275年写的续古摘厅算法一书中。在欧洲,直到574年,德国著名画家丢功才绘制出了完整的4阶幻方。1.2 课题意义 掌握奇数阶、偶数阶幻方的制作。了解连续摆数法、阶梯法、对称法、斯特
8、雷奇法以及LUX方法制作幻方。通过小组配合写出代码,并调试出正确结果。在调试过程中,熟练掌握C+程序设计步骤,提高自己编写程序的能力。2需求分析2.1 涉及的知识基础C+知识:循环语句、选择语句、数组、函数1.循环语句(1)for( )语句for( )循环语句的一般格式为:for(;)S;其中,三个表达式都可以是C+中的任一符合语法规则的表达式;语句S可以是任一C+的语句。同样地将语句S称为for( )的内嵌语句,并把称为循环体。for( )语句的执行过程如下;首先计算“表达式1”(循环初值),且仅计算一次。每一次循环之前计算“表达式2”(循环条件),如果其结果为真,则执行“语句”S,并计算“
9、表达式3”(循环增量)。否则,循环终止。2.选择语句(多分支)现实生活中的各种条件是很复杂的,在一定条件下,又需要满足其他的条件才能确定相应的动作。为此,C+提供了if语句能够出现在另一个if语句或if-else语句里。嵌套if语句有两种形式。一种是嵌套在else分支中,格式为:if(表达式1)语句1;else if(表达式2)语句2; else if else 语句n;第2种是嵌套在if分支中,格式为:if(表达式1)if(表达式2)语句1;else语句2;else语句3;3数组数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置来区分,位置用下标表示。数组
10、有一维数组与多维数组之分,在程序中仅使用了二维数组。二维数组的定义格式为:类型说明符 数组名常量表达式1 常量表达式2;“类型说明符“指定数组元素的类型,“数组名”的命名规则与变量一样,方括号中的“常量表达式1”代表了二维数组的行数,“常量表达式2”代表了二维数组的列数。行列下标都是从零开始,其最大下标均比常量表达式的值小1。4函数函数定义的一般形式如下: 返回类型 函数名 (参数表) 语句块 return; 函数定义包括以下一个部分:函数名:函数名与变量名的定义规则一样,但应尽可能反映函数的功能,常常由几个单词组成。参数表:用于向函数传送数值或从函数带回数值。每一个参数都有自己的类型。函数可
11、以有一个或多个参数变量,也可以没有参数。如果没有参数,称为:无参“函数。函数体:花括号中的语句块称为函数体。一个函数的功能,通过函数体中的语句来完成。返回类型:指定函数用return返回的函数值的类型。如果函数没有返回值,返回类型应为void。2.2 总体方案幻方的制作主要包括两个部分,分别是奇数阶幻方的制作、偶数阶幻方的制作。奇数阶幻方可以通过连续摆数法和阶梯法制作。偶数阶幻方可以通过对称法、斯特雷奇法和LUX方法。其中对称法适用于双偶数阶幻方,斯特雷奇法适用于单偶数幻方。幻方的设计要求是:编写代码,实现奇、偶数幻方的制作。运行后,出现下面的参考界面: 表1 效果图选择一个菜单后,要求输入幻
12、方的阶数n。n的取值范围为310。输入n后,首先判断是否存在对应阶的幻方,如果存在,则显示幻方的制作效果。3课题内容3.1奇数阶幻方的制作3.1.1 连续摆数法例:一个5*5 格子,由最上面一行中间一格开始,依次填1,2,3等等。下一个格子填在左上位置。但要注意两点:出了幻方的范围,右边接到左边,下边接到上边。某一格右上已经有了数字,改填在这个格子的下面一个,然后延续前面的方法。17241815235714164613202210121921311182529表1-1 5*5奇阶幻方81711524112591821931221102262041351423716也不一定按照斜上方写字,可以走
13、马步,得到的是泛对角幻方。 表1-2 5*5奇阶幻方(1) 哪些“步子”是可行的,是需要注意的一个问题。3.1.2 阶梯法 例:以5阶为例。第一步:画一个9*9的方格。如下斜着填数字。注意中间的5*5格子才是要作的幻方的位置,已经涂成了黄色。5410391522011325624111723162221 表1-3 9*9奇阶幻方第二步:黄色范围以外的数字,平移到黄色格子中没有数字的位置。31692215208211427251311924125186114171023表1-4 9*9奇阶幻方(1)去掉外围的格子,就得到所要作的幻方。3169221520821142725131192412518
14、6114171023表1-5 5*5奇阶幻方(2)3.2偶数阶幻方的制作3.2.1对称法,适用于双偶数阶幻方例:以8阶幻方为例。第一步:在左上4*4格子中,去一半的格子,要求每行每列都取到2个。如下图黄色格子所示。 表2-1 8*8双偶阶幻方 第二步:按照左右对称、上下对称、中心对称的方法把这8个格子扩充为32个格子。 表2-2 8*8双偶阶幻方(1) 第三步:从左上角开始,从左到右从上到下,从1开始填数。不过只填没有选中的格子(即没有涂黄的格子)24579111416171922242628293134363739414346484951545658606163表2-3 8*8双偶阶幻方(2
15、) 第四步:从右下角开始从右到左从下到上在选中的格子里填进刚才没填的数字。64262455975795511535214501617471945442242244026382829353133323430363727392541234321204618484915511312541056858660613631 表2-3 8*8双偶阶幻方(3)制作成功。这个方法可以产生不同的双偶阶幻方。3.2.2 斯特雷奇法,适用于单偶数幻方例:设阶数 n=2(2m+1)=6,m=1.第一步:把方阵分为4个小方阵,位置依次为A左上,B右下,C右上,D左下。用连续摆数法,把1-a2放在A中成第一个幻方;把a2+
16、12a2放在B中成第二个幻方。把2a2+13a2放在C中成第三个幻方。把3a2+14a2放在D中成第四个幻方。816261924357212325492112720352833171015303234121416313629131822表3-1 6*6单偶阶幻方第二步:在A的各行左起取m个方格,但中间一行从第二格开始。与D中相应位置对换。816261924357212325492112720352833171015303234121416313629131822 表3-2 6*6单偶阶幻方(1)第三步 在C的各行右起取m1个方格,与B中相应位置对换。此例m-1=0,无需交换。351626192
17、433272123253192112720828331710153053412141643629131822表3-3 6*6单偶阶幻方(2)3.2.3 LUX方法 这是剑桥大学康韦教授发明的方法例 设阶数n=2(2m+1)=10,m=2。 第一步:任取一个2m+1 阶幻方。这可以使用已知的奇数阶幻方,例如 幻方制作与性质演示(下一页)中的第一个5阶幻方。如下。 1 23 16 4 21 15 14 7 18 11 24 17 13 9 2 20 8 19 12 6 5 3 10 22 25 表3-4 5*5奇阶幻方第二步:在上面的m+1行 (此处为3行)的每个格子里填入一个字母L;接下去一行填
18、字母U,余下m-1 行填字母X。最后把中间的一个L 与它下面的一个U 交换一下。 1L 23L 16L 4L 21L 15L 14L 7L 18L 11L 24L 17L 13U 9L 2L 20U 8U 19L 12U 6U 5X 3X 10X 22X 25X 表3-5 5*5奇阶幻方(1)第三步:作一个1010方格,设想为每22为一个单位,每个单位相应于上面一个格子。对应于5阶幻方中数字1的单位填1,2,3,4。对应于5阶幻方中数字2的填5,6,7,8。等等。但是标有字母L 的按照“右上左下右下左上”次序;标有字母U 的按照“左上左下右下右上”次序;标有字母X 的按照“左上右下左下右上”次
19、序。 4 1 92 89 64 61 16 13 84 81 2 3 90 91 62 63 14 15 82 83 60 57 56 53 28 25 72 69 44 41 58 59 54 55 26 27 70 71 42 43 96 93 68 65 49 52 36 33 8 5 94 95 66 67 50 51 34 35 6 7 77 80 29 32 76 73 45 48 21 24 78 79 30 31 74 75 46 47 22 23 17 20 9 12 37 40 85 88 97 100 19 18 11 10 39 38 87 86 99 98 表3-6
20、10*10单偶阶幻方当然,这个方法也产生很多幻方。3.3流程图流程图如图3.4所示。 图3.4流程图4 代码和解析#include#includevoid jishu(int n) /任意奇数阶幻方制作的函数(阶梯法) int p=n-1,q=0,s=1,i,j,t=n-1; int b5050; int a100100; for(i=0;i2*n-1;i+) /给数组a赋初值 for(j=0;j2*n-1;j+) aij=0; while(p=p+1-n;i-) /根据行的变换,列数每次右移五格 for(j=q;jq+n;j+) if(i+j=t) aij=s; /每次赋值都加1 s+; t
21、+=2; q+; p+; for(i=0;i2*n-1;i+) /把中间框以外的数字按规律填到中间的框内 for(j=0;j2*n-1;j+) if(i=(3*n-1)/2&aij!=0) /格子下方的数填入数组中 ai-nj=aij; else if(j=(3*n-1)/2&aij!=0) /格子右方的数填入数组中 aij-n=aij; for(i=0;in;i+) /用一个新数组把a的中间提取出来 for(j=0;jn;j+) bij=ai+(n-1)/2j+(n-1)/2; for(i=0;in;i+) /换行输出,每行5个 for(j=0;jn;j+) coutsetw(3)bij ;
22、 coutendl; void f1(int n) /设计的一个通用双偶函数 int a100100; int i,j; int x,k=1,m=3,t; t=(n-1)/4; if(t=0) /即n=4 for(i=0;i=m;i+) /给数组依次赋初值1,2,3 for(j=0;j=m;j+) aij=k;k+; for(i=1;i=2;i+) /用走日字的方法交换数组中的元素 x=a0i;a0i=amm-i;amm-i=x; x=ai0;ai0=am-im;am-im=x; for(i=0;i=m;i+) /输出数组 for(j=0;j=m;j+) coutaij ; coutendl; goto loop; /跳到loop for(i=0;i8;i+) /给数组赋初值0 for(j=0;j1) for(i=0;i2;i+) /取
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1