停车场管理系统实现

题目:编写程序实现停车场管理系统的模拟。
要求:
(1)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
(2)每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
(3)对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费,功能自己添加)。

以下是简单代码,后续进行更新算法分析

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define PARKMAXSIZE 3
#define PRICE 0.1
//定义时间结点结构体
typedef struct Time {
	int hour;
	int minute;
} Time;

//定义车辆信息结点结构体
typedef struct CarNode {
	char CarID[10];
	Time Arrive;
	Time Leave;
} CarNode;

//定义栈数据结构模拟停车场
typedef struct ParkCar {
	CarNode *base;
	CarNode *top;
	int ParkMaxsize;
	int CurrentCarTotal;
} ParkCar;

//定义队列数据结构模拟便道
typedef struct PathCar {
	CarNode *data;
	struct PathCar *next;
} PathCarNode;
typedef struct {
	PathCarNode *front;
	PathCarNode *rear;
} PathCar;

//模拟停车场初始化
void InitParkCar(ParkCar *Park) {
	Park->base=(CarNode *)malloc(PARKMAXSIZE*sizeof(CarNode));
	if(!Park->base) {
		printf("\n 模拟停车场栈存储空间分配失败!");
		exit(0);
	}
	Park->top=Park->base;
	Park->ParkMaxsize=PARKMAXSIZE;
	Park->CurrentCarTotal=0;
	printf("\n 模拟停车场栈初始化完成!");
}

//模拟便道初始化
void InitPathCar(PathCar *Path) {
	Path->front=Path->rear=(PathCarNode *) malloc (sizeof (PathCar));
	Path->front->next=NULL;
	printf("\n 模拟便道队列初始化完成!\n");
}

//车辆到达
void CarArrive(ParkCar *Park,PathCar *Path) {
	int length,flag=0;
	char * City[]= {"京","津","冀","晋","蒙","辽","吉","黑","沪","苏","浙","皖","闽","赣","鲁","豫","鄂"
	                "湘","粤","桂","琼","渝","川","贵","云","藏","陕","甘","青","宁","新"
	               };
	CarNode *car;
	char first[3];
	car=(CarNode *) malloc (sizeof(CarNode));

	printf("\n 请输入到达车辆的车牌号:");
	scanf("%s",&car->CarID);
	while(1) {
		strncpy(first,car->CarID,2);	//截取车牌号汉字
		first[2]='\0';
		length=sizeof(City)/sizeof(City[0]);
		while(length>0) {
			if(strcmp(City[length-1],first)==0) {
				flag=1;
				break;
			}
			length--;
		}
		if(flag==0) {
			printf("\n 您输入的车牌号格式有错误请重新输入:");
			scanf("%s",&car->CarID);
		} else break;
	}

	printf("\n 请输入到达车辆的到达时间:");
	scanf("%d:%d",&car->Arrive.hour,&car->Arrive.minute);
	while(1) {
		if(car->Arrive.hour<=60 && car->Arrive.hour>=0 && car->Arrive.minute>=0 && car->Arrive.minute<=60) break;
		else {
			printf("\n 您输入的车辆到达时间格式有错误请重新输入:");
			scanf("%d:%d",&car->Arrive.hour,&car->Arrive.minute);
		}
	}

	if(Park->CurrentCarTotal < Park->ParkMaxsize) {
		*Park->top++=*car;
		Park->CurrentCarTotal++;
		printf("\n 您的车辆已停入停车场,当前位于停车场<%d>号位置 \n",Park->CurrentCarTotal);
	} else {
		printf("\n 很抱歉,停车场已满,您的车辆将在便道上等候!");
		PathCarNode *pathnode;
		pathnode=(PathCarNode *) malloc (sizeof(PathCar));
		pathnode->data=car;
		pathnode->next=NULL;
		Path->rear->next=pathnode;
		Path->rear=pathnode;
		printf("\n 您的车辆已停入便道,待停车场有空位方可进入停车场!\n");
	}
}

//判断当前停车场是否存在所需离开车辆
int IsCarPark(ParkCar Park,char car_id[]) {
	if(Park.top!=Park.base) {
		int i;
		for(i=Park.CurrentCarTotal; i>=0; i--,Park.top--) {
			if(strcmp(car_id,Park.top->CarID)==0)	return 1;
		}
	}
	return 0;
}

