停车场系统代码

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

#define Price  0.05          
#define MAX_STOP 5
#define MAX_PAVE 100 
 

typedef struct time
{
int hour;
int min;
}Time;//定义时间结点

//记录汽车信息 
typedef struct
{
    Time reach;
	Time leave;        // 离开停车场时间
    char license_plate[10];  // 汽车牌照号码
}CAR;

//停车位栈 
typedef struct
{
    CAR Stop[MAX_STOP];   
    int top;                  
}STOPPING;

//通道队列 
typedef struct
{
    int count;                // 用来指示队中的数据个数
    CAR Pave[MAX_PAVE];   
    int front, rear;         
}PAVEMENT;

//辅助栈
typedef struct
{
    CAR Buff[MAX_STOP];  
    int top;                
}Buffer;

STOPPING s;
PAVEMENT p;
Buffer   b;
CAR      c;
char     plate[10];



void car_come();
void car_pave();
void car_leave();
void stopinfor(); 
void paveinfor();

void welcome() //功能展示界面 
{
	printf("===欢迎使用停车场管理系统===\n");
	printf("  1.车辆到达登记\n");
	printf("  2.车辆离开登记\n");
	printf("  3.车辆停靠信息查询\n");
	printf("  4.退出系统\n");
}


void come() // 汽车驶入界面,判断该停入停车位还是停入通道 
{
	printf("******车辆到达登记******\n");
    if (s.top >= MAX_STOP - 1) // 如果停车位已满,停入便道
    {
        car_pave();                    
    }
    else  //否则停入停车位 
    {
        car_come();
    }
    getchar();
}


void car_come() //汽车停入停车位 
{
	printf ("请输入该车的车牌号:");     
    scanf ("%s", &plate);
	printf("请输入该车到达时间(用空格隔开):\n");
    scanf("%d %d",&s.Stop[s.top+1].reach.hour, &s.Stop[s.top+1].reach.min);
    s.top++;                            // 停车位栈顶指针加1 
    strcpy(s.Stop[s.top].license_plate, plate);     
    printf ("汽车%s已停入%d号停车位\n", plate,s.top + 1);
    printf("汽车停入登记完毕!");	
    
}


void car_pave() // 汽车停入通道 
{
	printf ("请输入该车的车牌号:");     
    scanf ("%s", &plate);
    strcpy(p.Pave[p.rear].license_plate, plate);    // 车进入便道 
    p.rear = (p.rear + 1) % MAX_PAVE;   // 队尾指示器加1
    p.count++;                          // 计数器加1
    printf ("汽车%s已停入%d号便道\n", plate, p.rear);
    
}


void leave() // 汽车离开界面 
{
	printf("******车辆离开登记******\n");
    printf ("请输入即将离开的车牌号:\n");
    scanf ("%s", &plate);
    if (s.top < 0)      // 若停车位栈头指针为-1,则车位为空 
    {
        printf ("车位已空,无车辆信息!\n");
    }
    else
    {
        car_leave();  //若有车辆,则进入车离开函数 
    }
    getchar();
}


