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