黑马程序员——交通路灯管理系统

来源:互联网 发布:.moe域名注册 编辑:程序博客网 时间:2024/05/22 07:07

                             ------- android培训、java培训、期待与您交流! ---------- 

我刚看完张老师这个题,我蒙了,我真不知道该从何下手。就像张老师说的:我一直不知道十字路口有多少路线,不知道怎样去分析这道题。于是我开始认真看老师的讲解。

      刚开始我以为就会进入主题,原来张老师把这道题的背景和我一直忽略的问题等。下面试我从张老师这套教程中所学到的:

()一个人要想做成一番大事,必须珍惜和保护好自己的身体:

邓小平70几岁处于人生低落时期时,仍然坚持游泳锻炼身体,就是为日后复出做准备,老骥伏枥,志在千里。即使你学富五车,才高八斗,如果没有好的身体,等到真正要施展抱负,想去实现宏伟大业时,这往往都需要坚持和耐力,可能在接近成功时,就壮志未酬身已衰,出师未捷身先卒。真是一语惊醒梦中人。所以身体是革命的本钱!

()切不可空想,一定要画图!

当所遇到的问题你不能抽象出来,画图非常有助于理解和分析问题,例如此题,总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换。(画完图才知道,原来有十二条路线!呵呵!)

()面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。

牢牢掌握几个典型的案例:人在黑板上画圆,列车司机紧急刹车,货员统计收获小票的金额,你把门关上了等。

      因为在面向对象编程时,自己的数据要包装,外部不能访问,所以操作数据的方法只能放在本类里面

“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”,

对象不能把自己销毁而变成另外一个对象,把自己变成另一个对象,

“球从一根绳子的一段移动到了另一端”,

对象:Rope,Ball

Class Rope{

private Point start;

  private Point end;

  public Rope(Point start,Point end){

this.start=start;

      this.end=end;

   }

   Public Point nextPoint(Point currentPoint){

        /*

         通过两点一线的数学公式计算当前的下一个点,如果是终点,则返回null

*/

     }

}

class Ball{

   private Rope rope;

   private Point currentPoint;

public Ball(Rope rope,startPoint){

   this.rope=rope;

   this.currentPoint=startPoint;

}

public void move(){

  currentPoiont=rope.nextPoint(currentPoint);

  System.out.println(“小球移动到+currentPoint);

}

}

()交通管理系统

首先分析它的需求

A.异步随机生成按照各个路线行驶的车辆。

B.信号灯忽略黄灯,只考虑红灯和绿灯。

       应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

       南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

每辆车通过路口时间为1,可用Thread.sleep(TIME)实现

C.随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

    获取的信息就是 lamp(灯)、road(路)、controlLamp控制灯的红绿

    而车则只是一个工具,不需要建立其对象。

     1)建立灯这个对象,对象里要设计灯的红绿切换方法,使用枚举

     2)谁拥有数据就对用有操作数据的方法,所以建立路对象,控制车辆的增减

     3)控制灯呢则按照一定时间切换灯。

我感觉就是十二条路线的设计最难:

实际情况中有十二条路线,像张老师里面的一样,2表示to(我感觉这样写老专业了,呵呵)

S2N,S2W,E2W,E2S,//由南向、东向出发的路线(右转路线除外)

N2S,N2E,W2E,W2N,//与上边四个方向相反的由北向、西向出发的路线(右转路线除外)

S2E,E2N,N2W,W2S;//右转路线,无论红灯、绿灯都可以走==相当于都是绿灯

路线考虑清楚后,接下来是灯的问题了:直行通过后,下一个是其左转路线。

当某个路口亮绿灯时(S2N),与之对应的相反路线的灯(N2S)为绿灯,车可以通行,而与之对应的下一个路线(S2W)灯则是红灯,当此路口灯为红灯时,与之对应的相反路线的灯也变红,它的下一个路线则变绿。

1)红绿灯有两个功能:亮绿灯、亮红灯(亮红灯的时候,相反路线也红灯,下一个路线亮绿灯,并在这个方法里返回亮起的绿灯对象)

2)控制红绿灯的亮灭:按照题目的要求,

每十秒当前绿灯转红:相反方向绿灯也转红,下一方向转绿。

下面考虑道路的功能

1)随机产生一辆上路的车

2)每隔一秒判断对应的灯是否为绿,是的话放行一辆车。

通过对张老师这个视频的学习,我对面向对象的设计又加深很多,就如我拿到黑马给我的基础测试题中就有一道:妈妈做饭,没有盐了,叫小明买盐,买盐要三分钟,盐买回来了妈妈继续做饭:

分析:妈妈做饭,和叫可用两个方法,cook,shout;小明买盐,shop;盐有用完的时候,所以我就用一个整形变量表示,时间好说了,就用线程啦!  但妈妈不能以有盐就做饭吧,所以我固定好妈妈做饭要用多少盐,

下面是我的代码:

import java.util.Random;

class Mum

{

int  salt=5;       //假设家里有5g

int   count=0;     

XiaoMing xiaoM=null;

public Mum(){

xiaoM=new XiaoMing();  //妈妈又个儿子叫小明

cook();

}

publicvoid cook(){

for(int i=salt;i>0;i--){

System.out.print("妈妈做饭 ,");   //有盐妈妈就做饭

count++;

if(count==15){                 //妈妈做饭需要15g

System.out.println("\n"+"------------饭做好了----------------");

System.exit(0);

}

}

shout();          //没盐了,叫小明买盐

cook();           //盐买好了,继续做法

}

publicvoidshout(){

System.out.println("小明,没盐了!帮我买点盐");

try{

Thread.sleep(3000);     //在买盐的过程中,要花3分钟,这里我用三秒钟代表三分钟;

}catch(Exception e){

e.printStackTrace();

}

salt= xiaoM.shop();        //小明去买盐了

}

}

class XiaoMing

{

Random rd=new Random();

publicint shop(){

System.out.println("小明买盐了!");

returnrd.nextInt(5)+1;   //定义盐的变量,每次买1~5g

}

}

publicclass Noname1

{

publicstaticvoid main(String args[]){

new Mum();

}

}

以上是个人同过对张老师“交通灯管理系统面试题破解”所总结的,水平有限,希望能在“黑马”提高自己!

                       ------- android培训、java培训、期待与您交流! ----------
原创粉丝点击