1. 程式人生 > >黑馬程式設計師_7k面試題之交通燈管理系統

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

交通燈管理系統
1.
模擬實現十字路口的交通燈管理系統邏輯,具體需求如下:非同步隨機生成按照各個路線行駛的車輛。例如:由南向而來去往北向的車輛---- 直行車輛由西向而來去往南向的車輛---- 右轉車輛由東向而來去往南向的車輛---- 左轉車輛
       ......
      
訊號燈忽略黃燈,只考慮紅燈和綠燈。應考慮左轉車輛控制訊號燈,右轉車輛不受訊號燈控制。具體訊號燈控制邏輯與現實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。注意:
    1
)南北向車輛與東西向車輛交替放行,同方向等待車輛應先放行直行車輛而後放行左轉車輛。
    2
)每輛車通過路口時間為1秒(提示:可通過執行緒

Sleep的方式模擬)。
    3
)隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設定。
    4
)不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式執行結果。
2.
面向物件的分析與設計行車路線圖:

              
    
涉及到的物件:紅綠燈、紅綠燈控制系統、汽車和公路。分析:路擁有車輛這個資料,路本身知道自己身上有幾輛車,所以,路上有一個集合,用於儲存汽車的,根據誰擁有資料,方法就定義在誰上面,所以路上有增加和刪除物件(車)的方法,這樣就可以將車和路線繫結在一起。每條路線每隔一秒都會對控制本路線的燈進行判斷是否為綠,如果為綠燈就將排在前面的車移走,表示車已經開走。然後設計一個燈的類,裡面來設計者

12個燈,實際上只需設計四個方向的燈即可,其他的都是對應的。注意把右拐彎的燈設計為常綠。自己的燈綠或黑時,也讓自己對立的那一面變綠或黑。當一個燈變黑是讓下一個燈變綠。
      3.
功能程式碼的實現
    1
路的編寫程式碼實現如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Load {
          List<String> vechile=newArrayList<String>();
          private String name;
         Load(String name)
          {
                 this.name=name;
               ScheduledExecutorService time =Executors.newScheduledThreadPool(1);
                 time.execute(new Runnable(){
                     @Override
                     public voidrun() {
                            for(inti=1;i<1000;i++)
                            {
                                   try{
                                          Thread.sleep((newRandom().nextInt(10))*1000);//隨機的向公                                                 路上開車。
                                   }catch (InterruptedException e) {
                                          //TODO Auto-generated catch block
                                          e.printStackTrace();
                                   }
                                   vechile.add(i+"::::"+Load.this.name);//把車新增到集合中
                                   //System.out.println("第"+i+"車來了");
                            }                   
                     }                   
                 });         
                ScheduledExecutorService times2 =Executors.newScheduledThreadPool(1);
                 times2.scheduleAtFixedRate(
                               new Runnable(){
                                   @Override
                                   publicvoid run() {
                                          //TODO Auto-generated method stub
                                          if(vechile.size()>0)    //判斷公路上有沒有車
                                          {
                                                 booleanfight=Lamp.valueOf(Load.this.name).isLigth();
                                                 if(fight)  //判斷是否是綠,如果是把最前面的車移走
                                                 {
                                                        System.out.println("第"+vechile.remove(0)+"走了!");
                                                 }
                                                
                                          }
                                   }  
                               },
                               1,  //每隔一秒來執行一下這個程式,檢視一下是否有車是否是綠燈
                               1,
                              TimeUnit.SECONDS);
          }
}

    2 .燈的編寫

程式碼如下:

package daiwenjuan.traffic.interview;
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 boolean lighted;
     private String oppsited;
     private String next;
     Lamp(Stringoppsited,String next,boolean lighted)
     {
        this.oppsited=oppsited;
        this.next=next;
        this.lighted=lighted;
     }
     public boolean isLigth() //用於判斷燈是否亮
     {
        return lighted;
     }
     public void Lighted()
     {
        this.lighted=true;
        if(oppsited!=null)
        Lamp.valueOf(oppsited).Ligthed(); //讓與自己相反的燈也變數。
        System.out.println(name() + " lamp is green,下面總共應該有6個方向能看到汽車穿過!");
     }
     public Lamp Locked()
     {
       this.lighted=false;
        if(oppsited!=null)
         Lamp.valueOf(oppsited).Locked();//讓自己相反的燈變黑
        Lamp nextLamp=null;
        if(next!=null){
           nextLamp= Lamp.valueOf(next);
         System.out.println("綠燈從" + name() + "-------->切換為" + next);
           nextLamp.Lighted(); //讓下一個燈變亮
        }
       return nextLamp ;
     }
}

