停车场管理系统

这篇具有很好参考价值的文章主要介绍了停车场管理系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发

 

以下为停车场管理系统的代码:

 

首先定义Car类,记录车辆信息:

 

```java

public class Car {

    private String plateNumber;  // 车牌号

    private long enterTime;  // 进入停车场时间

    private long exitTime;  // 离开停车场时间

 

    public Car(String plateNumber, long enterTime) {

        this.plateNumber = plateNumber;

        this.enterTime = enterTime;

    }

 

    public String getPlateNumber() {

        return plateNumber;

    }

 

    public long getEnterTime() {

        return enterTime;

    }

 

    public long getExitTime() {

        return exitTime;

    }

 

    public void setExitTime(long exitTime) {

        this.exitTime = exitTime;

    }

}

```文章来源地址https://www.toymoban.com/news/detail-484825.html

 

定义一个接口,包含小型车库的基本操作:

 

```java

public interface CarGarage {

    boolean isFull();  // 是否已满

    void addCar(Car car);  // 将车辆加入车库

    Car removeCar(String plateNumber);  // 将车辆从车库中移除

    boolean contains(String plateNumber);  // 判断车库中是否包含指定车辆

    int getSize();  // 返回车库当前的车辆数量

}

```

 

实现CarGarage接口,使用散列表(Node)进行模拟:

 

```java

public class CarGarageImpl implements CarGarage {

    private static final int GARAGE_CAPACITY = 5;  // 小型车库的容量

    private Map<Integer, Node> garageMap = new HashMap<>();

 

    // 散列表节点类

    private class Node {

        Car car;

        Node next;

 

        Node(Car car, Node next) {

            this.car = car;

            this.next = next;

        }

    }

 

    // 获取指定车辆应该存储的散列表下标

    private int getIndex(String plateNumber) {

        return Math.abs(plateNumber.hashCode()) % GARAGE_CAPACITY;

    }

 

    @Override

    public boolean isFull() {

        int size = 0;

        for (Node node : garageMap.values()) {

            for (; node != null; node = node.next) {

                size++;

            }

        }

        return size == GARAGE_CAPACITY;

    }

 

    @Override

    public void addCar(Car car) {

        int index = getIndex(car.getPlateNumber());

        Node node = garageMap.get(index);

        garageMap.put(index, new Node(car, node));

    }

 

    @Override

    public Car removeCar(String plateNumber) {

        int index = getIndex(plateNumber);

        Node node = garageMap.get(index);

        Node prev = null;

 

        while (node != null) {

            if (node.car.getPlateNumber().equals(plateNumber)) {

                if (prev == null) {

                    garageMap.put(index, node.next);

                } else {

                    prev.next = node.next;

                }

                return node.car;

            }

            prev = node;

            node = node.next;

        }

        return null;

    }

 

    @Override

    public boolean contains(String plateNumber) {

        int index = getIndex(plateNumber);

        Node node = garageMap.get(index);

 

        while (node != null) {

            if (node.car.getPlateNumber().equals(plateNumber)) {

                return true;

            }

            node = node.next;

        }

        return false;

    }

 

    @Override

    public int getSize() {

        int size = 0;

        for (Node node : garageMap.values()) {

            for (; node != null; node = node.next) {

                size++;

            }

        }

        return size;

    }

}

```

 

定义一个接口,包含停车场的基本操作:

 

```java

public interface ParkingLot {

    void enter(Car car);  // 车辆进场

    void exit(Car car);  // 车辆出场

    int getEmptySpotCount();  // 返回停车场空余车位数量

}

```

 

实现ParkingLot接口,使用队列存储车辆排队的情况,每五个车位使用一个小型车库进行模拟:

 