//车辆离开
void CarLeave(ParkCar *Park,PathCar *Path) {
	int PathFlag=0,ParkFlag=0;
	CarNode *car;
	car=(CarNode *) malloc (sizeof(CarNode));
	printf("\n 请输入需要离开车辆的车牌号:");
	getchar();						//消除循环车辆离开问题
	char car_id[10];
	gets(car_id);
	if(Path->front!=Path->rear) {
		PathCarNode *pathnode;
		pathnode=Path->front->next;
		PathCarNode *prepathnode;
		prepathnode=Path->front;
		while(pathnode) {
			if(strcmp(car_id,pathnode->data->CarID)==0) {
				car=pathnode->data;
				prepathnode->next=pathnode->next;		//修改前驱结点指针
				if(prepathnode->next == NULL) {			//当前所找的的车牌号的车为便道上刚入队车辆
					Path->rear=prepathnode;
				}
				free(pathnode);
				PathFlag=1;
				printf("\n 您的车当前停放在便道上,离开不需要收取费用,感谢您的光临!");
				break;
			}
			prepathnode=prepathnode->next;
			pathnode=pathnode->next;
		}
	}
	if(PathFlag==0) {
		int i;
		ParkFlag=IsCarPark(*Park,car_id);			//确定当前存在此车辆
		if(ParkFlag==1) {
			printf("\n 您的车当前存放在停车场内,离开前请等候前车离开!");
			ParkCar TempPark;
			InitParkCar(&TempPark);	//暂存需要先退出停车场的车辆
			Park->top--;
			for(i=Park->CurrentCarTotal; i>0; i--,Park->top--) {
				*TempPark.top++=*Park->top;
				TempPark.CurrentCarTotal++;
				if(strcmp(car_id,Park->top->CarID)==0) {
					int hour,minute;
					printf("\n 请输入当前车辆离开时间:");
					scanf("%d:%d",&hour,&minute);
					while(1) {
						if(hour<=60 && hour>=0 && minute>=0 && minute<=60) break;
						else {
							printf("\n 您输入的车辆离开时间格式有错误请重新输入:");
							scanf("%d:%d",&hour,&minute);
						}
					}
					Park->CurrentCarTotal--;
					if(TempPark.top!=TempPark.base) {
						//将临时车栈中车辆存入停车场
						int i;
						TempPark.top--;
						TempPark.top->Leave.hour=hour;
						TempPark.top->Leave.minute=minute;
						int h,m;
						double price;
						h=(TempPark.top->Leave.hour-TempPark.top->Arrive.hour+60)%60;
						m=(TempPark.top->Leave.minute-TempPark.top->Arrive.minute+60)%60;
						price=60*h*PRICE+m*PRICE;
						printf("\n 您的车辆当前在停车场内停留了%d小时%d分钟,需交费%.2f元",h,m,price);
						TempPark.top--;
						for(i=TempPark.CurrentCarTotal-1; i>0; i--,TempPark.top--) {
							*Park->top++=*TempPark.top;
						}
					}
					//便道中队头车辆进入停车场
					PathCarNode *pathnode;
					pathnode=Path->front->next;
					if(pathnode) {
						pathnode->data->Arrive.hour=hour;
						pathnode->data->Arrive.minute=minute;
						*Park->top++=*pathnode->data;
						Path->front->next=pathnode->next;
						printf("\n 便道等待的车牌号为 %s 的车辆已进入停车场内!",pathnode->data->CarID);
						if(Path->rear==pathnode)	Path->rear=Path->front;
						Park->CurrentCarTotal++;
					}
					printf("\n 您的车已离开,欢迎下次光临!");
					break;
				}
			}
		}
	}
	if(PathFlag!=1 && ParkFlag!=1)	printf("\n 当前此停车场内、便道上均未查询到所需离开车辆车牌号!");
}

//显示当前停车场车辆信息
void ShowParkCar(ParkCar Park) {
	if(Park.top!=Park.base) {
		printf("\n 停车场内车辆信息");
		printf("\n 车牌号 \t 到达时间 \t 停车位置");
		int i;
		Park.top--;
		for(i=Park.CurrentCarTotal; i>0; i--,Park.top--) {
			printf("\n % -10s \t %02d:%02d \t\t %-10d",Park.top->CarID,Park.top->Arrive.hour,Park.top->Arrive.minute,i);
		}
	} else {
		printf("\n 停车场内暂无车辆!");
	}
}

//显示当前便道车辆信息
void ShowPathCar(PathCar Path) {
	if(Path.front!=Path.rear) {
		printf("\n 便道车辆信息");
		printf("\n 车牌号 \t 到达时间 \t 停车位置");
		int i=1;
		PathCarNode *pathnode;
		pathnode=Path.front->next;
		while(pathnode) {
			printf("\n % -10s \t %02d:%02d \t\t %-10d",pathnode->data->CarID,pathnode->data->Arrive.hour,pathnode->data->Arrive.minute,i);
			pathnode=pathnode->next;
			i++;
		}
	} else {
		printf("\n 便道当前无车辆等待!");
	}
}
int main() {
	system("color F1");
	ParkCar Park;
	PathCar Path;
	InitParkCar(&Park);
	InitPathCar(&Path);
	int type;
here:
	while(1) {
		printf("\n **************************************");
		printf("\n **************1.车辆到达**************");
		printf("\n **************2.车辆离开**************");
		printf("\n **************3.车况显示**************");
		printf("\n **************4.退出******************");
		printf("\n **************************************\n");
		while(1) {
			printf("\n 请输入选择功能:");
			scanf("%d",&type);
			switch(type) {
				case 1 :
					CarArrive(&Park,&Path);
					break;
				case 2 :
					CarLeave(&Park,&Path);
					break;
				case 3 :
					while(1) {
						printf("\n **************************************");
						printf("\n **************1.停车场车况************");
						printf("\n **************2.便道车况**************");
						printf("\n **************3.返回******************");
						printf("\n **************************************\n");
						int flag;
						while(1) {
							printf("\n 请输入选择功能:");
							scanf("%d",&flag);
							switch(flag) {
								case 1 :
									ShowParkCar(Park);
									break;
								case 2 :
									ShowPathCar(Path);
									break;
								case 3 :
									goto here;
									break;
								default:
									printf("\n 请输入合法功能选项!");
									break;
							}
						}
					}
					break;
				case 4 :
					return 0;
				default:
					printf("\n 请输入合法功能选项!");
					break;
			}
		}

	}
	return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值