停车场系统代码
#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;
}