幻方 C++课程设计报告.docx

上传人:b****9 文档编号:25402152 上传时间:2023-06-08 格式:DOCX 页数:33 大小:99.48KB
下载 相关 举报
幻方 C++课程设计报告.docx_第1页
第1页 / 共33页
幻方 C++课程设计报告.docx_第2页
第2页 / 共33页
幻方 C++课程设计报告.docx_第3页
第3页 / 共33页
幻方 C++课程设计报告.docx_第4页
第4页 / 共33页
幻方 C++课程设计报告.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

幻方 C++课程设计报告.docx

《幻方 C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《幻方 C++课程设计报告.docx(33页珍藏版)》请在冰豆网上搜索。

幻方 C++课程设计报告.docx

幻方C++课程设计报告

淮阴工学院

C++程序设计课程设计报告

选题名称:

幻方

系(院):

计算机工程系

专业:

通信工程

班级:

通信XXXXX

姓名:

XXX学号:

XXXXXXXXXXXXX

指导教师:

戴峻峰赵建洋

学年学期:

200X~200X学年第X学期

200X年XX月XXX日

设计任务书

课题

名称

幻方

设计

目的

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.06.7~2009.06.7

在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。

2

2009.06.7~2009.06.10

设计总体方案,构建、绘制流程框图,编写代码,上机调试。

3

2009.06.11~2009.06.12

测试程序,优化代码,增强功能,撰写设计报告。

4

2009.06.12~2009.06.13

提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。

指导教师(签章):

年月日

摘要:

幻方是一个非常神秘的课题,它有着悠久的历史文明。

我们这些炎黄子孙对它有着很深入的了解和研究。

幻方就是一个方阵,它有着自己的规则和定义。

就象你玩游戏一样,你要遵从游戏规则才能去完成它。

幻方可分为奇阶幻方和偶阶幻方,同时偶阶幻方又可以分为双偶阶和单偶阶。

奇阶幻方比偶阶幻方简单一些。

幻方要运用到数组的知识,首先我要把数组的赋值,输出等。

首先我要回顾一下这些知识,进而全面的讨论了幻方操作的基本理论。

幻方还运用到循环体结构等知识。

我要先把这些看明白,才可以完成这个程序设计。

在这过程中我要多思考多总结,善于去研究去探索,这样才能把这个课题完成好。

幻方的规则就是它每一行和每一列的和及两条对角线的和要相等,每列,每行,每条对角线的和称之为幻和。

这样你排出来的才叫幻方,否则没有条理,那样就没有意义了。

幻方中所排的数就是从1开始到N的平方结束。

所谓双偶阶就是指N能被4整除,单偶阶就是指能被2整除但不能被4整除。

给出主要的流程图,最后编写软件代码。

关键词:

连续摆数法;阶梯法;对称法;斯特雷奇法;LUX方法;奇阶幻方;双偶阶幻方;单偶阶幻方

2.1涉及的知识基础………………………………………………………………1

2.2总体方案…………………………………………………………………………………..3

3课题内容…………………………………………………………………………………3

3.1奇数阶幻方的制作………………………………………………………………………..3

3.2偶数阶幻方的制作………………………………………………………………………..5

3.3流程图………………………………………………………………………………….11

4代码和解析……………………………………………………………………………………11

5程序的运行与测试…………………………………………………………………………21

总结…………………………………………………………………………………24

致谢…………………………………………………………………………………26

参考文献……………………………………………………………………………27

1课题综述

1.1课题来源

幻方又称为魔方,方阵或厅平方,它最早起源于我国。

宋代数学家杨辉称之为纵横图。

所谓纵横图,它是由1到n2,这n2个自然数按照一珲的规律排列成N行、N列的一个方阵。

它具有一种厅妙的性质,在各种几何形状的表上排列适当的数字,如果对这些数字进行简单的逻辑运算时,不论采取哪一条路线,最后得到的和或积都是完全相同的。

关于幻方的起源,我国有“河图”和“洛书”之说。

