数据结构课程设计交通灯管理含最终的报告.docx
- 文档编号:12905051
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:16
- 大小:88.49KB
数据结构课程设计交通灯管理含最终的报告.docx
《数据结构课程设计交通灯管理含最终的报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计交通灯管理含最终的报告.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构课程设计交通灯管理含最终的报告
数据结构课程设计
设计题目交通灯管理系统
学生姓名吴军
学号11s2156124
专业班级11计科专升本
指导教师余云
信息工程学院计算机科学与技术系
安徽新华学院课程设计成绩评定表(本科)
课题名称
交通灯管理系统
院系
信息工程学院
年级专业
11计科专升本
学号
姓名
成绩
11s2156124
吴军
课题设计
目的与
设计意义
1、课题设计目的:
城市的日益发展带来了很多的交通道路问题,其中有关于交通灯的设计管理问题尤为重要。
本次课程设计的目的在于解决多岔道的交通路口信号灯的解决方案,既要使车辆安全有序地通过路口,又要使得路口的流通量最大
2、课题设计意义:
熟练运用离散数学的知识,利用数学建模简化实际问题;将数学模型实现计算机语言的转化;灵活运用数据结构中的各种数据结构,存储结构以及运算,为建立的数学模型选择合理的数据结构,存储结构以及运算;加深对数据结构算法的理解,以及能够分析算法的优劣
指导教师:
年月日
目录
一需求分析4
1.1设计背景4
1.2任务概述4
二、详细设计5
2.1数据结构5
2.2算法流程图6
2.2.1建立邻接矩阵的流程图6
2.2.2交通灯颜色模块的流程图6
2.3函数之间的调用关系图7
2.3.1输入图函数7
2.3.2染色函数8
2.3.3定位函数8
2.3.4主程序9
三、调试分析9
3.1经验体会9
3.2算法改进10
四、用户手册10
五、测试结果10
六、附录12
多叉路口交通灯管理
一需求分析
1.1设计背景
通常,在十字路口只需设红、绿两色的交通灯便可以保证正常的交通秩序,而在多叉路口需设计几种颜色的交通灯才能既使车辆相互之间不碰撞,又能达到车辆的最大流量。
该程序就是在多叉路口情况下,判断各个路口交通灯颜色,以便人们进行管理。
对于用户任意输入的多叉路口(实际输入所有的可以通行的方向及数量,从而构建出图),输出需要的交通灯的数量。
1.2任务概述
假设有一个如图1所示的五叉路口,其中C和E为单行道。
在路口有13条可行的道路,其中有的可以同时通行,如A—>B和E—>C,而有的不能同事通行,如E—>B,A—>D,那么,如何设置交通灯呢?
每个圆圈表示五叉路口上的一条通路,两个圆圈之间的连线表示这两个圆圈表示的两条道路不能同事通行。
设置交通灯的问题等价为对图的顶点进行染色问题。
要求对图上的每个顶点染一种颜色,并且要求有限相连的两个顶点不能具有相同颜色,而且总的颜色种类尽可能少。
所以,我准备把每个顶点用字母“a、b、c、……”表示,而染色的颜色用数字表示。
可以同时通行的道路交通灯的颜色相同,不能同时通行的颜色不同。
顶点AB为a,AC为b,AD为c,BA为d,BC为e,BD为f,DA为g,DB为h,DC为i,EA为j,EB为k,EC为l,ED为m,顶点之间的边全都用“1”表示。
二、详细设计
2.1数据结构
首先,是考虑数据类型。
在多叉路口中,每条通路是最基本的组成部分,对于交通灯管理已经不可能在细分了,所以选定通路作为数据的基本类型,并在程序中定义图的数据结构,其中包含存放图的顶点和图的边,以及顶点数和边数。
用邻接矩阵表示图的结构。
其形式描述如下:
intcolor[30]={0};//来存储对应块的对应颜色
typedefcharvextype;
typedefintadjtype;
typedefstruct//定义图
{
vextypevexs[MAXedg];//存放边的矩阵
adjtypearcs[MAXedg][MAXedg];//图的邻接矩阵
intvnum,arcnum;//图的顶点数和边数
}Graph;
在选择数据结构方面,直接用数组来存储数据,即使是在内存中也用数组来处理数据间的联系。
运用顺序表这个结构虽然不是那么直观,但在查找数据时的算法设计比较简单容易实现,效率高,而且在内存中的数据可以直接读入到文件中,文件中的数据也可以直接读入内存,不需要进行转换。
所以在衡量的各个方面之后,我决定用数组来处理数据间的联系。
2.算法流程图
2.2.1建立邻接矩阵的流程图
图2-1邻接矩阵流程图
2.2.2交通灯颜色模块的流程图
图2-2交通灯颜色模块流程图
3.函数之间的调用关系图
构想好总体规划之后,便开始设计程序中需要用到的各个功能函数,输入图函数、染色函数、输出函数等。
图3-1函数关系图
2.3.1输入图函数
voidCreate(Graph&G)
考虑到输入的问题,就是在输入界面以何种形式输入,输入顶点和边数以及边的权值在计算机内部建立数组存储。
部分代码如下:
printf("输入多叉路口的顶点数和边数:
\n");
scanf("%d%d",&G.vnum,&G.arcnum);
getchar();
printf("输入多叉路口的各顶点:
\n");
for(i=1;i<=G.vnum;i++)
{
scanf("%c",&G.vexs[i]);
getchar();
}
printf("输入边的两个顶点和权值:
\n");
for(k=0;k { scanf("%c",&v1);getchar(); scanf("%c",&v2);getchar(); scanf("%d",&w);getchar(); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j]=w; G.arcs[j][i]=w; } 2.3.2染色函数 给各个顶点染色,然后输出染色结果,并调用判断颜色是否满足要求函数。 从第一个顶点开始染色,而后判断和其相邻的顶点的颜色是够与第一个顶点相同。 部分代码如下: voidtrycolor(ints,GraphG) if(s>G.vnum) { output(G); exit (1); } else { for(i=1;i<=N;i++)//对每一种色彩逐个测试 { color[s]=i; if(colorsame(s,G)==0) trycolor(s+1,G);//进行下一块的着色 } } 2.3.3定位函数 在已经输入的图中,找到与要记录的顶点在图中的位置,返回值是在数组中的位置。 部分代码如下: intLocateVex(GraphG,charu) for(i=1;i<=G.vnum;i++) { if(u==G.vexs[i]) returni; } if(i==G.vnum) { printf("Erroru! \n"); exit (1); } return0; 2.3.4主程序 intmain() { inti,j; GraphG; Create(G); printf("多叉路口的各顶点: \n"); for(i=1;i<=G.vnum;i++) printf("%c",G.vexs[i]); printf("\n"); printf("相应的亮灯方案: \n"); trycolor(1,G); return0; } 三、调试分析 3.1经验体会 通过这次课设,体会很深刻,将一直以来学到的东西都运用到实际上来,学以致用,对所学知识有了更深刻的理解,同时还发现了许多平时在书本上没有遇见过的问题,促进了自己对知识的渴望,遇见了问题,就希望能够通过查找课外书来解决它们。 刚接触题目的时候,自己就有了一定的想法,觉得这个程序做起来是问题不大的,但到了自己真正开始编程的时候却发现远远没有想象中那么简单,很多细节的问题没有预想到,很多关系的处理想得过于简单,以至于实施起来遇到了很大的困难,花了大量的时间。 3.2算法改进 关于这个程序的缺点方面,由于自己花的时间不是很多,再加上知识有限,并不会运用可视化编程工具来辅助自己编程,所以弄得这个程序的不足之处还是挺多的,首当其冲的是程序界面,一开始的时候是注重功能的实现,并没有怎么理会运用界面,而到了后期,当辛辛苦苦搞好了功能之后,界面就没有动力再去弄了,所以程序的界面很粗糙。 四、用户手册 在VC++环境下,运行该程序。 根据提示输入多叉路口的顶点数和边数,例如五叉路口的情况,顶点13个,20条边,就输入1320然后回车,根据提示输入顶点abcdefghijklm回车,根据提示输入两个顶点和权值aj1ae1…回车,程序结果就出现在屏幕上了“亮灯方案: 1111223312441” 五、测试结果 正确输入时结果如下图 第一组: 图1: 输出界面图一 第二组: 图2: 输出界面图二 第三组: 图3输出界面图三 第四组: 错误输入后,如果不按照要求输入,测试结果: 系统没能作出良好提示,突然退出 图4出错界面 六、附录 #include #include #defineMAXedg30 #defineMAX0 #defineN4//亮灯的颜色数 intcolor[30]={0};//来存储对应块的对应颜色 typedefcharvextype; typedefintadjtype; typedefstruct//定义图 { vextypevexs[MAXedg];//存放边的矩阵 adjtypearcs[MAXedg][MAXedg];//图的邻接矩阵 intvnum,arcnum;//图的顶点数和边数 }Graph; intLocateVex(GraphG,charu) { inti; for(i=1;i<=G.vnum;i++) { if(u==G.vexs[i]) returni; } if(i==G.vnum) { printf("Erroru! \n"); exit (1); } return0; } voidCreate(Graph&G)//输入图 { inti,j,k,w; vextypev1,v2; printf("输入多叉路口的顶点数和边数: \n"); scanf("%d%d",&G.vnum,&G.arcnum); getchar(); printf("输入多叉路口的各顶点: \n"); for(i=1;i<=G.vnum;i++) { scanf("%c",&G.vexs[i]); getchar(); } printf("输入边的两个顶点和权值: \n"); for(k=0;k { scanf("%c",&v1);getchar(); scanf("%c",&v2);getchar(); scanf("%d",&w);getchar(); i=LocateVex(G,v1); j=LocateVex(G,v2); G.arcs[i][j]=w; G.arcs[j][i]=w; } } intcolorsame(ints,GraphG)//判断这个颜色能不能满足要求 { inti,flag=0; for(i=1;i<=s-1;i++)//分别于前面已经着色的几块比较 if(G.arcs[i][s]==1&&color[i]==color[s]) {flag=1;break;} returnflag; } voidoutput(GraphG) { inti; for(i=1;i<=G.vnum;i++) printf("%d",color[i]); printf("\n"); } voidtrycolor(ints,GraphG)//s为开始图色的顶点,从1开始 { inti; if(s>G.vnum) { output(G); exit (1); } else { for(i=1;i<=N;i++)//对每一种色彩逐个测试 { color[s]=i; if(colorsame(s,G)==0) trycolor(s+1,G);//进行下一块的着色 } } } intmain() { inti,j; GraphG; Create(G); printf("多叉路口的各顶点: \n"); for(i=1;i<=G.vnum;i++) printf("%c",G.vexs[i]); printf("\n"); printf("相应的亮灯方案: \n"); trycolor(1,G); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 交通灯 管理 最终 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)