C语言停车场模拟管理程序的设计与实现

项目要求:
  停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后依次进入。汽车离开时按停放时间收费。
基本功能要求:
1)建立三个数据结构分别是:停放队列,让路栈,等候队列
2)输入数据模拟管理过程,数据(入或出,车号)。

//头文件
#include<stdio.h>
#include<stdlib.h>			/*system(cls)函数用到的头文件*/
#include<conio.h>			/*getch()函数用到的头文件*/
#include<windows.h>
#include<string.h>
#include<malloc.h>

#include <time.h>


//宏定义
#define MAX_LEN  15	
#define MAX_STOP  5			//停车场一共有5个停车位
#define MAX_PAVE  3         //便道不限制停放车辆的数目,设为足够大
#define MAX 105  

#define price 2//每小时收费2元
  
//结构体
//汽车
typedef struct  {
	char license_plate[10]; //汽车牌照号码,定义为一个字符指针类型
    char state[3];          //汽车的当前状态,字符s表示停放在停车位上,字符p表示停放在便道上,每辆车的初始状态用字符i表示
 
	int inhour;
    int inminute;
    int outhour;
    int outminute;

}CAR;
//停车场
typedef struct{ 
	CAR STOP[MAX_STOP];     //各汽车信息的存储空间
	int top;                //用来指示栈顶位置
}STOPPING;
//辅助位置
typedef struct{ 
	CAR BUFF[MAX_STOP];     //各汽车信息的存储空间
	int top;                //用来指示栈顶位置的静态指针
}BUFFER;
//便道
typedef struct{
	CAR PAVE[MAX_PAVE-1];   //各汽车信息的存储空间
	int front, rear;        //用来指示队头和队尾位置
	int count;              //记录汽车的数量
}PAVEMENT;



STOPPING *s;   //停车场
BUFFER *b;     //辅助位置
PAVEMENT *p;   //便道
char carname[17];

int Timeh[MAX_STOP];//各车辆进入停车场的小时
int Timem[MAX_STOP];//各车辆进入停车场的分钟
int timeh;		  //车辆离开停车场的小时
int timem;		  //车辆离开停车场的分钟
int totaltime;

//--------------------------------------------------------
//函数声明
STOPPING *init_stopping();  //初始化“停车位栈”
BUFFER *init_buff();	    //初始化“辅助栈”
PAVEMENT *init_pavement();  //初始化“便道队列”
void car_come();			//汽车信息输入“停车位栈”,并打印该车状态
void stop_to_buff();		//汽车信息从“停车位栈”移动到“辅助栈”
void buff_to_stop();		//汽车信息从“辅助栈”移动到“停车位栈”
void pave_to_stop();		//汽车信息从“便道队列”移动到“停车位栈”	
void Car_to_pave(PAVEMENT *p,char name[MAX_LEN]);//车辆进入便道
void display();				//显示车辆信息的界面
void welcome();				//欢迎界面
void come();				//汽车进入停车位管理模块
void leave();				//汽车离开停车位管理模块
void Car_mid();				//车从停车场离场的中间步骤
void out_Time();            //记录出停车场的时间
//--------------------------------------------------------

//欢迎界面
void welcome()                       
{
	system("cls");
	printf("\n\n\n\n\n"); 
	printf("\t\t|-------------------------------**欢迎使用本程序**-------------------------------|\n");
	printf("   												              \n");
	printf("\t\t|\t\t本程序为停车场的模拟管理程序,进入停车场请按【1】键。            |\n");
	printf("\t\t|\t\t根据屏幕提示进行相关操作,车要离开时请按    【2】键。            |\n");
	printf("\t\t|\t\t根据屏幕提示相进行关的操作,查看停车场状态和便道上的状态请按【3】|\n");
	printf("\t\t|\t\t根据屏幕提示进行相关操作,要退出程序请按    【0】键。            |\n");
	printf("\t\t|\t\t注意:输入完毕或操作完成后按【Enter】或【空格】均可进行下一步操作|\n");
	printf("\t\t|\t\t下面请选择您要进行的操作:                                       |\n");
	printf("   												              \n");
	printf("\t\t|--------------------------------------------------------------------------------|\n\n");
	printf("\t\t\tplease choose (0-3): ");
}

//初始化“停车位栈”
STOPPING *init_stopping()
{
	STOPPING *s=(STOPPING*)malloc(sizeof(STOPPING));//分配内存空间
	s->top=-1;
	return s;	
}
//初始化“辅助栈”
BUFFER *init_buff()
{
	BUFFER *b=(BUFFER*)malloc(sizeof(BUFFER));      //分配内存空间
	b->top=-1;
	return b;
}
//初始化“便道队列”
PAVEMENT *init_pavement()
{
	PAVEMENT *p=(PAVEMENT*)malloc(sizeof(PAVEMENT));//分配内存空间
	p->front=p->rear=MAX_PAVE-1;					//初始化一个循环队列
	p->count=0;
	return p;
}

//车辆进入便道
void Car_to_pave(PAVEMENT *p,char name[MAX_LEN])
{
    if(p->count>0&&p->front==(p->rear+1)%MAX_PAVE)//如果便道已满,给一个提示
    {
        printf("Sorry! 便道已满,停车场没有空位了。\n");
        return ;
    }
    else
    {
        p->rear=(p->rear+1)%MAX_PAVE;
        p->count++;
        strcpy(p->PAVE[p->rear].license_plate,carname);
		strcpy(p->PAVE[p->rear].state,"p");//状态
        printf("%s号车,您好!\n",carname);
        printf("%s开入便道%d号车位\n",carname,p->rear+1);//车位:1--5号
    }
}

//汽车信息输入“停车位栈”,并打印该车状态
void car_come()
{
	printf("停车场有空闲位置,请输入此时的时间(h,m):\n");
	s->top++;
	scanf(" %d:%d",&s->STOP[s->top].inhour,&s->STOP[s->top].inminute);//输入进入停车场各车辆时间
    Timeh[s->top]=s->STOP[s->top].inhour;
    Timem[s->top]=s->STOP[s->top].inminute;//记录进入停车场各车辆时间
    strcpy(s->STOP[s->top].license_plate,carname);//存储各车辆牌号信息
	strcpy(s->STOP[s->top].state,"s");            //修改该车状态
    printf("%s号车,您好!\n",carname);
    printf("%s开入停车场%d号车位\n",carname,s->top+1);
}

//汽车进入停车位管理模块	    
void come()				
{
	printf("请输入您的车牌号:");
    scanf("%s",carname);

	if(s->top==MAX_STOP-1)//判断停车场是否满位
    {
		Car_to_pave(p,carname);//把车停到便道上
	}
	else
    {
        printf("停车场有空闲位置\n");
		//将汽车压入“停车位栈”,并修改该车状态
		car_come();
    }
}

//将汽车从“停车位栈”移动到“辅助栈”
void stop_to_buff()
{
	strcpy(b->BUFF[++b->top].license_plate,s->STOP[s->top+1].license_plate);//要离开的车后面车辆压入辅助栈
	strcpy(s->STOP[s->top+1].state,"i");    //修改车辆的状态
    printf("牌照为%s的汽车暂时退出停车场\n",s->STOP[s->top+1].license_plate);
}

//汽车信息从“辅助栈”移动到“停车位栈”
void buff_to_stop()
{
	while(b->top>=0)//从辅助栈压入临时停放的车辆
    {
		strcpy(s->STOP[++s->top].license_plate,b->BUFF[b->top--].license_plate);
    }
}

//汽车信息从“便道队列”移动到“停车位栈”
void pave_to_stop()
{
	int i;
	strcpy(s->STOP[++s->top].license_plate,p->PAVE[p->front].license_plate);//将便道的车停入停车场
    printf("牌照为%s的汽车停回停车场%d号车位\n",p->PAVE[p->front].license_plate,s->top+1);
    if(p->count>1)
    {
		for(i=p->front+1; i<p->count; i++)
        {
            strcpy(p->PAVE[i-1].license_plate,p->PAVE[i].license_plate);//便道上车停入停车场后,便道中的车前移
        }
            p->rear--;
            p->front--;
            p->count--;
    }
    else//便道中有1个车
    {
        p->rear=MAX_PAVE-1;
        p->front=MAX_PAVE-1;
        p->count=0;
    }	
}
//车从停车场离场的中间步骤
void Car_mid()
{
    int find = 0;
    while(s->top>=0)
    {
        if(strcmp(s->STOP[s->top--].license_plate,carname)==0)//寻找要离开的车辆,若找到则跳出此循环
        {
            find = 1;
            break;
        }
        else
        {
			//汽车信息从“停车位栈”移动到“辅助栈”
            stop_to_buff();
        }
    }
    if(!find)//未找到此车
    {
        printf("查无此车!\n");
        while(b->top>=0)//从辅助栈压入临时停放的车辆
        {
            strcpy(s->STOP[++s->top].license_plate,b->BUFF[b->top--].license_plate);
        }
        return ;
    }
    else
    {
		out_Time();
		//汽车信息从“辅助栈”移动到“停车位栈”
		buff_to_stop (); 
        if(s->top<=MAX_STOP-1&&p->count>0)//
        {
            p->front=(p->front+1)%MAX_PAVE;
			//汽车信息从“便道队列”移动到“停车位栈”
			pave_to_stop();  
        }
    }
}
//记录出停车场的时间
void out_Time()
{
	int i;
	printf("请输入此时离开的时间:\n");
    scanf("%d:%d",&s->STOP[s->top+1].outhour,&s->STOP[s->top+1].outminute);
    timeh=s->STOP[s->top+1].outhour;//记录离开车的小时
    timem=s->STOP[s->top+1].outminute;//记录离开车的分钟
    if(Timeh[s->top+1]==timeh)//出去和进入的小时是相同的,不满一小时
    {
        totaltime=1;
    }
    else
    {
        totaltime=timeh-Timeh[s->top+1]+(timem>Timem[s->top+1]?1:0);//计算停车的时间,小时
    }
    printf("牌照为%s的汽车从停车场开走\n",s->STOP[s->top+1].license_plate);
    printf("停车%d小时,应收费%d元\n",totaltime,price*totaltime);
	if(s->top+1>=0)
    {
		for(i=s->top+1; i<MAX_STOP-1; i++)
        {
			Timeh[i]=Timeh[i+1];//离开车辆位置后的车辆进入时间往前移一位
            Timem[i]=Timem[i+1];//记录原来车辆的进入时间
        }
        Timeh[MAX_STOP]=timeh;
        Timem[MAX_STOP]=timem;//最外头的是新进来车辆的时间;先是辅助栈进入停车场,然后是便道的车辆进入停车场
 
    }
}
//车辆离开
void leave()
{
    printf("请输入将要离开的车牌号:");
    scanf("%s",carname);
    if(s->top<0)   //停车场是空的
        printf("停车场为空!\n");
    else
        Car_mid();
}

void display()
{
    int i;
    if(s->top==-1)
    {
        printf("停车场为空!\n");
    }
    else
    {
        printf("停车场有%d个车位,已停%d个车位,便道有车位%d个,便道已停%d个车位\n",MAX_STOP,s->top+1,MAX_PAVE-1,p->count);
        if(p->count>0)
        {
            printf("停车场车辆情况:\n");
            for(i=0; i<=s->top; i++)
            {
                printf("%d号停车车位:%s\n",i+1,s->STOP[i].license_plate);
            }
            printf("便道车辆情况:\n");
            for(i=0; i<p->count; i++)
            {
                printf("%d号便道车位:%s\n",i+1,p->PAVE[i].license_plate);
            }
        }
        else
        {
            printf("停车场车辆情况:\n");
            for(i=0; i<=s->top; i++)
            {
                printf("%s\n",s->STOP[i].license_plate);
            }
            printf("便道为空!\n");
        }
    }
}

int main()
{	
	s=init_stopping();	//初始化“停车位栈”
	b=init_buff();		//初始化“辅助栈”
	p=init_pavement();	//初始化“便道队列”
	int option;
	welcome();
	scanf("%d",&option);
	while(option)
	{  
		switch(option)
		{
			case 1: come();break;
			case 2: leave();break;
			case 3: display();break;
			default: break;
		}
		getch();
		welcome();
		scanf("%d",&option);
	}
	printf("谢谢使用,再会!\n");
	return 0;
}



[还有一种简易的初始化栈和队列的方法:](http://ddrv.cn/a/83269)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值