操作系统,交通信号灯问题
课 程 设 计 报 告
课程名称 操作系统 课题名称交通信号灯问题
专 业班 级 1301班 学 号 [1**********]1 姓 名李世伟
2016 年 6 月 18 日
湖南工程学院 课 程 设 计 任 务 书
课程名称 操作系统
课 题 交通信号灯问题
专业班级 信息管理与信息系统 学生姓名 李世伟
学 号 [1**********]1
指导老师 谢 雅 审 批
任务书下达日期 2016 年 6 月 3 日 任务完成日期 2016年 6 月 17 日
一、设计内容与设计要求
1. 课程设计目的:
《操作系统》课程设计是信管专业实践性环节之一,是学习完《操作系统》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。
进一步提高上机动手能力,培养使用计算机解决实际问题的能力,为后继课程的学习和实验,以及毕业设计的完成打下扎实的基础。
2. 课题题目
交通信号灯问题
问题描述:一个十字路口,共有四组红绿灯,每个路口的车辆都遵循“红灯停,绿灯行”的原则,假设将每一台汽车都作为一个进程,请设计良好的机制,展示出合理的“十字路口交通管理”情况。
车辆通行设定:路口宽度不限,对一个路口而言,只有当一辆车通过路口(越过对面路口的交通灯后),其后续车辆才能继续通过交通灯,车辆通过路口的时间可以固定,可以自行计算。
进程的互斥:交通灯进程实际上是互斥的,即不能同时为红或者同时为绿。 进程的消息通信或其通信方式:对车辆进程而言,每一个车辆在通过路口前,必须确认前面的车辆已经通过了路口。
进程的调度:停留在一个路口的车辆,决定其前进或等候的因素是交通灯和前面车辆的状态,需要设计一个良好的进程调度机制来控制所有车辆的通行。
3. 设计要求:
1.根据自己对应的课题完成以下主要工作:
(1). 分析设计要求,给出解决方案,建立必要的数据结构,然后设计总体流程(包
括界面)、详细设计必要的算法,并最终显示结果。基于WINDOWS 或LINUX 操作系统都可以,用何种编程语言都有可以。
(2). 提交设计报告,包括设计要求、设计思想流程、设计所涉及的主要数据结构、
程序清单、运行结果、设计心得、参考资料等。
(3). 严禁抄袭,复制设计内容,查出后相关同学设计成绩以零分处理。 (4). 所提交源程序应是能够运行通过的完整程序。
(5). 提交不少于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设计要求 . ............................................................. 1 1.2课程设计目的 . ......................................................... 1 1.3解决方案 . ............................................................. 1 1.4系统开发与运行环境 . ................................................... 2 2 总体设计 ................................................................... 2
2.1函数定义说明 . ......................................................... 2 2.2结构设计说明 . ......................................................... 3 2.3算法流程图 . ............................................................... 3
2.4数据结构 . ............................................................. 4 3 详细设计 ................................................................... 4
3.1 模块描述 ............................................................. 4 3.2 核心函数设计 ......................................................... 5 3.3主函数的设计 . ......................................................... 7 4 系统调试 ................................................................... 9 5 程序运行结果 ............................................................... 9 6 心得体会 .................................................. 错误!未定义书签。 7附录 . ...................................................... 错误!未定义书签。
7.1 源代码 .............................................................. 13 7.2 参考文献 ............................................................ 19 8 评分表 .................................................................... 20
1 系统需求分析
1.1 设计要求
一个十字路口, 共有四组红绿灯, 每个路口的车辆都遵循" 红灯停, 绿灯行" 的原则, 假设将每一台汽车都作为一个进程, 请设计良好的机制, 展示出合理的" 十字路口交通管理" 情况.
车辆通行设定:路口宽度不限, 对一个路口而言, 只有当一辆车通过路口(越过对面路口的交通灯后) 后, 其后续车辆才能继续通过交通灯, 车辆通过路口的时间可以固定, 可以自行计算。
进程的互斥:交通灯进程实际上是互斥的, 即不能同时为红或者同时为绿.
进程的消息通信或其他通信方式:对车辆进程而言, 每一个车辆在通过路口前, 必须确认前面的车辆已经通过了路口.
进程的调度:停留在一个路口的车辆, 决定其前进或等候的因素是交通灯和前面车辆的状态, 需要设计一个良好的进程调度机制来控制所有车辆的通行。
1.2课程设计目的
了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。
1.3 解决方案
根据设计要求,在VC++6.0环境下编译,设计了一个能够实现自由模拟某一时段交通状况并能预测某辆车需要多久才能到达路口的系统程序,改程序达到了设计要求,成功地实现了要求功能。
1.4系统开发与运行环境
代码实现:C++语言程序
开发工具:Microsoft Visual C++ 6.0 运行环境:windows XP或更高版本操作系统 执行方式:文件打开后直接执行
窗口界面:MS-DOS 窗口界面 操作方式:全键盘控制 操作需要相关专业技能:无
2总体设计
2.1函数定义说明
本设计中,定义了两个函数实现P 、V 原语的操作,其中P (int i )函数实现了i 方向上车辆等待数目减一,车辆编号增一以及输出的功能,V (int i)函数实现了时间的增加,交通转换灯的转换,无车标志的转换以及输出的功能。同时定义了东西调度函数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 (int i )函数用来实现从i (东西南北)方向等待车辆中挑出当前的第一个并让其通行,同时记录此车的编号,输出此车的发车时间,代码如下:
void P(int i) //P函数,i 为方向判断标志 {
if(Max[i]>0) {
Max[i] = Max[i]-1;//i方向上的车辆等待数目减一 R[i]++;//当前车辆编号 if((PS-1)==i&&R[i]==PN)
PT = Time;//保存预测时间
cout
}
if(Max[++i]>0) {
Max[i] = Max[i]-1; R[i]++;
if((PS-1)==i&&R[i]==PN)
PT = Time;
cout
设计V (int i)函数实现时间的流逝,红绿灯的转换以及无车标志的转换,同时输出上一时刻调用P 函数车辆的到达时间,代码如下:
void V(int i) //V函数,i 为方向判断标志 {
Time=Time+4;//时间流逝 if(Max[i]>=0) {
if(Max[i]==0)
Max[i]=-1;
}
cout
}
if(Max[++i]>=0) {
if(Max[i]==0)
Max[i]=-1;
cout
设计东西调度函数ETW ()以及南北调度函数STN ()在互斥方向无车且绿灯状态下循环调用P 、V 函数实现单方向队列上车辆的循环调度,代码如下:
void ETW()//东西调度函数 { }
void STN()//南北调度函数 {
if(L[1]==0)
change();
if(L[0]==0)//若为红灯则交换
change(); }
T=T-4;//绿灯时间减少 if(T
change(); int temp;//换灯 temp = L[0]; L[0] = L[1]; L[1] = temp;
T = 30-Time%30;//修正红绿灯时间
while(T>0&&L[0]==1&&EW==1)//绿灯有时间且南北无车 { }
int b = 0; P(b); V(b);
while(T>0&&L[1]==1&&SN==1)//绿灯有时间且东西无车 }
{ }
int a = 2; P(a); V(a);
3.2主函数的设计
设计main()函数用来提供程序的输入接口,并实现南北东西方向函数的交叉调度,以及预测车辆出发时间的输出显示。
int main() {
cout
cout>a; if(a==1) { } if(a==2) { }
L[0] = 1; L[1] = 0; L[0] = 0; L[1] = 1;
cout
cin>>Max[0]>>Max[1]>>Max[2]>>Max[3];
cout>PS;
cout>PN;
while(Max[0]!=-1&&Max[1]!=-1&&Max[2]!=-1&&Max[3]!=-1)//调度函数
{ }
cout
ETW(); STN();
4. 系统调试
交通信号灯模拟程序的运行说明如下:
1、按照系统提示一步一步向下走即可顺利执行程序。
2、输入数据的过程中一定要尽量保证数据的正确性,防止因数据不正确而造成程序的崩溃等问题。
3、在所有数据都输入之后,程序会自动直接开始运行,运行过程中程序会自动执行到最后,而不会运行一步停下来等待用户的指示,因此为了保证用户检验数据,请在运行之前做好充分的数据记录,以便与理论值进行对照。
本系统是一款多功能,操作方便,界面友好的软件。软件所提供的所有功能都可以通过键盘操作实现,简单易行,会给用户的相关操作带来很大方便。
5程序运行结果
1. 系统初始界面如图5-1所示。
图5-1
2. 选择东西方信号灯状态
图5-2
3. 选择红绿灯状态后会出现图5-3的界面。
图5-3
4. 依次输入四个方向的车的数量之后出现如图5-4所示的画面。
图5-4
5. 选择预测方向之后会出现如果5-5所示的画面。
图5-5
6. 输入预测的车辆编号之后会直接开始执行,出现如图5-6所示的画面。
图5-6
7. 在运行过程中遇到红绿灯切换的状态,如图5-7所示
图
5-7
8. 最终运行完毕后,程序会给出相应预测的结果,内容如图5-8所示。
图5-8
6 心得体会
两周周的课程设计结束了,我的课程设计题目是交通信号灯模拟,通过课程设计我 对P 操作和V 操作又有了更深入的认识,同时更加熟练的掌握了利用VC++6.0去解决这类模拟问题的方法。
刚开始接触到课题感觉到无从下手,不知道P 、V 操作要从那方面入手,后来通过逐步的思考,认真的研究逐步的建立了整个宏观的流程,然后就是一段时间的埋头苦干,狂敲代码。这就告诉我们理论与实践的关系。想到不一定能做到,但做到了一定会想到,做到不一定有想象的那么难。只要你愿意做,就一定能做到。放手去做吧。当然课设也有很多的不足,由于编译环境的限制无法实现程序的互斥执行,将是今后研究的重点。
最后,在此我要感谢给于过我帮助的指导老师和热心的同学们,谢谢大家,我也会继续努力。
7附录
7.1 源代码
交通信号灯模拟: #include #include #include #include using namespace std; int Max[4]; int Time=0; int R[30];
int PS=1,PN=1,PT=1,SN=0,EW=1; int T=30; int L[2]; char FX[4]; void P(int); void V(int); void change(); void STN(); void ETW();
void P(int i) //P函数,i 为方向判断标志 {
if(Max[i]>0) {
Max[i] = Max[i]-1;//i方向上的车辆等待数目减一 R[i]++;//当前车辆编号 if((PS-1)==i&&R[i]==PN)
PT=Time;//保存预测时间
cout
}
if(Max[++i]>0) { }
Max[i] = Max[i]-1; R[i]++;
if((PS-1)==i&&R[i]==PN)
PT = Time;
cout
void V(int i) //V函数,i 为方向判断标志 {
Time=Time+4;//时间流逝 if(Max[i]>=0) {
if(Max[i]==0)
Max[i]=-1;
cout
if(Max[++i]>=0) {
if(Max[i]==0)
Max[i]=-1;
cout
T=T-4;//绿灯时间减少 if(T
change();
}
}
temp = L[0]; L[0] = L[1]; L[1] = temp;
T = 30-Time%30;//修正红绿灯时间
void ETW()//东西调度函数 { }
void STN()//南北调度函数 {
if(L[1]==0)
change();
if(L[0]==0)//若为红灯则交换
change();
while(T>0&&L[0]==1&&EW==1)//绿灯有时间且南北无车 { }
int b = 0; P(b); V(b);
while(T>0&&L[1]==1&&SN==1)//绿灯有时间且东西无车 }
void change() {
{ }
int a = 2; P(a); V(a);
cout
int ss;
ss=SN;
SN=EW;
EW=ss;
Sleep(2000);
}
int main()
{
int a;
char b;
for(;;)
{
cout
*********************"
cin>>b;
if(b=='Y'||b=='y')
break;
else
cout
}
system("cls");
while(1)
{
cout
cout
cout
cout
int a;
cin>>a;
通信号灯模拟系统
} if(a==1) { } if(a==2) { } L[0] = 1; L[1] = 0; break; L[0] = 0; L[1] = 1; break; cout>Max[0]>>Max[1]>>Max[2]>>Max[3];//输入各方位车辆数量 cout>PS; cout>PN;
Time = 0;
T =32;
EW = 1; SN = 1; FX[0]='E'; FX[1]='W'; FX[2]='S'; FX[3]='N';
while(Max[0]!=-1&&Max[1]!=-1&&Max[2]!=-1&&Max[3]!=-1)//表示四个方向有车循环,无车就停止循环
}
{ } cout
7.2参考文献
[1] 胡志刚,谭长庚等,《计算机操作系统》,中南大学出版社2005年
[2] 罗宇,邹鹏等,《操作系统》(第二版),电子工业出版社2007年4月
[3] 汤子瀛,哲风屏,汤小冉等,《计算机操作系统》,西安电子科技大学出社,2001年8月
[4] 张尧学,史美林,《计算机操作系统课程》,清华大学出版社,2000年
[5] 庞丽萍,《操作系统原理》,华中理工大学出版社,2000年
[6] 马季兰等Linux 操作系统,电子工业出版社2002年
[7] 任爱华,李鹏,刘方毅,操作系统实验指导,清华大学出版社,2004年
[8] 谭浩强著.C 程序设计,清华大学出版社,1999年12月第2版
[9] 谭浩强著.C++程序设计实践指导,清华大学出版社,2005年7月底1版
8评分表
计算机与通信学院课程设计评分表
教师签名:
日 期: