实验题目:模拟停车场管理程序的设计与实现
一、需求分析
1.程序的功能;
这是一个模拟停车场管理程序,设停车厂是一个可停放n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若停车场内已停满汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。停放在便道上的汽车也收费,收费标准比停放在停车场的车低。每辆停放在停车场的车,在离开时按其在停车场停留时间的长短交费。
2.输入输出的要求;
每一组输入数据包括三个数据项:汽车“到达”或“离去”的信息、汽车牌照号码、汽车到达或离去的时刻;
对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用
3.测试数据。
当停车场容量为5时,连续有7辆车到来,牌照号分别为F001、F002、F003、F004、、F005、F006、F007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。牌照号为F003的汽车从停车厂开走,应显示F005、F004的让路动作和F006从便道到停车位上的动作。(到达和离开时间请自行设定)。
二、概要设计
1.本程序所用的抽象数据类型的定义;
/*时间的类型定义*/ typedef struct { int hour; int min; }TIME;
/*汽车的类型定义*/ typedef struct { char license_plate[10]; /*汽车牌照号码*/ TIME time,time1; /*time,time1分别表示汽车进入停车场和便道的时刻*/ char state; /*汽车当前状态,p 表示一直停放在停车位上,*/
/*q表示一直在便道上等候,*/ /*i表示由便道进入停车位*/
}Car;
/*表示停车位的顺序栈*/ typedef struct { Car Park[MAX_PARK]; /*各汽车信息的存储空间*/ int top; /*用来指示栈顶位置的静态指针*/ }ParkStack;
/*链队列来模拟便道*/
typedef struct qnode { Car data; /*各汽车信息的存储空间*/ struct qnode *next; }Qnode;
typedef struct { Qnode *front, *rear; /*用来指示队头和队尾位置的指针*/ }RoadQueue;
2.主模块的流程及各子模块的主要功能;
本程序从总体上分为四个功能模块,分别为: (1)程序功能介绍和操作提示模块 提示用户进行正确的操作。 (2)汽车进入停车位的管理模块 记录进入停车场的汽车信息并插入栈或队中。 (3)汽车离开停车位的管理模块 释放离开汽车所占空间,计算汽车停车费用并输出。 (4)查看停车场状态的查询模块 列出停车场状态。 3.模块之间的层次关系。
三、详细设计
1.采用c 语言定义相关的数据类型;
/*时间的类型定义*/
typedef struct { int hour; int min; }TIME;
/*汽车的类型定义*/ typedef struct { char license_plate[10]; /*汽车牌照号码*/ TIME time,time1; /*time,time1分别表示汽车进入停车场和便道的时刻*/ char state; /*汽车当前状态,p 表示一直停放在停车位上,*/
/*q表示一直在便道上等候,*/ /*i表示由便道进入停车位*/
}Car;
/*表示停车位的顺序栈*/ typedef struct { Car Park[MAX_PARK]; /*各汽车信息的存储空间*/ int top; /*用来指示栈顶位置的静态指针*/ }ParkStack;
/*链队列来模拟便道*/
typedef struct qnode { Car data; /*各汽车信息的存储空间*/ struct qnode *next; }Qnode;
typedef struct { Qnode *front, *rear; /*用来指示队头和队尾位置的指针*/ }RoadQueue;
2.写出各模块的伪码算法;
//程序功能介绍和操作提示模块 void welcome() { cout
cout>ch; }
//汽车进入停车场的管理模块 void car_come() { Car newCar; cout>newCar.license_plate; if(Park_Car->top:"; cin>>newCar.time.hour>>newCar.time.min; newCar.state='p'; Park_Car->top++; Park_Car->Park[Park_Car->top]=newCar; } else //停车位满,车辆进去便道或开走 { int i; cout
cin>>i; if(i==1) { cout:";
cin>>newCar.time1.hour>>newCar.time1.min; newCar.state='q'; Qnode *p; p=new Qnode; if(!p) { coutdata=newCar; p->next=NULL;
Road_Car->rear->next=p; Road_Car->rear=p; } } else cout>ch; welcome(); }
//汽车离开停车场的管理模块 void car_leave() { char s[10]; int i; TIME t; cout>s; for(i=0;itop;i++) //在停车位寻找要开走的汽车 if(strcmp(s,Park_Car->Park[i].license_plate)==0) break; if(itop) //在停车位找到要开走的汽车 { cout:"; cin>>t.hour>>t.min; print(Park_Car->Park[i],t); while( (Park_Car->top) > i ) //该车前面的汽车暂时退出 { Buffer_Car->top++; Buffer_Car->Park[Buffer_Car->top]=Park_Car->Park[Park_Car->top]; Park_Car->top--; coutPark[Buffer_Car->top].license_plate
} coutPark[i].license_plate
Park_Car->top--; while(Buffer_Car->top>-1) //暂时退出的汽车开回停车位 {
Park_Car->top++; Park_Car->Park[Park_Car->top]=Buffer_Car->Park[Buffer_Car->top]; Buffer_Car->top--; coutPark[Park_Car->top].license_platetop+1
} if(Road_Car->front!=Road_Car->rear) //便道有车,则进入停车位 { Qnode *p; p=Road_Car->front->next; Road_Car->front->next=p->next; p->data.state='i'; p->data.time=t; Park_Car->top++; Park_Car->Park[Park_Car->top]=p->data; delete p; if(Road_Car->front->next==NULL) Road_Car->rear=Road_Car->front; coutPark[Park_Car->top].license_platetop+1
} } else //在停车位未找到要开走的汽车,则在便道寻找 { int k=0; Qnode *p,*r; p=Road_Car->front->next; r=Road_Car->front->next; while(p) { k++; if(strcmp(p->data.license_plate,s)==0) break; p=p->next; } if(p) //在便道找到该车 { cout:"; cin>>t.hour>>t.min; print(p->data,t); while(p!=r) //该车前面有车,前面的车要让路 { coutdata.license_plate
"
Road_Car->front->next=r->next; r->next=NULL; BufferCar->rear->next=r; BufferCar->rear=r; r=Road_Car->front->next; } coutdata.license_platefront->next=p->next; //删除结点 delete p; if(Road_Car->front->next==NULL)//若便道只有一辆车,出队后便道为空 Road_Car->rear=Road_Car->front; if(BufferCar->front!=BufferCar->rear)//辅助队列不为空,即有车让路 { BufferCar->rear->next=Road_Car->front->next; Road_Car->rear=Road_Car->front; Road_Car->rear->next=BufferCar->front->next; Road_Car->rear=BufferCar->rear; BufferCar->rear=BufferCar->front; cout>ch; welcome(); }
//显示停车场停车状态的查询模块 void car_display() { int i=0; //停车位情况 couttop) { coutPark[i].license_plate; if(Park_Car->Park[i].state=='p') coutPark[i].time.hourPark[i].time.min
else {
coutPark[i].time1.hourPark[i].time1.min
coutPark[i].time.hourPark[i].time.min
} i++; } while(ifront==Road_Car->rear) coutfront->next; i=1; while(p) { coutdata.license_plate; coutdata.time1.hourdata.time1.min
p=p->next; i++; } } cout>ch; welcome(); }
3.画出函数的调用关系图。
四、调试分析
1.调试中遇到的问题及对问题的解决方法;
经过两周的设计和开发,停车场管理系统基本开发完毕。其功能基本符合用户需求,能够完成对车辆的管理和查询以及各类相关报表的打印。
对于车辆进去和离开停车场的时间,也进行了完善,具体到了小时和分钟。 该程序给用户提供了选择机会,采用比较友好的界面显示。 但由于设计时间较短,该系统仍有不尽人意的地方,如不同类型车辆收费情况不够完善等。
五、使用说明及测试结果
(1)使用说明
程序操作简单,在车辆到来时,选择【C 】,然后根据提示输入车牌号及当前时刻;有车要走时,选择【L 】,然后根据提示输入此时时刻;要查询停车场信息时,只需选择【S 】; 若退出程序,则选择【Q 】。 (2)测试结果 程序运行时的欢迎界面。
当停车场容量为5时,连续有7辆车到来,牌照号分别为F001、F002、F003、F004、、F005、F006、F007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。
显示停车场信息。
牌照号为F003的汽车从停车厂开走,应显示F005、F004的让路动作和F006从便道到停车位上的动作。(到达和离开时间请自行设定)。
牌照号为F003的汽车从停车厂开走后,显示停车场信息。
六、源程序
#include #include #include #include
#define MAX_PARK 3 /*停车场容量*/ #define Price 0.5 #define price 0.3
typedef struct {
typedef struct /*汽车的类型定义*/ {
char license_plate[10];/*汽车牌照号码,定义为一个字符数组*/ TIME time,time1; char state;
/*time,time1分别表示汽车进入停车场和便道的时刻*/
/*汽车当前状态,p 表示一直停放在停车位上,q 表示一直在便道上等
int hour; int min;
/*停车位收费标准:每分钟每车.5元*/ /*便道收费标准:每分钟每车.3元*/
}TIME;
候,i 表示由便道进入停车位*/ }Car;
typedef struct /*表示停车位的顺序栈*/
Car Park[MAX_PARK]; /*各汽车信息的存储空间*/ int top; /*用来指示栈顶位置的静态指针*/
}ParkStack;
ParkStack *Park_Car,*Buffer_Car; //Park_Car和Buffer_Car分别指向表示停车场和辅助栈的指针变量
typedef struct qnode /*链队列来模拟便道*/ {
Car data; /*各汽车信息的存储空间*/ struct qnode *next;
}Qnode; typedef struct {
Qnode *front, *rear; /*用来指示队头和队尾位置的指针*/ }RoadQueue;
RoadQueue *Road_Car,*BufferCar; //Road_Car和BufferCar 分别指向表示便道和辅助队列的指针变量 char ch;
void car_display();
//顺序栈的初始化
ParkStack *Init_ParkStack() { }
//链队列的初始化
RoadQueue *Init_RoadQueue() {
RoadQueue *q; Qnode *p; q=new RoadQueue; p=new Qnode; if (!q || !p)
return NULL; ParkStack *s; s=new ParkStack; if (s==NULL) { }
s->top=-1;
return s; //申请到新空间,返回栈空间地址 return NULL; //未申请到足够大的存储空间,返回空指针 else
}
}
p->next=NULL; q->front=q->rear=p; return q;
//打印要离开汽车的信息及收费清单 void print(Car car,TIME t) { " ;
}
else if (car.state=='i' ) {
int m,n;
m=(car.time.hour-car.time1.hour)*60+(car.time.min-car.time1.min); n=(t.hour-car.time.hour)*60+(t.min-car.time.min); cout
cout
//车辆由便道进入停车位
cout
每小时每车"
cout
else if (car.state=='q' ) {
cout
cout
cout
//车辆一直在便道等候
cout
cout
//车辆一直停放在停车位
时"
每小时每车"
"
时"
"
}
}
cout
//程序功能介绍和操作提示模块 void welcome() { }
//汽车进入停车场的管理模块 void car_come() {
Car newCar; cout
cout>newCar.license_plate;
if (Park_Car->top
int i;
cout>i; if (i==1) {
cout:" ; cin>>newCar.time1.hour>>newCar.time1.min;
//停车位满,车辆进去便道或开走
cout:" ; cin>>newCar.time.hour>>newCar.time.min; newCar.state='p' ; Park_Car->top++;
Park_Car->Park[Park_Car->top]=newCar; cout
cout>ch;
}
}
}
Qnode *p; p=new Qnode; if (!p) { } else { }
p->data=newCar; p->next=NULL;
Road_Car->rear->next=p; Road_Car->rear=p;
cout
else
cout
cout>ch; welcome();
//汽车离开停车场的管理模块 void car_leave() {
char s[10]; int i; TIME t; cout
cout>s;
for (i=0;itop;i++) {
cout:" ; cin>>t.hour>>t.min; print(Park_Car->Park[i],t); while ( (Park_Car->top) > i )
//该车前面的汽车暂时退出
break ;
//在停车位找到要开走的汽车
//在停车位寻找要开走的汽车
if (strcmp(s,Park_Car->Park[i].license_plate)==0)
if (itop)
}
}
coutPark[i].license_platetop--;
while (Buffer_Car->top>-1) { }
if (Road_Car->front!=Road_Car->rear) //便道有车,则进入停车位 { }
//在停车位未找到要开走的汽车,则在便道寻找 Qnode *p;
p=Road_Car->front->next; Road_Car->front->next=p->next; p->data.state='i' ; p->data.time=t; Park_Car->top++;
Park_Car->Park[Park_Car->top]=p->data; delete p;
if (Road_Car->front->next==NULL)
Road_Car->rear=Road_Car->front;
coutPark[Park_Car->top].license_platetop++;
Park_Car->Park[Park_Car->top]=Buffer_Car->Park[Buffer_Car->top]; Buffer_Car->top--;
coutPark[Park_Car->top].license_plate
//暂时退出的汽车开回停车位
Buffer_Car->top++;
Buffer_Car->Park[Buffer_Car->top]=Park_Car->Park[Park_Car->top]; Park_Car->top--;
coutPark[Buffer_Car->top].license_plate
时退出停车场;"
//该车开出停车场
车场的" top+1
进入停车位的" top+1
else {
int k=0; Qnode *p,*r;
p=Road_Car->front->next; r=Road_Car->front->next; while (p) {
k++;
if (strcmp(p->data.license_plate,s)==0)
}
}
}
p=p->next;
//在便道找到该车
if (p) { } else
cout:" ; cin>>t.hour>>t.min; print(p->data,t); while (p!=r) { }
coutdata.license_platefront->next=p->next; delete p;
if (Road_Car->front->next==NULL) { }
//没有找到该车
BufferCar->rear->next=Road_Car->front->next; Road_Car->rear=Road_Car->front;
Road_Car->rear->next=BufferCar->front->next; Road_Car->rear=BufferCar->rear; BufferCar->rear=BufferCar->front; coutrear=Road_Car->front;
//若便道只有一辆车,出队后便道为空 //删除结点
coutdata.license_platefront->next=r->next; r->next=NULL;
BufferCar->rear->next=r; BufferCar->rear=r; r=Road_Car->front->next;
//该车前面有车,前面的车要让路
if (BufferCar->front!=BufferCar->rear)//辅助队列不为空,即有车让路
cout
cout>ch; welcome();
//显示停车场停车状态的查询模块 void car_display() {
//停车位情况
couttop) { }
while (i
//便道上的情况
coutfront==Road_Car->rear) { }
cout>ch; welcome();
Qnode *p;
p=Road_Car->front->next; i=1; while (p) { }
coutdata.license_plate;
coutdata.time1.hourdata.time1.minnext; i++;
cout
cout
coutPark[i].license_plate; if (Park_Car->Park[i].state=='p' )
coutPark[i].time.hour
" Park[i].time.min
else { } i++;
coutPark[i].time1.hour
coutPark[i].time.hourPark[i].time.min
" Park[i].time1.min
"
//主函数模块 void main() { }
cout
while ( ch!='q' && ch!='Q' ) { }
cout
cout
if ( ch=='c' || ch=='C' ) { }
cout>ch;
car_come(); car_leave(); car_display();
else if ( ch=='l' || ch=='L' ) else if ( ch=='s' || ch=='S' ) else
//初始化表示停车场的顺序栈
Buffer_Car=Init_ParkStack(); //初始化辅助栈
//初始化表示便道的链队列 //初始化辅助队列