数据结构课程设计报告

一、题目

    奇数阶幻方求解

【问题描述】

幻方是一种很有意思的数字矩阵,在很早著名的九宫八卦阵就与幻方有关。幻方的定义为: 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放在最上一行正中间的方格中,然后把下一个整数放置到右上方,如果到达最上一行,下一个整数放在最后一行,就好像它在第一行的上面,如果到达最右端,则下一整数放在最左端,就好像它在最右一列的右侧,当到达的方格中已填上数值时,下一个整数就放在刚填上数码的方格的正下方。照着三阶幻方,从1至9走一下,就可以明白它的构造方法。

四、详细设计和编码

  1、主函数:

             Void main()

             {int m,mm,i,j,ni,nj,s,*h;

              Int magic[Max][Max];

              先输入你要查找幻方的阶数

              然后调用Input()

              最后调用Search()

              输出。

             }

2、Input函数:int Input()

              {

               Int i[Max],*p=NULL,j=0;

                  

            返回指针p

                 }

3、Search()函数:int Search(int *p,int m)

             {

            通过判断*p是否为0来结束查找,因为输入时是以0结束的。

            返回0或1.

            }

4、幻方的求解 :先用if判断你你输入的阶数是否为奇数,如果是,继续判断Search的返回值是否为1,如果是,则开始重新编排数组的值。首先,将1放在第一行的正中间的空格中,然后把2放在1空格的右上方,像田字的对角一样,如果1刚好是最后一列,则2放在第一列,1的上一行;如果1刚好在第一行,则2放在最后一行。如果1的右上方位置已经有数,则把2放在该数的正下方一行。其他数同理。

5、具体代码:   

#include<stdio.h>

#define Max 100

int Input()

{int i[Max],*p=NULL,j=0;

 p=i;

 printf("输入多个测试集,以0结束……\n");

 i[j]=-1;

 while(i[j]!=0)

 {   j++;

     scanf("%d",&i[j]);//从一开始存储

 }

 return p;

 }

int Search(int *p,int m)

{

 while(*p!=0)

 {

  if(*p==m)

    return 1;

   p++;

 }

 return 0;

}

void main(void)

{

 int m,mm,i,j,k,ni,nj,s,*h;

 int magic[Max][Max];

 h=Input();

 printf("请输入你要查找的幻方的阶数:");

 scanf("%d",&m);

 for(i=0;i<m;i++)//初始化该矩阵

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

   magic[i][j]=0;

 if((m>0)&&(m%2!=0))

 { s=Search(h,m);

   if(s==1)

   { mm=m*m;//表示数据的个数

     i=0;j=m/2;//第一个值得位置

    for(k=1;k<=mm;k++)

    {

     magic[i][j]=k;//将每一个值放入空格

     //求右方格的坐标

     if(i==0)//最上一行

         ni=m-1;//下一个位置在最下一行

     else

         ni=i-1;//否则下一个位置向上移动一位

     if(j==m-1)//最右端

         nj=0;//下一个位置在最左端

     else

         nj=j+1;//否则下一列

     if(magic[ni][nj]==0)//右上方无值

     {    i=ni;

         j=nj;

     }

     else//右上方方格已经填上了数

         i++;

    }

    printf("查找成功!\n幻方如下\n");

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

    {

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

      printf("%4d",magic[i][j]);

      printf("\n");

    }

  }

  else

      printf("在测试集中没有找到你要的幻方!!!\n");

 }

 else//偶数和非正数情况

     printf("输入错误,该程序只能查抄奇数阶幻方!!\n!");

}

五、测试结果及分析

分析:先是输入一连串的测试集,并以0结束,然后输入你要查找的幻方的阶数,11阶,因为11在测试集中,所以表示查找成功,并且输出11阶幻方,可以检测到该幻方符合要求。

分析:15不在测试集中,由主程序中的Search()函数的返回值可以判断,15不等于数组i【】中的任一个值,所以返回0给主函数,故提示在测试集中没有找到你要找的幻方,并且无法输出幻方。

    

六、用书使用说明

1、本程序运行的环境为window操作系统。

2、运行的工具为vc++6.0。

3、在Dos的页面下,请按要求输入。

七、参考文献

【1】王昆仑 李红《数据结构与算法》。北京.中国铁道出版社.2007.6

【2】谭浩强 《c程序设计》。北京.清华大学出版社.2010.6

【3】严蔚敏 吴伟明 《数据结构》 北京.清华大学出版社2002.9

八、附录

 源程序文件清单:

#include<stdio.h>

#define Max 100

int Input()

{int i[Max],*p=NULL,j=0;

 p=i;

 printf("输入多个测试集,以0结束……\n");

 i[j]=-1;

 while(i[j]!=0)

 {   j++;

     scanf("%d",&i[j]);//从一开始存储

 }

 return p;

 }

int Search(int *p,int m)

{

 while(*p!=0)

 {

  if(*p==m)

    return 1;

   p++;

 }

 return 0;

}

void main(void)

{

 int m,mm,i,j,k,ni,nj,s,*h;

 int magic[Max][Max];

 h=Input();

 printf("请输入你要查找的幻方的阶数:");

 scanf("%d",&m);

 for(i=0;i<m;i++)//初始化该矩阵

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

   magic[i][j]=0;

 if((m>0)&&(m%2!=0))

 { s=Search(h,m);

   if(s==1)

   { mm=m*m;//表示数据的个数

     i=0;j=m/2;//第一个值得位置

    for(k=1;k<=mm;k++)

    {

     magic[i][j]=k;//将每一个值放入空格

     //求右方格的坐标

     if(i==0)//最上一行

         ni=m-1;//下一个位置在最下一行

     else

         ni=i-1;//否则下一个位置向上移动一位

     if(j==m-1)//最右端

         nj=0;//下一个位置在最左端

     else

         nj=j+1;//否则下一列

     if(magic[ni][nj]==0)//右上方无值

     {

      i=ni;

      j=nj;

     }

     else//右上方方格已经填上了数

         i++;

    }

    printf("查找成功!\n幻方如下\n");

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

    {

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

      printf("%4d",magic[i][j]);

      printf("\n");

    }

  }

  else

      printf("在测试集中没有找到你要的幻方!!!\n");

 }

 else//偶数和非正数情况

     printf("输入错误,该程序只能查抄奇数阶幻方!!\n!");

}

 

第二篇:数据结构课程设计报告敢死队问题

华 北 科 技 学 院

课程设计说明书

数据结构课程设计

班级:   信管B08-1      姓名:  陈秋苗     

学号:           200807034118            

设计题目:     敢死队问题               

设计时间:__20##-9-6_____至___20##-9-17____

指导教师:______    __________________

评    语:________________________________

_________________________________________

_________________________________________

_________________________________________

_________________________________________

评阅成绩:__   __评阅教师:__   ___

数据结构》课程设计实验报告

开课实验室:基础实验室                             20##  9 16

相关推荐