算法课程设计报告材料.docx
《算法课程设计报告材料.docx》由会员分享,可在线阅读,更多相关《算法课程设计报告材料.docx(14页珍藏版)》请在冰豆网上搜索。
算法课程设计报告材料
《算法与数据结构》课程设计报告
题目:
教学计划编制问题
专业:
计算机科学与技术
班级:
1002
学号:
1030030242
姓名:
巫爱萍
指导教师:
许文庆
完成日期:
2012年6月14日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计内容
针对计算机系本科课程,依据其相互依赖关系制定课程安排计划,其相互依赖关系如下图所示,并要求各学期课程数目大致相同且搭配适当。
三、课程设计过程
1.需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
并明确规定:
(1)输入的形式和输入值的范围;创建邻接表时需要输入顶点数、边数、顶点及其入度和确定弧的两个顶点的下标。
(2)输出的形式;在主函数中输出拓扑排序序列。
(3)程序所能达到的功能;A、求解上图的拓扑排序结果。
B、上述课程在4学期上完,要求每学期上课的门数大致一样。
(4)测试数据:
创建邻接表时输入的顶点数:
7
创建邻接表时输入的顶点数:
8
创建邻接表时输入的顶点及其入度分别为:
(1,0)、(2,0)、(3,1)、(4,2)、(5,2)、(6,2)、(7,1)
创建邻接表时输入的确定弧的两个顶点的下标为:
<1,3>、<3,4>、<2,4>、<2,7>、<2,5>、<7,6>、<4,6>、<4,5>
2.概要设计
1)本程序包含7个函数:
①主函数main()
②创建邻接表函数creatgraph(algraph&g)
③拓扑排序函数toposort(algraph&g,intn)
各函数间关系如下:
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:
按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。
1)
typedefstructarcnode
{
intadjvex;
//intinfo;
structarcnode*nextarc;
}arcnode;
2)
typedefstructvnode
{
intdata;
intid;
structarcnode*firstarc;
}vnode,adjlist[MAX_VERTEX_NUM
3)
typedefstruct
{
adjlistvertices;
intvexnum,arcnum;
//intkind;
}algraph;
4)图的基本操作
为了方便用邻接表来存储有向图。
algraphcreatgraph(algraph&g)
{
inti,j,k;
arcnode*p;
algraphag;
printf("******************************************\n");
printf("请输入顶点数:
\n");
scanf("%d",&g.vexnum);
printf("请输入边数:
\n");
scanf("%d",&g.arcnum);
printf("******************************************\n");
printf("请输入顶点:
");
for(i=1;i<=g.vexnum;++i)
{
scanf("%d,%d",&g.vertices[i].data,&g.vertices[i].id);
g.vertices[i].firstarc=NULL;
}
printf("请输入确定弧的两个顶点的下标:
\n");
for(k=1;k<=g.arcnum;++k)
{scanf("%d,%d",&i,&j);
p=(arcnode*)malloc(sizeof(arcnode));
p->adjvex=j;
p->nextarc=g.vertices[i].firstarc;
g.vertices[i].firstarc=p;
}
returnag;
}
5)拓扑排序的基本操作
inttoposort(algraph&g,intn)
{
inti,j,k,m=0;
inttop=0;
arcnode*p;
//p=(arcnode*)malloc(sizeof(arcnode));
for(i=1;i<=n;i++)
if(g.vertices[i].id==0)
{
g.vertices[i].id=top;
top=i;
}
while(top!
=0)
{j=top;
top=g.vertices[top].id;
printf("%d\n",g.vertices[j].data);
m++;
p=g.vertices[j].firstarc;
while(p!
=NULL)
{k=p->adjvex;
g.vertices[k].id--;
if(g.vertices[k].id==0)
{g.vertices[k].id=top;
top=k;
}
p=p->nextarc;
}
}
if(m{printf("TheAOVnetworkhasacycle\n");
return0;
}
else
return1;
printf("\n");
}
6)主函数的基本操作
voidmain()
{algraphg;
creatgraph(g);
printf("拓扑排序为:
\n");
toposort(g,7);
}
4.调试分析
内容包括:
a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
刚开始编译时很多错,不是分号漏了,就是对应的大小写不正确,因对引用及指针传的是值还是址不够清楚,最后不得不一个一个的改。
在运行时也因为对象没弄清楚,一直都产生随机数,还好,认真检查后发现了错误。
b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和
改进设想;
分析算法的时间复杂度:
对7个顶点8条边的AOV网建立邻接表需O(15)的时间;搜索入度为0的顶点需O(7)的时间;在拓扑排序过程中若AOV网无环路,每个顶点进一次栈出一次栈各7次,入度减一的操作g.vertices[k].id—共执行8次,所需时间为O(15)。
所以总的时间复杂度为O(15)。
c.经验和体会等。
从这件事中可以看出,自己做事还是不够认真,老是犯一些低级错误。
因此,以后不管在学习中还是在工作中都要认认真真的待事,尽量避免不应犯的错误。
5.用户使用说明
程序名为toposort.exe,运行环境为DOS。
程序执行后显示
*************************************************************
请输入顶点数:
请输入边数:
*************************************************************
请输入顶点:
请输入确定弧的两个顶点下标:
拓扑排序为:
Pressanykeytocontinue:
**************************************************************
在调试无误后进入运行状态,此时界面会提示“请输入顶点数”、“请输入边数”、“请输入顶点”、“请输入确定弧的两个顶点下标”、”拓扑排序为”每执行以上步骤时会显示执行的结果(正确或错误)。
6.测试结果
程序名为toposort.exe,运行环境为DOS。
程序执行后显示
在调试无误后进入运行状态,此时界面会提示“请输入顶点数”、“请输入边数”、“请输入顶点”、“请输入确定弧的两个顶点下标”、”拓扑排序为”每执行以上步骤时会显示执行的结果(正确或错误)。
7.附录
#include
#include
#defineMAX_VERTEX_NUM20
//定义表结点
typedefstructarcnode
{
intadjvex;//该弧所指向的顶点的位置
//intinfo;//该弧相关信息
structarcnode*nextarc;//指向下一条弧的指针
}arcnode;//表结点类型
//定义表头结点
typedefstructvnode
{
intdata;//顶点域
intid;//入度域
structarcnode*firstarc;//指向第一个表结点的指针
}vnode,adjlist[MAX_VERTEX_NUM];//邻接表结点类型
typedefstruct
{
adjlistvertices;//表头结点数组
intvexnum,arcnum;//图的当前顶点数和弧数
//intkind;//图的种类标志
}algraph;
algraphcreatgraph(algraph&g)
{
inti,j,k;
arcnode*p;//定义一个表结点指针
algraphag;
printf("******************************************\n");
printf("请输入顶点数:
\n");
scanf("%d",&g.vexnum);
printf("请输入边数:
\n");
scanf("%d",&g.arcnum);
printf("******************************************\n");
printf("请输入顶点:
");
for(i=1;i<=g.vexnum;++i)
{
scanf("%d,%d",&g.vertices[i].data,&g.vertices[i].id);//输出顶点及其入度
g.vertices[i].firstarc=NULL;//指向第一个表结点的指针指向空
}
printf("请输入确定弧的两个顶点的下标:
\n");
for(k=1;k<=g.arcnum;++k)
{scanf("%d,%d",&i,&j);
p=(arcnode*)malloc(sizeof(arcnode));
p->adjvex=j;//弧所指向的顶点的位置赋给j
p->nextarc=g.vertices[i].firstarc;
g.vertices[i].firstarc=p;
}
returnag;
}
inttoposort(algraph&g,intn)//AOV网以带入度的邻接表g存储,算法求其一种拓扑有序序列
{
inti,j,k,m=0;
inttop=0;
arcnode*p;
//p=(arcnode*)malloc(sizeof(arcnode));
for(i=1;i<=n;i++)//把所有入度为零的顶点压入入链栈
if(g.vertices[i].id==0)//如果入度为0
{
g.vertices[i].id=top;//栈顶指针值存入入度域
top=i;//栈顶指针指向新栈顶
}
while(top!
=0)//开始拓扑排序
{j=top;//栈顶指针值送j
top=g.vertices[top].id;//从栈顶弹出一个元素
printf("%d\n",g.vertices[j].data);
m++;//统计输出的顶点个数
p=g.vertices[j].firstarc;//p指向第j个链表的第一个结点
while(p!
=NULL)//当第j个链表不空
{k=p->adjvex;//p所指结点邻接点域值送k中
g.vertices[k].id--;//第k个表头结点的入度域减一
if(g.vertices[k].id==0)//如果入度域为0则压入链栈中
{g.vertices[k].id=top;//栈顶指针值存入其入度域
top=k;//更新栈顶指针为k
}
p=p->nextarc;//p指向下一个邻接点
}
}
if(m{printf("TheAOVnetworkhasacycle\n");
return0;
}
else
return1;
printf("\n");
}
voidmain()
{printf("1:
高数2:
程序设计3:
离散4:
数据结构5:
编译6:
操作7:
组成原理\n");
algraphg;
creatgraph(g);
printf("拓扑排序为:
\n");
toposort(g,7);
printf("******************************************\n");
}
四、课程设计体会
通过五天的课程设计,我巩固了以前学过的知识,懂得了理论与实践相结合的重要性,只有理论知识是远远不够的,理论知识是为将来的实践服务的,理论知识很重要,实践活动更重要。
通过课程设计我看到自己实际操作能力的严重不足,知识理解不够深刻,掌握不够牢固,编程基础薄弱,没有耐心。
在同学和相关资料的帮助下,最终完成了代码。
通过这次设计,我看到自身学习方法存在很多不足,我决心在以后的学习过程中,要多锻炼自己处理实际问题的能力,要提高独立分析问题和解决问题的能力,多动手多上机操作。
并且利用假期时间进一步巩固数据结构课程与C语言基础,为今后的学习打下比较坚实的基础。
最后,谢谢同学的帮助,谢谢老师的指导和教诲。