3 燈的管理器的編寫

 import java.util.concurrent.Executors;
importjava.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LightContruct {
  privateLamp light;
   LightContruct()
   {
         light=Lamp.S2N;
         light.Lighted();
         ScheduledExecutorServicetime = Executors.newScheduledThreadPool(1);
         time.scheduleAtFixedRate(
                       newRunnable(){
                              @Override
                              publicvoid run() {
                                     //TODO Auto-generated method stub                        
                                            light=light.Locked();   
                                            //System.out.println(light.name()+"綠了");
                              }                   
                       },
                       10,
                       10,//每隔十秒讓燈變換一次。
                       TimeUnit.SECONDS);
   }
 
}

下面是一個測試類:

package daiwenjuan.traffic.interview;
 
public class testDemo {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
       String[] s={"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
       for(int i=0;i<s.length;i++)
       {
           new Load(s[i]);
       }
  new LightContruct();
    }
}

執行結果:


總結:從這個系統中所學到的知識:一個重要的思想:誰擁有資料,就擁有操作這個資料的方法。在進行分析時,因為車在路上跑,所以不用專門用於定義一個車的類,因為路擁有車的物件,所以在路上操作即可。分析燈時,因為燈都是相對的,所以只操作一半即可,因為每個燈都是唯一的所以想到的列舉。操作等變換時只需定義一個執行緒池即可。

相關推薦

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

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

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

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

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

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

黑馬程式設計師_7k試題交通管理系統)學習筆記

總共有12條路線,為了統一程式設計模型,可以假設每條路線都有一個紅綠燈對其進行控制,右轉彎的4條路線的控制燈可以假設稱為常綠狀態,另外,其他的8條線路是兩兩成對的,可以歸為4組,所以,程式只需考慮圖中標註了數字號的4條路線的控制燈的切換順序,這4條路線相反方向的路線的控制燈跟隨這4條路線切換,不必額外考慮

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

-面向物件分析設計經驗:誰用於資料,誰就對外提供操作這些資料的方法。 典型案例:      人在黑板上畫圓。 分析: 共有三個物件:人、黑板、圓。動作:畫 畫圓需要圓心和半徑,圓心和半徑都是圓的屬性上,圓擁有資料,所以圓物件提供畫圓的方法 圓在黑板上,黑板擁有

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

---------------------- Android開發、java培訓、期待與您交流! ---------------------- 一.需求 模擬實現十字路口的交通燈管理系統邏輯,具體需求如下: 1.非同步隨機生成按照各個路線行駛的車輛。 例如:       

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

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

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

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

黑馬程式設計師_試題1(交通管理系統)

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

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

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

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

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

黑馬程式設計師_7k試題銀行業務排程系統

----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! --------- 一.專案需求: 模擬實現銀行業務排程系統邏輯,具體需求如下: 銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速

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

------- android培訓、java培訓、期待與您交流! ---------- 銀行業務排程系統 1. 模擬實現銀行業務排程系統邏輯,具體需求如下:銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。有三種對應型別的客戶:

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

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

黑馬程式設計師------------高新試題銀行排程系統

     面向物件的分析和設計說明:        1、有三種客戶:VIP客戶、普通客戶、快速客戶。需要非同步隨機產生各種型別的客戶。        2、每一個客戶其實就是由銀行的一個取號機器產生號碼的方式來表示的。所以,要有一個號碼管理器物件,讓這個物件不斷地產生號碼,就等於隨機生成了客戶。        

黑馬程式設計師——java試題基礎語法

型別轉化 float f1 = (float)12.345; float f2 = 12.345f; f1其實是通過一個double型別轉換過來的。 而f2本身就是一個flo

黑馬程式設計師---7k試題(銀行業務排程系統

號碼管理器 publicclassNumberManager{ privateint lastNumber =0;//客戶數 privateList queueNumbers =newArrayList();//視窗叫號數 publicsynchronizedInteger generateN

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

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

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

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

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

package com.itheima.traffic; import java.beans.VetoableChangeSupport; import java.util.ArrayList; import java.util.List; import java.util.Random; import j