关键路径问题课程设计报告书Word格式文档下载.docx
《关键路径问题课程设计报告书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《关键路径问题课程设计报告书Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
(1)符合课题要求,实现相应功能;
(2)要求界面友好美观,操作方便易行;
(3)注意程序的实用性、安全性;
1.本设计所采用的数据结构(图)
程序流程图
2.功能模块详细设计
2.1详细设计思想
主函数switch()对条件进行选择判断,进入关键路径的程序,然后对结点数的接收,分配相应的存储空间,构建AOE-网,逐个对图结点信息(包括俩邻接点,权值)输入接收,并与分配存储空间。
寻找关键路径:
构建栈用与存储拓扑排序序列,求得每个接点的相应最早发生时间,最迟完成时间,关键事件的求取,并输出关键路径。
2.2核心代码
#include"
stdafx.h"
#include<
cstdio>
cstdlib>
iostream>
iomanip>
process.h>
usingnamespacestd;
//#definePROJECTUNMBER9//10
//#definePLANNUMBER11//13
typedefstructnode
{
intadjvex;
intdut;
structnode*next;
}edgenode;
typedefstruct
intprojectname;
intid;
edgenode*link;
}vexnode;
//vexnodeGraphicmap[PROJECTNUMBER];
voidGreateGraphic(vexnode*Graphicmap,intprojectnumber,intactivenumber)
intbegin,end,duttem;
edgenode*p;
for(inti=0;
i<
projectnumber;
i++)
{
Graphicmap[i].projectname=i;
Graphicmap[i].id=0;
Graphicmap[i].link=NULL;
}
printf("
某项目的开始到结束在图中的节点输入<
vi,vj,dut>
\n"
);
如:
3,4,9回车表示第三节点到第四节点之间的活动用了9个单位时间\n"
*********************************************\n"
for(intk=0;
k<
activenumber;
k++)
{
scanf("
%d,%d,%d"
&
begin,&
end,&
duttem);
p=(edgenode*)malloc(sizeof(edgenode));
p->
adjvex=end-1;
dut=duttem;
Graphicmap[end-1].id++;
next=Graphicmap[begin-1].link;
Graphicmap[begin-1].link=p;
}
intSearchMapPath(vexnode*Graphicmap,intprojectnumber,intactivenumber,int&
totaltime)
inti,j,k,m=0;
intfront=-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));
//表示活动最早开始时间
totaltime=0;
for(i=0;
i++)ve[i]=0;
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"
将退出本程序\n"
return0;
totaltime=ve[projectnumber-1];
vl[i]=totaltime;
for(i=projectnumber-2;
i>
=0;
i--)
j=topologystack[i];
if((vl[k]-p->
dut)<
vl[j])
vl[j]=vl[k]-p->
i=0;
|起点|终点|最早开始时间|最迟完成时间|差值|备注|\n"
for(j=0;
j<
j++)
e[++i]=ve[j];
l[i]=vl[k]-p->
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("
关键活动|"
return1;
voidseekkeyroot()
intprojectnumber,activenumber,totaltime=0;
system("
cls"
请输出这个工程的化成图形的节点数:
"
scanf("
%d"
projectnumber);
请输入这个工程的活动个数:
activenumber);
vexnode*Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode));
GreateGraphic(Graphicmap,projectnumber,activenumber);
SearchMapPath(Graphicmap,projectnumber,activenumber,totaltime);
整个工程所用的最短时间为:
%d个单位时间\n"
totaltime);
pause"
}
intmain()
charch;
for(;
;
)
do
system("
|欢迎进入求关键路径算法程序|"
for(inti=0;
80;
i++)printf("
*"
%s"
"
(S)tart开始输入工程的节点数据并求出关键路径\n"
(E)xit退出\n"
请输入选择:
scanf("
%c"
ch);
ch=toupper(ch);
if(ch!
='
S'
&
ch!
E'
请输入正确的字符!
}while(ch!
switch(ch)
case'
:
seekkeyroot();
break;
return1;
}
}
2.3程序运行结果
输入S开始程序(如图)
输入节点数和活动个数(如图)
输入E,退出程序
3.课程设计心得
这次的课程设计主要是对基础知识的灵活使用,这就让我进一步提高了对数据结构知识的巩固。
这次设计的完成,有很多难题让我都曾不知所措,但通过努力最终解决它们让我体会到成就感,更重要的是我的能力在无形中得到了提升和优化。
今后我会更加的努力,去充分的提升自己。
【此文档部分内容来源于网络,如有侵权请告知删除,本文档可自行编辑和修改内容,感谢您的支持!
】