停车场管理系统

设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排以便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场时,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX 5//停车场的容量
#define PRICE 2.0//停车收费价格:元/小时

typedef struct car
{
	char name[10];//车牌号
	struct tm intime;//入库时间
	struct tm outtime;//出库时间
	int expense;//停车费用
	int length;//停车时间
	int position;//车位
}CAR;//车位信息
typedef struct stack
{
	int top;
	CAR num[MAX];
}Stack;//栈
struct carnode
{
	CAR data;
	struct carnode*next;
};//过道车的结点
typedef struct carnode Carnode;
typedef struct carnode* Link;
typedef struct queue
{
	Carnode*head;
	Carnode*rear;
}Queue;//队列

int initstack(Stack **s)//初始化栈
{
	(*s) = (Stack*)malloc(sizeof(Stack));
	if(*s == NULL)
	{
		printf("分配内存出错!n");
		exit(-1);
	}
	(*s)->top = -1;
	return 0;
}
int stackisempty(Stack **s)//判断栈是否为空
{
	if((*s)->top == -1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int stackisfull(Stack **s)//判断栈是否为满
{
	if((*s)->top == MAX-1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int stackpush(Stack **s,CAR car)//入栈
{
	if(!stackisfull(s))
	{
		(*s)->top++;
		(*s)->num[(*s)->top] = car;
	}
}
CAR stackpop(Stack **s)//出栈
{
	CAR car;
	if(!stackisempty(s))
	{
		car = (*s)->num[(*s)->top];
		(*s)->top--;
	}
	return car;
}
int initqueue(Queue **q)//初始化队列
{
	(*q) = (Queue*)malloc(sizeof(Queue));
	if(*q == NULL)
	{
		printf("内存分配出错!\n");
		exit(-1);
	}
	(*q)->head = NULL;
	(*q)->rear = NULL;
	return 0;
}
int queueisempty(Queue **q)//判断队列是否为空
{
	if((*q)->head == NULL && (*q)->rear == NULL)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int queuepush(Queue **q,CAR car)//入队列
{
	Link tmp = NULL;
	tmp = (Link)malloc(sizeof(Carnode));
	if(tmp == NULL)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}
	tmp->data = car;

	tmp->next = (*q)->head;
	(*q)->head = tmp;
	
	return 0;
}
CAR queuepop(Queue **q)//出队列
{
	CAR car;
	Link tmp = NULL;
	Link p = NULL;
	tmp = (Link)malloc(sizeof(Carnode));
	if(tmp == NULL)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}
	tmp = (*q)->head;
	if(!queueisempty(q))
	{
		if(tmp == (*q)->rear)
		{
			car = tmp->data;
			free(tmp);
			(*q)->head = NULL;
			(*q)->rear = NULL;
			return car;
		}
		while(tmp->next != (*q)->rear)
		{
			p = tmp;
			tmp = tmp->next;
		}
		if((*q)->rear == NULL)
		{
			if(tmp == (*q)->head)
			{
  	      		car = ((*q)->head)->data;
				free((*q)->head);
				(*q)->head = NULL;
			}
			else
			{
   	     		car = tmp->data;
				free(tmp);
				(*q)->rear = p;
				p->next = NULL;
			}
		}
		else
		{
			car = ((*q)->rear)->data;
			free((*q)->rear);
			(*q)->rear = tmp;
			tmp->next = NULL;
		}
	}
	
	return car;
}
int printfdata(struct tm gm)//显示时间
{
	printf("%d/%d %2d:%2d:%2d\n",gm.tm_mon,gm.tm_mday,gm.tm_hour+8,gm.tm_min,gm.tm_sec);
	return 0;
}
int showstack(Stack **s)//查看车库车辆
{
	int i;
	printf("****************************************\n");
	printf("车位使用情况\n");
	if(stackisempty(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("*******************************************\n");
	return 0;
}
int showqueue(Queue **q)//查看过道车辆
{
	printf("****************************************\n");
	if(!queueisempty(q))
	{
		Carnode *p = NULL;
		p = (Link)malloc(sizeof(Carnode));
		if(p == NULL)
		{
			printf("内存分配出错!\n");
			exit(-1);
		}
		p = (*q)->head;
		printf("过道使用情况!\n");
		printf("车牌号\t进入时间\n");
		while(p != NULL)
		{
			printf("%s\t",p->data.name);
			printfdata(p->data.intime);
			p = p->next;
		}
	}
	else
	{
		printf("过道上没有车在等待\n");
	}
	printf("****************************************\n");
	return 0;
}
int showall(Stack **s,Queue **q)//查看整个停车场车辆
{
	showstack(s);
	showqueue(q);
	menu(s,q);
	return 0;
}
int reach(Stack **s,Queue **q)//入库
{
	CAR car;
	struct tm *gm;
	time_t lt;
	time(<);
	gm = gmtime(<);

	car.intime = *gm;
	printf("输入车牌号:");
	scanf("%s",car.name);

	if(!stackisfull(s) && queueisempty(q))//栈未满,入栈
	{
		car.position = ((*s)->top) + 2;
		stackpush(s,car);
		showstack(s);
	}
	else if(stackisfull(s) || !queueisempty(q))//栈满,入队列
	{
		printf("提示:车位满,只有先停放在过道上!\n");
		car.position = MAX;
		queuepush(q,car);
		showall(s,q);
	}
	menu(s,q);
	return 0;
}
int printfrate(CAR *car)//打印帐单
{
	printf("****************************************\n");
	printf("帐单\n");
	printf("车牌号:%s\n",car->name);
	printf("停车位置:%d\n",car->position);
	printf("进入时间:");
	printfdata(car->intime);
	//printf("\n");
	printf("离开时间:");
	printfdata(car->outtime);
	//printf("\n");
	printf("停车时间(秒):%d\n",car->length);
	printf("费用(元):%d\n",car->expense);
	//printf("\n\n");
	printf("****************************************\n");
	return 0;
}
int leave_s(Stack **s,Queue **q)//离开车库
{
	struct tm *gm;
	time_t lt;
	
	Stack *p = NULL;
	initstack(&p);
	//char nowtime[10];
	CAR car;
	int i;
	int pos;

	if(stackisempty(s))
	{
		printf("所有车位是空的,没有车辆需要离开!\n");
	}
	else
	{
		printf("现在车位使用情况!\n");
		showstack(s);
		printf("哪个车位的车辆需要离开:");
		scanf("%d",&pos);
		if(pos > 0 && pos <= (*s)->top+1)
		{
			for(i = (*s)->top+1; i > pos;i--)
			{
	   			car = stackpop(s);
			    car.position = car.position - 1;
			    stackpush(&p,car);
			}
			car = stackpop(s);
			time(<);
			gm = gmtime(<);
			car.outtime = (*gm);//出栈时间
			car.length = mktime(&car.outtime)-mktime(&car.intime);
			car.expense = (car.length/3600+1)*PRICE;
			printfrate(&car);
			while(!stackisempty(&p))
			{
	   			car = stackpop(&p);
				stackpush(s,car);
			}
			while(!stackisfull(s) && !queueisempty(q))
			{
 	  			car = queuepop(q);
				time(<);
				gm = gmtime(<);
				car.intime = (*gm);
				stackpush(s,car);
			}
		}
		else
		{
			printf("输入车位错误,那个车位没有车!\n");
		}
	}
	menu(s,q);
	return 0;
}
int leave_q(Stack **s,Queue **q)
{
	char name[10];
	Carnode *tmp = NULL;
	Carnode *p = NULL;
	CAR car;

	/*tmp = (Link)malloc(sizeof(Carnode));
	if(tmp == NULL)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}*/

	tmp = (*q)->head;

	if(queueisempty(q))
	{
		printf("过道上是空的,没有车辆需要离开!\n");
	}
	else
	{
		showqueue(q);
		printf("过道上哪个车需要离开,输入车牌号:");
		scanf("%s",name);
		while(tmp != NULL)
		{
			if(strcmp(name,(tmp->data).name) == 0)
			{
				break;
			}
			p = tmp;
			tmp = tmp->next;
		}
		if(tmp == NULL)
		{
			printf("过道没有这辆车!\n");
		}
		else
		{
			if((*q)->rear == NULL)
			{
				if(tmp->next == NULL)
				{
					if(tmp == (*q)->head)
					{
						car = tmp->data;
						free(tmp);
						(*q)->head = NULL;
					}
					else
					{
						car = tmp->data;
						p->next = NULL;
					}
				}
				else
				{
					if(tmp == (*q)->head)
					{
						car = tmp->data;
						(*q)->head = tmp->next;
						free(tmp);
					}
					else
					{
						car = tmp->data;
						p->next = tmp->next;
						free(tmp);
					}
				}
			}
			else
			{
				if(tmp == (*q)->head)
				{
					if(tmp == (*q)->rear)
					{
						car = tmp->data;
						free(tmp);
						(*q)->head = NULL;
						(*q)->rear = NULL;
					}
					else
					{
						car = tmp->data;
						(*q)->head = tmp->next;
						free(tmp);
					}
				}
				else
				{
					if(tmp == (*q)->rear)
					{
						car = tmp->data;
						(*q)->rear = p;
						p->next = NULL;
						free(tmp);
					}
					else
					{
						car = tmp->data;
						p->next = tmp->next;
						free(tmp);
					}
				}
			}
			printf("************************\n");
			printf("车牌号:%s\n",car.name);
			printf("进入过道时间:");
			printfdata(car.intime);
			printf("不收费,欢迎再次使用!\n");
			printf("************************\n");
		}
	}
	return 0;
}
int leave(Stack **s,Queue **q)
{
	char ch;

	while(1)
	{
		printf("输入你的车位置(1)车库(2)过道:");
		scanf(" %c",&ch);
		if(ch == '1' || ch == '2')
		{
			break;
		}
		else
		{
			printf("输入序号有误!\n");
		}
	}
	switch(ch)
	{
		case '1':leave_s(s,q);
				 break;
		case '2':leave_q(s,q);
				 break;
	}
	menu(s,q);
	return 0;
}
int quit(Stack **s,Queue **q)//退出系统
{
	printf("欢迎你的下次使用!\n");
	exit(0);
	return 0;
}
int menu(Stack **s,Queue **q)//菜单	
{
	char ch;

	printf("******欢迎使用停车场系统******\n");
	printf("        (1)驶入停车场         \n");
	printf("        (2)离开停车场         \n");
	printf("        (3)查看停车场信息     \n");
	printf("        (4)退出系统           \n");
	printf("提示:本停车场共%d个车位,停满后的车辆停在过道上!\n",MAX);
	printf("收费标准,停在停车场的车辆:%.2f元/小时,停在过道上的车辆不收费!\n",PRICE);
	while(1)
	{
		printf("输入你的选择(1-4):");
		scanf(" %c",&ch);
		if(ch >= '1' && ch <= '4')
		{
			break;
		}
		else
		{
			printf("输入序号有误!\n");
		}
	}
	switch(ch)
	{
		case '1': reach(s,q);
				  break;
		case '2': leave(s,q);
				  break;
		case '3': showall(s,q);
				  break;
		case '4': quit(s,q);
				  break;
	}
	return 0;
}
int main()
{
	Stack *s = NULL;
	initstack(&s);
	Queue *q = NULL;
	initqueue(&q);
	menu(&s,&q);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值