一、停车管理系统(有点BUG)
#include <stdio.h>
#include "Queue.h"
#include "Stack.h"
#include <stdlib.h>
#include <time.h>
enum {EXIT,PARK,LEAVE,FIND};
struct Time
{
int time_in;
int time_out;
}ptime;
void Menu(); //定义菜单
//定义功能实现
void Func(Stack *s_way,Queue *q_wait,Stack *s_park,int *id,int *num);
//定义停车功能
int Park(Stack *s_park,Queue *q_wait,int *id,int *num,int count);
//查看停车场的车辆
void Find(Stack *s_way,Queue *q_wait,Stack *s_park,int num);
//车辆驶离停车场
int Leave(Stack *s_way,Stack *s_park,Queue *q_wait,int *id,int *num,int *count);
int main()
{
Stack s_way; //让路栈
InitS(&s_way);
Queue q_wait; //等候队列
Init(&q_wait);
Stack s_park; //停车栈
InitS(&s_park);
int num = 0;
int id = 0; //统计停车场停放的车辆数
while(1)
Func(&s_way,&q_wait,&s_park,&id,&num); //0退出,1停车,2离开,3查看停车信息。
return 0;
}
//主菜单
void Menu()
{
printf("*****************welecome to our Car Parting**************\n");
printf("**\t\t\t1、停车\t\t\t\t**\n");
printf("**\t\t\t2、离开\t\t\t\t**\n");
printf("**\t\t\t3、查看停车信息\t\t\t**\n");
printf("**\t\t\t0、退出\t\t\t\t**\n");
printf("**********************************************************\n");
}
//停车
int Park(Stack *s_park,Queue *q_wait,int *id,int *num,int count)
{
if(FullS(s_park))
{
printf("您前面已有%d辆车在等候,您是第%d辆\n",count,count+1);
sleep(2);
count++;
push(q_wait,count);
return count;
}
else
{
(*id)++; //有车停入,数量加一
// if(id > SIZE && != 0)
{
}
pushS(s_park,*id);
time_t t1; //记录时间
long int t = time(&t1);
char *t2;
t2 = ctime(&t1);
ptime.time_in = t;
printf("车辆停入成功,id号码为%d\n",*id);
printf("车辆进入时间:%s\n",t2);
sleep(2);
}
return 0;
}
//车辆离开
int Leave(Stack *s_way,Stack *s_park,Queue *q_wait,int *id,int *num,int *count)
{
int i; //要离开车辆的id
int tmp = 0; //判断车库有没有满,有无车在等待
printf("请输入要驶离车辆的id号码:");
scanf("%d",&i);
int j = s_park->top;
while(i < (s_park->data[j])) //将大于要离开车辆id的车放到让路栈中
{
int k = GetTopS(s_park); //获取栈顶的车辆id
pushS(s_way,k);
popS(s_park);
j--;
}
popS(s_park);
time_t t1; //记录时间
long int t = time(&t1);
char *t2;
t2 = ctime(&t1);
ptime.time_out = t;
printf("车辆离开时间:%s\n",t2);
if(Null(q_wait) == FALSE) //如果候车队列有车则进入
{
pushS(s_park,i);
pop(q_wait);
tmp = *count;
(*count)--;
printf("停放id为%d的车已经出库,等候区第一俩车入库成功id为%d\n",i,i);
printf("此时等候区有%d辆车在等候\n",*count);
sleep(2);
}
while(!NullS(s_way)) //将让路栈的id全部放回停车栈
{
int k = GetTopS(s_way); //获取栈顶的车辆id
pushS(s_park,k);
popS(s_way);
}
if(0 == tmp)
{
int time_all = (ptime.time_out)-ptime.time_in;
printf("总共停车为%d分钟,收费%d元\n",time_all/60,time_all/60*2);
printf("停放id为%d的车已经出库,此时等候区无车辆\n",i);
sleep(3);
return i;
}
return 0;
}
//查看停车场的的车辆
void Find(Stack *s_way,Queue *q_wait,Stack *s_park,int num)
{
while(1)
{
system("clear");
printf("-----------------------------停车场现有车辆--------------------------------\n");
int i;
for(i = 0 ; i <= s_park->top;i++)
{
printf("-车辆id:%d\t",s_park->data[i]);
printf("车牌号码:%d\t",num);
time_t t1; //记录时间
long int t = time(&t1);
printf("总停车时间为:%ld\n",t-(ptime.time_in));
}
printf("--------------------------------------------------------------------------\n");
int j;
printf("\t\t\t\t\t\t\t请输入0退出查看界面\n");
scanf("%d",&j);
if(0 == j)
break;
}
}
//功能
void Func(Stack *s_way,Queue *q_wait,Stack *s_park,int *id,int *num)
{
system("clear");
Menu(); //界面
static int count = 0; //统计等候队列的人数
int i; //功能选择
printf("请选择功能\n");
scanf("%d",&i);
switch(i)
{
case EXIT: //退出
exit(-1);
break;
case PARK: //停车
count = Park(s_park,q_wait,id,num,count);
break;
case LEAVE: //离开
Leave(s_way,s_park,q_wait,id,num,&count);
break;
case FIND: //查看
Find(s_way,q_wait,s_park,*num);
break;
default :
printf("指令无效,请重新输入指令\n");
break;
}
}
一些没解决的问题:车没满的时候有多辆车离开了,但是离开车辆位置的id不会记住。
时间上的问题:一旦有新的车停入,保存的时间会刷新,(决定明天使用数组保存试试)。