操作系统-交通信号灯问题_第1页
操作系统-交通信号灯问题_第2页
操作系统-交通信号灯问题_第3页
操作系统-交通信号灯问题_第4页
操作系统-交通信号灯问题_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

I课程设计报告课程名称操作系统课题名称交通信号灯问题专业信息管理与信息系统班级1301班学号201303110131姓名李世伟指导教师谢雅2016年6月18日

湖南工程学院课程设计任务书课程名称操作系统课题交通信号灯问题专业班级信息管理与信息系统学生姓名李世伟学号201303110131指导老师谢雅审批任务书下达日期2016年6月3日任务完成日期2016年6月17日

一、设计内容与设计要求1.课程设计目的:《操作系统》课程设计是信管专业实践性环节之一,是学习完《操作系统》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。进一步提高上机动手能力,培养使用计算机解决实际问题的能力,为后继课程的学习和实验,以及毕业设计的完成打下扎实的基础。2.课题题目交通信号灯问题问题描述:一个十字路口,共有四组红绿灯,每个路口的车辆都遵循“红灯停,绿灯行”的原则,假设将每一台汽车都作为一个进程,请设计良好的机制,展示出合理的“十字路口交通管理”情况。车辆通行设定:路口宽度不限,对一个路口而言,只有当一辆车通过路口(越过对面路口的交通灯后),其后续车辆才能继续通过交通灯,车辆通过路口的时间可以固定,可以自行计算。进程的互斥:交通灯进程实际上是互斥的,即不能同时为红或者同时为绿。进程的消息通信或其通信方式:对车辆进程而言,每一个车辆在通过路口前,必须确认前面的车辆已经通过了路口。进程的调度:停留在一个路口的车辆,决定其前进或等候的因素是交通灯和前面车辆的状态,需要设计一个良好的进程调度机制来控制所有车辆的通行。3.设计要求:1.根据自己对应的课题完成以下主要工作:分析设计要求,给出解决方案,建立必要的数据结构,然后设计总体流程(包括界面)、详细设计必要的算法,并最终显示结果。基于WINDOWS或LINUX操作系统都可以,用何种编程语言都有可以。提交设计报告,包括设计要求、设计思想流程、设计所涉及的主要数据结构、程序清单、运行结果、设计心得、参考资料等。严禁抄袭,复制设计内容,查出后相关同学设计成绩以零分处理。所提交源程序应是能够运行通过的完整程序。提交不少于5000字的课程设计报告,含系统说明,系统功能图,流程图,程序设计说明,源程序清单2.设计过程中既要虚心接受老师的指导,又要充分发挥主观能动性、独立思考、努力钻研、勤于实践、勇于创新。3.在设计过程中,要严格要求自己,树立严密、严谨的科学态度,必须按时、保质、保量完成任务。要求独立完成规定的设计内容,不得弄虚作假,不准抄袭或拷贝他人的程序或其他内容。4.不得迟到、早退、旷课。缺课节数达两次以上者,成绩按不及格处理。二、进度安排第15周星期一14:30—18:30星期三14:30—18:30星期四14:30—18:30第16周星期二14:30—18:30星期三14:30—18:30星期四14:30—18:30目录1系统需求分析 系统需求分析1.1设计要求一个十字路口,共有四组红绿灯,每个路口的车辆都遵循"红灯停,绿灯行"的原则,假设将每一台汽车都作为一个进程,请设计良好的机制,展示出合理的"十字路口交通管理"情况.车辆通行设定:路口宽度不限,对一个路口而言,只有当一辆车通过路口(越过对面路口的交通灯后)后,其后续车辆才能继续通过交通灯,车辆通过路口的时间可以固定,可以自行计算。进程的互斥:交通灯进程实际上是互斥的,即不能同时为红或者同时为绿.进程的消息通信或其他通信方式:对车辆进程而言,每一个车辆在通过路口前,必须确认前面的车辆已经通过了路口.进程的调度:停留在一个路口的车辆,决定其前进或等候的因素是交通灯和前面车辆的状态,需要设计一个良好的进程调度机制来控制所有车辆的通行。1.2课程设计目的了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。1.3解决方案根据设计要求,在VC++6.0环境下编译,设计了一个能够实现自由模拟某一时段交通状况并能预测某辆车需要多久才能到达路口的系统程序,改程序达到了设计要求,成功地实现了要求功能。1.4系统开发与运行环境代码实现:C++语言程序开发工具:MicrosoftVisualC++6.0运行环境:windowsXP或更高版本操作系统执行方式:文件打开后直接执行窗口界面:MS-DOS窗口界面操作方式:全键盘控制操作需要相关专业技能:无2总体设计2.1函数定义说明本设计中,定义了两个函数实现P、V原语的操作,其中P(inti)函数实现了i方向上车辆等待数目减一,车辆编号增一以及输出的功能,V(inti)函数实现了时间的增加,交通转换灯的转换,无车标志的转换以及输出的功能。同时定义了东西调度函数ETW()和南北调度函数STN(),最后当然定义了main()来调用上述函数实现动态演示及预测功能2.2结构设计说明为了实现题设的要求,在VC++6.0环境下编译实现,整个系统的主要流程设计为如下步骤:1.定义全局变量用来存放实验所需基本信息2.change函数实现交换无车标志的功能3.P函数模拟P原语的功能4.V函数模拟V原语的功能5.ETW函数实现东西方向的车辆调度6.STN函数实现南北方向的车辆调度7.main函数实现程序的输入接口以及模拟演示2.3算法流程图2.4数据结构为了实现题设的要求,在VC++6.0环境下编译实现,整个系统的主要流程设计为如下步骤:1.定义全局变量用来存放实验所需基本信息2.change函数实现交换无车标志的功能3.P函数模拟P原语的功能3详细设计3.1模块描述图3-1交通信号灯模拟程序功能模块图3.2核心函数的设计设计P(inti)函数用来实现从i(东西南北)方向等待车辆中挑出当前的第一个并让其通行,同时记录此车的编号,输出此车的发车时间,代码如下:voidP(inti)//P函数,i为方向判断标志{ if(Max[i]>0) { Max[i]=Max[i]-1;//i方向上的车辆等待数目减一 R[i]++;//当前车辆编号 if((PS-1)==i&&R[i]==PN) PT=Time;//保存预测时间 cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i]<<"辆车开始出发!"<<endl; } if(Max[++i]>0) { Max[i]=Max[i]-1; R[i]++; if((PS-1)==i&&R[i]==PN) PT=Time; cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i]<<"辆车开始出发!"<<endl; }}设计V(inti)函数实现时间的流逝,红绿灯的转换以及无车标志的转换,同时输出上一时刻调用P函数车辆的到达时间,代码如下:voidV(inti)//V函数,i为方向判断标志{ Time=Time+4;//时间流逝 if(Max[i]>=0) { if(Max[i]==0) Max[i]=-1; cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i]<<"辆车到达对面!"<<endl; } if(Max[++i]>=0) { if(Max[i]==0) Max[i]=-1; cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i]<<"辆车到达对面!"<<endl; } T=T-4;//绿灯时间减少 if(T<=0) { change(); inttemp;//换灯 temp=L[0]; L[0]=L[1]; L[1]=temp; T=30-Time%30;//修正红绿灯时间 }}设计东西调度函数ETW()以及南北调度函数STN()在互斥方向无车且绿灯状态下循环调用P、V函数实现单方向队列上车辆的循环调度,代码如下:voidETW()//东西调度函数{ if(L[0]==0)//若为红灯则交换 change(); while(T>0&&L[0]==1&&EW==1)//绿灯有时间且南北无车 { intb=0; P(b); V(b); }}voidSTN()//南北调度函数{ if(L[1]==0) change();while(T>0&&L[1]==1&&SN==1)//绿灯有时间且东西无车 { inta=2; P(a); V(a); }}3.2主函数的设计设计main()函数用来提供程序的输入接口,并实现南北东西方向函数的交叉调度,以及预测车辆出发时间的输出显示。intmain(){ cout<<"欢迎进入交通信号灯模拟系统!"<<endl; cout<<"请选择当前东西方向红绿灯状态:"<<endl;//初始化红绿灯 cout<<"\t1.红灯\n"; cout<<"\t2.绿灯\n"; inta; cin>>a; if(a==1) { L[0]=0; L[1]=1; } if(a==2) { L[0]=1; L[1]=0; }cout<<"请依次输入向东,西,南,北方向的车辆数目(100以内):"<<endl; cin>>Max[0]>>Max[1]>>Max[2]>>Max[3]; cout<<"请选择预测的方向:"<<endl; cout<<"\t1.东\n"; cout<<"\t2.西\n"; cout<<"\t3.南\n"; cout<<"\t4.北\n"; cin>>PS; cout<<"请输入预测的车辆编号"<<endl; cin>>PN;while(Max[0]!=-1&&Max[1]!=-1&&Max[2]!=-1&&Max[3]!=-1)//调度函数 { ETW(); STN(); } cout<<"向"<<FX[PS-1]<<"行驶编号为"<<PN<<"的车辆预测出发时间为:"<<PT<<endl;return0;}系统调试交通信号灯模拟程序的运行说明如下:1、按照系统提示一步一步向下走即可顺利执行程序。2、输入数据的过程中一定要尽量保证数据的正确性,防止因数据不正确而造成程序的崩溃等问题。3、在所有数据都输入之后,程序会自动直接开始运行,运行过程中程序会自动执行到最后,而不会运行一步停下来等待用户的指示,因此为了保证用户检验数据,请在运行之前做好充分的数据记录,以便与理论值进行对照。本系统是一款多功能,操作方便,界面友好的软件。软件所提供的所有功能都可以通过键盘操作实现,简单易行,会给用户的相关操作带来很大方便。5程序运行结果1.系统初始界面如图5-1所示。图5-12.选择东西方信号灯状态图5-2选择红绿灯状态后会出现图5-3的界面。图5-3依次输入四个方向的车的数量之后出现如图5-4所示的画面。图5-45.选择预测方向之后会出现如果5-5所示的画面。图5-5输入预测的车辆编号之后会直接开始执行,出现如图5-6所示的画面。图5-6在运行过程中遇到红绿灯切换的状态,如图5-7所示图5-7最终运行完毕后,程序会给出相应预测的结果,内容如图5-8所示。图5-86心得体会两周周的课程设计结束了,我的课程设计题目是交通信号灯模拟,通过课程设计我对P操作和V操作又有了更深入的认识,同时更加熟练的掌握了利用VC++6.0去解决这类模拟问题的方法。刚开始接触到课题感觉到无从下手,不知道P、V操作要从那方面入手,后来通过逐步的思考,认真的研究逐步的建立了整个宏观的流程,然后就是一段时间的埋头苦干,狂敲代码。这就告诉我们理论与实践的关系。想到不一定能做到,但做到了一定会想到,做到不一定有想象的那么难。只要你愿意做,就一定能做到。放手去做吧。当然课设也有很多的不足,由于编译环境的限制无法实现程序的互斥执行,将是今后研究的重点。

