黑马程序员_7k面试题之交通灯管理系统

本文介绍了一个使用Java实现的十字路口交通灯管理系统。该系统通过控制红绿灯的切换来模拟真实世界的交通情况,并通过线程控制实现了不同方向车辆的随机生成及通行逻辑。

---------------------- ASP.Net+Android+IOS开发、href="http://edu.csdn.net"target="blank">.Net培训、期待与您交流! ----------------------

1、项目需求

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
 
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

2、以图形表示


3、从面向对象的角度分析

1)交通灯:因为只考虑红绿灯,因此只需控制直行的灯和左转的灯即可,而对侧的路口显示的是相同的灯,因此主要只需控制相邻两个方向上直行和左转共四个交通灯的变化即可,右转灯为常绿。其内部所具备的功能是亮灯的状态、灯变绿、灯变红

2)路口:控制着车辆的存在与消失,12个方向均可又车等候或行驶。

3)车辆:因为每一个路口等候的车都是有顺序的,在灯变绿后,排在前面的车先移除,因此用ArrayList集合存储车辆。

4、程序代码:

1)交通灯:

package ceshi.traffic;
//定义交通灯的枚举类
public enum Lamp {
	//12个方向,与每个灯相关的属性是对面的灯、下一个灯、当前灯状态
	S2N("N2S","S2W",false),S2W("N2E","W2E",false),W2E("E2W","W2N",false),W2N("E2S","S2N",false),
	N2S(null,null,false),N2E(null,null,false),E2W(null,null,false),E2S(null,null,false),
	S2E(null,null,true),W2S(null,null,true),N2W(null,null,true),E2N(null,null,true);
	
	private String opposite;
	private String next;
	private boolean flag;
	//初始化时,可传入一个方向的交通灯状况
	private Lamp(String opposite,String next,boolean flag){
		this.opposite=opposite;
		this.next=next;
		this.flag=flag;
	}
	//定义功能,判断当前灯状态
	public boolean isLighted(){
		return flag;
	}
	//定义功能,开启当前灯、对面灯
	public void light(){
		this.flag = true;
		if(opposite!=null){
			Lamp.valueOf(opposite).light();
		}
		System.out.println(name()+"is green");
	}
	//定义功能,关闭当前灯、对面灯,开启下一个灯
	public Lamp blackOut(){
		flag = false;
		if(opposite!=null){
			Lamp.valueOf(opposite).blackOut();
		}
		Lamp nextLamp = null;
		if(next!=null){
			nextLamp = Lamp.valueOf(next);
			System.out.println("绿灯从"+name()+"切换到"+next);
			nextLamp.light();
		}
		return nextLamp;
	}
}
2)交通灯控制器:

package ceshi.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
//交通灯控制器
public class LampController {
	public Lamp currentLamp ;
	//初始化灯为S2N
	public LampController(){
		currentLamp = Lamp.S2N;
		currentLamp.light();
		//定义线程池,该线程池的主要功能是控制每隔10秒变化一次灯
		//该线程池,它可安排在给定延迟后运行命令或者定期地执行。
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run (){
						currentLamp = currentLamp.blackOut();
					}
				},
				10,//初始延迟10秒
				10,//周期,每隔10秒变化一次
				TimeUnit.SECONDS
				);
		
		
	}
}

3)十字路口,控制车辆:

package ceshi.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

//控制路上的车辆
//12个方向上均可有等候的车辆,定义容器存储车辆,并根据交通灯的状态按先后顺序移除
public class Road {
	//定义车辆的集合,存储某个方向上的某辆车
	private List<String> vehicles = new ArrayList<String>();
	private String name = null;
	//随机生成车辆,存入集合
	public Road(String name){
		this.name = name;
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable(){
			public void run(){
				for(int i=1;i<1000;i++){
					try {
						//随机1-10秒内产生一辆车
						Thread.sleep((new Random().nextInt(10)+1)*1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					vehicles.add(Road.this.name+"_"+i);
					System.out.println(Road.this.name+"_"+i+"::is waiting");
				}
				
			}
		});
		//定义线程池,判断当前灯的状态,如果为绿灯,该方向上的车依次移除
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						if(vehicles.size()>0){
							boolean light = Lamp.valueOf(Road.this.name).isLighted();
							if(light){
								System.out.println(vehicles.remove(0)+"::is moving");
							}
						}
					}
				}, 
				1,
				1, 
				TimeUnit.SECONDS);
		
	}

}

4)主函数:

package ceshi.traffic;

public class Main {

	public static void main(String[] args) {
		//定义12个方向的数组
		String[] names = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
		for(int i=0;i<names.length;i++){
			new Road(names[i]);
		}
		new LampController();
	}
}


---------------------- ASP.Net+Android+IOS开发、 href="http://edu.csdn.net"target="blank">.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
内容概要:本文档聚焦于通信系统中的调制解调技术与Turbo码的结合应用,系统研究了GMSK调制的二比特差分解调方法,以及Turbo码分别与BPSK、GMSK调制方式联合使用的系统性能。通过Matlab平台实现了完整的通信链路仿真,涵盖信号调制、信道编码、解调解码及误码率分析等关键环节,深入探讨了不同调制体制下Turbo编码系统的抗干扰能力与频谱效率表现。研究不仅提供了算法实现代码,还包含了详细的性能对比分析,有助于理解现代数字通信中高效编码调制技术的设计原理与工程实现。此外,文档附带多个相关科研方向的仿真案例,展现出广泛的技术延展性与实际应用价值。; 适合人群:具备通信原理、数字信号处理等相关基础知识,熟悉Matlab编程环境,正在从事无线通信系统仿真、信道编码理论研究或相关领域科研工作的研究生、高校教师及工程技术研究人员。; 使用场景及目标:①深入掌握GMSK调制与Turbo码相结合的技术机制,理解其在提高通信可靠性与频谱利用率方面的优势;②熟练运用Matlab构建完整的数字通信仿真系统,完成从调制编码到解调译码的全流程建模与性能评估;③为无人机通信、卫星通信、移动通信等实际应用场景下的高可靠传输系统设计提供理论支持与算法参考。; 阅读建议:建议结合所提供的Matlab代码逐模块运行与调试,重点关注GMSK差分解调过程与Turbo译码的迭代收敛特性,同时可参考文档中列出的其他研究课题拓展仿真范围,提升综合科研与工程实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值