课程设计报告参考Word格式.docx
《课程设计报告参考Word格式.docx》由会员分享,可在线阅读,更多相关《课程设计报告参考Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
用二叉树表示一个家谱关系
12---15
设计任务
(1)
任务
名称
班级
2007级1班
指导
教师
许海成
地点
红河学院
成绩
学年
2008-2009
开始
日期
2008-12-20
结束
2009-2-25
组员
设计目的及要求:
目的:
(1)进一步加深对图的表示,存储、定义的理解,并能够掌握图的遍历,以及它在程序中的使用方法。
(2)掌握软件设计的基本内容和设计方法,并能培养进行规范化软件设计能力。
要求:
(1)首先要分析题目,查阅相关资料。
(2)清晰的设计出整个程序的思路。
(3)按要求编写程序。
(4)写出运行结果,并分析结果。
设计内容及基本要求:
内容:
建立有向图的存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的深度优先遍历和广度优先遍历的结果。
基本要求:
(1)要给出整个设计的框架说明,并描述所设计程序的各个函数功能。
(2)要求能全面的测试所设计程序的功能;
同时给出程序的测试情况,并分析运行结果。
(3)要求程序又充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。
(4)多查阅与之相关的资料,确保程序中的语句定义,格式准确无误。
(5)书写规范。
采用的设计方法、设计技术路线:
(包括本任务的总体安排和进度、采用的设计方法和步骤以及任务流程图、可能遇到的问题和解决的方法)
设计方法及步骤:
(1)首先定义头文件以及相应的宏,然后再定义三个结构体(其中最重要的结构体是一个含3个成员的结构体,且结构体变量为Mgraph);
(2)创建图。
包括顶点数,边数的输入,以及各顶点(为字符)的输入。
(3)定义图中各顶点之间的关系为0(即无关联)。
(4)利用for循环将每一条边的起点与终点输入,并将输入的边的起点、终点与输入的有向图顶点不复合的边,赋值为1。
(5)定义主函数。
主函数中包括,调用创建图的函数,并输出该图的深度优先遍历和广度优先遍历的结果。
任务总体安排:
2008-12-20~2009-1-30完成课程设计所要求的全部任务。
进度安排:
2008-12-20~2008-12-31:
上网查找与题目相关的资料,并重点阅读课本上的相关知识。
2009-1-2~2009-1-10:
对问题进行抽象,得到描述问题的算法,编写出程序。
2009-1-11~2009-1-20:
设计完整的程序进行演示。
2009-1-21~2009-1-31:
对设计进行总结分析。
2009-2-1~2009-2-25:
填写课程设计手册,并提交指导教师。
任务流程图:
定义头文件----------定义结构体----------创建图----------主函数----------运行----------输出深度优先遍历和广度优先遍历的结果。
可能遇到的问题:
(1)由于参考资料有限,程序说明方面的知识不全面,以及学的程度较浅,自身思维的考虑不全,使在程序中对某些方面的定义不复合。
(2)程序中的算法结构单一,考虑不全,可能不能处理一些特殊、复杂的图。
解决的方法:
(1)多看一些相关知识的参考数,并对其仔细揣摩,深入了解其含义,并能掌握其运用的方法,还可以多研究一些例子,勤于思考,揣摩创新,将他人的东西变为自己所有,
(2)根据自身的能力,编写出既严密,又清楚易懂的程序。
设计成果及总结分析:
(设计成果包括程序清单、测试数据、指定的功能模块说明、设计说明,程序清单可打印,总结分析要手写)
功能模块:
创建图的函数模块主程序模块
主要由以下函数构成(函数的功能在程序清单中说明):
(1)LocateVex();
(2)CreatUDN();
(3)FirstAdjVex();
(4)VisitFunc();
(5)NextAdjVex();
(6)DFS();
(7)DFSTraverse();
(8)InitQueue();
(9)EnQueue();
(10)DeQueue();
(11)QueueEmpty();
(12)BFSTraverse();
(13)main()。
程序清单:
#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[20];
}infotype;
infotypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
intLocateVex(MGraph*G,char*v)
{intc=-1,i;
for(i=0;
i<
G->
vexnum;
i++)
if(strcmp(v,G->
vexs[i].name)==0)
{c=i;
break;
}
returnc;
MGraph*CreatUDN(MGraph*G)//初始化图,接受用户输入
inti,j,k,w;
charv1[20],v2[20];
printf("
请输入图的顶点数,弧数:
"
);
scanf("
%d%d"
&
vexnum,&
arcnum);
结点名字:
\n"
i++){
No.%d:
i+1);
%s"
G->
vexs[i].name);
for(j=0;
j<
j++)
arcs[i][j].adj=INFINITY;
请输入一条边依附的两个顶点和权值:
for(k=0;
k<
arcnum;
k++)
{printf("
第%d条边:
k+1);
起始结点:
v1);
结束结点:
v2);
边的权值:
%d"
w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i>
=0&
&
j>
=0){
arcs[i][j].adj=w;
arcs[j][i]=G->
arcs[i][j];
}}
returnG;
intFirstAdjVex(MGraph*G,intv)
inti;
if(v<
=0&
v<
vexnum){//v合理
for(i=0;
if(G->
arcs[v][i].adj!
=INFINITY)
returni;
}
return-1;
voidVisitFunc(MGraph*G,intv)
%s"
vexs[v].name);
intNextAdjVex(MGraph*G,intv,intw)
intk;
if(v>
v<
vexnum&
w>
w<
vexnum)//v,w合理
{
for(k=w+1;
arcs[v][k].adj!
returnk;
intvisited[MAX];
voidDFS(MGraph*G,intv)//从第v个顶点出发递归地深度优先遍历图G
intw;
visited[v]=1;
VisitFunc(G,v);
//访问第v个结点
for(w=FirstAdjVex(G,v);
w>
=0;
w=NextAdjVex(G,v,w))
if(!
visited[w]){
DFS(G,w);
%d"
arcs[v][w].adj);
voidDFSTraverse(MGraph*G,char*s)//深度优先遍历
{intv,k;
for(v=0;
v++)
visited[v]=0;
k=LocateVex(G,s);
if(k>
vexnum){
for(v=k;
v>
v--){
visited[v])
DFS(G,v);
for(v=k+1;
typedefstructQnode
intvexnum;
structQnode*next;
}QNode,*QueuePtr;
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
intInitQueue(LinkQueue*Q)
Q->
front=Q->
rear=(QueuePtr)malloc(sizeof(QNode));
front)exit(0);
front->
next=NULL;
return1;
voidEnQueue(LinkQueue*Q,inta)
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
p)exit(0);
p->
vexnum=a;
p->
rear->
next=p;
rear=p;
intDeQueue(LinkQueue*Q,int*v)
{QueuePtrp;
if(Q->
front==Q->
rear)
结点不存在!
exit(0);
p=Q->
next;
*v=p->
next=p->
if(Q->
rear==p)
Q->
rear;
return*v;
intQueueEmpty(LinkQueue*Q)
rear==Q->
front)
return0;
intVisited[MAX];
voidBFSTraverse(MGraph*G,char*str)//广度优先遍历
{intw,u,v,k;
LinkQueueQ,q;
v++)Visited[v]=0;
InitQueue(&
Q);
q);
k=LocateVex(G,str);
v--)
Visited[v])
Visited[v]=1;
VisitFunc(G,v);
EnQueue(&
Q,v);
//v入队
while(!
QueueEmpty(&
Q))
DeQueue(&
Q,&
u);
//出队
for(w=FirstAdjVex(G,u);
w=NextAdjVex(G,u,w))
if(!
Visited[w])
{
Visited[w]=1;
EnQueue(&
Q,w);
voidmain()
MGraph*G,b;
charv[10];
G=CreatUDN(&
b);
请输入起始结点名称:
v);
\n深度优先遍历:
DFSTraverse(G,v);
\n广度优先遍历:
BFSTraverse(G,v);
getch();
运行结果:
总结:
设计任务
(2)
(1)进一步加深对二叉树的表示,存储、定义的理解,并能够熟悉的掌握二叉树的应用,以及它在程序中的使用方法。
设计一个程序,采用二叉树表示一个家谱关系。
(1)文件操作功能:
记录输入、记录输出,清除全部文件记录和将家谱记录存盘。
(2)家谱操作功能:
用括号表示法输出家谱二叉树,查找某人所有的儿子,查找某人所有的祖先。