关键路径-数据结构课程设计任务书
- 格式:doc
- 大小:174.17 KB
- 文档页数:23
《数据结构》课程设计任务书计算机与通信学院2018-5湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院湖南工业大学计算机与通信学院湖南工业大学计算机与通信学院湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书湖南工业大学计算机与通信学院《数据结构》课程设计任务书。
《数据结构》课程设计报告课程题目:关键路径学院:班级:学号:XX:指导教师:完成日期:目录一、需求分析3二、概要设计4三、详细设计5四、调试分析11五、用户使用说明12六、测试结果13七、附录13一、需求分析1、问题描述AOE网(即边表示活动的网络),在某些工程估算方面非常有用。
它可以使人们了解:(1)研究某个工程至少需要多少时间?(2)哪些活动是影响工程进度的关键? 在AOE网络中,从源点到汇点的有向路径可能不止一条,但只有各条路径上所有活动都完成了,这个工程才算完成。
因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和,这条路径就叫做关键路径(critical path)。
2、设计步骤(1)、以某一工程为蓝本,采用图的结构表示实际的工程计划时间。
(2)、调查并分析和预测这个工程计划每个阶段的时间。
(3)、用调查的结果建立AOE网,并用图的形式表示。
(4 )、用CreateGraphic ()函数建立图的邻接表存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中。
(5)、用SearchMaxPath()函数求出最大路径,并打印出关键路径。
(6)、编写代码并调试、测试通过。
3、测试数据○v2○v5○v1○v4○v6○v36v1 v2 v3 v4 v5 v68v1 v2 a1 3v1 v3 a2 2v2 v4 a3 2v2 v5 a43v3 v4 a5 4v3 v6 a6 3v4 v6 a7 2v5 v6 a8 1二、概要设计为了实现上述函数功能:1、抽象数据类型图的定义如下:ADT Graph {数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR};VR={<v,w>|v,w∈V,且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义和信息}基本操作:InitGraph(G);初始条件:图G存在。
《数据结构》课程设计说明书题目:求网中的关键路径班级计科1203 组别:完成时间:指导老师:学号:组长:学号:组员1:学号:组员2:学号:组员3:成绩:目录一需求分析 (1)1.1题目内容与要求 (1)1.2题目理解与功能分析 (1)二概要设计 (3)2.1设计思路 (3)2.2系统模块图 (4)2.2 系统模块图 (3)3.1图存储结构的建立 (4)3.2求取关键路径 (8)3.3主程序建立 (10)四实验结果 (11)五课程设计心得 (12)六参考文献 (13)一需求分析1.1题目内容与要求内容:自拟定合适的方式,从键盘上输入一个AOE网,并用合适的存储结构存储该AOE网,然后求出该AOE网的关键路径。
基本要求:1.输入AOE网的方式要尽量的简单方便;2.要能够较形象地观察AOE网和它的关键路径;3.课程设计报告必须符合课程设计报告规范;4.提交合格的课程设计报告,经指导教师测试课设完成(验收)程序,课设完成;1.2 题目理解与功能分析该题实质要求用数据结构中的图形知识编写一个求无循环有向帯权图中从起点到终点所有路径,经分析、比较求出长度最大路径,从而求出关键路径。
通常我们用有向图表示一个工程。
在这种有向图中,用顶点表示活动,用有向边<Vi,Vj>表示活动Vi必须先于活动Vj进行。
如果在这种图中用有向边表示一个工程中的各项活动(ACTIVITY),用有向边上的权值表示活动的持续时间(DURATION),用顶点表示事件(EVENT),则这种的有向图叫做用边表示活动的网络,简称AOE网络。
在AOE网络中,从源点到各个顶点,可能不止一条。
这些路径的长度也可能不同。
不同路径所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。
因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。
这条路径长度就叫做关键路径(critical path)。
平顶山工学院《数据结构》课程设计任务书班级0814101/2专业计算机科学与技术课程名称数据结构指导教师张芳芳、杨斌、张延红计算机科学与工程系2018年2月《数据结构》课程设计任务书一、设计时间及地点1、设计时间:第1周2、设计地点:计算机系机房205、212二、设计目的和要求数据结构课程设计是在学完数据结构课程之后的实践教案环节。
该实践教案是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧。
要求学生在设计中逐步提高程序设计能力,培养科学的软件工作方法。
学生通过数据结构课程设计在下述各方面得到锻炼:1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、培养算法分析能力。
分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。
学生认真主动完成课程设计的要求,发挥自主学习的能力,充分利用时间,安排好课程设计,并在课程设计过程中不断检测自己的计划完成情况,及时向教师汇报。
三、设计题目和内容1、运动会分数统计任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子工程,和w 个女子工程。
工程编号为男子1……m,女子m+1……m+w。
不同的工程取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
<m<=20,n<=20)功能要求:<1)可以输入各个工程的前三名或前五名的成绩;<2)能统计各学校总分;<3)可以按学校编号或名称、学校总分、男女团体总分排序输出;<4)可以按学校编号查询学校某个工程的情况;可以按工程编号查询取得前三或前五名的学校。
《数据结构》课程设计任务书《数据结构》课程设计任务说明一、题目及选题规定1、课程设计题目1)航空客运订票系统2)用二叉树实现家谱的相关运算3)电话客户服务模拟2、选题规定数据结构课程设计需独立完成1个选题内容。
1)~3)选题中任选一个。
二、课程设计进度安排1.问题分析和任务定义(3学时)内容:根据设计题目的要求,充分分析和理解问题,明确问题要求做什么(不是怎么做?),限制条件是什么。
要求:掌握问题分析的方法,以无歧义的陈述说明程序设计的任务;了解以用例图来明确系统功能的方法。
重难点:以无歧义的陈述说明程序设计的任务;对问题作透彻分析,避免出现需求分析错误。
说明:本阶段是解决“做什么”的问题,就是要全面理解用户的各项要求,并准确表达所接受的用户需求。
2.逻辑设计和数据结构的选择(3学时)内容:为操作对象定义相应的数据结构,以结构化程序设计的思想方法为原则划分各个模块,定义数据的抽象数据类型。
要求:掌握逻辑设计和数据结构选择的方法。
重难点:逻辑设计和数据结构选择。
说明:本阶段的主要任务是把需求分析得到得数据流图转换为软件结构和数据结构。
设计软件结构的具体任务是:将一个负责系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。
数据结构设计包括数据特征的描述、确定数据的结构特性、以及数据库的设计。
总体设计建立的是目标系统的逻辑模型,与计算机无关。
3.详细设计和编码(5个学时)内容:算法的具体描述和代码的书写要求:掌握在逻辑设计基础上作详细设计的方法把详细设计的结果进一步求精为程序设计语言程序。
同时加入一些注解和断言,使程序中逻辑概念清楚。
重难点:在逻辑设计基础上作详细设计并编码实现。
说明:本阶段主要任务是设计每个模块的实现算法、所需的局部数据结构。
详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。
4.上机调试(4个学时)内容:源程序的输入和代码的调试要求:能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。
《数据结构》课程设计任务书一、课程设计教学目的及基本要求1. 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2. 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;5. 独立完成或分组完成;6. 题材不限,或从参考题目中任选一题;7. 仅限用C语言编写程序;8. 7月3日前完成。
9./jsjxy/jpkc/中课程资源有五份课程设计样例,格式可以参照,不能抄袭!10.允许分小组完成,每组最多3人组成,每人分别都要提交自己的课程设计报告,并填写附录文件“09软工数据结构课程设计分组情况.xls”。
11.同一个题目不能超过6个小组选作,“整个专业分组表”请2个班班长一起汇总,6月15日前发我信箱huangsix@。
12.每个同学设计报告命名“学号姓名.doc”,7月3日前“按班级”打一个压缩包发我信箱。
二、课程设计步骤1. 问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?2. 逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。
逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;3. 详细设计:定义相应的存储结构并写出各函数的伪码算法。
在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。
详细设计的结果是对数据结构和基本操作作出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;4. 程序编码:把详细设计的结果进一步求精为程序设计语言程序。
课程设计任务书《数据结构》课程设计一、课程设计的目的课程设计是《数据结构》课程教学必不可缺的一个重要环节,可加深学生对该课程所学内容的进一步的理解与巩固,是将计算机课程与实际问题相联接的关键步骤。
通过课程设计,能够提高学生分析问题、解决问题,从而运用所学知识解决实际问题的能力,因而必须给予足够的重视。
二、课程设计的要求1.明确课设任务,复习与查阅有关资料。
2.按要求完成课设内容,课设报告要求文字和图工整、思路清楚、正确。
3.应用程序应具有一定的可用性。
凡用户输入时,给出足够的提示信息。
格式明显易懂,使用户感到方便使用。
4.程序具有一定的健壮性,不会因为用户的输入错误引起程序运行错误而中断执行:对输入值的类型、大小范围、字符串的长度等,进行正确性检查,对不合法的输入值给出出错信息,指出错误类型,等待重新输入。
三、课程设计报告内容课程设计报告中应包括封面、内容摘要、关键词、目录、正文、参考文献、附录、致谢等几部分。
正文包括绪论、需求分析、概要设计、详细设计、调试分析、测试结果、总结等。
具体:(1)封面包括设计题目、所在系、专业、班级、姓名、指导教师姓名和完成日期。
(2)内容摘要应扼要叙述课设的主要内容、特点,文字要精练,是一篇具有独立性和完整性的短文,包括基本研究方法、理论与实际意义。
关键词是供检索用的主题词条,应采用能够覆盖课程设计报告主要内容的通用专业术语。
(3)绪论一般作为第1章,综述课程设计选题的目的、背景和意义,所要研究的主要内容。
(4)需求分析陈述说明课程设计的任务。
明确规定:输入/输出形式和输出值的范围;程序所能达到的功能;测试的数据:包括正确的输入和错误的输入及其相应的输出结果。
(5)概要设计包括设计思想、实现方法、系统中主要函数及各函数间的关系描述。
(6)详细设计包括实现概要设计中定义的所有数据类型,对每个操作需要写出伪代码算法。
(7)调试分析包括:调试过程中遇到的问题,如何解决的以及对设计实现的回顾讨论和分析;对算法的分析和改进设想;经验和体会等。
《数据结构》课程设计教学任务书12级信息课程设计周数:2周一、课程设计的目的数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;⏹训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二、课程设计的基本要求1、独立思考,独立完成:每人任选一题,在课程设计中各任务要求独立完成,遇到问题大家可以相互讨论,互相调试检查,但不可以拷贝。
2、按照课程设计的具体要求建立的功能模块,每个模块要求按照如下几个内容认真完成;其中包括:a)需求分析:在该部分中叙述,每个模块的功能要求b)概要设计在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义。
c)详细设计各个算法实现的源程序(可放在附录中),对每个题目要有相应的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
d)调试分析测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法的改进设想等。
中北大学数据结构课程设计说明书2011年12月20日设计内容:设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。
1、对一个描述工程的AOE网,应判断其是否能够顺利进行。
2、若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及每一个关键活动所依附的两个顶点、最早发生时间、最迟发生时间。
设计要求:(1) 符合课题要求,实现相应功能;(2) 要求界面友好美观,操作方便易行;(3) 注意程序的实用性、安全性;1.本设计所采用的数据结构(图)程序流程图2.功能模块详细设计2.1 详细设计思想主函数switch()对条件进行选择判断,进入关键路径的程序,然后对结点数的接收,分配相应的存储空间,构建AOE-网,逐个对图结点信息(包括俩邻接点,权值)输入接收,并与分配存储空间。
寻找关键路径:构建栈用与存储拓扑排序序列,求得每个接点的相应最早发生时间,最迟完成时间,关键事件的求取,并输出关键路径。
2.2 核心代码#include "stdafx.h"#include <cstdio>#include <cstdlib>#include <iostream>#include <iomanip>#include <process.h>using namespace std;//#define PROJECTUNMBER 9//10//#define PLANNUMBER 11//13typedef struct node{int adjvex;int dut;struct node *next;}edgenode;typedef struct{int projectname;int id;edgenode *link;}vexnode;//vexnode Graphicmap[PROJECTNUMBER];void GreateGraphic(vexnode* Graphicmap,int projectnumber,int activenumber){int begin,end,duttem;edgenode *p;for(int i=0;i<projectnumber;i++){Graphicmap[i].projectname=i;Graphicmap[i].id=0;Graphicmap[i].link=NULL;}printf("某项目的开始到结束在图中的节点输入<vi,vj,dut>\n");printf("如:3,4,9回车表示第三节点到第四节点之间的活动用了9个单位时间\n");printf("*********************************************\n");for(int k=0;k<activenumber;k++){scanf("%d,%d,%d",&begin,&end,&duttem);p=(edgenode*)malloc(sizeof(edgenode));p->adjvex=end-1;p->dut=duttem;Graphicmap[end-1].id++;p->next=Graphicmap[begin-1].link;Graphicmap[begin-1].link=p;}}int SearchMapPath(vexnode* Graphicmap,int projectnumber,int activenumber,int& totaltime){int i,j,k,m=0;int front=-1,rear=-1;int* topologystack=(int*)malloc(projectnumber*sizeof(int));//用来保存拓扑排列int* vl=(int*)malloc(projectnumber*sizeof(int));//用来表示在不推迟整个工程的前提下,vl允许最迟发生时间int* ve=(int*)malloc(projectnumber*sizeof(int));//用来表示vj最早发生时间int* l=(int*)malloc(activenumber*sizeof(int));//用来表示活动Ai最迟完成开始时间int* e=(int*)malloc(activenumber*sizeof(int));//表示活动最早开始时间edgenode *p;totaltime=0;for(i=0;i<projectnumber;i++) ve[i]=0;for(i=0;i<projectnumber;i++){if(Graphicmap[i].id==0){topologystack[++rear]=i;m++;}}while(front!=rear){front++;j=topologystack[front];m++;p=Graphicmap[j].link;while(p){k=p->adjvex;Graphicmap[k].id--;if(ve[j]+p->dut>ve[k])ve[k]=ve[j]+p->dut;if(Graphicmap[k].id==0)topologystack[++rear]=k;p=p->next;}}if(m<projectnumber){printf("\n本程序说建立的图有回路不可计算出关键路径\n");printf("将退出本程序\n");return 0;}totaltime=ve[projectnumber-1];for(i=0;i<projectnumber;i++)vl[i]=totaltime;for(i=projectnumber-2;i>=0;i--){j=topologystack[i];p=Graphicmap[j].link;while(p){k=p->adjvex;if((vl[k]-p->dut)<vl[j])vl[j]=vl[k]-p->dut;p=p->next;}}i=0;printf("|起点|终点|最早开始时间|最迟完成时间|差值| 备注|\n");for(j=0;j<projectnumber;j++){p=Graphicmap[j].link;while(p){k=p->adjvex;e[++i]=ve[j];l[i]=vl[k]-p->dut;printf("| %4d | %4d | %4d | %4d | %4d |",Graphicmap[j].projectname+1,Graphicmap[k].projectname+1,e[i],l[i],l[i]-e[i]);if(l[i]==e[i])printf("关键活动 |");printf("\n");p=p->next;}}return 1;}void seekkeyroot(){int projectnumber,activenumber,totaltime=0;system("cls");printf("请输出这个工程的化成图形的节点数:");scanf("%d",&projectnumber);printf("\n");printf("请输入这个工程的活动个数:");scanf("%d",&activenumber);printf("\n");vexnode*Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode));GreateGraphic(Graphicmap,projectnumber,activenumber);SearchMapPath(Graphicmap,projectnumber,activenumber,totaltime);printf("整个工程所用的最短时间为:%d个单位时间\n",totaltime);system("pause");}int main(){char ch;for(;;){do{system("cls");printf("| 欢迎进入求关键路径算法程序 |");for(int i=0;i<80;i++)printf("*");printf("\n");printf("%s","(S)tart 开始输入工程的节点数据并求出关键路径\n");printf("\n");printf("%s","(E)xit 退出\n");printf("\n");printf("%s","请输入选择:");scanf("%c",&ch);ch=toupper(ch);if(ch!='S'&&ch!='E')printf("请输入正确的字符!\n");system("pause");}while(ch!='S'&&ch!='E');switch(ch){case'S':seekkeyroot();break;case'E':return 1;}}}2.3程序运行结果输入S开始程序(如图)输入节点数和活动个数(如图)输入E,退出程序3.课程设计心得这次的课程设计主要是对基础知识的灵活使用,这就让我进一步提高了对数据结构知识的巩固。
一.课程设计的任务每位同学做两题:一题在设计题中每人相对应一题号另一题必选题(每个班级有一必选题)二. 要求:1、对相应的题目进行算法设计2、编写源代码3、上机调试4、显示调试结果5、写出实验总结三.课程设计进度安排设计总学时为2周课程设计每周大体分五个阶段:1、选题与搜集资料:每人选择相应题目,进行课程设计课题的资料搜集.2、分析与概要设计:根据搜集的资料,进行程序功能与数据结构分析,并选择合适的数据结构,并在此基础上进行实现程序功能的算法设计.3、程序设计:运用掌握C语言编写程序,实现所程序的各个模块功能.4、调试与测试:自行调试程序,成员交叉测试程序,并记录测试情况.5、实习报告:编写实习报告6、验收与评分:指导教师对每个小组的开发的系统,及每个成员开发的模块进行综合验收.结合设计报告,根据课程设计成绩的评定方法,评出成绩.四.课程设计考核标准考核时主要有如下几项参考:1、初步设计内容的考核:是否有查阅资料能力?是否有设计思想?2、程序编码能力调试能力的考核:程序是否清晰、易读?在技算计上是否可独立完成程序的调试,是否熟练?3、说明书质量的考核:设计结构是否合理?叙述是否正确?方案是否可行?4、答辩:设计结果的调试能力,对自己设计是否熟练?5、出勤率极平时表现的考核:出勤超过2次不到者成绩为不及格。
五.课程设计报告的内容设计结束后要写出课程设计报告,以作为整个课程设计评分的书面依据和存档材料.设计报告以规定格式的电子文档书写,打印并装订,排版及图,表要清楚,工整.装订顺序如下:封面、目录、正文.正文包括以下7个内容:1.需求分析陈述说明程序设计的任务,强调的是程序要做什么,需要什么结果、所能达到的功能.2.概要设计说明本程序中用到的所有抽象数据类型的定义,主程序的流程以及各程序模块之间的层次(调用)关系.3.详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);可采用流程图、N S 图进行描述,画出函数和过程的调用关系图.4.调试分析内容包括:a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;c.经验和体会等.5.测试结果列出你的测试结果,包括输入和输出.这里的测试数据应该完整和严格,最好多于需求分析中所列.6.参考文献列出参考的相关资料和书籍.封面格式如下:数据结构课程设计报告题目——采用的方法班级:_________________________姓名:__________________________ 指导教师:__________________________ 成绩:__________________________信息工程学院年月日。
课程设计(论文)任务书软件学院软件工程专业2011 - 2班一、课程设计(论文)题目数据结构课程设计二、课程设计(论文)工作自2012 年12月17日起至2012 年12月18 日止。
三、课程设计(论文) 地点: 软件工程实训中心四、课程设计(论文)内容要求:1.本课程设计的目的(1)使学生熟练掌握抽象数据类型的组织和定义;(2)使学生熟练掌握数据类型的定义和实现;(3)培养学生组织和分析数据的能力;(4)培养学生分析和应用基于不同数据结构的算法的能力;(5)提高学生的科技论文写作能力。
2.基本要求:每位同学在以下题目中任选一题(在方框中打勾),独立完成课程设计:□稀疏矩阵运算:实现稀疏矩阵的输入、输出、加减乘的运算。
□关键路径:求出完成整项工程至少需要多少时间以及整项工程中的关键活动。
(1)能够输入并存储一个描述工程的AOE网;(1)对输入的AOE网,应判断其是否能够顺利进行;(2)若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及每一个关键活动所依附的两个顶点、最早发生时间、最迟发生时间。
□银行业务模拟:参见《数据结构》教材P68。
3.课程设计论文编写要求(1)要按照书稿的规格打印誊写课设报告;(2)报告分为封面、任务书(本文档)、正文、课程设计体会和参考文献四部分;学生签名:年月日课程设计(论文)评审意见(1)题目分析(20分):优()、良()、中()、一般()、差();(2)流程分析(30分):优()、良()、中()、一般()、差();(3)数据定义(30分):优()、良()、中()、一般()、差();(4)代码编写(10分):优()、良()、中()、一般()、差();(5)创新能力(10分):优()、良()、中()、一般()、差();(6)格式规范性、设计态度及考勤是否降等级:是()、否()评阅人:职称:讲师年月日正文一、数据结构定义1.抽象数据类型本设计中用到的数据结构ADT定义如下:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR}VR={<v,w>|v,w (- V且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义或信息} 基本操作P:CreateGraph(* G ,V,VR)初始条件:V是图的顶点集,VR是图中弧的集合。
操作结果:按V和VR的定义构造图G。
Thelongestkey_Way(* G ,V,VR ,T)初始条件:图G存在,T表示完成此项工程至少需要的时间。
操作结果:利用V和VR计算出结果T。
ThekeyWay( )//关键活动函数初始条件:图G存在,函数调用的程序函数。
操作结果:输入V和VR计算结果T。
}ADT Graph2.存储结构定义数据存储结构的C语言定义如下://邻接表类型typedef struct ANode //弧的节点结构类型{int adjvex; //弧的终点位置(弧头)int dut; //弧的权值struct ANode *nextarc; //指向下一条弧的指针}ArcNode;typedef struct //头结点的类型{int projectname; //顶点域int id; //顶点的入度信息ArcNode *firstarc; //指向第一条弧}V exnode;3.基本操作数据结构的基本操作实现如下:void CreateGraph(V exnode* G,int projectnum,int activenum)初始条件:projectnum是图的顶点集,activenum是图中弧的集合即活动时间。
操作结果:输入顶点数和弧的值,构造图G。
int Thelongestkey_Way(V exnode* G,int projectnum,int activenum,int& totaltime)初始条件:图G存在,totaltime是计算图中工程的时间。
操作结果:由存在的图G,利用顶点和弧的关系信息,计算出工程至少需要的时间。
void ThekeyWay( )初始条件:由上面两个函数存在。
操作结果:显示进入求关键活动的结果。
Int main( )初始条件:由上面函数存在。
操作结果:显示最终结果。
二、解题过程1.问题分解该问题主要应实现以下功能:(1)计算完成整个工程的至少需要的时间。
(2)确定关键路径,以找出哪些活动时影响工程进度的关键。
因此须计算以下几点:a.事件的最早发生时间ve[k];b.事件最迟发生时间vl[k];c.活动最早开始时间ee[i];d.活动的最迟开始时间el[i];计算其过程必须分别在拓扑有序和逆拓扑有序的前提下进行。
也就说,ve[k]必须在事件vk所有前驱的最早发生的时间求得之后才能确定。
因此,可以在拓扑排序的基础上计算ve[k]和vl[k]。
由此得到求解关键路径的方法:首先输入e条有向边<i,j>,建立AOE-网的邻接表存储结构;然后从始点出发,令事件的最早发生时间为0,按拓扑有序求其余各顶点时间的最早发生时间ve[k];(代码如下)while(p) {k=p->adjvex ;Graph[k].id --;if(ve[j]+p->w >ve[k])ve[k]=ve[j]+p->w ;}接着从终点出发,令事件最迟发生时间等于其最早发生时间,按逆拓扑排序求其余各顶点事件最迟发生时间vl[k];最后根据各顶点事件的ve和vl值,求所有活动最早开始时间ee和最迟开始时间el。
如果某活动满足条件ee=el,则为关键活动。
(代码如下)if(ee==el) //关键活动printf("是");同时,为计算各顶点事件的ve值是在拓扑排序的过程中进行的,因此需一个队列来记录拓扑排序,如果顶点的入度为0,则该顶点从队尾进入队列,拓扑排序时,从队头出队列。
(代码如下)if(G[k].id ==0)//如果入度为0,则入队TopoQueue[++rear]=k;p=p->nextarc ; // 指向下一个结点2.模块结构系统主要由 4 个模块组成,分别是:(1)创建图(2)求完成此项工程至少要多少时间(3)求关键活动函数(4)主函数模块之间的结构如下:3.解题思路各模块的实现步骤为(1)首先主函数main( );(2)调用实现求关键活动的函数ThekeyWay();(3)再调用CreateGraph(V exnode* G,int projectnum,int activenum);创建图;(4)再调用Thelongestkey_Way(V exnode* G,int projectnum,int activenum,int& totaltime);求完成此项工程至少要多少时间三、实现#include<stdio.h>#include<stdlib.h> //malloc(); free(); exit();#include<iomanip.h> //I/O控制头文件#include <process.h> //控制过程函数system("cls");//邻接表类型typedef struct ANode //弧的节点结构类型{int adjvex; //弧的终点位置(弧头)int dut; //弧的权值struct ANode *nextarc; //指向下一条弧的指针}ArcNode;typedef struct //头结点的类型{int projectname; //顶点域int id; //顶点的入度信息ArcNode *firstarc; //指向第一条弧}V exnode;void CreateGraph(V exnode* G,int projectnum,int activenum)//创建图{int begin,end,duttem; // 弧的前结点,尾结点,活动时间ArcNode *p;// 弧指针for(int i=0;i<projectnum;i++){G[i].projectname=i;//顶点命名G[i].id =0;//顶点信息的度数均赋值为零G[i].firstarc =NULL; //顶点指针为空}printf("\n");printf("请输入活动工程的信息,温馨提示:(请用int型格式输入:弧尾,弧头,活动时间)\n");printf("例如:输入1,2,3 即代表弧<1,2>的活动时间为3。
\n");printf("\n");for(int k=0;k<activenum;k++) //activenum为活动的数目,即弧的条数{scanf("%d,%d,%d",&begin,&end,&duttem); //输入弧的前结点,尾结点,活动时间p=(ArcNode*)malloc(sizeof(ArcNode));//开辟弧的存储空间pp->adjvex =end-1;//数组下标从0开始记录,故减一,将弧头插入邻接表内p->dut =duttem; //此弧的活动时间为duttemG[end-1].id ++; //弧头指向,入度+1p->nextarc=G[begin-1].firstarc ;//插入弧p,使得下一结点作为下一条弧的弧尾(前结点)G[begin-1].firstarc =p;}}int Thelongestkey_Way(V exnode* G,int projectnum,int activenum,int& totaltime) // 求完成此项工程至少要多少时间{int i,j,k,m=0;int front=-1,rear=-1;int* TopoQueue=(int*)malloc(projectnum*sizeof(int));// 用拓扑序列保存数据int* vl=(int*)malloc(projectnum*sizeof(int));//vl表示最迟发生时间int* ve=(int*)malloc(projectnum*sizeof(int));//ve表示最早发生时间int* l=(int*)malloc(activenum*sizeof(int));//l表示活动最迟开始时间int* e=(int*)malloc(activenum*sizeof(int));//e表示活动最早开始时间ArcNode *p;totaltime=0; //完成此工程至少需要的时间for(i=0;i<projectnum;i++)ve[i]=0;//活动的最早发生时间均赋值为0for(i=0;i<projectnum;i++){if(G[i].id==0) //入度为0,即为头结点{TopoQueue[++rear]=i;//所有头结点队尾插入,且队尾指针+1m++; //记录入队列的顶点个数}}while(front!=rear) //队列不为“空”{front++; // 出队列,队头指针+1j=TopoQueue[front]; // 结点依次出队列m++; // 记录结点数p=G[j].firstarc ; // 指向其下一个顶点{k=p->adjvex ; // 弧头G[k].id --;// 删除一个入度为0的前结点和其弧,入度减一if(ve[j]+p->dut >ve[k])// 将最长路径赋值给ve[k]ve[k]=ve[j]+p->dut ;if(G[k].id ==0)//如果入度为0,则入队TopoQueue[++rear]=k;p=p->nextarc ; // 指向下一个结点}}if(m<projectnum)//设有环,则不能遍历{printf("\n工程建立的图有环,不能计算关键路径!\n");printf("即将退出工程!谢谢使用!\n");return 0;}totaltime=ve[projectnum-1];//完成的至少时间为所有结点累加的时间和for(i=0;i<projectnum;i++)vl[i]=totaltime;for(i=projectnum-2;i>=0;i--)// 逆拓扑排序,求vl{j=TopoQueue[i];p=G[j].firstarc ;{k=p->adjvex ; //指向弧头if((vl[k]-p->dut )<vl[j])vl[j]=vl[k]-p->dut ;p=p->nextarc ;}}i=0;printf("\n");printf("| 起点(弧尾)| 终点(弧头)| 最早开始时间| 最迟完成时间| 活动差值|关键活动\n");for(j=0;j<projectnum;j++){p=G[j].firstarc;while(p){k=p->adjvex ;e[++i]=ve[j];l[i]=vl[k]-p->dut;printf("| %10d | %10d | %12d | %12d | %8d |",G[j].projectname +1,G[k].projectname +1,e[i],l[i],l[i]-e[i]);if(l[i]==e[i]) //关键活动printf("是",G[j].projectname +1,G[k].projectname +1);printf("\n");p=p->nextarc ;}}return 1;}void ThekeyWay()//关键活动函数{int projectnum,activenum,totaltime=0;printf("\n");printf("-----------------------------------------------\n");printf("欢迎进入求关键活动系统!\n");printf("\n");printf("请输入项目中AOE-网的结点数:");scanf("%d",&projectnum);printf("请输入项目中AOE-网的活动数:");scanf("%d",&activenum);V exnode* G=(V exnode*)malloc(projectnum*sizeof(V exnode)); CreateGraph(G,projectnum,activenum);Thelongestkey_Way(G,projectnum,activenum,totaltime);printf("\n");printf("工程所需至少活动时间为:%d \n",totaltime); system("pause");}int main(){int a;system("cls");printf("**************************************************************\n");printf(" 亲!欢迎进入本应用程序\n");printf("**************************************************************\n");printf("\n (0) 退出本程序\n");printf("\n (1) 开始输入工程相关数据并求关键活动\n");printf("\n");printf("请输入选择0 or 1:");scanf("%d",&a);switch(a){case 1:ThekeyWay();break;case 0:printf("\n谢谢使用本程序!再见!\n");printf("\n作者:柯晔-11级2班19号!谢谢使用!\n");return 1;default:printf("无效的选项\n");}}四、实验结果1.实验数据1,2,61,3,41,4,52,5,13,5,14,6,25,7,95,8,76,8,47,9,28,9,42.实验结果(1)开始界面(2)测试正确数据①输入选择1进入程序②输入顶点数和弧数③输入活动时间④打印出关键活动和完成整项工程至少需要多少时间(3)测试错误数据注意:应输入的数为整型数据,若输入非整形的数据,则程序遇到问题关闭。