```java

public class ParkingLotImpl implements ParkingLot {

    private static final int PARKING_LOT_CAPACITY = 100;  // 停车场容量

    private static final int GARAGE_COUNT = PARKING_LOT_CAPACITY / 5;  // 小型车库数量

    private static final double PRICE_PER_15_MINUTE = 0.5;  // 普通车辆停车价格:0.5元/15分钟

    private static final double NIGHT_PRICE_PER_HOUR = 1;  // 夜间车辆停车价格:1元/小时

    private static final long NIGHT_START_TIME = 22 * 3600 * 1000;  // 夜间计费开始时间:22点

    private static final long NIGHT_END_TIME = 6 * 3600 * 1000;  // 夜间计费结束时间:6点

 

    private int emptySpotCount = PARKING_LOT_CAPACITY;  // 停车场空余车位数量

    private Queue<Car>[] entranceQueues;  // 入口队列数组

    private Queue<Car> exitQueue = new LinkedList<>();  // 出口排队队列

    private CarGarage[] garages;  // 小型车库数组

 

    public ParkingLotImpl(int entranceCount) {

        entranceQueues = new Queue[entranceCount];

        for (int i = 0; i < entranceCount; i++) {

            entranceQueues[i] = new LinkedList<>();

        }

 

        garages = new CarGarage[GARAGE_COUNT];

        for (int i = 0; i < garages.length; i++) {

            garages[i] = new CarGarageImpl();

        }

    }

 

    @Override

    public void enter(Car car) {

        int emptyGarageIndex = -1;

        for (int i = 0; i < garages.length; i++) {

            if (!garages[i].isFull()) {

                emptyGarageIndex = i;

                break;

            }

        }

 

        if (emptyGarageIndex != -1) {

            garages[emptyGarageIndex].addCar(car);

            emptySpotCount--;

        } else {

            entranceQueues[0].offer(car); // 第一个入口就放排队

        }

    }

 

    private long getParkingTime(Car car) {

        return car.getExitTime() - car.getEnterTime();

    }

 

    private double calcPrice(long parkingTime) {

        if (parkingTime <= 15 * 60 * 1000) { // 普通车免费15分钟

            return 0;

        } else {

            double price = Math.ceil((double) parkingTime / (15 * 60 * 1000)) * PRICE_PER_15_MINUTE;

            // 夜间停车价格

            if (car.getEnterTime() < NIGHT_END_TIME || car.getEnterTime() >= NIGHT_START_TIME) {

                price += (double) Math.ceil((double) parkingTime / (60 * 60 * 1000)) * NIGHT_PRICE_PER_HOUR;

            }

            return price;

        }

    }

 

    @Override

    public void exit(Car car) {

        int garageIndex = -1;

        for (int i = 0; i < garages.length; i++) {

            if (garages[i].contains(car.getPlateNumber())) {

                garageIndex = i;

                break;

            }

        }

 

        if (garageIndex != -1) {

            Car removedCar = garages[garageIndex].removeCar(car.getPlateNumber());

            long parkingTime = removedCar.getExitTime() - removedCar.getEnterTime();

            double price = calcPrice(parkingTime);

            emptySpotCount++;

            System.out.println("离开了停车库,车牌号为" + removedCar.getPlateNumber() + ",停车时间为" + parkingTime +

                    "毫秒,需支付" + price + "元");

        } else {

            System.out.println("未找到车牌号为" + car.getPlateNumber() + "的车辆");

        }

    }

 

    @Override

    public int getEmptySpotCount() {

        return emptySpotCount;

    }

 

    // 模拟车辆进场

    public void simulateCarEnter() {

        for (Queue<Car> entranceQueue : entranceQueues) {

            if (entranceQueue.isEmpty()) {

                continue;

            }

 

            // 先检查是否有空车位,有的话直接入车库

            int emptyGarageIndex = -1;

            for (int i = 0; i < garages.length; i++) {

                if (!garages[i].isFull()) {

                    emptyGarageIndex = i;

                    break;

                }

            }

 

            // 没有空车位

            if (emptyGarageIndex == -1) {

                Car car = entranceQueue.peek();

                if (garages[0].contains(car.getPlateNumber())) {

                    entranceQueue.poll();  // 已在排队列中的车,直接取出

                } else {

                    entranceQueue.offer(car);  // 添加到排队队列的末尾等待下次取出

                }

            } else {

                Car car = entranceQueue.poll();

                garages[emptyGarageIndex].addCar(car);

                emptySpotCount--;

            }

        }

    }

 

    // 模拟车辆出场

    public void simulateCarExit() {

        if (exitQueue.isEmpty()) {

            return;

        }

 

        Car car = exitQueue.peek();

 

        // 夜间停车不允许从22点较晚离开22点较早

        if (car.getEnterTime() < NIGHT_END_TIME || car.getEnterTime() >= NIGHT_START_TIME) {

            if (System.currentTimeMillis() < NIGHT_START_TIME && car.getExitTime() >= NIGHT_START_TIME) {

                System.out.println("当前时间为夜间停车计费时间段内,不允许车牌号为" + car.getPlateNumber() + "的车辆现在离开停车场。");

                return;

            }

        }

 

        exitQueue.poll();

 

        Car removedCar;

        int garageIndex = -1;

        for (int i = 0; i < garages.length; i++) {

            if (garages[i].contains(car.getPlateNumber())) {

                garageIndex = i;

                break;

            }

        }

        if (garageIndex != -1) {

            removedCar = garages[garageIndex].removeCar(car.getPlateNumber());

            long parkingTime = removedCar.getExitTime() - removedCar.getEnterTime();

            double price = calcPrice(parkingTime);

            emptySpotCount++;

            System.out.println("离开了停车库,车牌号为" + removedCar.getPlateNumber() + ",停车时间为" + parkingTime +

                    "毫秒,需支付" + price + "元");

        } else {

            System.out.println("未找到车牌号为" + car.getPlateNumber() + "的车辆");

        }

    }

 

    // 获取下一个应该出场的车辆

    private Car getNextExitCar() {

        Car nextCar = null;

        long nextExitTime = Long.MAX_VALUE;

 

        for (CarGarage garage : garages) {

            for (Node node : ((CarGarageImpl) garage).garageMap.values()) {

                for (; node != null; node = node.next) {

                    Car car = node.car;

                    if (car.getExitTime() < nextExitTime) {

                        nextExitTime = car.getExitTime();

                        nextCar = car;

                    }

                }

            }

        }

 

        return nextCar;

    }

 

    // 模拟出场排队

    public void simulateExitQueue() {

        if (getEmptySpotCount() == PARKING_LOT_CAPACITY) {

            return;

        }

 

        while (exitQueue.size() < 1 && getNextExitCar() != null) {

            Car nextCar = getNextExitCar();

            exitQueue.offer(nextCar);

            long waitTime = nextCar.getExitTime() - System.currentTimeMillis();

            try {

                Thread.sleep(waitTime);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

```

 

最后,可以使用以下方式模拟车辆进出停车场的情况:

 

```java

public static void main(String[] args) {

    ParkingLot parkingLot = new ParkingLotImpl(5);

    String[] plateNumbers = {"京A12345", "京A23456", "京A34567", "京A45678", "京A56789", "京A67890",

            "京B12345", "京B23456", "京B34567", "京B45678", "京B56789", "京B67890"};

    Random random = new Random();

 

    // 模拟车辆进入停车场

    Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        @Override

        public void run() {

            Car car = new Car(plateNumbers[random.nextInt(12)], System.currentTimeMillis());

            parkingLot.enter(car);

        }

    }, 0, 500);

 

    // 模拟车辆出场

    timer.scheduleAtFixedRate(new TimerTask() {

        @Override

        public void run() {

            parkingLot.simulateExitQueue();

            parkingLot.simulateCarExit();

        }

    }, 0, 1000);

 

    // 模拟车辆进入小型车库

    timer.scheduleAtFixedRate(new TimerTask() {

        @Override

        public void run() {

            parkingLot.simulateCarEnter();

        }

    }, 0, 5000);

}

```

 

 

以下是 Python 代码示例,实现了停车场管理系统的大致功能:

 

```python

import time

from collections import deque

 

# 停车场

class ParkingLot:

    def __init__(self, num_entrances, num_exits, num_spaces):

        self.num_entrances = num_entrances

        self.num_exits = num_exits

        self.num_spaces = num_spaces

        self.entrance_queues = [deque() for _ in range(num_entrances)]

        self.spaces = [Space() for _ in range(num_spaces)]

        self.night_rate = 1  # 小型车夜间停车费用:1元/小时

 

    # 停车

    def park(self, car):

        # 获取可用车位

        space = self.get_empty_space()

        if space is not None:

            # 将车停入车位

            space.park(car)

        elif self.is_full():

            # 如果停车场已满,则车辆排队等候

            print(f"停车场已满,请{car}在入口处排队等候")

            self.entrance_queues[car.entrance].append(car)

        else:

            raise Exception("Invalid parking state")

 

    # 取车

    def unpark(self, car):

        space = self.find_space_by_car(car)

        if space is not None:

            duration = car.get_duration()

            fee = 0  # 停车费用

            if car.is_small:

                # 夜间停车费用

                hour = time.localtime(car.enter_time).tm_hour

                if hour >= 22 or hour < 6:

                    fee = self.night_rate * duration / 3600

            # 计算停车费用

            fee += duration // 900 * 0.5

            print(f"{car}停车时长为{duration//60}分钟,停车费用为{fee:.2f}元")

            space.unpark(car)

            # 检查排队等候的车辆

            self.check_waiting_cars()

        else:

            raise Exception(f"{car}不在停车场内")

 

    # 获取可用车位

    def get_empty_space(self):

        for space in self.spaces:

            if not space.is_occupied():

                return space

        return None

 

    # 根据车牌号查找车位

    def find_space_by_car(self, car):

        for space in self.spaces:

            if space.car == car:

                return space

        return None

 

    # 停车场是否已满

    def is_full(self):

        for space in self.spaces:

            if not space.is_occupied():

                return False

        return True

 

    # 检查排队等候的车辆

    def check_waiting_cars(self):

        for i in range(self.num_entrances):

            if len(self.entrance_queues[i]) > 0:

                car = self.entrance_queues[i][0]

                space = self.get_empty_space()

                if space is not None:

                    self.entrance_queues[i].popleft()

                    self.park(car)

                    print(f"{car}入场成功")

 

 

# 车位

class Space:

    def __init__(self):

        self.car = None

 

    # 判断车位是否被占用

    def is_occupied(self):

        return self.car is not None

 

    # 停车

    def park(self, car):

        self.car = car

        car.enter_time = time.time()

 

    # 取车

    def unpark(self, car):

        self.car = None

 

 

# 车辆

class Car:

    def __init__(self, plate, entrance, is_small):

        self.plate = plate  # 车牌号码

        self.entrance = entrance  # 入口编号

        self.is_small = is_small  # 是否小型车

        self.enter_time = None  # 进场时间

 

    # 获取停车时长,返回秒数

    def get_duration(self):

        if self.enter_time is not None:

            return time.time() - self.enter_time

        else:

            return -1

 

    def __str__(self):

        return self.plate

 

 

if __name__ == '__main__':

    lot = ParkingLot(2, 2, 25)

    for i in range(80):

        is_small = i % 5 == 0  # 每5个车位是一个小型车库

        car = Car(f"京A{i:02d}", i % 2, is_small)

        if i == 40:

            lot.unpark(car)  # 取走一辆不存在的车

        else:

            lot.park(car)

        time.sleep(0.1)  # 模拟每隔一段时间有车进入或离开停车场

```

