黑马程序员——交通灯管理系统的学习与分析

本文介绍了一个交通灯管理系统的实现方案,包括系统分析、对象定义、灯的状态管理及控制器设计等核心部分。通过枚举和多线程技术实现了交通灯的自动切换及车辆通行逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

交通灯管理系统的学习与分析

 

针对这个题目,最重要的是对题目进行分析,首先,我们应该从我们最熟悉的路口进行入手,并画一张示意图进行描述,示意图如下:

由上图可知,在一个十字路口,一共有12条线路可以同行。

同时,为了方便起见,做出以下设定:

1.      忽略黄灯(黄灯只是在绿灯变红灯的时候加入几秒钟,去除不影响该系统的整体实现效果)。

2.      因为车辆始终可以向右转弯,所以右转路线的交通灯始终为绿灯,这样统一划定,便于编程实现。

该系统所设定的对象:红绿灯、红绿灯控制器、汽车、路。

对车辆进行分析

汽车通过路口的条件:1.绿灯亮。2.前面没有车。

对路进行分析

路中存有车辆的集合,同时也应有增加和删除车辆的方法。

面向程序设计的重要经验:谁拥有数据,谁就对外提供操作这些数据的方法。

 

因为有12种路线,所以应有12个实例对象,此处使用枚举,更加方便。

对灯进行分析

除去向右转弯的4个灯共有8个灯,在这8个灯中,相对的灯点亮情况相同,即灯又是成对出现,所以只需要分析4组就可以了。此处分析S2N,S2W,E2W,E2S四个方向上的灯。

灯必须保存3个信息:1.绿灯是否点亮。2. 相对灯的信息。3. 下一个灯的信息。

加入是右转方向的灯,则不需要这3个信息。

编码阶段

 

对 “路”的定义

判断灯的点亮情况,并且获取车辆和释放车辆。

package com.itheima.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(String name){
		this.name = name;
		
		ExecutorService pool = Executors.newSingleThreadScheduledExecutor();
		pool.execute(new Runnable(){
			public void run(){
				for(int i = 1; i < 1000;i++){
					try {
						Thread.sleep((new Random().nextInt(10) + 1) * 1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					vechicles.add(Road.this.name + "_" + i );
				}
			}
		});
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				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条道路上灯的点亮情况,并设置方法,当一个方向上绿灯点亮,则对应的一侧绿灯也会点亮。当一个方向绿灯熄灭,则对应的一侧的绿灯也熄灭,同时控制下一组绿灯点亮。

package com.itheima.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 Lamp(String opposite, String next, boolean lighted){
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	
	private Lamp(){
		
	}
	
	private boolean lighted;
	private String opposite;
	private String next;
	
	
	public boolean isLighted(){
		return lighted;
	}
	
	public void light(){
		this.lighted = true;
		if(opposite != null){
			Lamp.valueOf(opposite).light();
		}
		System.out.println(name() + "lamp is green, 下面总共应有6个方向上能看到汽车穿过!");
	}
	
	public Lamp blackOut(){
		this.lighted = 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;
	}
}

对控制器的定义

对路灯进行定时点亮和熄灭。

package com.itheima.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(){
						currentLamp = currentLamp.blackOut();
					}
				}, 
				10,
				10,
				TimeUnit.SECONDS);
	}
}

主函数:

package com.itheima.traffic;

public class MainClass {

	/**
	 * @param args
	 */ 
	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();

	}

}


内容概要:本文详细探讨了杯形谐波减速器的齿廓修形方法及寿命预测分析。文章首先介绍了针对柔轮波发生器装配时出现的啮合干涉问题,提出了一种柔轮齿廓修形方法。通过有限元法装配仿真确定修形量,并对修形后的柔轮进行装配和运转有限元分析。基于Miner线性疲劳理论,使用Fe-safe软件预测柔轮寿命。结果显示,修形后柔轮装配最大应力从962.2 MPa降至532.7 MPa,负载运转应力为609.9 MPa,解决了啮合干涉问题,柔轮寿命循环次数达到4.28×10⁶次。此外,文中还提供了详细的Python代码实现及ANSYS APDL脚本,用于柔轮变形分析、齿廓修形设计、有限元验证和疲劳寿命预测。 适合人群:机械工程领域的研究人员、工程师,尤其是从事精密传动系统设计和分析的专业人士。 使用场景及目标:①解决杯形谐波减速器中柔轮波发生器装配时的啮合干涉问题;②通过优化齿廓修形提高柔轮的力学性能和使用寿命;③利用有限元分析和疲劳寿命预测技术评估修形效果,确保设计方案的可靠性和可行性。 阅读建议:本文涉及大量有限元分析和疲劳寿命预测的具体实现细节,建议读者具备一定的机械工程基础知识和有限元分析经验。同时,读者可以通过提供的Python代码和ANSYS APDL脚本进行实际操作和验证,加深对修形方法和技术路线的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值