void car_leave()
{
	int alltime;
	double money;
	while (s.top >= 0)
    {
        if (0 == strcmp(s.Stop[s.top].license_plate, plate)) //如果找到此车跳出循环 
        {
            break;
        }

        strcpy(b.Buff[b.top++].license_plate, s.Stop[s.top].license_plate);
        printf ("牌照为%s的汽车进入辅助站\n", s.Stop[s.top--].license_plate);
    }

    // 如果停车位中的车都让了道,说明停车位中无车辆需要出行
    if (s.top < 0)
    {
        printf ("停车位上无此车消息\n");
    }
    else
    {
        printf("请输入该车离开时间(用空格隔开):\n");
        scanf("%d %d",&s.Stop[s.top].leave.hour, &s.Stop[s.top].leave.min);
        if(s.Stop[s.top].leave.min>=s.Stop[s.top].reach.min)
        	alltime=(s.Stop[s.top].leave.hour-s.Stop[s.top].reach.hour)*60+(s.Stop[s.top].leave.min-s.Stop[s.top].reach.min);
        else
        	alltime=(s.Stop[s.top].leave.hour-s.Stop[s.top].reach.hour-1)*60+(s.Stop[s.top].leave.min+60-s.Stop[s.top].reach.min)%60;
       
        money=Price*alltime;
		printf ("牌照为%s的汽车从停车场开走\n", s.Stop[s.top].license_plate);
	    printf("该车到达时间为:%d: %d\n",s.Stop[s.top].reach.hour, s.Stop[s.top].reach.min);
		printf("该车离开时间:%d:%d\n",s.Stop[s.top].leave.hour, s.Stop[s.top].leave.min);
        printf ("共计时间:%d 分钟\n", alltime );
        printf ("需支付%.2lf元\n", money );
        s.top--;
    }

    // 将辅助站中的车辆信息进入停车位栈
    while (b.top > 0)
    {
        strcpy(s.Stop[++s.top].license_plate, b.Buff[--b.top].license_plate);
        printf ("牌照为%s的汽车停回停车位%d车位\n", b.Buff[b.top].license_plate, s.top+1);
    }

    while (s.top < MAX_STOP-1)//从便道到停车位 
    {
        if (0 == p.count)   // 判断队列是否为空
        {
            break;
        }   // 不为空,将便道中优先级高的车停入停车位
        else
        {
            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);
            p.front = (p.front + 1) % MAX_PAVE;
            p.count--;
            printf("请输入汽车%s的驶入时间(中间用空格隔开):\n",s.Stop[s.top].license_plate);
            scanf("%d %d",&s.Stop[s.top].reach.hour, &s.Stop[s.top].reach.min);
        }
    }
}

void Display()
{
	int flag,choice;
    printf("1.停车场信息\n");
    printf("2.便道信息\n");
    printf("3.返回主菜单\n");
    printf("请输入您要进行的操作(1~3):");
    scanf("%d",&choice);
    switch(choice)
    {
        case 1:stopinfor();
                break; 
        case 2:paveinfor();
                break;
        case 3:flag=0;break;
        default: break;
    }
    getchar();
}


void stopinfor()  //停车场显示信息 
{
    int m = s.top,i;
    if (m == -1)
    {
        printf ("停车场里没有车\n");
    }
    else{
    	printf("========停车场信息查询========\n");
    	printf ("车牌号\t\t位置\t\t驶入时间\n");
    	for(i=0;i<=m;i++)
    	{
    		printf("%s",s.Stop[i].license_plate);
    		printf("\t\t%d",i+1);
    		printf("\t\t%d : %d\n",s.Stop[i].reach.hour, s.Stop[i].reach.min);
		}
	}
    
}

void paveinfor() //便道上信息 
{ 
    int m = p.rear, i=p.front;
    if(p.front!=p.rear) 
    {
        
        printf("===========便道信息查询========:\n");
        printf ("车牌号\t\t位置\n");
    	for(i;i<m;i++)
    	{
    		printf("%s",p.Pave[i].license_plate);
    		printf("\t\t%d\n",i+1);
    		//printf("\t\t%d : %d\n",p.Pave[i].reach.hour, p.Pave[i].reach.min);
        }
    }
    else 
        printf("便道里没有车"); 

}

int main()
{
    // 初始化
    s.top   = -1; //令top指向栈顶元素 
    b.top   =  0;
    p.rear  =  0;
    p.count =  0;
    p.front =  0;
 
    int select;//select接收用户的选择 
    while(1)
    {
        system("cls");
		welcome();
		printf("\n请输入您要进行的操作(1~4):\n");
		scanf("%d",&select);
		getchar();
		switch(select)
		{
			case 1 : come();
			         break;
			case 2 : leave();
			         break;
			case 3 : Display();
			         break;
			case 4 : return 0;
			default : printf("请输入正确的操作序号(1~4)!");
		}
		getchar();
    }
    return 0;
}