幻方课程设计.docx
- 文档编号:24244108
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:19
- 大小:138.63KB
幻方课程设计.docx
《幻方课程设计.docx》由会员分享,可在线阅读,更多相关《幻方课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
幻方课程设计
C++程序设计课程设计报告
选题名称:
幻方
系(院):
计算机工程学院
专业:
计算机科学与技术
班级:
计算机1093班
姓名:
学号:
指导教师:
学年学期:
2009~2010学年第1学期
2009年12月30日
摘要:
C++程序设计是计算机科学与技术、通信工程等相关专业的最重要的一门专业基础课,它内容大、涉及面广、知识点多。
课程设计就是通过建立系统设计的整体思想,锻炼编写程序、调试程序的能力,学习文档编写规范,培养独立学习、吸取他人经验,树立团队协作精神。
本次课程设计选的是幻方,所谓幻方,就是一个n行n列的正方形,共有n2个格子,将1、2、3、……n2这些数字放到这些格子里,使其每行的和、每列的和及两条对角线的和都是同一个相同的数s。
幻方可以分为:
奇数幻方、双偶幻方、单偶幻方……但人为计算高阶幻方很困难,所以这里我们通过计算机编写程序来完成幻方的计算,这样就方便多了。
本课程设计主要研究奇数幻方、单偶幻方、双偶幻方,通过以知的数学方法,将其编成C++代码,在VisualC++6.0环境下进行运行出正确的幻方阵。
关键词:
循环结构;类;数组;函数
设计任务书
课题
名称
幻方
设计
目的
1.调研并熟悉幻方的基本功能、数据流程与工作规程;
2.学习与幻方相关的参考资料和基于VC++集成环境的编程技术;
3.通过实际编程加深对基础知识的理解,提高实践能力;
4.学习开发资料的收集与整理,学会撰写课程设计报告。
实验
环境
1.微型电子计算机(PC);
2.安装Windows2000以上操作系统,VisualC++6.0开发工具。
任务
要求
1.利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;
2.在第16周末之前完成预设计,并请指导教师审查,通过后方可进行下一步工作;
3.本课题主要实现奇、偶幻方的制作,要求输入幻方的阶数n,n的取值范围为3-10,输入n后,首先判断是否存在对应阶的幻方,如果存在,则显示幻方制作效果。
4.结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、结论正确,正文字数不少于3000字(不含代码)。
工作进度计划
序号
起止日期
工作内容
1
2009.12.21~2009.12.21
在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。
2
2009.12.22~2009.12.25
设计总体方案,构建、绘制流程框图,编写代码,上机调试。
3
2009.12.11~2009.12.26
测试程序,优化代码,增强功能,撰写设计报告。
4
2009.12.27~2009.12.27
提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。
指导教师(签章):
年月日
1课题综述
本课题研究的是幻方,主要研究奇数阶幻方、双偶数阶幻方、单偶数阶幻方。
通过编写c++程序来生成各种奇偶数阶的幻方。
1.1课题来源及意义
幻方起源于《易》,古称九宫(龟文),乃是我国最先发现的一个著名组合算题。
《易》算之于九宫,识之以天象,在古代天文、历法、农牧生产与社会生活中具有广泛的应用价值。
易十数为体,八九为用,八九不离十。
《易》九宫算动态组合模型(包括河图、洛书、八卦)是幻方的通解与最简模型
随着数学的发展和科学技术水平的提高,人们逐渐发现幻方同现代数学的一些分支,如群论,组合分析等有关。
到了近代,幻方已经成为组合数学研究的一个有趣课题。
特别是从本世纪电子计算机出现之后,幻方已经在图论、程序设计、实验设计、对策论、概率统计、人工智能以及工艺美术等方面得到了广泛的应用。
1.2预期目标
通过已知的幻方数学算法,在VisualC++6.0集成环境下编写程序并进行
运行调试从而得出幻方阵!
1.3面对的问题
将查到的数学算法转化成C++语言有很大的困难,这要求我对数学算法身份了解,对C++也要很熟悉。
在解答幻方时,要对连续摆数法、对称法、斯特雷奇法、阶梯法以及LUX法的选择和准确运用。
选择好方法后,怎样将它们转换成C++算法,这又面临着很大的困难。
1.4解决的关键技术
对VisualC++6.0与Word的操作十分了解,并能运用自如。
对C++的算法十分熟悉。
2系统分析
2.1涉及的知识基础
用到的基础知识主要有:
函数调用、if—else语句、while语句、for循环语句、数组、类等等。
2.1.1函数调用
调用一个函数之前必须对该函数进行说明。
函数调用由函数名和函数调用运算符()组成,()内有0个或多个逗号分隔的参数(称为实参)。
每一个参数是一个表达式,且参数的个数与参数的类型要与被调函数定义的参数(称为形参)个数和类型匹配。
当被调函数执行时,首先计算实参表达式,并将结果值传送给行参,然后执行函数体,返回的返回值被传送到调用函数。
如果函数调用后有返回值,调用表达是可以用在表达式中,而无参函数的调用是一个单独的语句。
无参函数一般格式如下:
<函数名>()。
有参函数一般格式如下:
<函数名>(<实参表>)
2.1.2if—else语句
if—else语句也称为条件语句,其功能是根据给定的条件选择程序的执行方向。
if—else语句的基本格式为:
if(表达式)语句1;else语句2;其中表达式称为条件表达式,语句1和语句2称为内嵌语句。
2.1.3while语句
While语句一般形式为:
While(<表达式>){语句S;},其中,<表达式>是符合C++语法规则任意表达式,语句S称为循环体,可以是C++中任意语句。
执行过程是:
先计算表达式的值,若不等于0,则执行后面语句S,再计算表达式的值,重复以上过程,直到表达式值为0为止。
2.1.4for循环语句
For()循环语句一般格式为:
For(<表达式1>;<表达式2>;<表达式3>){语句S;}其中,三个<表达式>均是符合C++语法规则任意表达式,语句S可以是C++中任意语句,语句S称为for()的内嵌语句,并称为循环体。
执行过程:
求解表达式1;求解表达式2,若其值为真,则执行for语句中指定的循环体语句,然后执行下面的第3)步。
若为假,则结束循环,转到第5)步;求解表达式3;转回上面第2)步继续执行;循环结束,执行for语句后面的其他语句。
2.1.5数组
数组是一种顺序容器,是有一类型元素组成的一个有序集合。
一维数组的定义格式为:
《存储类型》<类型><数组名>[<常量表达式>];二维数组的通用格式为:
《存储类型》类型数组名[行表达式][列表达式]。
2.1.6类
类定义的一般形式如下:
(1)由关键字class开头,Name是用户自定义的类名。
(2)类体包括所有的细节,并放在一对花括号中。
(3)有分号结尾,否则,会产生难以理解的编译错误。
类成员包括数据成员,它们指定了该类对象的内部表示;成员函数,他们指定该类的操作。
类成员访问权限分为三种:
(1)公有(public)成员:
可以在类外访问。
(2)私有(private)成员:
只能被该类的成员函数访问。
(3)保护(protected)成员:
只能被该类的成员函数或派生类的成员函数访问。
要注意的是:
数据成员通常是私有的。
成员函数通常有一部分是公有的,一部分是私有的。
公有成员函数可在类外被访问,也称之为类的接口。
类成员的数据类型可以由任何合法的C++数据类型组成,可以包含通常的基本类型,可以包含结构类型,可以包含任何合法类型的指针,可以包含类对象。
2.2总体方案
将幻方分成三个部分,再用函数调用进行连接。
这三个部分为:
奇数阶幻方、双偶数幻方、单偶数幻方。
根据输入的奇偶数进行选择,再输入幻方的阶数,通过主函数进行选择调用哪个部分。
2.3功能模块框图
3系统设计
3.1奇数阶幻方
当幻方的阶数为奇数时,将调用函数jshf。
在函数jshf中时使用连续摆数法对幻方制作的。
具体方法如下:
首先,将1放在第一行中间一个格子里。
其次,依次将后一个数放到前一个数的右上格,如:
将2放到1的右上格。
将3放到2的右上格等等。
可能出现下面的情况。
(1)若右上格从上面超出,则将后一数放到与右上格同列的最后一行。
(2)若右上格从右面超出,则将后一数放到与右上格同行的最后一列。
(3)若右上格既从右面超出又从上面超出,则将后一数放到前一数的下面。
(4)若右上格已被数字填充,则将后一数放到前一数的下面。
例:
如图3-1时根据上面的规则做出的5阶幻方。
17
24
1
8
15
23
5
7
14
16
4
6
13
20
22
10
12
19
21
3
11
18
25
2
9
图3-15阶幻方
3.2双偶数阶幻方
对称法适用于双偶数阶幻方,这里以8阶幻方为例说明对称法。
第一步:
在左上4×4格子中,取一半的格子,要求每行每列都取到2个。
如图3-2-1所示。
图3-2-1
第二步:
按照左右对称、上下对称、中心对称的方法把这8个格子扩充为32个格子。
如图3-2-2所示。
图3-2-2
第三步:
从左上角开始,从左到右从上到下,从1开始填数。
不过只填没有选中的格子(即没有涂黄色的格子),如图3-2-3所示。
2
4
5
7
9
11
14
16
17
19
22
24
26
28
29
31
34
36
37
39
41
43
46
48
49
51
54
56
58
60
61
63
图3-2-3
第四步:
从右下角开始从右到左从下到上在选中的格子里填进刚才没有填的数字。
如图3-2-4所示。
64
2
62
4
5
59
7
57
9
55
11
53
52
14
50
16
17
47
19
45
44
22
42
24
40
26
38
28
29
35
31
33
32
34
30
36
37
27
39
25
41
23
43
21
20
46
18
48
49
15
51
13
12
54
10
56
8
58
6
60
61
3
63
1
图3-2-4
制作成功。
3.3单偶数阶幻方
单偶数阶幻方时选用的是斯特雷奇法,以阶数n=2(2m+1)=6,m=1为例。
第一步:
把方阵分为4个小方阵,位置依次为A左上,B右下,C右上,D左下。
用连续摆数法,把1-a^2放在A中成第一个幻方;把a^2+1~2a^2放在B中成第二个幻方。
把2a^2+1~3a^2放在C中成第三个幻方。
把3a^2+1~4a^2放在D中成第四个幻方。
如图3-3-1所示。
8
1
6
26
19
24
3
5
7
21
23
25
4
9
2
22
27
20
35
28
33
17
10
15
30
32
34
12
14
16
31
36
29
13
18
11
图3-3-1
第二步:
在A的各行左起取m个方格,但中间一行从第二格开始。
与D中相应位置对换。
如图3-3-2所示。
8
1
6
26
19
24
3
5
7
21
23
25
4
9
2
22
27
20
35
28
33
17
10
15
30
32
34
12
14
16
31
36
29
13
18
11
图3-3-2
第三步:
在C的各行右起取m-1个方格,与B中相应位置对换。
此例m-1=0,无需交换。
如图3-3-3所示。
35
1
6
26
19
24
3
32
7
21
23
25
31
9
2
22
27
20
8
28
33
17
10
15
30
5
34
12
14
16
4
36
29
13
18
11
图3-3-3
3.4流程图
4代码编写
4.1奇数阶幻方代码及运行
voidHF:
:
jshf()//奇数幻方(2n+1)(连续摆数法)
{
x=n/2,y=0;//XY表示数轴
for(i=1;i<=n*n;i++)
{
magic[y][x]=i;//给x*y个格子赋值
if(i%n==0)//右上角有数,放在下面
y++;
elseif(y==0)//超出上边界
x++,y=n-1;
elseif(x==n-1)//超出右边界
x=0,y--;
else///正常情况
x++,y--;
}
}
程序运行:
输入n=9时幻方如图4-1
图4-1
4.2双偶数阶幻方代码及运行
voidHF:
:
souhf()//双偶数幻方(对称法)
{
for(x=0;x for(y=0;y if((x+y)%2==0)//等价于书上涂黄格做标记 { magic[x][y]=-1; magic[x][n-y-1]=-1; magic[n-x-1][y]=-1; magic[n-x-1][n-y-1]=-1; } for(x=0;x for(y=0;y { oscs=x*n+y;//oscs为偶数常数 if(magic[x][y]==-1)//给做标记的数赋值 magic[x][y]=n*n-oscs; else magic[x][y]=oscs+1;//给未做标记的数赋值 } } 程序运行: 输入n=12时幻方如图4-2 图4-2 4.3单偶数阶幻方代码及运行 voidHF: : dsouhf()//单偶数阶(2(2m+1))幻方(斯特雷奇法) { for(di=0;di<4;di++)//幻方的分块 { switch(di) { case0: //左上的一块A dx=0,dy=0; break; case1: //右下的一块B dx=n/2,dy=n/2; break; case2: //右上的一块C dx=n/2,dy=0; break; case3: //左下的一块D dx=0;dy=n/2; break; default: break; } x=(n/2)/2,y=0;//1/4的第一行中间的数 intnhsq;//1/2n的平方 nhsq=(n/2)*(n/2); for(i=1;i<=nhsq;i++)//给幻方赋值 { magic[y+dy][x+dx]=i+nhsq*di; if(i%(n/2)==0)//右上角有数 y++; elseif(y==0)//当超出上面的边界时 x++,y=n/2-1; elseif(x==n/2-1)//当超出右面的边界时 x=0,y--; else//正常情况下 x++,y--; } } intnm; nm=(n/2-1)/2; for(j=1;j { temp=magic[(n/2)/2][j]; magic[(n/2)/2][j]=magic[(n/2+1)/2+n/2-1][j];//把A中的中间一行,第二个数开始M个数(左上1/4)给D magic[(n/2+1)/2+n/2-1][j]=temp;//把D中间一行,第二个数开始M个数(左下1/4)给A } for(i=0;i { if(i==(n/2)/2)////I指的是数组的行 continue;//如果到了中间的数,跳出循环 for(j=0;j { temp=magic[i][j]; magic[i][j]=magic[n/2+i][j]; magic[n/2+i][j]=temp; } } for(i=0;i for(j=n-1;j>n-nm;j--) { temp=magic[i][j]; magic[i][j]=magic[n/2+i][j]; magic[n/2+i][j]=temp; } } 程序运行: 输入n=10时幻方如图4-3 图4-3 5调试分析 刚开始时做的总体没有循环,就是只能进行一次,如果要进行另一次就要关掉重开,这个比较麻烦如图5-1所示。 图5-1 后来在主函数上加了循环程序,现在如果还要进行下一次,就不用退出了。 总结 经过差不多一星期的努力,我的这份课程设计终于完成了,它凝结了我的心血。 在这个过程中,我遇到了许多困难,不过经过我的不懈地努力,还有老师和同学的帮助,这些困难都一一克服了。 首先遇到的问题是找幻方的算法,不过这个很容易解决,上网搜索就行了或者是到图书馆借相关的书籍。 其次,就是编写C++程序了,我的C++基础本来就不是很好,要将数学算法转换成程序代码那就难上加难了。 在本报告中用到的数组以及各种循环语句,之前我对它们的掌握都是十分含糊的,特别是有关类的一些概念和用法更是不明白,但通过这次实践,我对这些知识进行了认真地复习与整理,终于对这些知识有了更深的了解,不敢说能够自如运用它们,但也能了解和掌握它们了。 再次,就是word文档的编写,我对word掌握得也还可以,但是画图那部分就不行了,所以我花费了一定的时间在图书馆找书温习word。 最后,就是费了好大精力去完成报告了,因为之前我没写过任何正规的论文或课程设计,所以报告的格式都不是太清楚的,在这过程中我问了许多同学,也咨询了老师,他们都十分乐意地帮助了我,使得我能克服种种困难,在规定的时间内把报告写完。 通过这次课程设计使我懂得了许多,至少是在C++方面了解到更多知识,也学到了许多,尤其是同学们间互相帮助与老师们一丝不苟地指导最让我印象深刻。 以上就是我在这次课程设计完成过程中的心得与体会 致谢 这次课程设计是我们在大学里第一次将理论和实践联系起来,在这次课程设计中我遇到了一些困难,这些困难使我感到措手无策,当我不知如何进行下去时,我的同学、老师给了我很大的帮助。 在我顺利将这次设计完成时,我要向那些帮助过我的老师,同学衷心的说声“谢谢”! 如果没有你们的援助,我不会这么顺利的完成我的作业,成功不是我一个人的,但是我却享受到了成功的喜悦! 还有我要感谢我的同伴,没有你们的陪伴和鼓励,我相信我不会走到尽头。 最后我还要感谢学校为我们精心安排的这次课程设计,经过这次实践,我学会了如何面对困难,学会互帮互助,一同分析和解决问题。 明白个人的力量是有限的,集体的力量是不可估量的。 我很期待下一次的课程设计的到来。 参考文献 1于永彦,于长辉.《C++课程设计指导书》.2008: 25~30 2吴乃陵况迎辉《C++程序设计》(第二版)2006年三月 3张岳新《VisualC++程序设计》江苏大学出版社 4吴鹤龄《幻方及其他——娱乐数学经典名题》(第二版) 5马秀麟,赵云英《计算机应用基础》清华大学出版社 指导教师评语 学号 姓名 班级 选题 名称 序号 评价内容 权重(%) 得分 1 考勤记录、学习态度、工作作风与表现。 5 2 自学情况: 上网检索机时数、文献阅读情况(笔记)。 10 3 论文选题是否先进,是否具有前沿性或前瞻性。 5 4 成果验收: 是否完成设计任务;能否运行、可操作性如何等。 20 5 报告的格式规范程度、是否图文并茂、语言规范及流畅程度;主题是否鲜明、重心是否突出、论述是否充分、结论是否正确;是否提出了自己的独到见解。 30 6 文献引用是否合理、充分、真实。 5 7 答辩情况: 自我陈述、回答问题的正确性、用语准确性、逻辑思维、是否具有独到见解等。 25 合计 指导教师(签章): 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计