题目:编写程序实现停车场管理系统的模拟。
要求:
(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;
}