停车场管理系统

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#define MAX 20  //车库容量
typedef struct car{
	time_t time1;  //车辆进入时间
	time_t time2;  //车辆离开时间
	char num[10]; //车牌号
}CAR;			  //车辆信息
typedef struct seqstackcar{
	int top;
	CAR stack[MAX];
}SeqStackCar;		//用栈模拟车库
typedef struct QNode{ 
	CAR waitingcar;
	struct QNode *next;
}QNode,*QueuePtr;//结点类型
typedef struct{   
	QueuePtr front;  //队头指针
	QueuePtr rear;   //队尾指针
}Linkq;					//链队列类型
void InitStack(SeqStackCar *S)//初始化栈
{
	S->top=0;
}                  
void EnQueue(Linkq *q,CAR a) //入便道队列
{
	QNode *p;
	printf("\n车位已满,请在便道等候!\n");
	p=(QNode *)malloc(sizeof(QNode));
	p->next=NULL;
	p->waitingcar=a;
	q->rear->next=p;
	q->rear=p;
}
void Arrival(Linkq *q,SeqStackCar *Enter,CAR h,int n){//车辆进入
	//time_t t;
	if(Enter->top==n){
	    printf("\n 车位已满,请在便道等候,请输入车牌号:\n");
	    scanf("%s",h.num);
		EnQueue(q,h);
	}
	else{
		printf("\n 请输入车牌号:");
		scanf("%s",h.num);
		h.time1 = time(NULL);
		Enter->top++;
		Enter->stack[Enter->top]=h;
		printf("\n 您的车位号是%d\n",Enter->top);
	}
}
double price(CAR h,double p,int t){     //停车费
	static double sum=0;
	double a=difftime(h.time2,h.time1);
	sum+=a*p;
	if(t==1)
	  return a*p;
	else
	  return sum;
}
void Leave(Linkq *q,SeqStackCar *Enter,double p,CAR h){  //离开车位
	SeqStackCar *Temp;  //临时栈
	int room;
	Temp=(SeqStackCar *)malloc(sizeof(SeqStackCar));
	InitStack(Temp);
	printf("请输入离开的车位号(范围为1--%d)\n",Enter->top);
	scanf("%d",&room);
	while(Enter->top>room)//车辆进入临时栈
	{
	  Temp->stack[++Temp->top]=Enter->stack[Enter->top];
	  Enter->top--;
	}
	h=Enter->stack[Enter->top];
	Enter->top--;
	h.time2=time(NULL);
	printf("\n出库车牌:%s  车位号:%d\n",h.num,Enter->top);
	printf("您本次的停车费为:%.2f\n",price(h,p,1));
	while(Temp->top>=1)
	{
		Enter->top++;
		Enter->stack[Temp->top]=Temp->stack[Enter->top];
		Temp->top--;
	}
	if((q->front!=q->rear)&&Enter->top<MAX)
	{
		QNode *p;
		p=(QNode *)malloc(sizeof(QNode));
		p=q->front->next;
        q->front->next=p->next;
		if(p->next==NULL)
			q->rear=q->front;
		Enter->top++;
		Enter->stack[Enter->top]=p->waitingcar;
		printf("便道内车牌为%s的车进入%d号车位\n",p->waitingcar.num,Enter->top);
		free(p);
	}
}
void check(SeqStackCar *Enter,int n){
  int a;
  a=n-Enter->top;
  printf("目前还有车位数%d\n",a);
}
void InitQueue(Linkq *q)//初始化暂停便道
{
	q->front=(QNode *)malloc(sizeof(QNode));
	q->rear=q->front;
	q->front->next=NULL;
}
void display(Linkq *q,SeqStackCar *Enter){
	QNode *p;
	int i=0;
	p=(QNode *)malloc(sizeof(QNode));
	if(Enter->top==0)
		printf("停车场内没有车!\n");
	else
		printf("停车场内有%d辆车\n",Enter->top);
	if(q->rear==q->front)
		printf("暂停便道内没有车!\n");
	else{
		for(p=q->front->next;p;p=p->next)
        i++;
		printf("停车场内有%d辆车\n",i);
	}
	free(p);
}
void Menu()
{
    printf("\t**                 停车场管理程序                **\n");
    printf("\t===================================================\n");
    printf("\t**              1 --- 设置已停车量、停车价格     **\n");
    printf("\t**              2 --- 汽车进停车场               **\n");
    printf("\t**              3 --- 汽车出停车场               **\n");
    printf("\t**              4 --- 收费情况统计               **\n");
	printf("\t**              5 --- 查询当前空闲车位数         **\n");
	printf("\t**              6 --- 查看当前整体情况           **\n");
	printf("\t**              7 ---     退出                   **\n");
    printf("\t===================================================\n");
} 
void operate(int n,double p,SeqStackCar *Enter,CAR h,Linkq *q)
{
     int ch;
	 printf("请输入您的选择:");
     scanf("%d",&ch);
     switch(ch)
     {
               case 1:
                    {
                          printf("请输入参数n,停车每秒价格p\n");
						  scanf("%d%f",&n,&p);
						  operate(n,p,Enter,h,q);
                          break;
                    }
               case 2:
                    {
                          Arrival(q,Enter,h,n);
						  operate(n,p,Enter,h,q);
                          break;
                    }
			   case 3:
                    {
                          Leave(q,Enter,p,h);
						  operate(n,p,Enter,h,q);
                          break;
                    }
			   case 4:
                    {
                          printf("统计从程序启动到当前已经收入%.2f费用\n",price(h,p,0));
						  operate(n,p,Enter,h,q);
                          break;
                    }
			   case 5:
                    {
                          check(Enter,n);
						  operate(n,p,Enter,h,q);
                          break;
                    }
			  case 6:
                    {
                          display(q,Enter);
						  operate(n,p,Enter,h,q);
                          break;
                    }
				case 7:
					{
					       exit(0);
						   break;
					}
               default:
                       {
                                printf("输入错误,请重新选择操作!");
								operate(n,p,Enter,h,q);
                                break;
                       }
     }
} 
int main(){
	int n=10;     //最多停n量
	double p=3;  //停车每秒价格
	SeqStackCar *S;
	Linkq *q;
	CAR h;
	h.time1=0;
	S=(SeqStackCar *)malloc(sizeof(SeqStackCar));
	q=(Linkq *)malloc(sizeof(Linkq));
	InitQueue(q);
	InitStack(S);
	Menu();
	operate(n,p,S,h,q);
	getchar();getchar();
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值