停车场管理系统
本人是刚入门的小菜鸡,这个学期刚好学数据结构,想着把写过的问题记录一下,一开始不会写,参考了别人写的,然后才有了点思路,但还是感觉写的有点冗长
欢迎各位大佬指出问题,我会努力改进的
问题描述:
设停车场是一个可停放n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆达到时间的先后顺序,依次由北向南排列(大门在最南端,最先达到的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退车车场为它让路,待赶辆车开出大门外,其它车辆在按原次序进入车场, 每辆停放在车场的车在它离开停车场时必须按它停留的时间长短叫纳费用。试为停车场编制按上述要求进行管理的模拟程序。
基本要求
(1)以栈模拟停车场,以队列模拟车场外的便道, 按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及达到或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆达到、则输出汽车在停车场内或便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
(2)最好有操作菜单。
3实现提示:
需另设一个栈,临时停放 为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。 输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包括两个数据项:汽车的牌照号码和进入停车场的时刻。
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define ok 1
#define false 0
#define TIMEMAX 40
#define Parksite 3
#define Price 0.1//每秒收0.1元
typedef int status;
struct car
{
int timein;//进停车场时间
int timeout;//出停车场时间
char t[TIMEMAX];//字符串记录进入时间
char k[TIMEMAX];//字符串记录出场时间
char lincense[20];//汽车车牌
};
struct sqstack//以停车场为顺序栈
{
car park[Parksite];
int top;//栈顶的位置,停车场有多少辆车
};
typedef sqstack letstack;//为要离开的车让路而退出来的车的栈
struct node
{
car p;
node* next;
};
struct queue//便道为链队列,带头结点
{
node* front;//头指针
node* rear;//尾指针
int length;//记录长度
};
int main()
{
status now();
status creat(queue & L);
status stop1(sqstack & Q, queue & L);
status stop2(queue & L, car a);
int find(car a, sqstack Q, queue L);
status departure(sqstack & Q, car a, queue & L);
status situation(sqstack Q, queue L);
status display(sqstack Q);
status show(queue L);
now();
sqstack Q;
Q.top = 0;//初始顺序栈
queue L;
creat(L);
printf("\t\t\tWelcome to the Parking Lot\n");
//操作菜单
printf("\n\t\t\t1.停车场内的具体停车情况\n");
printf("\t\t\t2.车辆到达\n");
printf("\t\t\t3.车辆离开\n");
printf("\t\t\t4.查找车辆\n");
printf("\t\t\t5.便道内的停车情况\n");
printf("\t\t\t6.退出系统\n");
for (;;)
{
situation(Q, L);
printf("\n请输入要进行的操作:");
int x;
scanf_s("%d", &x);
if (x == 6)
break;
if (x == 1)
display(Q);
if (x == 2)
stop1(Q, L);
if (x == 3)
{
car a;
printf("请输入要离开车辆的车牌号:");
scanf_s("%s", a.lincense, 20);
departure(Q, a, L);
}
if (x == 4)
{
car b;
printf("请输入要查找的车辆的车牌号:");
scanf_s("%s", b.lincense, 20);
int y;
y = find(b, Q, L);
}
if (x == 5)
show(L);
if(x!=1&&x!=2&&x!=3&&x!=4&&x!=5&&x!=6)
printf("输入有误,请重新输入");
}
}
status now()//现在时间
{
time_t timer;
struct tm timed;
char a[TIMEMAX];
timer = time(NULL);
localtime_s(&timed,&timer);
asctime_s(a,&timed);
printf("%s", a);
return ok;
}
status creat(queue& L)//建一个空队列
{
L.front = L.rear = (node*)malloc(sizeof(node));
if (!L.front)
return OVERFLOW;
L.rear->next = NULL;
L.length = 0;
return ok;
}
status stop1(sqstack& Q,queue& L)//停车
{
status stop2(queue & L, car a);
printf("请输入停车的车牌号:");
car a;
scanf_s("%s", a.lincense, 20);
int i = Q.top;//在栈和队列查询该辆车是否已经存在
while (i != 0)
{
if (strcmp(a.lincense, Q.park[i-1].lincense) == 0)//栈中查询
{
printf("该车辆已在停车场\n");
return false;
}
i--;
}
node* k = L.front;
while (k->next!=NULL)
{
if (strcmp(a.lincense, k->p.lincense) == 0)//队列查询
{
printf("该车辆已在便道\n");
return false;
}
k = k->next;
}
//如果停车场位满,停便道
if (Q.top == Parksite)
stop2(L,a);
//停入停车场
else
{
time_t curtime;
long int g = curtime = time(NULL);
ctime_s(Q.park[Q.top].t,sizeof Q.park[Q.top].t,&curtime);//登记入场时间
Q.park[Q.top].timein = g;
strcpy_s(Q.park[Q.top].lincense, a.lincense);//登记车牌
Q.top++;
}
}
//入便道
status stop2(queue&L,car a)
{
node* h;
h = (node*)malloc(sizeof node);
h->next = NULL;
L.rear->next = h;
L.rear = h;
time_t curtime;
long int g = curtime = time(NULL);
ctime_s(a.t, sizeof a.t, &curtime);//登记入道时间
a.timein = g;
h->p = a;
L.length++;
return ok;
}
//查找车的位置
int find(car a,sqstack Q,queue L)//i<=5为停车场,i>5为便道
{
node* e = L.front->next;
for (int i = 1;i<=5+L.length;i++)
{//在停车场
if (i <= 5 && strcmp(Q.park[i - 1].lincense, a.lincense)==0)
{
printf("在停车场的第%d个位置\n", i);
return i;
}
//在便道
if (i > 5 && strcmp(e->p.lincense, a.lincense)==0)
{
printf("在便道的第%d个位置\n", i - 5);
return 5;
}
}
//不在现场
printf("不在现场");
return false;
}
//停车场内有车离开
status departure(sqstack& Q, car a, queue& L)
{
//先找到要离开的车的位置
int i;
i = find(a, Q, L);
//停车场中的车及它后边的车离开
letstack T;
T.top = 0;//初始让路栈
while(Q.top>i)
{
T.park[T.top] = Q.park[Q.top-1];
printf("车牌号为%s的车辆暂时从停车场中离开\n", T.park[T.top].lincense);
T.top++;
Q.top--;
}
printf("车牌号为%s的车辆从停车场中离开\n", Q.park[Q.top - 1].lincense);
time_t curtime;
long int g = curtime = time(NULL);
Q.park[Q.top-1].timeout = g;
ctime_s(Q.park[Q.top - 1].k, sizeof Q.park[Q.top - 1].k, &curtime);//登记离开时间
float money;
money = (Q.park[Q.top-1].timeout - Q.park[Q.top-1].timein) * Price;
printf("\n车牌号为%s的车辆应支付%0.1f元\n", Q.park[Q.top-1].lincense, money);//停车费用
Q.top--;
//让路的车重新进来
while (T.top > 0)
{
Q.park[Q.top] = T.park[T.top - 1];
printf("车牌号为%s的车辆重新进入停车场\n", Q.park[Q.top].lincense);
T.top--;
Q.top++;
}
//若便道有车,则让便道中的第一辆车进来
if (L.length != 0)
{
printf("车牌号为%s的车辆从便道进入停车场\n", L.front->next->p.lincense);//带头结点,头节点没数据
car a;
strcpy_s(a.lincense, L.front->next->p.lincense);
time_t curtime;
long int g = curtime = time(NULL);
a.timein = g;
ctime_s(a.t, sizeof a.t, &curtime);
Q.park[Q.top] = a;
Q.top++;
node* p = L.front->next;
free(p);
L.length--;
}
return ok;
}
//停车场内和便道的停车情况
status situation(sqstack Q, queue L)
{
printf("\t\t\t目前停车场情况\t\t\t\n");
printf("\t停车场内的车位情况为%d/%d,便道的目前已停%d辆车", Q.top, Parksite,L.length);
return ok;
}
//展示停车场内的停车情况
status display(sqstack Q)
{
printf("车牌号\t\t已停时间\t目前费用\t位置\n");
for (int i = 1;i <= Q.top;i++)
{
time_t curtime;
curtime = time(NULL);
time_t g = curtime - Q.park[i - 1].timein;
int min, second;
min = g / 60;
second = g % 60;
printf("%s\t\t%d分%d秒\t\t%0.1f\t\t第%d个位置\n", Q.park[i - 1].lincense, min, second, g * Price, i);
}
return 0;
}
//展示便道的停车情况
status show(queue L)
{
printf("车牌号\t\t位置\n");
node* k = L.front;
int i = 0;
while (k!=L.rear)
{
i++;
k = k->next;
printf("%s\t\t", k->p.lincense);
printf("第%d个位置\n", i);
}
return ok;
}