到了这里,关于停车场管理系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 停车场管理系统(C语言)

    1、问题描述 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待

    2024年02月04日
    浏览(39)
  • 数据结构停车场管理系统设计

    数据结构与算法分析课程设计之数据结构停车场管理系统设计。主要应用到数据结构中的栈与队列。运用到的编程语言为C++。 目录 一  设计要求  二 思路分析 三 设计流程 先附上完整代码: 运行结果图: 1.1 问题描述 :设停车场是一个可停放n辆车的狭长通道,且只有一个

    2024年02月04日
    浏览(43)
  • 用JAVA实现停车场管理系统

    该程序使用ArrayList存储停车记录,并通过switch-case语句实现菜单选择功能。主要功能包括: 停车:输入车牌号和进入时间,自动分配停车位编号, 结算:根据停车位编号计算停车费用,计费标准为停车时长(秒)乘以每秒费用0.05元,同时记录车辆离开时间和费用; 查看记录

    2024年02月11日
    浏览(40)
  • 停车场管理系统文件录入(C++版)

    ❤️作者主页:微凉秋意 ✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆 之前写的停车场管理系统或者是通讯录管理系统都没有使用 文件 录入、保存数据,今天带来一个文件录入信息的C++版停车场管理系统。代码部分都会有详细注释,稍加思

    2024年02月03日
    浏览(39)
  • 【数据结构】停车场管理系统程序设计

    说明: 该程序设计采用常见基础的数据结构栈和队列实现了一个简单停车场管理系统。在具体设计中,实现了系统页面和停车场的示意图显示,通过调用顺序栈和链队的相关函数,模拟了实际停车场的运营流程。 目录 1 任务内容 2 需求分析 2.1 功能需求 2.2 输入输出需求 3 概

    2024年02月03日
    浏览(46)
  • Python 实验报告,实现停车场收费管理系统

    3.某小型收费停车场有50个车位,有一个入口与一个出口,满1小时收费1元,不足1小时不收费,10元封顶,超过1天罚款200元。编写程序实现停车场出入口管理。 要求: (1)定义出入口类,将车位总数与目前停在停车场的车辆信息(每辆车包括车牌和入场时间)定义为类属性;

    2024年02月12日
    浏览(40)
  • 基于Web的停车场管理系统(Java)

    目录 一、系统介绍 1.开发的环境 2.本系统实现的功能 3.数据库用到的表 4.工程截图 二、系统展示 1、登录页面  2、首页 3、系统信息管理模块   4、车位信息管理模块  5、IC卡信息管理模块 ​编辑6、固定车主停车管理模块 7、临时车主停车管理模块 8、系统功能操作模块 三

    2024年02月10日
    浏览(36)
  • 【计算机毕业设计】智能停车场管理系统

          摘 要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述智能停车场管理的当前背景以及系统开发的目的,后续章节将严格按照

    2024年02月06日
    浏览(37)
  • 停车场管理系统(C语言顺序栈+链栈+链队列)

    1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈、队列进行分析; 2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用函数的形式来实现; 3.通过对参考代码的运行与调试,并且对以核心功能

    2024年02月08日
    浏览(42)
  • 模拟停车场管理系统(c++,使用栈和队列)

    目录 一、问题描述 二、算法结构分析与设计 三、算法主模块的流程及各子模块的主要功能 四、算法详细设计 五、源代码 功能要求         设停车场只有一个可以停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包