停车场项目需求
问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门
外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车
要先退出,待它走后在依次进入。汽车离开时按停放时间收费。
基本功能要求:
(1)建立三个数据结构分别是:停放栈、让路栈、等候队列。
(2)输入数据模拟管理过程,数据(入或出,车号)
功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、
查询场内车辆信息、查询等候车辆信息、退出系统。
(1)linux系统编写(链表、栈、队列);
(2)进车登记:登记车牌号以及入场时间;
(3)出车登记:计算出停车时间,记录车辆车牌;
(4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场
(5)查询出入记录:所有车辆,包括已经离开的
(6)查询场内车辆信息:列出所有场内车辆信息
(7)查询等候车辆信息:显示等候车辆数量以及所有车牌号
(8)退出系统。
#include <stdio.h>
#include<stdlib.h>#include<time.h>
#include <string.h>
#include<math.h>
#define Status int
#define MAX 5 //停车容量
#define PRICE 2.0 //停车收费标准:元/每小时
#define TRUE 1
#define FALSE 0
typedef struct car
{
char name[10]; //车牌号
struct tm intime; //入库时间
struct tm outtime; //出库时间
int expense; //停车费用
int length; //停车时间
int position; //车位
}Car; // 车位信息
typedef struct stack
{
Car num[MAX];
int top;
}Stack; //顺序栈
typedef struct node
{
Car data;
struct node * next;
}Node,* LinkPtr;
typedef struct
{
LinkPtr front;
LinkPtr rear;
}LinkQueue; //链队列
Status InitStack(Stack *S) //初始化栈
{
S->top= - 1;
return TRUE;
}
Status StackEmpty(Stack S) //判断栈是否为空
{
if(- 1 == S.top)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status StackFull(Stack S) //判断栈是否为满
{
if(S.top == MAX - 1)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status PushStack(Stack *S,Car e) //入栈
{
if(!StackFull(*S))
{
S->top++;
S->num[S->top]=e;
return TRUE;
}
return FALSE;
}
Car PopStack(Stack *S) //出栈
{
Car p;
if(!StackEmpty(*S))
{
p=S->num[S->top];
S->top--;
return p;
}
}
Status InitLinkQueue(LinkQueue * Q) //链队列的初始化
{
(Q->front)=(Q->rear)=(LinkPtr)malloc(sizeof(Node));
if(NULL == Q->front)
{
exit(OVERFLOW);
}
Q->front->next=NULL;
return TRUE;
}
Status LinkQueueEmpty(LinkQueue Q) //判断队列是否为空
{
if(Q.front ==Q.rear)
{
return TRUE;
}
return FALSE;
}
Status PushLinkQueue(LinkQueue *Q,Car e) //入队列
{
LinkPtr p;
p=(LinkPtr)malloc(sizeof(Node));
if(NULL == p)
{
exit(OVERFLOW);
}
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return TRUE;
}
Car PopLinkQueue(LinkQueue *Q) //出队列
{
LinkPtr p;
Car lcar;
if(Q->front== Q->rear)
{
printf("等候队列为空");
}
p=Q->front->next;
lcar=p->data;
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear=Q->front;
free(p);
}
return lcar;
}
int Printfdata(struct tm gm) //显示时间:月 日 几点几分几秒
{
printf("%d/%d%3d:%2d:%2d \n",gm.tm_mon+ 1,gm.tm_mday,gm.tm_hour+8,gm.tm_min,gm.tm_sec);
return 0;
}
Status ShowStack(Stack S) //查看车位车辆
{
int i;
printf("*********************************************");
printf("车位使用情况\n");
if(StackEmpty(S))
{
printf("停车场内没有车辆\n");
}
else
{
printf("位置\t车牌号\t进站时间\n");
for(i=0;i<=S.top;i++)
{
printf("%d\t",S.num[i].position);
printf("%s\t",S.num[i].name);
Printfdata(S.num[i].intime);
}
printf("\t\t\t共%d辆车!",S.top + 1);
if(S.top == MAX - 1)
{
printf("(已满)\n");
}
else
{
printf("还可以停放%d辆车\n",MAX - 1 - S.top);
}
}
printf("**************************************");
getchar();
return TRUE;
}
Status ShowLinkQueue(LinkQueue Q) //查看便道上的车辆
{
int i,count=0;
LinkPtr p;
p=Q.front->next;
printf("***************************************");
printf("便道使用情况:\n");
if(LinkQueueEmpty(Q))
{
printf("便道上没有车\n");
}
while(NULL != p)
{
printf("车牌号\t 进场时间\n");
printf("%s\t ",p->data.name);
Printfdata(p->data.intime);
p=p->next;
count++;
}
printf("便道上有 %d 辆车在等候\n",count);
printf("**************************************\n");
return TRUE;
}
Status Reach(Stack *S,LinkQueue *Q,LinkQueue *L) //入库
{
Car car;
struct tm * gm;
time_t It;
time(&It); /*time_t time(time_t * timer) 得到机器的日历时间*/
gm=gmtime(&It); /* struct tm * gmtime(time_t * time) 得到以结构tm表示的时间信息*/
car.intime=*gm;
printf("输入车牌号:");
scanf("%s",car.name);
if(!StackFull(*S) && LinkQueueEmpty(*Q) ) //入停车栈
{
car.position=(S->top) + 2;
PushStack(S,car);
ShowStack(*S);
}
else if(StackFull(*S) || !LinkQueueEmpty(*Q)) //车满,入等候队列
{
printf("提示:车位满,只有先停放在便道上!\n");
car.position=MAX;
PushLinkQueue(Q,car);
}
printf("按回车键继续..\n");
getchar();
Menu(*S,*Q,*L);
return TRUE;
}
Status Printfrate(Car * car) //打印账单
{
printf("********************************************");
printf("账单\n");
printf("车牌号:%s\n",car->name);
printf("停车位置:%d\n",car->position);
printf("进入时间:");
Printfdata(car->intime);
printf("离开时间:");
Printfdata(car->outtime);
printf("停车时间(秒):%d\n",car->length);
printf("费用(元):%d\n",car->expense);
printf("********************************************");
printf("按回车键继续");
getchar();
return TRUE;
}
Status Leave_s(Stack *S,LinkQueue *Q,LinkQueue *L) //离开车库
{
struct tm *gm;
time_t Lt;
Stack p;
InitStack(&p);
Car car,lcar;
int i;
int pos;
if(StackEmpty(*S))
{
printf("所有车位是空的,没有车辆需要离开!\n");
}
else
{
printf("现在车位使用情况!\n");
ShowStack(*S);
printf("哪个车位的车辆需要离开:");
scanf("%d",&pos);
getchar();
if(pos>0 && pos<=S->top + 1)
{
for(i=S->top + 1;i> pos;i --) //该车位后面的车需要入让车栈
{
car=PopStack(S); //后面的车先出栈
car.position=car.position - 1;
PushStack(&p,car); //入让车栈
}
lcar=car=PopStack(S); //要离开的车出栈,列出信息
time(&Lt);
gm=gmtime(&Lt);
lcar.outtime=(*gm);
lcar.length=mktime(&lcar.outtime)- mktime(&lcar.intime); /*time_t mktime(struct tm * timeptr) 将tm结构数据转换成从 公元1970年1月1号0时0分0秒算起至今的UTC时间所经过的秒数*/
lcar.expense=(lcar.length /3600 + 1)*PRICE;
Printfrate(&lcar);
while(! StackEmpty(p))
{
car=PopStack(&p); //让路栈的车进车位
PushStack(S,car);
}
while(! StackFull(*S) && ! LinkQueueEmpty(*Q)) //等候队列中第一辆车进车库
{
car=PopLinkQueue(Q);
time(&Lt);
gm=gmtime(&Lt);
car.intime=(*gm);
PushStack(S,car);
}
}
else
{
printf("输入车位错误,那个车位没有车!\n");
}
}
PushLinkQueue(L,lcar); //要离开的车入离开队列
Menu(*S,*Q,*L);
printf("按回车键继续");
getchar();
return TRUE;
}
Status Showlcar(LinkQueue L) //查看离开车辆
{
int i,count=0;
LinkPtr p;
p=L.front->next;
printf("是否有车离开过:\n");
if(LinkQueueEmpty(L))
{
printf("没有车离开过\n");
return FALSE;
}
else
{
printf("有车离开过,离开车的信息:\n");
while(NULL !=p)
{
printf("车牌号:%s\n",p->data.name);
printf("进入时间:");
Printfdata(p->data.intime);
printf("离开时间:");
Printfdata(p->data.outtime);
printf("停车时间(秒):%d\n",p->data.length);
printf("费用(元):%d\n",p->data.expense);
p=p->next;
}
printf("按回车键继续...");
getchar();
return TRUE;
}
}
Status Showall(Stack S,LinkQueue Q,LinkQueue L) //查看车库,便道上,包括已经离开的车的车辆信息,出入记录
{
ShowStack(S);
ShowLinkQueue(Q);
Showlcar(L);
Menu(S,Q,L);
return TRUE;
}
int Leave(Stack *S,LinkQueue *Q,LinkQueue *L) //离开车位
{
Leave_s(S,Q,L);
Menu(*S,*Q,*L);
printf("按回车键继续..\n");
getchar();
return TRUE;
}
Status Seek(Stack S,LinkQueue Q,LinkQueue L) //按车牌号查询车辆信息,停车时间,是否来过停车场,是否还在停车场
{
int i;
char sname[10];
Status flag=FALSE;
LinkPtr p;
p=L.front->next;
printf("请输入要查询的车牌号:\n");
scanf("%s",sname);
if(!LinkQueueEmpty(L))
{
while(NULL != p && flag==FALSE)
{
if(0 == strcmp(p->data.name,sname))
{
printf("该车来过停车场,现已离开\n");
printf("车牌号:%s\n",p->data.name);
printf("停车位置:%d\n",p->data.position);
printf("进入时间:");
Printfdata(p->data.intime);
printf("离开时间:");
Printfdata(p->data.outtime);
printf("停车时间(秒):%d\n",p->data.length);
printf("费用(元):%d\n",p->data.expense);
flag=TRUE;
}
p=p->next;
}
}
if(!StackEmpty(S))
{
for(i=0;i<=S.top && flag==FALSE;i++)
{
if(0 == strcmp(S.num[i].name,sname))
{
printf("该车在停车场内\n");
printf("车牌号:%s\n",S.num[i].name);
printf("进入时间:");
Printfdata(S.num[i].intime);
printf("停车位置:%d\n",S.num[i].position);
flag=TRUE;
}
}
}
if(StackEmpty (S)&& LinkQueueEmpty(L))
{
printf("该车没有来过停车场\n");
}
if(flag== FALSE)
{
printf("该车不在停车场内\n");
}
getchar();
Menu(S,Q,L);
}
Status Quit() //退出程序
{
printf("欢迎你的下次使用!\n");
exit(0);
return TRUE;
}
int Menu(Stack S,LinkQueue Q,LinkQueue L) //菜单
{
int ch;
printf("********欢迎使用停车场系统*********\n");
printf("(1)驶入停车场\n");
printf("(2)离开停车场\n");
printf("(3)查看停车场信息\n");
printf("(4)按车牌号查车辆信息\n");
printf("(5)退出系统\n");
printf("提示:本停车场共%d 个车位,停满后的车辆停在便道上!\n",MAX);
printf("收费标准,停在停车场的车辆:%.2f元/小时,停在便道上的车辆不收费!\n",PRICE);
while(1)
{
printf("输入你的选择(1-5):");
scanf("%d",&ch);
if(ch>=1 && ch<=5)
{
break;
}
else
{
printf("错误输入\n");
getchar();
}
}
switch(ch)
{
case 1:Reach(&S,&Q,&L);break;
case 2:Leave(&S,&Q,&L);break;
case 3:Showall(S,Q,L);break;
case 4:Seek(S,Q,L);break;
case 5:Quit();break;
}
return 0;
}
/******************************************************************************************************************************
* 项目描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若停车场满了,车要停在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后再依次进入。汽车离开时按停放时间收费。
* **************************************************************************************************************************/
int main () //主函数
{
Stack s;
InitStack(&s);
LinkQueue q;
InitLinkQueue(&q);
LinkQueue l;
InitLinkQueue(&l);
Menu(s,q,l);
return 0;
}