1. 程式人生 > >【黑馬程式設計師】7k面試題之交通燈

【黑馬程式設計師】7k面試題之交通燈

 交通燈專案需求:

模擬實現十字路口的交通燈管理系統邏輯,具體需求如下:

        非同步隨機生成按照各個路線行駛的車輛。

例如:

       由南向而來去往北向的車輛 ---- 直行車輛

       由西向而來去往南向的車輛 ---- 右轉車輛

       由東向而來去往南向的車輛 ---- 左轉車輛

       。。。

       訊號燈忽略黃燈,只考慮紅燈和綠燈。

       應考慮左轉車輛控制訊號燈,右轉車輛不受訊號燈控制。

      具體訊號燈控制邏輯與現實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。

注:南北向車輛與東西向車輛交替放行,同方向等待車輛應先放行直行車輛而後放行左轉車輛。

        每輛車通過路口時間為1秒(提示:可通過執行緒Sleep的方式模擬)。

        隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設定。

       不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式執行結果。

交通燈專案需求分析思路:

專案為模擬現實生活中的交通訊號燈,為方便業務邏輯分析我們先來畫圖分析。

專案分為三大主體:路,交通燈,車。

上圖所示,根據需求我們得知一共有12條路線。南---->北,北.---->南,南---->西,北---->東,東---->西,西---->東,東---->南,西---->北,南---->東,北---->西,東---->北,西---->南。

每條路有自己的車,車為路的資料,所以根據面向物件設計模式 ,設計Road類,封裝road類。 

Road類應該具有的方法和屬性。

name:路的方向。

vechicles:儲存車輛的集合。

public Road(String name):

構造方法,在建立路物件的時候,因該給路一個名字,然後用這個名字的訊號燈來控制此的可行與否。

應該不斷有車上路並排隊過訊號燈,所以建立Road物件時,應該加一個執行緒,每過若干時間為這條路上增加一輛車。

定時器:路應該每過1秒來判斷一下此路是否可通行(是否為綠燈),然後讓車隊裡的每一輛車從第一輛開始過路口。

package com.isoftstone.interview.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;

public class Road {
	private List<String> vechicles = new ArrayList<String>();//車輛集合
	private String name=null;//名字方向。
	public Road(){
		//無參構造方法
	}
	public Road(String name){
		this.name=name;//路的方向
		ExecutorService pool= Executors.newSingleThreadExecutor();
		pool.execute(
			new Runnable(){
				public void run(){
					for(int i=0;i<1000;i++){
						try {
							Thread.sleep((new Random().nextInt(10)+1)*1000);//隨機(1-10)秒後給本路新增一輛汽車
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						vechicles.add(Road.this.name+"_"+i);//隨機(1-10)秒後給本路新增一輛汽車

						
						
					}
				}
			}
		
		);
		
		ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
		timer.scheduleWithFixedDelay(new Runnable(){
			public void run(){
				if(vechicles.size()>0){
					boolean lighted=Lamp.valueOf(Road.this.name).isLighted();//得到當前路燈的可行狀態
					//如果可行,則每秒過一輛車
					if(lighted){

						System.out.println(vechicles.remove(0)+"is traversing!");
					}
				}
			}
			
		}, 1, 1, TimeUnit.SECONDS);
		
	}
}

上圖所示,根據需求我們得知一共有12條路線。南---->北(S2N),北.---->南(N2S),南---->西(S2W),北---->東(N2E),東---->西(E2W),西---->東(W2E),東---->南(E2S),西---->北(W2N),南---->東(S2E),北---->西(N2W),東---->北(E2N),西---->南(W2S)。

12條路線因該由12個訊號燈來指揮當前哪條線路可行駛。

訊號燈應該具備的屬性:

相對的燈:opposite;//相對的燈的可行狀態始終和this一樣。例:南往北為綠燈,北往南也為綠燈。

接下來變綠的燈;next;

當前燈可行狀態:lighted;

方法:

構造方法:Lamp(String opposite,String next ,boolean lighted);//為燈設定屬性。

得到燈的可行狀態:isLighted();

設定等的可行狀態為true:light();

變燈(把當前所有綠燈關閉,開啟接下來路線綠燈):blackOut();

需求“:

右轉車輛不受訊號燈控制

車輛行駛順序,假如南北先為綠燈:

1.南---->北   北.---->南

10秒後,南北綠燈變為紅燈,南---->北   北.---->南不可行。換為左拐:

2. 南---->西   北.---->

10秒後,南西左拐綠燈變為紅燈,南---->西   北.---->東不可行。換為東西直行

3. 東---->西   西---->東

10秒後,東西綠燈變為紅燈東---->西   西---->東不可行。換為東西左拐:

4.東---->南   西---->

10秒後。。。第四步跳回第一步,依次迴圈變燈。

瞭解需求後,我們來寫這個類,因為這12個燈為固定不變,所以這裡我用列舉。

package com.isoftstone.interview.traffic;

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;//
	private Lamp(){};
	private 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=Lamp.valueOf(next);
		
