数据结构课程设计之奇数魔方阵
- 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 8
7 5 3
2 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
(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< } cout< } } (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<<"此魔方阵的每行、每列、两条对角线的和为:"<