相传在远古时期,伏羲氏取得天下,把国家治理得井井有条,感动了上花于是黄河中跃出一匹龙马,背上驮着一张图,反作为礼物献给他,这就是“河图”,了是最早的幻方伏羲氏赁借着“河图”而演绎出了八卦,后来大禹治洪水时,咯水中浮出一只大乌龟,它的背上有图有字,人们称之为“洛书”。

“洛书”所画的衅中共有黑、白圆圈45个。

把这些连在一起的小圆和数目表示出来,得到九个。

这九个数就可以组成一个纵横图,人们把由九个数3行3列的幻方称为3阶幻方,除此之外,还有4阶、5阶……后来,人们经过研究,得出计算任意阶数幻方的各行、各列、各条对角线上所有数的和的公式为:

Nn=1/2n(n2+1)其中n为幻方的阶数,所求的数为Nn。

幻方最早记载于我国公元前500年的春秋时期《大戴礼》中,这说明我国人民早在2500年前就已经知道了幻方的排列规律。

而在国外,公元130年,希腊人塞翁才第一次提起幻方。

我国不仅拥用幻方的发明权,而且是对幻方进行深入研究的国家。

公元13世纪的数学家杨辉已经编制出3-10阶幻方,记载在他1275年写的《续古摘厅算法》一书中。

在欧洲,直到574年,德国著名画家丢功才绘制出了完整的4阶幻方。

1.2课题意义

掌握奇数阶、偶数阶幻方的制作。

了解连续摆数法、阶梯法、对称法、斯特雷奇法以及LUX方法制作幻方。

通过小组配合写出代码,并调试出正确结果。

在调试过程中,熟练掌握C++程序设计步骤,提高自己编写程序的能力。

2需求分析

2.1涉及的知识基础

C++知识:

循环语句、选择语句、数组、函数……

1.循环语句

(1)for()语句

for()循环语句的一般格式为:

for(<表达式1>;<表达式2>;<表达式3>)S;

其中,三个表达式都可以是C++中的任一符合语法规则的表达式;语句S可以是任一C++的语句。

同样地将语句S称为for()的内嵌语句,并把称为循环体。

for()语句的执行过程如下;首先计算“表达式1”(循环初值),且仅计算一次。

每一次循环之前计算“表达式2”(循环条件),如果其结果为真,则执行“语句”S,并计算“表达式3”(循环增量)。

否则,循环终止。

2.选择语句(多分支)

现实生活中的各种条件是很复杂的,在一定条件下,又需要满足其他的条件才能确定相应的动作。

为此,C++提供了if语句能够出现在另一个if语句或if-else语句里。

嵌套if语句有两种形式。

一种是嵌套在else分支中,格式为:

if(表达式1)语句1;

elseif(表达式2)语句2;

elseif…

else语句n;

第2种是嵌套在if分支中,格式为:

if(表达式1){

if(表达式2)语句1;

else语句2;

}

else语句3;

3.数组

数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置来区分,位置用下标表示。

数组有一维数组与多维数组之分,在程序中仅使用了二维数组。

二维数组的定义格式为:

类型说明符数组名[常量表达式1][常量表达式2];

“类型说明符“指定数组元素的类型,“数组名”的命名规则与变量一样,方括号中的“常量表达式1”代表了二维数组的行数,“常量表达式2”代表了二维数组的列数。

行列下标都是从零开始,其最大下标均比常量表达式的值小1。

4.函数

函数定义的一般形式如下:

返回类型函数名([参数表])

{

语句块

return;

}

函数定义包括以下一个部分:

函数名:

函数名与变量名的定义规则一样,但应尽可能反映函数的功能,常常由几个单词组成。

参数表:

用于向函数传送数值或从函数带回数值。

每一个参数都有自己的类型。

函数可以有一个或多个参数变量,也可以没有参数。

如果没有参数,称为:

无参“函数。

函数体:

花括号中的语句块称为函数体。

一个函数的功能,通过函数体中的语句来完成。

返回类型:

指定函数用return返回的函数值的类型。

如果函数没有返回值,返回类型应为void。

2.2总体方案

幻方的制作主要包括两个部分,分别是奇数阶幻方的制作、偶数阶幻方的制作。

奇数阶幻方可以通过连续摆数法和阶梯法制作。

偶数阶幻方可以通过对称法、斯特雷奇法和LUX方法。

其中对称法适用于双偶数阶幻方,斯特雷奇法适用于单偶数幻方。

幻方的设计要求是:

编写代码,实现奇、偶数幻方的制作。

运行后,出现下面的参考界面:

表1效果图

选择一个菜单后,要求输入幻方的阶数n。

n的取值范围为3~10。

输入n后,首先判断是否存在对应阶的幻方,如果存在,则显示幻方的制作效果。

3课题内容

3.1奇数阶幻方的制作

3.1.1连续摆数法

例:

一个5*5格子,由最上面一行中间一格开始,依次填1,2,3等等。

下一个格子填在左上位置。

但要注意两点:

●出了幻方的范围,右边接到左边,下边接到上边。

●某一格右上已经有了数字,改填在这个格子的下面一个,然后延续前面的方法。

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

表1-15*5奇阶幻方

8

17

1

15

24

11

25

9

18

2

19

3

12

21

10

22

6

20

4

13

5

14

23

7

16

也不一定按照斜上方写字,可以走马步,得到的是泛对角幻方。

表1-25*5奇阶幻方

(1)

哪些“步子”是可行的,是需要注意的一个问题。

3.1.2阶梯法

例:

以5阶为例。

第一步:

画一个9*9的方格。

如下斜着填数字。

注意中间的5*5格子才是要作的幻方的位置,已经涂成了黄色。

 

5

4

10

3

9

15

2

20

1

13

25

6

24

11

17

23

16

22

21

表1-39*9奇阶幻方

第二步:

黄色范围以外的数字,平移到黄色格子中没有数字的位置。

3

16

9

22

15

20

8

21

14

2

7

25

13

1

19

24

12

5

18

6

11

4

17

10

23

表1-49*9奇阶幻方

(1)

去掉外围的格子,就得到所要作的幻方。

3

16

9

22

15

20

8

21

14

2

7

25

13

1

19

24

12

5

18

6

11

4

17

10

23

表1-55*5奇阶幻方

(2)

 

3.2偶数阶幻方的制作

3.2.1对称法,适用于双偶数阶幻方

例:

以8阶幻方为例。

第一步:

在左上4*4格子中,去一半的格子,要求每行每列都取到2个。

如下图黄色格子所示。

 

表2-18*8双偶阶幻方

第二步:

按照左右对称、上下对称、中心对称的方法把这8个格子扩充为32个格子。

 

 

表2-28*8双偶阶幻方

(1)

第三步:

从左上角开始,从左到右从上到下,从1开始填数。

不过只填没有选中的格子(即没有涂黄的格子)

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

 

表2-38*8双偶阶幻方

(2)

第四步:

从右下角开始从右到左从下到上在选中的格子里填进刚才没填的数字。

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

 

表2-38*8双偶阶幻方(3)

制作成功。

这个方法可以产生不同的双偶阶幻方。

3.2.2斯特雷奇法,适用于单偶数幻方

例:

设阶数n=2(2m+1)=6,m=1.

第一步:

把方阵分为4个小方阵,位置依次为A左上,B右下,C右上,D左下。

用连续摆数法,把1-a2放在A中成第一个幻方;把a2+1~2a2放在B中成第二个幻方。

把2a2+1~3a2放在C中成第三个幻方。

把3a2+1~4a2放在D中成第四个幻方。

8

1

6

26

19

24

3

5

7

21

23

25

4

9

2

11

27

20

35

28

33

17

10

15

30

32

34

12

14

16

31

36

29

13

18

22

 

表3-16*6单偶阶幻方

第二步:

在A的各行左起取m个方格,但中间一行从第二格开始。

与D中相应位置对换。

8

1

6

26

19

24

3

5

7

21

23

25

4

9

2

11

27

20

35

28

33

17

10

15

30

32

34

12

14

16

31

36

29

13

18

22

 

表3-26*6单偶阶幻方

(1)

第三步在C的各行右起取m-1个方格,与B中相应位置对换。

此例m-1=0,无需交换。

35

1

6

26

19

24

3

32

7

21

23

25

31

9

2

11

27

20

8

28

33

17

10

15

30

5

34

12

14

16

4

36

29

13

18

22

 

表3-36*6单偶阶幻方

(2)

3.2.3LUX方法这是剑桥大学康韦教授发明的方法

例设阶数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-45*5奇阶幻方

第二步:

在上面的m+1行(此处为3行)的每个格子里填入一个字母L;接下去一行填字母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-55*5奇阶幻方

(1)

第三步:

作一个10×10方格,设想为每2×2为一个单位,每个单位相应于上面一个格子。

对应于5阶幻方中数字1的单位填1,2,3,4。

对应于5阶幻方中数字2的填5,6,7,8。

等等。

但是标有字母L的按照“右上-左下-右下-左上”次序;标有字母U的按照“左上-左下-右下-右上”次序;标有字母X的按照“左上-右下-左下-右上”次序。

 

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-610*10单偶阶幻方

当然,这个方法也产生很多幻方。

 

3.3流程图

流程图如图3.4所示。

 

 

图3.4流程图

4代码和解析

#include

#include

voidjishu(intn)//任意奇数阶幻方制作的函数(阶梯法)

{

intp=n-1,q=0,s=1,i,j,t=n-1;

intb[50][50];

inta[100][100];

for(i=0;i<2*n-1;i++)//给数组a赋初值

for(j=0;j<2*n-1;j++)

a[i][j]=0;

while(p<2*n-1)//从a的中间起向下运动一直到最后

{

{

for(i=p;i>=p+1-n;i--)//根据行的变换,列数每次右移五格

for(j=q;j

if(i+j==t)

{

a[i][j]=s;//每次赋值都加1

s++;

}

}

t+=2;

q++;

p++;

}

for(i=0;i<2*n-1;i++)//把中间框以外的数字按规律填到中间的框内

for(j=0;j<2*n-1;j++)

{

if(i<(n-1)/2&&a[i][j]!

=0)//格子上方的数填入数组中

{

a[i+n][j]=a[i][j];

}

elseif(i>=(3*n-1)/2&&a[i][j]!

=0)//格子下方的数填入数组中

{

a[i-n][j]=a[i][j];

}

elseif(j<(n-1)/2&&a[i][j]!

=0)//格子左方的数填入数组中

{

a[i][j+n]=a[i][j];

}

elseif(j>=(3*n-1)/2&&a[i][j]!

=0)//格子右方的数填入数组中

{

a[i][j-n]=a[i][j];

}

}

for(i=0;i

for(j=0;j

{

b[i][j]=a[i+(n-1)/2][j+(n-1)/2];

}

for(i=0;i

{

for(j=0;j

cout<

cout<

}

}

voidf1(intn)//设计的一个通用双偶函数

{

inta[100][100];

inti,j;

intx,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++)

{

a[i][j]=k;k++;

}

for(i=1;i<=2;i++)//用走日字的方法交换数组中的元素

{

x=a[0][i];a[0][i]=a[m][m-i];a[m][m-i]=x;

x=a[i][0];a[i][0]=a[m-i][m];a[m-i][m]=x;

}

for(i=0;i<=m;i++)//输出数组

{

for(j=0;j<=m;j++)

cout<

cout<

}gotoloop;//跳到loop

}

for(i=0;i<8;i++)//给数组赋初值0

for(j=0;j<8;j++)

a[i][j]=0;

if(n%4==0&&n/4>1)

{

for(i=0;i<2;i++)//取

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1