最后,在此我要感谢给于过我帮助的指导老师和热心的同学们,谢谢大家,我也会继续努力。7附录7.1源代码 交通信号灯模拟:#include<iostream>#include<windows.h>#include<string>#include<stdio.h>usingnamespacestd;intMax[4];intTime=0;intR[30];intPS=1,PN=1,PT=1,SN=0,EW=1;intT=30;intL[2];charFX[4];voidP(int);voidV(int);voidchange();voidSTN();voidETW();voidP(inti)//P函数,i为方向判断标志{ if(Max[i]>0) { Max[i]=Max[i]-1;//i方向上的车辆等待数目减一 R[i]++;//当前车辆编号 if((PS-1)==i&&R[i]==PN) PT=Time;//保存预测时间 cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i] <<"辆车开始出发!"<<endl; } if(Max[++i]>0) { Max[i]=Max[i]-1; R[i]++; if((PS-1)==i&&R[i]==PN) PT=Time; cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i] <<"辆车开始出发!"<<endl; }}voidV(inti)//V函数,i为方向判断标志{ Time=Time+4;//时间流逝 if(Max[i]>=0) { if(Max[i]==0) Max[i]=-1; cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i] <<"辆车到达对面!"<<endl; } if(Max[++i]>=0) { if(Max[i]==0) Max[i]=-1; cout<<Time<<"时刻向"<<FX[i]<<"方向行驶的第"<<R[i]<<"辆车到达对面!"<<endl; } T=T-4;//绿灯时间减少 if(T<=0) { change(); inttemp;//换灯 temp=L[0]; L[0]=L[1]; L[1]=temp; T=30-Time%30;//修正红绿灯时间 }}voidETW()//东西调度函数{ if(L[0]==0)//若为红灯则交换 change(); while(T>0&&L[0]==1&&EW==1)//绿灯有时间且南北无车 { intb=0; P(b); V(b); }}voidSTN()//南北调度函数{ if(L[1]==0) change();while(T>0&&L[1]==1&&SN==1)//绿灯有时间且东西无车 { inta=2; P(a); V(a); }}voidchange(){ cout<<"红绿灯变换,所有未通过车辆停止运行。"<<endl; intss; ss=SN; SN=EW; EW=ss; Sleep(2000);}intmain(){ inta; charb; for(;;) { cout<<"******************欢迎进入交通信号灯模拟系统*********************"<<endl <<"输入Y继续:"; cin>>b; if(b=='Y'||b=='y') break; else cout<<"您的输入有误,请重新输入"<<endl; } system("cls");while(1) { cout<<"欢迎进入模拟信号灯系统"<<endl; cout<<"请选择东西方信号灯状态:"<<endl; cout<<"\t1.红灯\n"; cout<<"\t2.绿灯\n"; inta; cin>>a; if(a==1) { L[0]=0; L[1]=1; break; } if(a==2) { L[0]=1; L[1]=0; break; } } cout<<"请依次输入向东、西、南、北行驶的车辆数:"<<endl; cin>>Max[0]>>Max[1]>>Max[2]>>Max[3];//输入各方位车辆数量 cout<<"请输入选择预测的方向:"<<endl; cout<<"\t1.E-东\n"; cout<<"\t2.W-西\n"; cout<<"\t3.S-南\n"; cout<<"\t4.N-北\n"; cin>>PS; cout<<"请输入预测车辆的编号:"<<endl; cin>>PN;T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论