数据结构课程设计之奇数魔方阵
实验四 魔方阵

班级:计算机091 学号:0908140529 姓名:李艳1.实验题目:魔方阵问题2.数据类型typedef struct Array{//n阶的矩阵的类型定义int *base;int b;}Array;3.算法描述构造一个n行n列的二维数组,根据魔方阵的特点进行相应的判断,然后把数字按顺序放到应该存放的数组位置中。
4.程序清单:#include<iostream>using namespace std;typedef struct Array{//n阶的矩阵的类型定义int *base;int b;}Array;void InitArray(Array &A,int n){//构造一个n行n列的二维数组A.base=new int[n*n];A.b=0;void Mofang(int order,Array &A){//按照算法,进行相应的判断,然后把数字按顺序放到应该存放的数组位置中int count;int row,column; //行、列A.b=order;//阶数row=0;column=order/2;for(count=1;count<=order*order;count++){A.base[row*A.b+column]=count;if(count%order==0){ //如果是该行的最后一个,则上一个数的行数加一row++;}else{ //其他情况下,正常的进行行数减一,列数加一row=(row==0)?order-1:row-1;column=(column==order-1)?0:column+1;}}void main(){int order; //阶数int i,j;Array arr;cout<<"请输入阶数:";cin>>order;while(order%2==0){cout<<"阶数必须是一个奇数,请重新输入!"<<endl;cin>>order;}InitArray(arr,order);Mofang(order,arr); //调用解魔方阵的主要函数for (i=0; i<order;i++) { //显示魔方阵for (j=0;j<order;j++) {cout<<"\t"<<arr.base[i*arr.b+j];}cout<<endl;}}5.调试报告请输入阶数: 38 1 63 5 74 9 2请输入阶数: 4阶数必须是一个奇数,请重新输入!517 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 96.算法时间复杂度分析:基本操作是:A.base[row*A.b+column]=count 所用时间为T(n)=O(n²)。
数据结构课程设计报告

一、题目奇数阶幻方求解【问题描述】幻方是一种很有意思的数字矩阵,在很早著名的九宫八卦阵就与幻方有关。
幻方的定义为: 1 到 N*N 的整数填入N*N的方格中,每行和每列以及对角线的数字之和必须是相等的。
你作为八卦公司的顶级程序员,现在需要你解决一个问题,将任意奇数阶的幻方找出来。
【基本要求】输入包括多个测试集,每行为一个正奇数N(1 <= N < 1000),0作为输入的结束且不需要处理,对于输入的每一个N,输出一个它所对应的N阶幻方,如果存在多个,任意一个即可,每个幻方为N*N的矩阵,对于每个幻方,每行输出幻方的一行,每行中的数字之间用一个或多个空格分开。
不同的幻方之间用一个空行分开。
二、问题分析及任务定义【问题分析】1、本程序要求输出奇数N阶幻方,其重点应该就是在求幻方的算法上,我们可以通过二维数组的方法来定义存储幻方。
2、本程序要输入多个测试集,可通过一位数组来存储,可通过查找算法在测试集中找出是否有你要的幻方。
【任务定义】通过对初始化的二维数组值的重新编排,用几个判断语句来实现幻方的输出。
三、数据结构的选择和概要设计1、采用一个子函数实现测试集的输入,并存储在数组中,同时定义一个数组指针,存储完成后返回指向该数组的指针。
2、采用另外一个子函数判断你要找的幻方是否在测试集中,形参为1中指向数组的指针和来自主函数中你要查找的幻方的阶数。
如果查找成功返回1,否则返回0;3、基本操作:int Input()操作结果:实现测试集的输入,并返回int Search(int *p,int m)操作结果:确定你要查找的幻方是否在测试集中,如果在返回1,否则返回0;Void main()操作结果:主函数,实现你要幻方的阶数的输入,同时实现幻方初始化后数据的重新编排,使之成为幻方并输出。
4、核心程序的算法奇数阶幻方的构造方法很简单,我们先来看一个三阶幻方。
各数在方阵中的位置可以这样确定:首先把1放在最上一行正中间的方格中,然后把下一个整数放置到右上方,如果到达最上一行,下一个整数放在最后一行,就好像它在第一行的上面,如果到达最右端,则下一整数放在最左端,就好像它在最右一列的右侧,当到达的方格中已填上数值时,下一个整数就放在刚填上数码的方格的正下方。
魔方阵算法的设计与实现

二维数组的应用
魔方阵算法的设计与实现
a[i][j]=1;
Think
Think2:螺旋方阵
1
2
3
4
5
6 7 8 9
18 19 20 21 22 17 28 29 30 23 16 27 26 25 24
15 14 13 12 11 10
Think3:塔型方阵
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 3 2 1
1 2 3 2 1
1 2 3 4
二维数 组存储 魔方阵
二维数组 中所有元 素初始化 为0
将1存放 在第一行 的中间 位置
依次将 2到25 存放进 数组
Flowchart
魔 方 阵 算 法 的 流 程 图
Programing
/* 以下依次将 2~25填充进二维数组,建立魔方阵 */ #include <stdio.h> for(i=0;i<N;i++) /*输出魔方阵 */ for(k=2;k<=N*N;k++) #define N 5 { for(j=0;j<N;j++) { m=i;/*记录上一个数的行下标*/ main( ) n=j;/* 记录上一个数的列下标 */ printf("%4d",a[i][j]); i=i-1; j=j+1; ; { int a[N][N],i,j,k printf("\n"); if(i<0) i=N-1; /*上一个数在 0行,则下一个数在第 N-1行*/ for(i=0;i<N;i++) /*初始化二维数组 */ j=0; 程序运行结果如下: /*上一个数在N-1列,则下一个数在第0列*/ } if(j>N-1) for(j=0;j<N;j++) if(a[i][j]!=0) { i=m+1; j=n;} /*若找到新的位置已经被占用 a[i][j]=0; 新数应放在上一个数的下方*/ a[i][j]=k;/* 将新数 k填进数组 */ i=0 ;j=N/2; /* 将1存放在第一行中间位置 */ }
《C语言程序》课程设计报告书-魔方阵程序设计

吉林工程技术师范学院《C语言程序》课程设计报告书设计题目:魔方阵程序设计专业:计算机科学与技术班级:1054学生姓名:学号:21指导教师:xx2011年1月信息工程学院摘要我的实验题目是对C语言程序设计——魔方阵的编写,主要的功能是实现每一行,每一列以及对角线的相加结果相同,而且每一个数字均不相等。
本次实验能够充分的考核我们对C语言的学习程度以及动手操作能力,对我们提高C语言的能力有极大的帮助,所以这次实验也是十分有必要的。
我的设计内容就是利用循环语句,以及判断条件等函数的合理使用,通过不断的运行,调试,输出,对本程序进行合理的解决,对魔方阵进一步的了解掌握。
关键字:C语言魔方阵程序设计目录摘要................................................. 第1章概述 (1)第2章系统分析 (2)2.1 技术分析 (2)2.2 功能分析 (2)第3章总体设计与详细设计 (3)3.1 系统总体设计 (3)3.2 详细设计 (4)第4章编码实现 (6)4.1 数据输入部分代码设计 (6)4.2 运算部分代码设计 (6)4.3 输出部分代码设计 (7)第5章系统调试 (9)5.1 程序运行结果 (9)5.2 调试过程中的问题与对策 (10)第6章设计总结 (10)参考资料 (12)致谢 (12)附录:1 源代码 (13)2 附图 (14)第1章概述本次实验报告十分有意义,对巩固C语言的学习有很大的帮助。
作用:我的实验课题是魔方阵(魔方阵是一个奇数行列式方阵),主要是实现一行,一列,对角线的和都相等。
意义、帮助:1、能够熟练掌握if、if…else、if…else if语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句实现分支选择结构。
2、能够熟练掌握while语句和for语句格式及使用方法,掌握循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。
c语言魔方阵课程设计

c语言魔方阵课程设计一、课程目标知识目标:1. 理解魔方阵的概念,掌握其基本性质和特点;2. 学会使用C语言实现魔方阵的生成、显示和验证;3. 掌握魔方阵相关算法,如:奇数阶魔方阵的生成方法、行列、对角线求和等;4. 了解魔方阵在实际应用中的价值,如:数学游戏、密码学等。
技能目标:1. 能够运用C语言编写程序,生成指定阶数的魔方阵;2. 能够分析魔方阵算法的时间复杂度和空间复杂度;3. 能够运用所学知识解决魔方阵相关实际问题,提高编程能力;4. 能够通过魔方阵编程实践,培养解决问题的策略和逻辑思维能力。
情感态度价值观目标:1. 培养学生对C语言编程的兴趣,激发学习热情;2. 培养学生合作探究、积极参与的精神,增强团队协作能力;3. 培养学生勇于克服困难、面对挑战的信心,提高自主学习能力;4. 引导学生认识到编程在生活中的应用价值,激发学生创新意识和实践能力。
课程性质:本课程为C语言编程实践课程,旨在让学生通过魔方阵编程实践,巩固C语言知识,提高编程能力。
学生特点:学生具备一定的C语言基础,对编程有兴趣,但可能缺乏实际编程经验。
教学要求:注重理论与实践相结合,强调动手实践,培养学生编程思维和解决问题的能力。
通过本课程的学习,使学生能够将所学知识运用到实际编程中,提高编程水平。
二、教学内容1. 魔方阵基本概念与性质- 魔方阵的定义与特点- 魔方阵的数学性质:行列、对角线求和等2. C语言编程基础回顾- 数据类型与变量- 控制结构:顺序、选择、循环- 数组的使用3. 魔方阵生成算法- 奇数阶魔方阵生成方法- 魔方阵生成程序的编写与调试4. 魔方阵显示与验证- 魔方阵的格式化输出- 验证魔方阵的正确性:行列、对角线求和检验5. 魔方阵编程实践- 编写生成指定阶数魔方阵的程序- 分析算法的时间复杂度和空间复杂度- 解决魔方阵相关实际问题6. 教学案例分析与讨论- 分析实际编程案例,总结编程技巧- 讨论编程中遇到的问题及解决方法7. 创新思维与实践- 探讨魔方阵在其他领域的应用- 鼓励学生进行创新编程实践,提高编程能力教学内容安排与进度:1. 基本概念与性质(1课时)2. C语言编程基础回顾(1课时)3. 魔方阵生成算法(2课时)4. 魔方阵显示与验证(1课时)5. 魔方阵编程实践(2课时)6. 教学案例分析与讨论(1课时)7. 创新思维与实践(1课时)教材章节关联:本教学内容与教材中关于数组、循环控制结构、函数等章节相关,通过魔方阵编程实践,使学生将所学理论知识应用于实际问题中,提高编程能力。
数据结构 魔方阵

【完成题目2】魔方阵【问题描述】魔方阵是一个古老的智力问题,它要求在一个m*n的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示:(a)三阶魔方阵(b)五阶魔方阵【基本要求】1.输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出提示信息;2.实现魔方阵;3.输出魔方阵。
【算法设计】首先,输入一个数字m(0<m<100),则输出对应的m阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。
若输入数字m超出要求范围或数字m为偶数或数字m<0,则提醒用户输入错误,需重新输入m。
使用多维数组输出魔方阵。
输入形式:数字m(0<m<100)。
输出形式:以矩阵形式输出n(0<m<100)阶奇数魔方阵;【源代码】#include <iostream>using namespace std;int main(int argc, char* argv[]){int i,j,m,k;//i:行,j:列,m:阶数,k:矩阵int a[100][100];cout<<"请输入一个奇数m (0<m<100):";loop1: cin>>m; //loop:循环if(m%2==0||m<0||m>=100){cout<<"输入错误!请重新输入一个奇数n (0<m<100):";goto loop1;}i=0;j=m/2;for(k=1;k<=m*m;k++){a[i][j]=k;if(k%m==0)i++;//行数加1else{i=(i==0)?m-1:i-1;j=(j==m-1)?0:j+1;}}for(i=0;i<m;i++){for(j=0;j<m;j++){cout<<a[i][j]<<" ";}cout<<endl;}return 0;}【结果截图】【收获及体会】本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。
奇数阶魔方阵算法分析

奇数阶魔方阵一、提出问题所谓“奇数阶魔方阵”是指n 为不小于3的奇数的魔方阵。
这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵。
例如:3阶、5阶和7阶的魔方阵如图3 – 4 所示。
294753618 ,92251811321191210222013641614752315812417 ,20112494031221234341322321444423324151345363425161453735261786462927189747382819101183930 图3 – 4 3阶5阶和7阶魔方阵容易知道,这三个魔方阵的魔方常数分别是15、65和175。
现在要求给出:能让计算机自动输出类似图3 – 4 所示的n 阶奇数魔方阵的算法,其中n 为任意给定的一个不小于3的奇数。
二、简单分析决定“奇数阶魔方阵”的关键是要按要求决定其方阵中的各个数字。
观察图3 – 4中的三个奇数阶魔方阵,不难发现:1.由于是正规魔方,故所填入的n 2个不同整数依次为1、2、3、…、n 2 ;2.各行、列和对角线上的数字虽各不相同,但其和却是相同的。
这表明,其魔方常数可由公式n ( n 2 + 1 ) / 2得到。
3.数字在阵列中的次序,并没有遵从阵列单元的行、列下标的顺序,但数字“1”却始终出现在阵列第一行的正中间位置,而数字“n 2”也始终出现在阵列第n 行的正中间位置,这说明阵列中的数字排列应该是有一定规律的。
通过对两个奇数阶魔方阵的简单分析,下面几个基本问题必须得到解决:◆ 奇数阶魔方阵中的数字有些什么规律?◆ 数字“1”的位置应如何确定?三、设计准备1.奇数阶魔方阵中的数字规律通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:(1)自然数1出现在第一行的正中间;(2)若填入的数字在第一行(不在第n 列),则下一个数字在第n 行(最后一行)且列数加1(列数右移一列);(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;(4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1);(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。
数据结构课程设计论文

数据结构数据结构课程设计(论文)题目魔方阵作者杨政冬院系信息工程学院专业信息管理与信息系统学号 1314210140 指导老师安强强答辩时间摘要我的实验题目是利用数据结构相关算法来设计——魔方阵,主要的功能是实现每一行,每一列以及对角线的相加结果相同,而且每一个数字均不相等。
本次实验能够充分的考核我们对数据结构相关算法以及C语言的学习程度、动手操作能力有极大的帮助,所以本次课程设计是十分有必要的。
我的设计内容就是利用幻方算法(劳伯法、斯特拉兹法、罗伯法、海尔法)循环语句,以及判断条件等函数的合理使用,通过不断的运行,调试,输出,对本程序进行合理的解决,对魔方阵进一步的了解掌握。
关键字:算法、C语言魔方阵程序设计AbstractMy experiment topic is the use of data structure algorithms to design - the magic square, the main function is to implement each row, every column, and diagonal together in the same result, and each number are not equal.This experiment can fully conducted by our algorithms for data structure and the degree of learning C language is of great help, hands-on ability, so the curriculum design is very necessary.My design content is to use magic square algorithm (rob, stern raz, rob, haier) loop, and the judgment function, such as the condition of reasonable use, through continuous running, debugging, output, the reasonable solution to the program, the magic square to further grasp.Key words: magic square algorithm, C language program design1 绪论计算机是随着社会的发展应运而生,它贯穿了人们生活的方方面面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
长沙理工大学《数据结构》课程设计报告田晓辉学院计算机与通信工程专业计算机科学与技术班级计08-01 学号************学生姓名田晓辉指导教师陈倩诒课程成绩完成日期2010年7月10日课程设计成绩评定学院计算机与通信工程专业计算机科学与技术班级计08-01学号200850080110 学生姓名田晓辉指导教师陈倩诒完成日期2010年7月10日指导教师对学生在课程设计中的评价指导教师对课程设计的评定意见课程设计任务书计算机与通信工程学院计算机科学技术专业用C语言解决魔方阵的问题学生姓名:田晓辉指导老师:陈倩诒摘要本课程设计主要解决设计一个n×n的矩阵中填入1到n2的数字(n为奇数),使得每一行、每一列、每条对角线的累加和都相等的问题。
在课程设计中,系统开发平台为Windows 7,程序设计语言采用Visual C++6.0,程序运行平台为Windows 98/2000/XP/7。
在程序设计中,采用了C 语言结构化程序设计思想和过程设计方法,以功能函数为基本结构,对问题中的要求做出了准确的实现。
程序通过调试运行,初步实现了设计目标。
关键词程序设计;C++6.0;结构化;过程设计;功能函数目录1.引言 (1)1.1课程设计目的 (1)1.2课程设计内容 (1)2.设计思路与方案 (2)3.详细实现 (3)3.1数据结构与数据存储表示 (3)3.2功能函数 (3)3.3函数逻辑功能调用图 (5)3.4本程序执行流程图 (6)4.运行环境与结果 (7)4.1程序运行环境 (7)4.2程序运行结果 (7)5.结束语 (9)参考文献 (10)附录源程序代码 (11)1 引言本课程设计主要解决设计一个n×n的方阵中填入1到n2(n为奇数)的数字,使得每一行、每一列、每条对角线上各个数字累加的和都相等的问题。
1.1 课程设计目的通过这次课程设计进一步了解了二维数组的使用方法和一些基本的设计思路。
对于一个n×n的方阵,其中n为奇数,在n×n的魔方阵中,填入1到n2的整数,使得其各每一行、每一列、每条对角线上各个数字累加和皆相等[1]。
1.2 课程设计内容本次课程设计内容主要是利用二维数组输出正确的n阶魔方矩阵。
n阶魔方,又叫幻方阵,在我国古代称为“纵横图”,是一个比较有趣的游戏。
[2]n阶魔方就是用1到n2的数字不重复的填入方阵中。
每一行中n个数之和,共得n个和;每一列中n个数之和,共得n个和;每一条对角线n个数之和,共得两个和,每一个和称为魔数。
魔方阵中的每个魔数都相等。
如图1.2就是一个3阶魔方阵,它是用数字1到9不重复的填入3*3的方阵中,使得各行、各列及对角线的魔数都等于15。
[3]6 1 87 5 32 9 4图1.1 3阶魔方阵2 设计思路与方案首先,输入一个数字n(1≤n≤99),则输出对应的n阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。
若输入数字n超出要求范围,则提醒用户重新输入n。
但若输入数字0时,操作结束,退出程序。
使用多维数组输出魔方阵,分别用3个子函数实现相应的功能。
输入形式:数字n(1≤n≤99)。
输出形式:(1)以矩阵形式输出n(1≤n≤99)阶魔方阵;(2)输出每一行、每一列、每条对角线上各个数字累加和;(3)输出程序运行时间。
3 详细实现3.1 数据结构与数据存储表示这方面使用二维数组n[MAX][MAX]来静态存储不超过MAX行MAX列的数组方阵,其中n(1<=n<=99)为满足条件的数。
3.2 功能函数主要使用与实现如下函数:(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)若填充位置超出左边界,则修改为最右边的相应位置,即把q-1改为n-1;iii)若填充位置已有数字,则填充位置修改为下一行的同一位置。
c.重复以上步骤,直至将n2个数字全部填入魔方中。
最后调用函数函数out(n,a)和check (n,a),实现魔方阵的输出,检验魔方阵的准确性。
具体实现代码如下:void jishu(int n)/*奇数*/{int p,q,i,a[MAX][MAX];p=0;q=(n-1)/2;a[0][q]=1;/*第一个数字的填入位置*/for(i=2;i<=n*n;i++){p=(p-1+n)%n;/*计算填入的位置*/q=(q-1+n)%n;if(a[p][q]>0)/*如果填入位置已有数字,则重新计算填入位置*/{p=(p+2)%n;/*由于前面p减了1,因此p应该加1,才能表示下一行*/q=(q+1)%n;/*由于前面q减了1,因此q应该加1,才能表示同一列*/ }a[p][q]=i;/*填入数字*/}out(n,a);/*调用输出函数*/check(n,a);/*调用验证函数*/}(4)void out(int n,int a[MAX][MAX])函数,此函数用以调整方阵元素位置,实现魔方阵n*n形式输出。
具体实现代码如下:void out(int n,int a[MAX][MAX])/*魔方矩阵输出函数*/{int p,q;for(p=0;p<=n-1;p++){for(q=0;q<=n-1;q++){cout<<setw(4)<<a[p][q]<<"";/*输出魔方矩阵的结果*/}cout<<endl<<endl;}}(5)void check(int n,int a[MAX][MAX])函数,计算并输出n阶魔方阵每行、每列以及每条对角线上各个数字的累加和,同时验证魔方阵的准确性。
具体实现代码如下:void check(int n,int a[MAX][MAX])/*魔方矩阵验证函数*/{int p,q,sum1=0,sum2=(n*n+1)*n/2,k;cout<<"此魔方阵的每行、每列、两条对角线的和为:"<<sum2<<endl;/*输出标准魔方阵的每行、每列、两条对角线的和*/for(p=0;p<n;p++){for(q=0;q<n;q++){sum1=a[p][q]+sum1;/*计算矩阵横行纵行的和*/}if(sum1!=sum2)/*判断矩阵横行纵行的和是否与标准相同*/{cout<<"横行纵行计算结果与标准不符,请修改程序错误"<<endl;break;}sum1=0;}for(k=0;k<n;k++){sum1=a[k][k]+sum1;/*计算矩阵主对角线的和*/}if(sum1!=sum2)/*判断矩阵主对角线的和是否与标准相同*/cout<<"主对角线计算结果与标准不符,请修改程序错误"<<endl;sum1=0;for(k=0;k<n;k++){sum1=a[k][n-k-1]+sum1;/*计算矩阵次对角线的和*/}if(sum1!=sum2)/*判断矩阵次对角线的和是否与标准相同*/cout<<"次对角线计算结果与标准不符,请修改程序错误"<<endl;}3.3 函数逻辑功能调用图3.4 程序执行流程图图3.2 程序流程图void main()void jishu(int n) out(n,a)check(n,a) 开始输入nn 在允许 的范围内调用jishu (int n )调用out (n ,a ) 调用check (n ,a )输出n 阶魔方阵每行、每列以及每条对角线上各数字的累加和结束NY4 运行环境与结果4.1程序运行环境:Windows 7系统,VC++ 6.0开发平台。
4.2 程序运行结果(1)运行程序,根据提示输入指令,当n=3时,程序运行结果如图4.2.1所示图4.1 n=阶魔方阵(2)当n=6时即n为偶数时,程序运行结果如图4.2.2所示图4.2 n=6阶魔方阵(3) 当输入n=101即n超出所给范围1到99时,运行结果如图4.2.3所示图4.3 n=101阶魔方阵(4) 当输入n=0时,程序运行结束,运行结果如图4.2.4所示图4.4 n=0程序结束5 结束语本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。
在编程实现的过程中,我进一步掌握和熟悉了而为数组的应用,并熟悉了将问题分解在组装的解决方法和函数的调用。
编程过程中,使用另外完成输出功能的子函数void out(int n,int a),通过对其调用,大大节省了程序编写的复杂度,提高了效率。
在实现奇数阶魔方阵时,遇到了一点问题,请教了同学,一起进行了讨论研究,最终解决了问题。
通过这次课程设计,使我们学到了一些以前没有学过的知识,使我们对程序设计有了更深层次的认识和理解,懂得了灵活运用。
最后,由衷的向我的指导老师表示衷心的感谢,是她的指导和要求,才使我的课程设计有了较为完善的一面,才有了我能力的提高,并使我得到了充分的锻炼,同时也感谢我的同学,是他们帮助我解决了一些问题。
最后预祝陈老师以及我的同学暑假快乐!!!参考文献[1]黎明志.数据结构—用C语言描述.北京:中国水利水电出版社,2006,1[2]ice7733.魔方阵(magic square).人教论坛,/thread-161512-1-1.html,2010,7,7[3]winice82.谁对魔方阵感兴趣.Csdn,/t/20020528/22/760436.html,2010,7,7附录源程序代码// 程序名称:MAGIC.c// 程序功能:输出魔方阵// 程序作者:田晓辉// 最后修改日期:2010-7-8#include<iostream.h>#include<iomanip.h>#include<time.h>#define MAX 99/*矩阵最大为99*99*/void jishu(int n);void out(int n,int a[MAX][MAX]);/*魔方矩阵输出函数*/void check(int n,int a[MAX][MAX]);/*魔方矩阵验证函数*/void main(){clock_t start,end;int n;while(n!=0)/*判断输出的数n是否为0*/{cout<<"************************************************************************"<< endl;cout<<"*本程序用于输出1到99阶魔方阵,即将1到n平方的数填入n*n(n为奇数)的方阵中*"<<endl;cout<<"* 使所有的横行,纵行以及对角线上所有数字之和相等*"<<endl;cout<<"* 当输入0时本程序结束*"<<endl;cout<<"************************************************************************"<< endl;cout<<endl<<"请输入所输出的魔方阶数:";cin>>n;while(n<1||n>99){if(n==0)break;/*n=0 本程序结束*/cout<<"超出范围,请重新输入:";cin>>n;}if(n==0)break;/*n=0,本程序结束*/cout<<"所得的魔方阵为:"<<endl;start=clock();jishu(n);end=clock();cout<<"所花费的时间为:"<<end-start<<"毫秒"<<endl;}cout<<"谢谢您的使用!"<<endl;}void jishu(int n)/*奇数*/{int p,q,i,a[MAX][MAX];p=0;q=(n-1)/2;a[0][q]=1;/*第一个数字的填入位置*/for(i=2;i<=n*n;i++){p=(p-1+n)%n;/*计算填入的位置*/q=(q-1+n)%n;if(a[p][q]>0)/*如果填入位置已有数字,则重新计算填入位置*/{p=(p+2)%n;/*由于前面p减了1,因此p应该加1,才能表示下一行*/q=(q+1)%n;/*由于前面q减了1,因此q应该加1,才能表示同一列*/ }a[p][q]=i;/*填入数字*/}out(n,a);/*调用输出函数*/check(n,a);/*调用验证函数*/}void out(int n,int a[MAX][MAX])/*魔方矩阵输出函数*/{int p,q;for(p=0;p<=n-1;p++){for(q=0;q<=n-1;q++){cout<<setw(4)<<a[p][q]<<"";/*输出魔方矩阵的结果*/}cout<<endl<<endl;}}void check(int n,int a[MAX][MAX])/*魔方矩阵验证函数*/{int p,q,sum1=0,sum2=(n*n+1)*n/2,k;cout<<"此魔方阵的每行、每列、两条对角线的和为:"<<sum2<<endl;/*输出标准魔方阵的每行、每列、两条对角线的和*/for(p=0;p<n;p++){for(q=0;q<n;q++){sum1=a[p][q]+sum1;/*计算矩阵横行纵行的和*/}if(sum1!=sum2)/*判断矩阵横行纵行的和是否与标准相同*/{cout<<"横行纵行计算结果与标准不符,请修改程序错误"<<endl;break;}sum1=0;}for(k=0;k<n;k++){sum1=a[k][k]+sum1;/*计算矩阵主对角线的和*/}if(sum1!=sum2)/*判断矩阵主对角线的和是否与标准相同*/cout<<"主对角线计算结果与标准不符,请修改程序错误"<<endl; sum1=0;for(k=0;k<n;k++){sum1=a[k][n-k-1]+sum1;/*计算矩阵次对角线的和*/}if(sum1!=sum2)/*判断矩阵次对角线的和是否与标准相同*/cout<<"次对角线计算结果与标准不符,请修改程序错误"<<endl;}。