实验题目 模拟停车场管理
一、 需求分析
1、 程序的基本功能:
1 主控功能:介绍程序的基本功能,并给出程序功能所对应的键盘操作的提示,如车到来或离去的表示方法,停车场或者便道的状态的查询方法提示等。
2 汽车到来:首先要查询当前停车的状态,当停车场非满时,将其驶入停车场(入栈),开始计费;当停车场满时,让其进入便道等候(入队)。
3 汽车离开停车场:当某辆车要离开停车场的时候,比他后进停车场的车要为他让路,(即将这些车依次“压入”辅助栈),开走请求离开的车辆,再将辅助栈中的车依次出栈,“压入”停车场;同时根据离开的车在停车场停留的时间进行收费;最后查询是否有车在便道等候,若有,将便道上的第一辆车驶入停车场(先出队,再入栈),开始计费。
4 查询状态:用来在屏幕上显示停车位和便道上各位置的状态。
2、 输入输出要求:
1 输入:汽车“到达”或“离去”的信息、汽车牌照号码、汽车到达或离去的时刻。
2 输出:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(假设在便道上等候的时间不收费)。
3、 测试数据:
当停车场容量为5时,连续有7辆车到来,牌照号分别为F001、F002、F003、F004、F005、F006、F007,前5辆车应该进入停车位1~5车位,第6、7辆车应停入便道的1、2位值上。牌照号为F003的汽车从停车场开走,应显示F005、F004的让路动作和F006从便道到停车位上的动作。
二、 概要设计
1、 抽象数据类型的定义:
使用栈来模拟停车场,使用队列来模拟停车场外的便道;还需另设计一个辅助栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。
2、 本程序包括以下4个模块:
1 汽车进停车场:
{
如果停车场满了,就将其余的车停放在便道,将车依次进队;
如果停车场没满,就将车依次进栈;
}
2 汽车出停车场:
{
显示车出停车场的信息,如果便道上有车则将车停入停车场,将车进站,并显示新进入停车场的车辆信息;
}
3 查询停车场信息:
{
显示停车场停放车辆的信息;
显示便道等候车辆的信息;
}
4 主程序模块:
{
进入停车场;
驶出停车场;
查询停车场信息;
退出程序;
}
3、 各程序模块之间的层次关系
主程序模块
汽车进入 汽车离开 查询车辆
三、 详细设计:
1、 类型数据结构体的定义:
typedef struct Car
{
char license[N];
float time;
char state;
}Car; //汽车类型的定义
typedef struct
{
Car Pack[MAX_PARK];
int top;
}ParkStack; //顺序栈停车场的定义
typedef struct qnode
{
Car data;
struct qnode *next;
}Qnode; //各汽车信息的存储空间
typedef struct
{
Qnode *front,*rear;
}RoadQueue; //用来表示队头和队尾位置的指针
2、 伪码算法:
#include
#include
#include
#define MAX_PARK 4
#define N 10
typedef struct Car
{
char license[N];
float time;
char state;
}Car;
typedef struct
{
Car Pack[MAX_PARK];
int top;
}ParkStack;
typedef struct qnode
{
Car data;
struct qnode *next;
}Qnode;
typedef struct
{
Qnode *front,*rear;
}RoadQueue;
ParkStack *Init_ParkStack()
{
ParkStack *s;
s=new ParkStack;
s->top=-1;
return s;
}
int Empty_ParkStack(ParkStack*s)
{
if(s->top==-1)
return 1;
else
return 0;
}
void Push_ParkStack(ParkStack *s,Car x)
{
s->top++;
strcpy(s->Pack[s->top].license,x.license);
s->Pack[s->top].state=x.state;
s->Pack[s->top].time=x.time;
}
void Pop_ParkStack(ParkStack *s,Car *x)
{
*x=s->Pack[s->top];
s->top--;
}
RoadQueue *Init_RoadQueue()
{
RoadQueue *q;
Qnode *p;
q=new RoadQueue;
p=new Qnode;
p->next=NULL;
q->front=p;
q->rear=p;
return q;
}
void In_RoadQueue(RoadQueue *q,Car x)
{
Qnode *p;
p=new Qnode;
strcpy(p->data.license,x.license);
p->data.state=x.state;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
int Empty_RoadQueue(RoadQueue *q)
{
if(q->front==q->rear)
return 1;
else
return 0;
}
void Out_RoadQueue(RoadQueue *q,Car *x)
{
Qnode *p;
if(Empty_RoadQueue(q))
{
cout<<"\t\t"<<"便道为空";
}
else
{
p=q->front->next;
q->front->next=p->next;
*x=p->data;
delete p;
if(q->front->next==NULL)
q->rear=q->front;
}
}
void Carin(ParkStack *q,RoadQueue *p)
{
Car c;
cout<<"\t\t"<<"请输入当前时间:";
cin>>c.time;
cout<<"\t\t"<<"请输入车牌号:";
cin>>c.license;
cout<<"\t\t"<<"请输入停车状态(P:停车,W:等待):";
cin>>c.state;
if(q->top==MAX_PARK-1)
{
cout<<"\t\t"<<"新来的车在便道等候停车!";
In_RoadQueue(p,c);
}
else
{
Push_ParkStack(q,c);
cout<<"\t\t"<<"车已在停车场停车,现在开始计时!";
}
cout<
}
void Carout(ParkStack *q,ParkStack *s,RoadQueue *p)
{
char license[N];
Car c;
float t;
double a=0;
cout<<"\t\t"<<"请输入当前时间:";
cin>>t;
cout<<"\t\t"<<"请输入车牌号:";
cin>>license;
Pop_ParkStack(q,&c);
while (strcmp(c.license,license)!=0)
{
Push_ParkStack(s,c);
Pop_ParkStack(q,&c);
}
a=(t-c.time)*10;
cout<
while (!Empty_ParkStack(s))
{
Pop_ParkStack(s, &c);
Push_ParkStack(q, c);
}
if (!Empty_RoadQueue(p))
{
Out_RoadQueue(p,&c);
c.time=t;
cout<<"\t\t"<
Push_ParkStack(q, c);
}
}
void Carsearch(ParkStack *q,ParkStack *s,RoadQueue *p)
{
Car c;
Qnode *t;
cout<<"\t\t停车场情况为:"<
if(Empty_ParkStack(q))
cout<<"\t\t"<<"停车场为空"<
else
{
while(!Empty_ParkStack(q))
{
Pop_ParkStack(q, &c);
q->top--;
Push_ParkStack(s, c);
q->top++;
}
while(!Empty_ParkStack(s))
{
Pop_ParkStack(s, &c);
cout<<"\t\t"<
Push_ParkStack(q, c);
}
}
cout<<"\t\t---------------------------------"<
cout<<"\t\t便道情况为:"<
t=p->front->next;
if(t==NULL)
cout<<"\t\t"<<"便道为空"<
else
{
while(t!=NULL)
{
cout<<"\t\t"<
t=t->next;
}
}
}
int main()
{
ParkStack *p,*s;
RoadQueue *t;
int a;
p=Init_ParkStack();
s=Init_ParkStack();
t=Init_RoadQueue();
while(a)
{
cout<<"\t\t"<<"-----------请选择-------------"<
cout<<"\t\t"<<"*********1.进入停车场*********"<
cout<<"\t\t"<<"*********2.驶出停车场*********"<
cout<<"\t\t"<<"*********3.查询车情况*********"<
cout<<"\t\t"<<"*********0.退出程序***********"<
cout<<"\t\t"<<"请输入:";
cin>>a;
switch(a)
{
case 1:
{
Carin(p,t);
cout<
break;
}
case 2:
{
Carout(p,s,t);
cout<
break;
}
case 3:
{
Carsearch(p,s,t);
cout<
break;
}
case 0:break;
}
}
return 0;
}
3、 函数间的调用关系:
四、 调试分析
调试中遇到的问题及对问题的解决方法:
驶出汽车时显示的信息不对,汽车离开的函数有问题。解决办法:重新检查输出汽车信息的程序段,并且一步步地检查程序代码改正。
五、 使用说明及测试结果
1、 使用说明
1 输入进入停车场的车辆信息。
2 输入离开停车场的车辆信息。
3 程序运行界面如下:
六、 源程序
略
本文来源:https://www.2haoxitong.net/k/doc/542d86537e21af45b307a8a3.html
文档为doc格式