		Lamp nextLamp = null;
		if (next!=null){
			//nextLamp=Lamp.valueOf(next);
			Lamp.valueOf(next).light();
			System.out.println("綠燈從"+name()+"------------>切換為"+next);
		}
		return nextLamp;
	}
	
}

寫到這裡燈的設計和程式碼都寫出來,這裡還差一個控制燈的一個控制器,讓燈每過10秒按照需求變化。

package com.isoftstone.interview.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class LampController {
	private Lamp currentLamp;
	public LampController(){
		currentLamp=Lamp.S2N;
		currentLamp.light();
		ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						System.out.println(currentLamp.name());
						currentLamp=currentLamp.blackOut();
						
						if(currentLamp==null){
							System.out.println("null");
						}
					}
				}
				
				
				, 
				10, 
				10, 
				TimeUnit.SECONDS
		);
	}
}
最後一步:建立一個燈控制器和12個方向的路,路會自動增加車輛,燈會每個一段時間自動變換。綠燈的路會讓車輛一輛一輛通過。
package com.isoftstone.interview.traffic;

class MainClass {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Lamp nextLamp=Lamp.valueOf("dfdfdf");
		// TODO Auto-generated method stub
		String [] directions=new String[]{
				"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","E2W","W2S"
		};
		for(int i = 0 ;i<directions.length;i++){
			new Road(directions[i]);
		}
		
		new LampController();
	}

}

專案感言

交通燈在現實生活中是一個實實在在的專案,雖然我們現在寫的這個小程式只是實現了一些個簡單的邏輯,但是這個小專案他培養的是程式設計設計的思維,拿到一個專案首先得會分析需求,然後實現需求。寫程式之前學好基礎固然重要,但是也一定得會設計程式。一個好的程式設計師必須要有好的基礎和好的思維。這個小專案如果寫得出來,我相信我將來可以實現更復雜的邏輯。非常感謝張老師!

相關推薦

黑馬程式設計師7k試題交通

 交通燈專案需求: 模擬實現十字路口的交通燈管理系統邏輯,具體需求如下:         非同步隨機生成按照各個路線行駛的車輛。 例如:        由南向而來去往北向的車輛 ---- 直行車輛        由西向而來去往南向的車輛 ---- 右轉車輛       

黑馬程式設計師7K試題銀行排程系統

模擬實現銀行業務排程系統邏輯,具體需求如下: Ø        銀行內有6個業務視窗,1- 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。 Ø        有三種對應型別的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。

黑馬程式設計師----7k試題交通管理系統

畫圖非常有助於分析和理解問題。 十字路總共有12條線路,為了統一程式設計模型,可以假設每條線路都有一個紅綠燈對其進行控制, 右拐的四條線路假設稱為常綠狀態,另外,其他的8條兩兩成對的,可以歸為4組, 所以程式只需考慮途中標註了數字號的4條線路的控制燈的切換順序, 這四條路線的反方向的路線控制燈跟隨

黑馬程式設計師----------7K試題交通管理

 ------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------                  

黑馬程式設計師-7k試題交通管理系統

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------- 面試題要求: 1.非同步隨機生成按照各種路線行駛的車輛。例如:由南向而來去往北向的車輛--------直行車輛由西向

黑馬程式設計師-----7K試題交通系統

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 現在每晚都加大力度去學習和加強自己的J

黑馬程式設計師11-7k試題交通

---------------------- android培訓、java培訓、期待與您交流! ---------------------- 1,交通燈管理系統的需求是什麼? 非同步隨機產生按照各個路線行駛的車輛 比如: 由南向北行駛的車輛視為直行車輛 由南向西行駛的車輛視為左行車輛 。。。 訊號燈忽略黃

本人禿頂程式設計師Java試題集(意思意思)

←←←←←←←←←←←← 我都禿頂了,還不點關注! 一、什麼是Spring MVC ?簡單介紹下你對springMVC的理解? Spring MVC是一個基於MVC架構的 用來簡化web應用程式開發的應用開發框架, 它是Spring的一個模組, 無需中間整合層來整合 , 它和Stru

黑馬程式設計師--Java基礎試題整理

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j

黑馬程式設計師C語言基礎-指標

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、

黑馬程式設計師棧記憶體與堆記憶體

java中記憶體分配策略及堆和棧的比較    1 記憶體分配策略    按照編譯原理的觀點,程式執行時的記憶體分配有三種策略,分別是靜態的,棧式的,和堆式的.    靜態儲存分配是指在編譯時就能確定每個資料目標在執行時刻的儲存空間需求,因而在編譯時就可以給他們分配固定的記憶體空間.這種分配策略要求程式程式碼中

黑馬程式設計師_7k試題交通管理系統

交通燈管理系統 1. 模擬實現十字路口的交通燈管理系統邏輯,具體需求如下:非同步隨機生成按照各個路線行駛的車輛。例如:由南向而來去往北向的車輛---- 直行車輛由西向而來去往南向的車輛---- 右轉車輛由東向而來去往南向的車輛---- 左轉車輛        ......        訊號燈忽略黃燈,只考

黑馬程式設計師_12_7k試題交通

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------  交通燈管理系統的專案需求: 非同步隨機生成按照各個路線行駛的車輛。 例如:由南來向北去的車輛——直

黑馬程式設計師分散式事務TransactionScope(學習筆記)

分散式事務: btnDel_Click() {  Delete(1);  Delete(2); } 如果 Delete(1)執行後Delete(2)沒有執行的話;  銀行轉賬 回滾 是資料庫的原子性 事務(Transaction) 1.TransactionScope採用

黑馬程式設計師Objective-C語言學習筆記核心語法(四)

--------------------------------------------IOS期待與您交流!-------------------------------------------- 一、點語法 1、沒有使用點語法的情況 此時我們使用setter和gette

黑馬程式設計師_7K試題交通

   ------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank"&g

黑馬程式設計師-java就業試題大全(持續更新)

13、是否可以從一個static 方法的內部發出對於非static方法的呼叫? 不可以,因為非static方法要和物件相關聯,必須建立物件後,才可以在該物件上進行方法的呼叫,而static方法呼叫時不需要建立物件。也就是說,當一個static方法被呼叫時可能還沒用建立任何例項物件,那麼要掉用非static方

黑馬程式設計師_7K試題交通系統

                                            交通燈訊號模擬系統 一、概述 模擬實現十字路口的交通燈管理系統邏輯,具體需求如下:(需求直接來源於老師的文件) ①      非同步隨機生成按照各個路線行駛的車輛。 例如:      

黑馬程式設計師Objective-C語言學習筆記之類(二)

--------------------------------------------IOS期待與您交流!-------------------------------------------- 一、OC中類的組成 OC中類一般由宣告和實現組成。 類的宣告:儲存在.h檔案

黑馬程式設計師關於try和fianlly中的return執行問題總結

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- 我們都知道finally語句塊的作用是無論出現什麼情況,finally塊中的語句一定會被執行,並且是在re