/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
项目名:停车场管理系统
课程:数据结构基础
编译环境:Visual Stuido .Net 2005
最后更改:2005/9/25
程序说明:1.本程序在VS.NET下编写与调试完成
2.TC下编译亦通过,0 warning ,0 error.
行数:400(包括大量注释)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
#include<stdio.h>
#include<stdlib.h>
//宏定义
#define STACKSIZE 3 //停车场容量,小一点,容易调试;)
#define PRICE 0.05 //费率:$/min,真便宜:)
#define OK 1
typedef int status;
//结构定义
typedef struct { //车辆信息结构
char licence[12]; //车牌号
int reach_h; //到达时间的小时值
int reach_m;
int leave_h; //离开时间的小时值
int leave_m;
} CarInfo;
typedef struct { //用于模拟停车场以及临时队列的栈
CarInfo *carstack[STACKSIZE+1]; //顺序存储
int top; //栈顶
}ParkStack;
typedef struct Car{ //////// 便道的队列
CarInfo *data; //
struct Car *next; //指向链表的下一个元素
}QueueNode; //车辆链表
//
typedef struct { //
QueueNode *front; //队头
QueueNode *rear; //队尾
}ParkLaterQueue; /////////
//---------------函数声明--------------------//
//初始化函数块
status InitStack(ParkStack *); //初始化栈
status InitQueue(ParkLaterQueue *); //初始化便道
//执行方法
status ParkingPush(ParkStack *,ParkLaterQueue *); //车辆到达
status ParkingPop(ParkStack *,ParkStack *,ParkLaterQueue *); //车辆离开
status TaskMenu(ParkStack *,ParkStack *,ParkLaterQueue *); //列出菜单
status ShowStatus(ParkStack *,ParkLaterQueue *); //列出停车场状态
status PrintCarInfo(CarInfo *); //打印离开信息
status GetTimeReach(CarInfo *); //获取到达时间
status GetTimeLeave(CarInfo *); //获取离开时间
status ShowTime(int,int); //检查时间信息,并打印
//-------------函数声明完毕----------------//
//------------主函数开始---------------//
int main()
{
//定义结构实例
ParkStack ComeIn,TempOut;
ParkLaterQueue Waiting;
//调用初始化函数
InitStack(&ComeIn); //初始化车站,传入实例地址.
InitStack(&TempOut); //初始化让路的临时栈
InitQueue(&Waiting); //初始化通道
//列出任务栏并执行
TaskMenu(&ComeIn,&TempOut,&Waiting);
return OK;
}
//列出任务表
status TaskMenu(ParkStack *ComeIn,ParkStack *TempOut,ParkLaterQueue *Waiting){
int menu;
printf("\n\n -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf(" - Cindy's Parking Management System -\n");
printf(" - 2005/09/25 version 1.0 -\n");
printf(" -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
while(1)
{
//打印主菜单
printf("\n\4 Please choose:\n 1. Arrivals\n");
printf(" 2. Leaves\n");
printf(" 3. Show the status of Park\n");
printf(" 4. Quit\n\n");
while(1)
{
flushall();
if(!scanf("%d",&menu)){
printf("You must input number!\n");
break;
}
if(menu>=1&&menu<=4)
break;
else printf("\n\aError!\nPlease rechoose: 1 to 4.\n");
}
switch(menu)
{
case 1:
printf("\4 A car is coming...\n");
ParkingPush(ComeIn,Waiting);
break; //车辆到达
case 2:
printf("\4 A car is leaving...\n");
ParkingPop(ComeIn,TempOut,Waiting);
break; //车辆离开
case 3:
printf("\4 The status of the park is...\n");
ShowStatus(ComeIn,Waiting);
break; //列出停车场状态
case 4:
printf("\4 GoodBye!\n\n");
return OK; //直接退出主程序
default:break;
}
}
}
//----------------初始化函数-------------------------//
status InitStack(ParkStack *ps) //初始化栈
{
int i;
ps->top=0;
for(i=0;i<=STACKSIZE;i++)
ps->carstack[i]=NULL;
return OK;
}
status InitQueue(ParkLaterQueue *plq) //初始化便道
{
plq->front=plq->rear=(QueueNode *)malloc(sizeof(QueueNode));
if(!plq->front) //申请失败
exit(1);
plq->front->next=NULL;
return OK;
}
//----------------其他执行方法-------------------------//
//车辆到达
status ParkingPush(ParkStack *ComeIn,ParkLaterQueue *Wait_Cars)
{
CarInfo *Info_A_Car;
QueueNode *Car_Will_Wait;
Info_A_Car=(CarInfo *)malloc(sizeof(CarInfo));//申请存储空间
printf("Input car licence:\n");
getchar(); //由于之前有回车在输入流中,需清除\n
gets(Info_A_Car->licence);
if(ComeIn->top<STACKSIZE) //车场未满,车进车场
{
ComeIn->top++;
GetTimeReach(Info_A_Car);
printf("The car's position number is No. %d\n",ComeIn->top);
ComeIn->carstack[ComeIn->top]=Info_A_Car;
}
else //车场已满,车进便道
{
printf("!There is no position, It must wait at waiting Way!\n");
Car_Will_Wait=(QueueNode *)malloc(sizeof(QueueNode));
Car_Will_Wait->data=Info_A_Car;
Car_Will_Wait->next=NULL;
Wait_Cars->rear->next=Car_Will_Wait;
Wait_Cars->rear=Car_Will_Wait;
}
return OK;
}
//车辆离开
status ParkingPop(ParkStack *ComeIn,ParkStack *TempOut,ParkLaterQueue *Wait)
{
int num,tmp_h,tmp_m;
//定义两个结构实例
QueueNode *Car_Will_Into; //便道中将要入停车场的汽车结点
CarInfo *Car_Into; //便道中将要入停车场的汽车的信息结构实例
//判断车场内是否有车,若无车则显示无车信息
if(ComeIn->top>0) //有车
{
while(1) //输入离开车辆的信息
{
printf("\nInput the position of this car:1 to %d:\n",ComeIn->top);
scanf("%d",&num);
if(num>=1&&num<=ComeIn->top)
break;
}
while(ComeIn->top>num) //原PARK栈中出栈,进入TEMP栈,直至位置为NUM的车出来
{
TempOut->top++;
TempOut->carstack[TempOut->top]=ComeIn->carstack[ComeIn->top];
ComeIn->carstack[ComeIn->top]=NULL;
ComeIn->top--;
}
GetTimeLeave(ComeIn->carstack[ComeIn->top]);
//保存离开时间,将赋给下一辆车进站时间
tmp_h=ComeIn->carstack[ComeIn->top]->leave_h;
tmp_m=ComeIn->carstack[ComeIn->top]->leave_m;
PrintCarInfo(ComeIn->carstack[ComeIn->top]); //打印离开的车
ComeIn->carstack[ComeIn->top]=NULL; //将离开的车所在数组元素赋空值
ComeIn->top--;
while(TempOut->top>=1) //让在临时栈中车辆回停车场
{
ComeIn->top++;
ComeIn->carstack[ComeIn->top]=TempOut->carstack[TempOut->top];
TempOut->carstack[TempOut->top]=NULL;
TempOut->top--;
}
//便道上是否有车
if(Wait->front!=Wait->rear) //便道的车辆进入车场
{
Car_Will_Into=Wait->front->next;
Car_Into=Car_Will_Into->data;
ComeIn->top++;
//显示从便道进入的车辆的信息
printf("\nThe car %s enter position %d from waiting way.\n",Car_Into->licence,ComeIn->top);
//输入进入时间
Car_Into->reach_h=tmp_h;
Car_Into->reach_m=tmp_m;
//下辆车成为先出车辆
Wait->front->next=Car_Will_Into->next;
if(Car_Will_Into==Wait->rear)
Wait->rear=Wait->front;
ComeIn->carstack[ComeIn->top]=Car_Into;
//释放链表所移去元素内存
free(Car_Will_Into);
}
}
else
printf("\nThere is no car in the park yet.\n"); //没车
return OK;
}
//打印出站车的信息
status PrintCarInfo(CarInfo *lc)
{
int rh,lh,rm,lm,total_min;
double total_price;
printf("\nThe Licence of the leaving car: ");
puts(lc->licence);
rh=lc->reach_h;
rm=lc->reach_m;
lh=lc->leave_h;
lm=lc->leave_m;
printf("Arrival time: ");
ShowTime(rh,rm);
printf(" Left time: ");
ShowTime(lh,lm);
total_min=(lh-rh)*60+lm-rm; //计算总分钟
total_price=total_min*PRICE; //计算总价
printf("You need to pay: $%.2f!\n",total_price);
return OK;
}
//显示停车场信息包括停车场内和便道
status ShowStatus(ParkStack *Info_In_Car ,ParkLaterQueue *Info_Wait_Car){
int i;
QueueNode *A_Car;
//显示停车场内信息
printf("\n\4 Park:\n");
if(Info_In_Car->top>0) //判断车站内是否有车
{
for(i=1;i<=Info_In_Car->top;i++)
{
printf("No.%d",i);
printf(" | The licence is: ");
printf("
pms.rar_ 停车场管理系统_停车场_停车场管理系统_停车管理.c_管理系统
版权申诉
103 浏览量
2022-09-14
14:30:14
上传
评论
收藏 69KB RAR 举报
JaniceLu
- 粉丝: 79
- 资源: 1万+
最新资源
- html+css+'青春献礼二十大 红色旅游助乡村'为主题的网页设计 2022年参与学校网页设计比赛时完成的
- Unity 模型布尔运算插件
- eCANtools工具,CAN资料包
- 129335283047061xiazaigongjuxiang(去重软件).apk
- Android环境检测工具,检测ksu,lsp,magisk等
- WordPress后台美化插件QuarterAdmin分享
- PCB_Project单片机绘制 (2024-5-11 22-22-13).zip
- nccl-local-repo-ubuntu2204-2.21.5-cuda12.4-1.0-1-amd64
- STM32移植LVGL源码工程 stm32移植GUI-Guider源码 LVGL移植源码
- Screenshot_20240522_084328_com.tencent.mm.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0