数据结构程序设计报告完美版Word文件下载.docx
《数据结构程序设计报告完美版Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构程序设计报告完美版Word文件下载.docx(33页珍藏版)》请在冰豆网上搜索。
以表格形式显示校园平面图,平面图中应能够准确地标示场所名称,及其对应各个场所的简介信息;
首先用二维数组初始化一个图形G,然后调用Browser(MGraph*G)函数调用并显示这个平面图。
第二模块:
实现了任意场所的信息查询功能,要求能够接受用户所输入的场所名称,并将场所的简介信息反馈给用户。
本设计用Search函数实现本部分功能。
第三模块:
功能为求单源点到其他各点的最短路径,计算并记录从某个景点到其他各个场所的各自所有最短路径。
主要有迪杰斯特拉算法实现。
第四模块:
实现了求任意场所的问路查询功能,接收用户所输入的场所编号,并在计算机的最短路径集合中找到相关项的信息反馈给用户,此模块旨在求任意两个场所之间的最短路径。
本模块主要用了弗洛伊德算法实现模块间关系如图1-1
1.3.3抽象数据类型的设计
本设计利用了图数据结构及图中几个重要的算法。
所以抽象数据类型如下:
ADTgraph{
数据对象V:
具有相同特性的数据元素的集合
数据关系R:
R={VR},VR={<
v,w>
|v,w∈V,<
表示从v到w的弧}
结构的建立:
CreatGraph(&
G,V,VR):
//按定义(V,VR)构造图
对顶点的访问操作:
LocateVex(G,u);
//若G中存在顶点u,则返回该顶点在图中“位置”;
否则返回其它信息。
GetVex(G,v);
//返回v的值。
PutVex(&
G,v,value);
//对v赋值value。
FirstAdjVex(G,v);
//返回v的“第一个邻接点”。
若该顶点在G中没有邻接点,则返回“空”。
NextAdjVex(G,v,w);
//返回v的(相对于w的)“下一个邻接点”。
若w是v的最后一个邻接点,则/返回“空”。
InsertVex(&
G,v);
//在图G中增添新顶点v。
DeleteVex(&
G,v);
//删除G中顶点v及其相关的弧。
InsertArc(&
G,v,w);
//在G中增添弧<
若G是无向的则还增添对称弧<
w,v>
。
DeletArc(&
G,v,w);
//在G中删除弧<
v,w>
,若G是无向的则还删除对称弧<
}
1.4详细设计
1.4.1抽象数据类型的类定义
typedefstructArcCell{//弧的定义
VRTypeadj;
//VRType是顶点关系类型。
对无权图,用1或0表示相邻
与否;
对带权图,则为权值类型。
InfoType*info;
//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct{//图的定义
VertexTypevexs[MAX_VERTEX_NUM];
//顶点信息
AdjMatrixarcs;
//弧的信息
intvexnum,arcnum;
//顶点数,弧数
GraphKindkind;
//图的种类标志
}MGraph;
1.4.2成员函数
在本设计这些函数中有一个公共成员函数:
voidMenu()
{
printf("
\n新校区校园导游图\n"
);
┏━━━━━━━━━━━━━━━━━━━━┓\n"
┃1.浏览校园全景┃\n"
┃2.查看所有游览路线┃\n"
┃3.选择出发点和目的地┃\n"
┃4.查看景点信息┃\n"
┃5.退出系统┃\n"
┗━━━━━━━━━━━━━━━━━━━━┛\n"
Option-:
"
另外各模块有自己的成员函数如下。
第一模块成员函数有两个:
(1)初始化平面图
MGraphInitGraph(void)
(2)浏览函数展示校园平面全景图
voidBrowser(MGraph*G)
第二个模块有自己的一个成员函数:
voidSearch(MGraph*G)
第三个模块是用实现单元颠倒其他各点的最短路径,成员函数为:
voidShortestPath_DIJ(MGraph*G)
第四个模块实现了图中任意两个场所之间的最短路径,成员函数为:
voidFloyd(MGraph*G)
1.4.3设计主函数
本函数在主函数里调用了C++语言的两个特殊命令修改控制台的颜色命令和设置控制台窗口大小的命令,还调用了一个具体实现该校园景点平面图的功能函数CMD函数。
主函数如下:
voidmain(void)
{
system("
color1f"
//修改控制台的颜色信息,改为白字蓝底的模式
modecon:
cols=140lines=130"
//设置窗口大小
cmd();
//调用cmd函数
voidcmd(void)
inti;
char*v;
b=InitGraph();
Menu();
scanf("
%d"
&
i);
while(i!
=6)
{
switch(i)
case1:
system("
cls"
Browser(&
b);
Menu();
break;
//先清屏,然后调用游览
函数,调用选项菜单函数,跳出本层循环。
case2:
ShortestPath_DIJ(&
case3:
Floyd(&
case4:
Search(&
case5:
CreatUDN(&
LocateVex(&
b,v);
case6:
exit
(1);
default:
}
scanf("
1.5运行与测试
本设计查询部分的测试数据分为以下三种:
(1)平面图中各景点的编号,编号范围为0到9十个数字;
(2)各景点编号的组合,例如23,2“Enter”3;
(3)五个选项编号,范围从1到5五个数字。
另外更新部分的测试数据为用户输入的顶点数和弧数范围。
测试结果举例如下:
(1)Menu功能,如图1-2。
图1-2menu功能实现界面
(2)第一模块功能显示,如图1-3:
图1-3第一模块功能实现界面
(3)第二模块功能实现,如图1-4。
图1-4第二模块功能实现界面
(4)第三模块功能实现,如图1-5。
图1-5第三模块功能实现界面
(5)第四模块功能实现,如图1-6。
图1-6第四模块功能实现界面
1.6课设总结
从过本次课程设计对图的概念有了一个新的较全面的认识,在学习离散数学的时候总觉得图是比较抽象的东西,但是在学习了数据结构课程以后,慢慢体会到了其中的奥妙,图能够在计算机中存在,首先要捕捉它有哪些具体化数字化的信息,比如说权值、顶点个数等。
这也就说明了想要把现实生活中的信息转换成计算机能识别的信息,必须用数字来完整的构成一个信息库,而图的存在又涉及到了顶点之间的关系。
图分为有向图和无向图,无向图是有向图在权值双向相等下的特例。
那么如何把现实生活中的校园游览问题转换成用图来实现呢?
通过老师和同学的帮助我用图的邻接矩阵存储方式完成了景点之间的路径问题。
对整个程序而言,迪杰斯特拉算法和弗洛伊德算法是核心内容,实现了校园景点之间最短路径问题,其实这两个算法在实际思考中并不难,找一个景点到其他景点的最短路径,也许大家会说一步步从这个场所找最近路线并与其实际距离相比较,就可以轻易找出来,但是在计算机中实现却需要很多专业知识,为实现这两个函数功能上调试了好多次。
在此次设计中还学会了C++的一些特殊命令:
如清屏函数system("
),conio.h不是C标准库中的头文件,conio是ConsoleInput/Output(控制台输入输出)的简写,等等。
另一方面,加深了对C语言的标准库函数中scanf()函数的理解,如scanf("
%d,%d"
k,&
j);
格式控制串中没有非格式字符作输入数据之间的间隔,只能用空格、Tab、回车作输入数据之间的间隔。
我会以此为契机刻苦学习,多实践,争取做出更好的咨询系统。
相信通过此次课程设计对数据结构图部分的理解与掌握较以前透彻了很多。
第2章n阶魔阵问题
2.1问题描述
给定一奇数n,构造一个n阶魔阵。
n阶魔阵是一个n阶方阵,其元素由自然数1,2,3,…,n2组成。
魔阵的每一行元素之和,每列元素之和以及主、副对角线元素之和均相等。
即对于给定的奇数n以及i=1,2,3,…,n,魔阵a满足条件:
实现要求:
要求输出结果的格式要具有n阶方阵的形式。
2.2需求分析
n阶魔方,又叫幻方阵,在我国古代称为“纵横图”,是一个比较有趣的游戏。
n阶魔方就是用1到n2的数字不重复的填入方阵中。
每一行中n个数之和,共得n个和;
每一列中n个数之和,共得n个和;
每一条对角线n个数之和,共得两个和,每一个和称为魔数。
魔方阵中的每个魔数都相等。
如图2-1就是一个3阶魔方阵,它是用数字1到9不重复的填入3*3的方阵中,使得各行、各列及对角线的魔数都等于15。
6
1
8
7
5
3
2
9
4
图2-13阶魔方阵
首先,输入一个数字n(1≤n≤99),则输出对应的n阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。
若输入数字n超出要求范围,则提醒用户重新输入n。
但若输入数字0时,操作结束,退出程序。
使用多维数组输出魔方阵,分别用3个子函数实现相应的功能。
输入形式:
数字n(1≤n≤99)。
输出形式:
以矩阵形式输出n(1≤n≤99)阶魔方阵;
输出每一行、每一列、每条对角线上各个数字累加和;
输出程序运行时间。
2.3概要设计
2.3.1数据结构与数据存储表示
这方面使用二维数组n[MAX][MAX]来静态存储不超过MAX行MAX列的数组方阵,其中n(1<
=n<
=99)为满足条件的数。
2.3.2需要的函数分块
(1)main()函数,主函数,调用以下子函数,实现魔方阵填充与输出,实现问题要求功能。
(2)#include<
time.h>
函数,用以计算程序运行时间函数。
(3)jishu(intn)函数,n为奇数实现n阶魔方阵。
(4)out(intn,inta[MAX][MAX])函数,此函数用以调整方阵元素位置,实现魔方阵n*n形式输出。
(5)check(intn,inta[MAX][MAX])函数,计算并输出n阶魔方阵每行、每列以及每条对角线上各个数字的累加和,同时验证魔方阵的准确性。
函数间调用关系如图2-2。
2.4详细设计
2.4.1功能函数
主要使用与实现如下函数:
(1)voidmain()
(2)#include<
(3)voidjishu(intn),实现思想如下:
在1到n2的数字中,选择1开始填充魔方,将数字1填入第一行的中间方格中,即(0,n/2)的位置;
向已填充的前一个数字位置(p,q)的左上角(p-1,q-1)填入下一个数字,如果出现以下情况,则修改填充位置:
若填充位置超出上边界,则修改为下边界的相应位置,即把p-1修改为n-1;
若填充位置超出左边界,则修改为最右边的相应位置,即把q-1改为n-1;
若填充位置已有数字,则填充位置修改为下一行的同一位置。
重复以上步骤,直至将n2个数字全部填入魔方中。
最后调用函数函数out(n,a)和check(n,a),实现魔方阵的输出,检验魔方阵的准确性。
具体实现代码如下:
voidjishu(intn)/*奇数*/
intp,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)voidout(intn,inta[MAX][MAX])具体实现代码如下:
voidout(intn,inta[MAX][MAX])/*魔方矩阵输出函数*/
intp,q;
for(p=0;
p<
=n-1;
p++)
for(q=0;
q<
q++)
{
cout<
<
setw(4)<
a[p][q]<
;
/*输出魔方矩阵的结果*/
}
endl<
endl;
(5)voidcheck(intn,inta[MAX][MAX])函数,计算并输出n阶魔方阵每行、每列以及每条对角线上各个数字的累加和,同时验证魔方阵的准确性。
voidcheck(intn,inta[MAX][MAX])/*魔方矩阵验证函数*/
intp,q,sum1=0,sum2=(n*n+1)*n/2,k;
此魔方阵的每行、每列、两条对角线的和为:
sum2<
/*输出标准魔方阵的每行、每列、两条对角线的和*/
n;
sum1=a[p][q]+sum1;
/*计算矩阵横行纵行的和*/
if(sum1!
=sum2)/*判断矩阵横行纵行的和是否与标准相同*/
横行纵行计算结果与标准不符,请修改程序错误"
break;
sum1=0;
for(k=0;
k<
k++)
sum1=a[k][k]+sum1;
/*计算矩阵主对角线的和*/
=sum2)/*判断矩阵主对角线的和是否与标准相同*/
主对角线计算结果与标准不符,请修改程序错误"
sum1=a[k][n-k-1]+sum1;
/*计算矩阵次对角线的和*/
=sum2)/*判断矩阵次对角线的和是否与标准相同*/
次对角线计算结果与标准不符,请修改程序错误"
2.4.2具体程序执行流程图
如图2-3所示。
2.5运行与测试
程序运行结果如下:
1.运行程序,根据提示输入指令,当n=3时,程序运行结果如图2-4所示。
图2-4n=阶魔方阵
2.当n=6时即n为偶数时,程序运行结果如图2-5所示。
图2-5n=6阶魔方阵
3.当输入n=101即n超出所给范围1到99时,运行结果如图2-6所示。
图2-6n=101阶魔方阵
4.当输入n=0时,程序运行结束,运行结果如图2-7所示。
图2-7n=0程序结束
2.6课设总结
本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。
在编程实现的过程中,我进一步掌握和熟悉了而为数组的应用,并熟悉了将问题分解在组装的解决方法和函数的调用。
编程过程中,使用另外完成输出功能的子函数voidout(intn,inta),通过对其调用,大大节省了程序编写的复杂度,提高了效率。
在实现奇数阶魔方阵时,遇到了一点问题,请教了同学,一起进行了讨论研究,最终解决了问题。
通过这次课程设计,使我们学到了一些以前没有学过的知识,使我们对程序设计有了更深层次的认识和理解,懂得了灵活运用。
最后,由衷的向我的指导老师表示衷心的感谢,是他的指导和要求,才使我的课程设计有了较为完善的一面,才有了我能力的提高,并使我得到了充分的锻炼,同时也感谢我的同学,是他们帮助我解决了一些问题。
参考文献
[1]严蔚敏、吴伟民主编《数据结构》(C语言版)清华大学出版社2002
[2]殷人昆等著《数据结构》(C++版)清华大学出版社2001
[3]金远平著《数据结构》(C++描述)清华大学出版社2005
[4]许卓群等著《数据结构与算法》高等教育出版社2004
[5]FrankM.Carrano等著《数据结构与C++高级教程》清华大学出版社2004
[6]严蔚敏、吴伟民《数据结构习题集》(C语言版)清华大学出版社
[7]谭浩强《C语言程序设计》清华大学出版社
[8]与所用编程环境相配套的C语言或C++相关的资料
[9]黎明志.数据结构—用C语言描述.北京:
中国水利水电出版社,2006,1
[10]ice7733.魔方阵(magicsquare).人教论坛
附录
附录1:
校园导游咨询源代码
#defineINFINITY10000/*无穷大*/
#defineMAX_VERTEX_NUM40
#defineMAX40
#include<
stdlib.h>
stdio.h>
conio.h>
string.h>
typedefstructArCell
intadj;
//路径长度
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct//图中顶点表示主要景点,存放景点的编号、名称、简介等信息,
charname[30];
intnum;
charintroduction[200];
//简介
}infotype;
typedefstruct
infotypevexs[MAX_VERTEX_NUM];
//景点
//路径数组
intvexnum,arcnum;
//景点数,路径长度记录
}MGraph;
MGraphb;
//全局变量
voidcmd(void);
//在主函数中用来调用其他应用子函数的函数声明
MGraphInitGraph(void);
//用来构造学校地图的子函数返回MGraph类型
voidMenu(void);
//菜单函数;
voidBrowser(MGraph*G);
//调用MGraph类型的地址,进行
voidShortestPath_DIJ(MGraph*G);
//迪杰斯特拉算法求最短路径的子函数
voidFloyd(MGraph*G);
//佛洛伊德算法
voidSearch(MGraph*G);
//寻找要查询的景点,并输出该景点的信息
intLocateVex(MGraph*G,char*v);
//定点位置
MGraph*CreatUDN(MGraph*G);
////初始化图形,接受用户输入
voidprint(MGraph*G);
//打印输出子函数
/******************************************************/
//设置调试窗口背景和字体颜色
//设置调试窗口的大小
//用该函数来调用其他需要用到的函数
voidcmd(void)//用来调用其他需要用到的函数的子函数
inti;
//构造校园地图
//调用菜单函数
=5)
switch(i)
{
case1:
case2:
ShortestPath_DIJ