课程设计报告参考.docx
《课程设计报告参考.docx》由会员分享,可在线阅读,更多相关《课程设计报告参考.docx(14页珍藏版)》请在冰豆网上搜索。
课程设计报告参考
红河学院工学院
课
程
设
计
报
告
专业:
计算机科学与技术
年级:
2007级
学号:
200703050215
姓名:
XXXXXXX
成绩:
红河学院工学院编制
说明
1、本报告供学生课程设计时使用。
2、学生应认真阅读所学课程配套的相关资料。
3、课程设计报告里面的内容要手工填写,以备存档使用(源程序可打印)。
4、课程设计的总评成绩根据课程的性质,按一定比例计入该门课程成绩。
5、报告中的“设计方法、设计技术路线、设计成果及总结分析”中的内容是评分的主要依据,如果不够书写,可以自行添加附页。
6、按规定的时间提交报告给教师评定成绩,由任课教师交到工学院存档。
课程设计目录
课程名称:
数据结构与算法
任务序号
任务名称
起止页码
1
图的遍历
3---11
2
用二叉树表示一个家谱关系
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
#include
#include
#include
typedefstructArCell{
intadj;
}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
charname[20];
}infotype;
typedefstruct
{
infotypevexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
intLocateVex(MGraph*G,char*v)
{intc=-1,i;
for(i=0;ivexnum;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",&G->vexnum,&G->arcnum);
printf("结点名字:
\n");
for(i=0;ivexnum;i++){
printf("No.%d:
",i+1);
scanf("%s",G->vexs[i].name);}
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
G->arcs[i][j].adj=INFINITY;
printf("请输入一条边依附的两个顶点和权值:
\n");
for(k=0;karcnum;k++)
{printf("第%d条边:
\n",k+1);
printf("起始结点:
");
scanf("%s",v1);
printf("结束结点:
");
scanf("%s",v2);
printf("边的权值:
");
scanf("%d",&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
if(i>=0&&j>=0){
G->arcs[i][j].adj=w;
G->arcs[j][i]=G->arcs[i][j];
}}
returnG;
}
intFirstAdjVex(MGraph*G,intv)
{
inti;
if(v<=0&&vvexnum){//v合理
for(i=0;ivexnum;i++)
if(G->arcs[v][i].adj!
=INFINITY)
returni;
}
return-1;
}
voidVisitFunc(MGraph*G,intv)
{
printf("%s",G->vexs[v].name);
}
intNextAdjVex(MGraph*G,intv,intw)
{
intk;
if(v>=0&&vvexnum&&w>=0&&wvexnum)//v,w合理
{
for(k=w+1;kvexnum;k++)
if(G->arcs[v][k].adj!
=INFINITY)
returnk;
}
return-1;
}
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);
printf("%d",G->arcs[v][w].adj);}
}
voidDFSTraverse(MGraph*G,char*s)//深度优先遍历
{intv,k;
for(v=0;vvexnum;v++)
visited[v]=0;
k=LocateVex(G,s);
if(k>=0&&kvexnum){
for(v=k;v>=0;v--){
if(!
visited[v])
DFS(G,v);}
for(v=k+1;vvexnum;v++)
if(!
visited[v])
DFS(G,v);
}
}
typedefstructQnode
{
intvexnum;
structQnode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
intInitQueue(LinkQueue*Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q->front)exit(0);
Q->front->next=NULL;
return1;
}
voidEnQueue(LinkQueue*Q,inta)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)exit(0);
p->vexnum=a;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
intDeQueue(LinkQueue*Q,int*v)
{QueuePtrp;
if(Q->front==Q->rear)
{printf("结点不存在!
\n");exit(0);}
p=Q->front->next;
*v=p->vexnum;
Q->front->next=p->next;
if(Q->rear==p)
Q->front=Q->rear;
return*v;
}
intQueueEmpty(LinkQueue*Q)
{
if(Q->rear==Q->front)
return0;
return1;
}
intVisited[MAX];
voidBFSTraverse(MGraph*G,char*str)//广度优先遍历
{intw,u,v,k;
LinkQueueQ,q;
for(v=0;vvexnum;v++)Visited[v]=0;
InitQueue(&Q);InitQueue(&q);
k=LocateVex(G,str);
for(v=k;v>=0;v--)
if(!
Visited[v])
{
Visited[v]=1;
VisitFunc(G,v);
EnQueue(&Q,v);//v入队
while(!
QueueEmpty(&Q))
{
DeQueue(&Q,&u);//出队
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
if(!
Visited[w])
{
Visited[w]=1;
VisitFunc(G,v);
EnQueue(&Q,w);
}
}
}
for(v=k+1;vvexnum;v++)
if(!
Visited[v])
{
Visited[v]=1;
VisitFunc(G,v);
EnQueue(&Q,v);//v入队
while(!
QueueEmpty(&Q))
{
DeQueue(&Q,&u);//出队
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
if(!
Visited[w])
{
Visited[w]=1;
VisitFunc(G,v);
EnQueue(&Q,w);
}
}
}
}
voidmain()
{
MGraph*G,b;
charv[10];
G=CreatUDN(&b);
printf("请输入起始结点名称:
");
scanf("%s",v);
printf("\n深度优先遍历:
\n");
DFSTraverse(G,v);
printf("\n广度优先遍历:
\n");
BFSTraverse(G,v);
getch();
}
运行结果:
总结:
设计任务
(2)
任务
名称
用二叉树表示一个家谱关系
班级
2007级1班
指导
教师
许海成
地点
红河学院
成绩
学年
2008-2009
开始
日期
2008-12-20
结束
日期
2009-2-25
组员
设计目的及要求:
目的:
(1)进一步加深对二叉树的表示,存储、定义的理解,并能够熟悉的掌握二叉树的应用,以及它在程序中的使用方法。
(2)掌握软件设计的基本内容和设计方法,并能培养进行规范化软件设计能力。
要求:
(1)首先要分析题目,查阅相关资料。
(2)清晰的设计出整个程序的思路。
(3)按要求编写程序。
(4)写出运行结果,并分析结果。
设计内容及基本要求:
内容:
设计一个程序,采用二叉树表示一个家谱关系。
基本要求:
(1)文件操作功能:
记录输入、记录输出,清除全部文件记录和将家谱记录存盘。
(2)家谱操作功能:
用括号表示法输出家谱二叉树,查找某人所有的儿子,查找某人所有的祖先。
采用的设计方法、设计技术路线:
(包括本任务的总体安排和进度、采用的设计方法和步骤以及任务流程图、可能遇到的问题和解决的方法)
设计成果及总结分析:
(设计成果包括程序清单、测试数据、指定的功能模块说明、设计说明,程序清单可打印,总结分析要手写)