数据结构第七天(停车场管理1.0)

一、停车管理系统(有点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不会记住。
时间上的问题:一旦有新的车停入,保存的时间会刷新,(决定明天使用数组保存试试)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值