停车场管理系统之控制台java实现
- 实验报告题目如下:
一、数据结构设计
项目需要使用栈和队列两种数据结构。其中栈用于停车场和中转区,队列用于便道,对应的类名分别为:CarStack和CarQueue。CarStack为顺序栈,CarQueue为链队列,队列中的结点为CarNode类。Car类为车辆信息类,记录了车辆的车牌,到达时间和离开时间等信息。
设有车辆栈和队列,其定义如下:
#define MAX 3 // 停车场最大容量为3辆,便于观察// 车辆信息 typedef struct { char num[10]; // 车牌
long reach; // 车辆到达时间
long leave; // 车辆离开时间 }Car;// 车辆顺序栈:停车场park和临时停车temp typedef struct { Car stack[MAX + 1];
int top;
int base; }SeqStack;// 便道停车wait队列的结点 struct CarNode { Car data;
CarNode *next; };// 便道停车链式队列 typedef struct { CarNode *head;
CarNode *rear; }LinkQueue;1、完成车辆栈CarStack的基本操作函数。其中: private static int MAXSIZE = 3; //
最大容量为3辆,便于观察 (1)public boolean push(Car car) // 车辆进栈 // 函数源码:(2)public Car pop() // 车辆出栈 // 函数源码:
(3)public boolean isEmpty() // 判空 // 函数源码:
(4)public boolean isFull() // 判满 // 函数源码:
2、完成车辆队列CarQueue的基本操作函数。其中: private CarNode front; // 队头 private
CarNode rear; // 队尾 (1)public boolean isEmpty() // 车辆队列判空 // 函数源码:(2)public boolean offer(Car car) // 车辆入队 // 函数源码:
(3)public Car poll() // 车辆出队 // 函数源码:
二、业务逻辑设计 1、停车场业务功能为CarPark类。在CarPark类中实现了汽车驶入、汽车驶离、费用计算和显示停车场车辆信息等功能。
// 停车场业务 /** *
功能: 将carNo车牌的汽车驶入,如果停车场有车位则进入停车场,设定入场时间,否则在便道等待进入 * 参数: * carNo
– 车牌信息 * 返回值: / public boolean arrival(String carNo) { 【代码1】 // 参考相关业务流程,完成该函数模块的编码任务。 } /* * 功能:
将carNo车牌的汽车驶离停车场,设定离开时间,同时便道汽车进入停车场 * 参数: * carNo – 车牌信息 *
返回值:离开汽车 */ public Car leave(String carNo) { 【代码2】 //
参考相关业务流程,完成该函数模块的编码任务。 }/** * 功能: 根据车辆的出入时间,计算费用及停车时长 * 参数: * car – 车辆信息 * 返回值:停车费用
*/ public double charging(Car car) {
long offset = car.leave.getTime() - car.arrive.getTime(); return offset / 60000 * price ; } // 显示所有入库车辆信息 public void
showPark(){ 【代码3】 // 参考相关业务流程,完成该函数模块的编码任务。 } // 显示所有在便道上等待信息 public
void showWaiting() { 【代码4】 // 参考相关业务流程,完成该函数模块的编码任务。 }2、系统菜单及主类。 (1)系统菜单 // 操作菜单 public static void menu() {
System.out.println("\n §※§※§※§※§※§ 欢迎使用停车场系统.§※§※§※§※§※§\t\n");
System.out.println("\t※◎※◎※◎※◎ 1. 车辆到达登记.※◎※◎※◎※◎\t");
System.out.println("\t※◎※◎※◎※◎ 2. 车辆离开登记.※◎※◎※◎※◎\t");
System.out.println("\t※◎※◎※◎※◎ 3. 显示车辆信息.※◎※◎※◎※◎\t");
System.out.println("\t※◎※◎※◎※◎ 4. 退出系统.※◎※◎※◎※◎\t");
System.out.println("\n\t请选择:\t"); } (2)主函数 public static void
main(String[] args) { CarPark carPark = new CarPark(); Scanner
scanner = new Scanner(System.in); String carNo; while(true) {
menu(); int item = -1; while (true) {
item = scanner.nextInt();
if(item>0 && item <5)
break;
System.out.println("\n 输入有误,请重新选择: 1~4: “); } switch(item) {
case 1:
System.out.println(“请输入车牌号:”);
carNo = scanner.next();
carPark.arrival(carNo);
break;
case 2:
System.out.println(“请输入车牌号:”);
carNo = scanner.next();
Car car = carPark.leave(carNo);
long time = (car.leave.getTime() - car.arrive.getTime())/60000;
DecimalFormat df = new DecimalFormat(”#.00");
String fee = df.format(carPark.charging(car));
System.out.println(“车辆”+carNo+“停车时长”+time+“分钟,共收费”+fee+“元。”);
break;
case 3:
carPark.showPark();
carPark.showWaiting();
break;
case 4:
System.exit(0); } } }
- 代码如下:
package C;
//车辆信息类,记录车辆的车牌,到达时间和离开时间等信息.
public class Car
{String carNo; //车辆车牌信息long reach; //到达时间long leave; //离开时间float cost; //停车费用public Car(String carNo) {this.carNo=carNo;}Car(String carNo,long reach,long leave,float cost) {this.carNo=carNo;this.reach=reach;this.leave=leave;this.cost=cost;}String getcarNo(){return this.carNo;}long getreach(){return this.reach;}long getleave(){return this.leave;}float getcost() {return this.cost;}}
package C;//CarNode类为模拟队列中的链表结点
public class CarNode {Car data;CarNode next;CarNode() {this.data=null;this.next=null;}public CarNode(Car car) {this.data=car;this.next=null;}Car getData(){return this.data;}}
package C;public class CarPark {CarStack CS1=new CarStack(3); //停车场CarStack CS2=new CarStack(3); //中转区CarQueue CQ1=new CarQueue(); //便道//判断车辆是否驶入停车场,并设定入场时间。public boolean arrival(String carNo) {if(CS1.Se(carNo)) {System.out.println("车辆已在停车场中!");return false;}if(CQ1.qe(carNo)) {System.out.println("车辆已在便道等待!");return false;}Car car=new Car(carNo);//当停车场无车位时,在便道等待进入if(CS1.isFull()) {System.out.print("场地无空余车位,请稍作等候!");CQ1.offer(car);return false;}//当停车场有车位,车辆入栈CS1.push(car);car.reach=System.currentTimeMillis(); //设定入场时间return true; }//车辆驶离停车场,设定离开时间,同时便道汽车进入停车场.public Car leave(String carNo) {//若车不在停车场和便道中if(!(CS1.Se(carNo))&&!(CQ1.qe(carNo))) {System.out.println("该车不在管理范围内!");return null;}Car car=null;//该车在停车场中if(CS1.Se(carNo)) {while(((car=CS1.pop())!=null)) {if(car.carNo.equals(carNo)) {break;}else { //非目标车辆先退出停车场,进入中转区CS2CS2.push(car);}}//中转区的汽车按原来的顺序返回停车场while(!CS2.isEmpty()) {CS1.push(CS2.pop());}//便道汽车进入停车场if(!CQ1.isEmpty()) {CS1.push(CQ1.poll());}car.leave=System.currentTimeMillis(); //离开时间 return car;}//该车在便道中if(CQ1.qe(carNo)) {CQ1.remove(carNo);System.out.println("车辆"+carNo+"在便道等待,无需收费。");return car;}return car;}//根据车辆的出入时间,计算费用及停车时长.public double charging(Car car) {double charge=0;long t=car.getleave()-car.getreach();charge=t/10000*20;return charge;}//显示所有入库车辆信息 (遍历栈,注意数据出栈后还要回去)public void showPark(){System.out.println("停车场车辆信息:");CS1.list();}//显示所有在便道上等待信息(遍历队列)public void showWaiting() {//判空if(CQ1.isEmpty()) {System.out.println("便道无车辆等待!");return;}System.out.println("便道上车辆信息:");CQ1.bianli();}
}
package C;//定义一个CarQueue为链队列,用于便道.
public class CarQueue {private int SIZE = 0; //队列的长度private CarNode front; //指向队列头private CarNode rear; //指向队列尾//判断队列是否为空public boolean isEmpty() {return SIZE == 0;}// 车辆入队public boolean offer(Car car) {//判断队列是否为空if(isEmpty()) {CarNode car1=new CarNode(car);front=car1;rear=front;SIZE++;return true; }//队列不为空时CarNode car2=new CarNode(car);rear.next=car2;rear=rear.next;SIZE++;return true;}//获取队列的数据,车辆出队列public Car poll() {//先判断队列是否为空if(isEmpty()) {System.out.println("场地已空,无车辆信息!");}Car car=front.getData();front=front.next;SIZE--;return car;}//顺序遍历链表(队列)public void bianli() {CarNode p=front;while(p!=null) {Car car=p.getData();System.out.println(car.getcarNo());p=p.next;} }//删除便道中车辆public void remove(String carNo) {CarNode p=front;if(p.getData().getcarNo().equals(carNo)) {front=front.next;p=p.next;}else {while(p.next!=null) {if(p.next.getData().getcarNo().equals(carNo)) { //找到想删掉的节点p.nextp.next=p.next.next; //删掉节点后,p后移到p.next.next}elsep=p.next; //不删除节点,即正常往后遍历}}}//判断便道是否存在该车牌号public boolean qe(String carNo) {//先判断队列是否为空if(isEmpty()) {return false;}CarNode p = front;while(p != null) {Car car=p.getData();if(car.getcarNo().equals(carNo))return true;p = p.next;}return false;}}
package C;//定义一个CarStack顺序栈,用于停车场和中转区
public class CarStack {private int MAXSIZE; //栈的最大容量private Car[]stack; //用数组stack[]来模拟栈,数据放在该数组private int top=-1; //top表示栈顶,初始化为-1//构造器public CarStack(int MAXSIZE) {this.MAXSIZE=MAXSIZE;stack=new Car[this.MAXSIZE];}//返回栈的最大容量public int maxsize() {return MAXSIZE;}//栈满public boolean isFull() {return top==MAXSIZE-1;}//栈空public boolean isEmpty() {return top==-1;}//入栈操作-push,车辆进场public void push(Car car) {//先判断栈是否满if(isFull()) {//System.out.print("场地无空余车位,请稍作等候!");return ;}top++;stack[top]=car;}//出栈操作-pop,车辆出去,返回车辆信息public Car pop(){//先判断栈是否为空if(isEmpty()) {System.out.println("场地已空,无车辆停放!");}Car car=stack[top];top--;return car;}//遍历//显示栈的情况【遍历栈】,遍历时,需要从栈顶开始显示数据public void list() {if(isEmpty()) {System.out.println("停车场已空,无车辆停放!");}//显示数据for(int i=0;i<=top;i++) {System.out.println(stack[i].getcarNo());}}//判断停车场是否存在该车牌号public boolean Se(String carNo) {if(isEmpty()) {return false;}//需要从栈顶开始显示数据for(int i=top;i>=0;i--) {// System.out.println(stack[i]);if(stack[i].getcarNo().equals(carNo)){return true;}}return false;}}
package C;
//停车场系统
import java.io.*;
import java.text.DecimalFormat;
import java.util.*;
public class Park {//主菜单public static void menu() { System.out.println("\n §※§※§※§※§※§ 欢迎使用停车场系统.§※§※§※§※§※§\t\n");System.out.println("\t※◎※◎※◎※◎ 1. 车辆到达登记.※◎※◎※◎※◎\t");System.out.println("\t※◎※◎※◎※◎ 2. 车辆离开登记.※◎※◎※◎※◎\t");System.out.println("\t※◎※◎※◎※◎ 3. 显示车辆信息.※◎※◎※◎※◎\t");System.out.println("\t※◎※◎※◎※◎ 4. 退出系统.※◎※◎※◎※◎\t");System.out.println("\n\t请选择:\t");}public static void main(String[] args) {CarPark carPark = new CarPark();Scanner scanner = new Scanner(System.in);String carNo;while(true) {menu();int item = -1;while (true) {item = scanner.nextInt();if(item>0 && item <5)break;System.out.println("\n 输入有误,请重新选择: 1~4: ");}switch(item) {case 1:System.out.println("请输入车牌号:");carNo = scanner.next();carPark.arrival(carNo);break;case 2:System.out.println("请输入车牌号:");carNo = scanner.next();Car car = carPark.leave(carNo);if(car==null) {break;}if(car.getreach()!=0) {long time = car.getleave() - car.getreach();DecimalFormat df = new DecimalFormat("#.00"); String fee = df.format(carPark.charging(car)); System.out.println("车辆"+carNo+"停车时长"+time/10000+"小时,共收费"+fee+"元。");}break;case 3:carPark.showPark();carPark.showWaiting();break;case 4:System.exit(0);}}}
}
停车场管理系统之控制台java实现相关推荐
- springboot毕设项目停车场管理系统8f46a(java+VUE+Mybatis+Maven+Mysql)
springboot毕设项目停车场管理系统8f46a(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBu ...
- springboot毕设项目小区停车场管理系统zvzay(java+VUE+Mybatis+Maven+Mysql)
springboot毕设项目小区停车场管理系统zvzay(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + H ...
- 停车场管理系统 java_使用java编写一个停车场管理系统
使用java编写一个停车场管理系统 发布时间:2020-11-30 16:00:28 来源:亿速云 阅读:145 作者:Leah 这篇文章给大家介绍使用java编写一个停车场管理系统,内容非常详细,感 ...
- Springboot毕设项目大连和平广场停车场管理系统52oca(java+VUE+Mybatis+Maven+Mysql)
项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- 酒店管理系统/停车场管理系统(毕业设计+代码)
一 停车场管理系统 "CarParking" 基于java的停车场管理系统 1.基本实现了停车场该有的功能. 比如会员管理,收发邮件,优惠券生成与发放,车辆出库入库,自动计算停车费 ...
- java语言使用栈和队列实现简易停车场管理系统
[问题描述]:设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出.车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面).如果停车场已放满n ...
- [附源码]计算机毕业设计JAVA停车场管理系统
[附源码]计算机毕业设计JAVA停车场管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Intel ...
- [附源码]计算机毕业设计JAVA 停车场管理系统
[附源码]计算机毕业设计JAVA 停车场管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Inte ...
- JAVA计算机毕业设计智能停车场管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
JAVA计算机毕业设计智能停车场管理系统Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计智能停车场管理系统Mybatis+源码+数据库+lw文档+系统+调试部署 本源码技 ...
最新文章
- 开发者进阶宝典,HarmonyOS 职业认证全奉上
- 汇编:ret以及retf指令
- python保存创建文件报错 with open(fileName,‘w‘) as fp: IOError: [Errno 22] invalid mode (‘w‘) or filename
- Hibernate + MySQL中文乱码问题
- 【agc004d】Teleporter
- nodejs进程异常退出处理方法
- Collectors.toMap()
- StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)
- 消息模板取数据的高阶使用说明
- 结合公司业务后,对极光推送的进一步思考
- linux主机安装sctp协议栈
- 【WSN通信】能量均衡的无线传感器网络非均匀分簇路由协议附matlab代码
- 《数字连线大招版》攻略
- 40岁前的男人必看的文章!共勉!
- 基于希克斯需求价格弹性计算_西方经济学(微观部分)计算题
- 《装甲战》的主要原则
- python wpf_为什么很少看到使用WPF开发的流行的应用程序呢?
- php个人编程词典,【编程词典】php htmlentities()函数
- tcping扫描所有端口_tcping端口检测工具使用
- 4.C++实现:线性插值