简易停车场管理系统
- 一、实验概述
- 二、代码结构
- 三、函数讲解
- table createTable()
- void carEnter(table t,QString num,QString etime,int pos)
- void carOut(table t,QString num)
- int search(table t,QString num)
- float calculate(QString etime,QString outtime)
- int createPos(int position[])
- queue createQueue()
- void enter(queue q,QString num)
- qcar Front(queue q)
- void DeQueue(queue q)
- int search(queue q,QString num)
- 四、结果演示
一、实验概述
实验内容:完成过道等待、进出停车场、计费等停车场管理。
实验要求:
1.车辆进入:判断停车场是否有空位,有空位就停入,没有空位,就在过道排队等候。
2.车辆离开:统计停车时间,计算停车费用。从进入停车场开始计时。
3.信息查询:包括停车场和车辆相关信息查询。
二、代码结构
停车场,利用表来实现。当停车场有空位的时候,车辆进入;当停车场
满的时候,进入停车队列等待。
车辆,结构体内有停车位置,车牌号,进入时间(用来计费)。
停车队列,利用队列实现。当停车场满时,车辆进入,不计费。
当停车场有空位时,车辆从队列中进入停车场。
三、函数讲解
table createTable()
创造一个空的停车场。
table createTable(){
table t;
t = (tableNode*)malloc(sizeof(tableNode));
t->size = COL*ROW;
t->cars = new car[t->size];
MakeEmpty(t);
return t;
}
void carEnter(table t,QString num,QString etime,int pos)
车辆进入停车场,同时记录下车牌号、进入时间、停车位。进入之前要判断
停车场是否还存在空位。
void carEnter(table t,QString num,QString etime,int pos){
if(IsFull(t))
printf("Parkinglot is Full!");
else{
t->cars[t->length].num = num;
t->cars[t->length].entime = etime;
t->cars[t->length].pos = pos;
t->length++;
}
}
void carOut(table t,QString num)
车辆出停车场。首先要判断输入的车牌号是否存在于停车场中。
void carOut(table t,QString num){
int index = search(t,num);
if(index == -1)
printf("not found!!!");
else{
for(int i = index;i < t->length - 1;i++){
t->cars[i] = t->cars[i+1];
}
t->length--;
}
}
int search(table t,QString num)
根据车牌号进行查找,根据sign的正负(返回值)来判断该车是否存在。
首先要判断停车场是否有车,若有,遍历停车场中的车,比对车牌号。
int search(table t,QString num){
int sign = -1;
if(IsEmpty(t))
printf("empty table!");
else{
int n = t->length;
for(int i = 0;i < n;i++){
if(t->cars[i].num == num){
printf("found it!!!");
sign = i;
break;
}
}
}
return sign;
}
float calculate(QString etime,QString outtime)
计算停车费用,按停车时间阶梯收费。这个费用可以自行更改。
float calculate(QString etime,QString outtime){
QDateTime timeen,timeout;
timeen = QDateTime::fromString(etime,"hh:mm:ss");
timeout = QDateTime::fromString(outtime,"hh:mm:ss");
int second = timeen.secsTo(timeout);
if(second <= 5)
return 0;
else if(second > 5 && second <= 20)
return 2;
else if(second > 20 && second <= 60)
return 5;
else if(second > 60)
return 10;
}
int createPos(int position[])
随机分配停车位,在循环中生成随机数,同时将数组元素置1,若再次生成
同样的数,遇到1则跳过,直到找到0为止。这种方法避免了伪随机的重复性。
int createPos(int position[]){
int max = COL*ROW,pos = rand()%max + 1;
if(position[pos-1] == 0){
position[pos-1] = 1;
return pos;
}
else{
int i;
for (i = 0; i < 10; i++)
{
if(position[i] == 0){
position[i] = 1;
return i+1;
}
}
}
}
以上是停车场的相关操作,是以表为基础完成的。
一下是停车队列的相关操作,是以队列为基础完成的。
queue createQueue()
创建一个空的停车队列。
queue createQueue(){
queue q;
q = (queueNode*)malloc(sizeof(queueNode));//为队列申请内存
q->capacity = Max;
q->wait = new qcar[q->capacity];//为数组申请内存
MakeEmpty(q);
return q;
}
void enter(queue q,QString num)
车辆进入停车队列。
首先要判断这个队列是否还有空位,若有,车辆进入。
void enter(queue q,QString num){
if(IsFull(q))
printf("Full queue");
else{
q->wait[q->rear].num = num;
q->size++;
if(++q->rear == q->capacity)
q->rear = 0;
}
}
qcar Front(queue q)
获得队列首的车。
qcar Front(queue q){
return q->wait[q->front];
}
void DeQueue(queue q)
车辆从队列中出去。
首先要判断队列中是否有车,注意队首和队尾的变化。
void DeQueue(queue q){
if(IsEmpty(q))
printf("empty queue!");
else{
q->size--;
q->front++;
if(q->front == 5)
q->front = 0;
}
}
int search(queue q,QString num)
输入车牌号,查找队列里的车。
int search(queue q,QString num){
int sign = -1;
if(IsEmpty(q))
printf("empty table!");
else{
int n = q->size;
for(int i = 0;i < n;i++){
if(q->wait[i].num == num){
printf("found it!!!");
sign = i;
break;
}
}
}
return sign;
}
四、结果演示
车辆进入、退出停车场。
对重复车牌号的判断。
停车场满时,车辆进入停车队列。
停车场有空位时,停车队列的车补位。
停车队列满时。
我在github上做的开源。