首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

月工资7K面试题之交通灯管理系统

2012-11-19 
月薪7K面试题之交通灯管理系统?认真学习了张老师讲解的这个系统,受益匪浅,这个题目估计不止是7K的面试题了

月薪7K面试题之交通灯管理系统

?

认真学习了张老师讲解的这个系统,受益匪浅,这个题目估计不止是7K的面试题了,有关需求和更详细的讲解我还在学习中,过后继续补上来,下面先贴上代码。

?

一、这是一般常见的十字路口,由图可知有十二个方向的车可穿行,S2N(南到北)、N2S(北到南)、E2W(东到西)、W2E(西到东)、N2W(北到西)、N2E(北到东)、E2S(东到南)、W2N(西到北)、S2E(南到东)、E2N(东到北)、N2W(北到西)、W2S(西到南)。现实生活中四个方向的车在任何时候都是可以通过的(S2E、E2N、N2W、W2S),因此这四个方向的车辆是不用看路灯状态的,在程序中可以假设这四个方向的灯总是绿灯状态。其他八个方向都是两两相对的,比如南到北对应北到南,东到西对应西到东,南到西对应北到东,东到南对应西到北,所以我们只需要考虑四个方向的路灯状态就可以了,按顺序行驶则如下:S2N和N2S——》S2W和N2E——》E2W和W2E——》E2S和W2N,如此循环。

月工资7K面试题之交通灯管理系统

二、现实生活中,是由人眼去判断车所行驶的方向的前方的路灯是什么状态来控制车的行驶状态,而在程序中就不会有人这个概念了,在程序中车要往什么方向行驶就需要获得前方的路灯是什么状态来控制行驶状态。

1.道路类,在程序中我们只需要知道道路上有没有车,只要有车,并且路灯是绿灯则使其通过,为了模拟现实中有车辆通过道路,就需要十二个方向的道路不断产生车辆并存到集合,然后十二个方向的道路以固定频率去判断集合是否有车和路灯状态是否是绿灯,是则使车辆穿过。

2.路灯,路灯所要做的事情就是变黄、变红、变绿,因此路灯类需要提供路灯变黄、变红、变绿的方法提供给路灯控制系统调用,因此还需要一个路灯状态控制器。

3.路灯控制器,路灯控制器所要做的事情就是初始化一个方向的绿灯和按固定频率切换绿灯。

?

?

?

?

?

/** * @fileName Road.java * @description 交通灯控制系统,道路,使用集合存储车辆来模拟现实情况, * 会产生十二个线程(因为有十二个方向的道路)来不断产生车辆 * 以及定时判断当前方向的道路是否有车辆,如果有车辆并且绿灯亮则可以通过 * @date 2012-7-1 * @time 15:35 * @author wst */public class Road {private List<String> vehicles = new ArrayList<String>();//车辆集合private String name;//车辆名称private int i=1;public Road(String name){this.name=name;/* * 车辆集合 * 产生一个ExecutorService对象, * 这个对象只有一个线程可用来执行任务, * 若任务多于一个,任务将按先后顺序执行。 */ExecutorService pool=Executors.newSingleThreadExecutor();pool.execute(new Runnable(){@Overridepublic void run() {while(true){try {//休息1到10秒Thread.sleep((new Random().nextInt(10)+1)*1000);} catch (InterruptedException e) {e.printStackTrace();}vehicles.add(Road.this.name+"_"+i);i++;}}});/* * 有车辆通过的道路, * 产生一个ScheduledExecutorService对象, * 这个对象的线程池大小为poolSize, * 若任务数量大于poolSize, * 任务会在一个queue里等待执行 */ScheduledExecutorService  timer=Executors.newScheduledThreadPool(1);/* * 固定频率的调度器 * 指定时间判断是否有车辆 */timer.scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {if(vehicles.size()>0){//获得当前道路前方的路灯状态boolean lighted=Lamp.valueOf(Road.this.name).isLighted();if(lighted){//绿灯亮System.out.println("道路"+vehicles.remove(0)+"有车辆驶过!");}}}}, 1,1,TimeUnit.SECONDS);}}
?

/** * @fileName Lamp.java * @description 路灯,路灯拥有使绿灯变亮和使红灯变亮的方法 * @date 2012-7-5 * @time 21:51 * @author wst */public enum Lamp {S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);private String opposite;//相对向的灯private String next;//下一个绿灯private boolean lighted;//绿灯亮:true;红灯亮:falseprivate Lamp(String opposite,String next,boolean lighted){this.opposite=opposite;this.next=next;this.lighted=lighted;}public boolean isLighted(){return lighted;}//绿等亮public void light(){this.lighted=true;if(opposite!=null){Lamp.valueOf(opposite).light();}}//红灯亮public Lamp blackOut(){this.lighted=false;if(opposite!=null){Lamp.valueOf(opposite).blackOut();}Lamp nextLamp=null;if(next!=null){nextLamp=Lamp.valueOf(next);nextLamp.light();//使下一个灯变绿}return nextLamp;}}
?
/** * @fileName LampController.java * @description 路灯控制器,初始化一个方向的等为绿, * 以固定频率控制当前绿灯变红并且使下一方向路灯变绿 * @date 2012-7-6 * @time 20:30 * @author wst * */public class LampController {private Lamp currentLamp;/** * 初始化默认南到北的路灯是绿灯 * 每隔10秒将当前绿灯变为红灯 */public LampController(){currentLamp=Lamp.S2N;currentLamp.light();//绿灯亮System.out.println(currentLamp+"变为绿灯,有6个方向的汽车可以穿过!");ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);/* * 固定频率的调度器 * 指定时间换一个绿灯 */timer.scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {System.out.println(currentLamp+"变为黄灯!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(currentLamp+"变为红灯!");currentLamp=currentLamp.blackOut();//当前等变红,并且返回下一个方向的绿灯System.out.println(currentLamp+"变为绿灯,有6个方向的汽车可以穿过!");}}, 10, 10,TimeUnit.SECONDS);}}
?
/** * @fileName MainClass.java * @description 测试,初始化所有道路,启用灯控制器 * @date 2012-7-6 * @time 20:40 * @author wst */public class MainClass {public static void main(String[] args) {String [] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for(int i=0;i<directions.length;i++){new Road(directions[i]);}new LampController();}}
?

热点排行