您的位置:首页 > 理论基础 > 数据结构算法

数据结构——停车场系统

2020-06-05 06:12 267 查看

停车场系统代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: