二.实验内容:
题目:模拟停车厂管理
问题描述:
设停车厂只有一个可停放5辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。
基本要求:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(1小时以内不收费,1小时以上收费标准为2元/小时,在便道上停留的时间不收费)。栈以顺序结构出现,队列以链表结构实现。
测试数据:
(1)连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、、JF005、JF006、JF007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。
(2)(1)中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF004的让路动作和JF006从便道到停车位上的动作。
(3)随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。
(4)程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。
三. 实验方案
(一)算法设计思路:
1、停车场:停车场用顺序栈表示,其中每个park为一个车位,其类型为carmes型包括车牌和到达离开信息,如停车场入栈出停车场出栈。
2、便道:便道使用链队,每个LNode包含carmes类型的cartrack车道和next指针,每个LNode节点和front、rear指针组合成为LQueue类型的链队。
3、使用的实现:如果停车场已满,要求先进入便道等待,如果停车场有空位则便道的front入车场,用户在停车前输入车牌与到达时间等信息,停车场出车时从最后一辆一辆一辆出车,用temp_car[]数组记录暂时让车的车辆。当车辆离开后其离开时间为便道入车场的到达时间。由于链队和栈的Out操作形参都需要car类型,但出来的操作无需car,特引入ghostcar函数建立一个没有内容的车辆保证运行。如果选择不使用形参car会造成返回值carmes*的指针混乱。
(二)使用模块及变量的说明(例如结构体的定义、含义)
typedef struct carmes {
string carplot[10];
float arrive;
float leave;
}carmes; 建立一个包含车辆信息的结构体carmes,链队和栈中存放的都是carmes类型数据。
carmes* ghostcar(){
carmes* car;
car = (carmes*)malloc(sizeof(carmes));
car->carplot[10]='0';
car->arrive=0;
return car;
} 由于链队和栈的Out操作形参都需要car类型,但出来的操作无需car,特引入ghostcar函数建立一个没有内容的车辆保证运行。如果选择不使用形参car会造成返回值carmes*的指针混乱。
temp_plot[]存放用来比较的车牌。
temp_car[]存放暂时让车的车辆。
四. 实验步骤或程序(经调试后正确的源程序)
#include "stdafx.h"
#include
using namespace std;
#include
typedef struct carmes {
string carplot[10];
float arrive;
float leave;
}carmes;
typedef struct {
carmes park[4];
int top;
}SeqStack;
typedef struct node {
carmes cartrack;
struct node* next;
}QNode;
typedef struct {
QNode* front, * rear;
}LQueue;
SeqStack* Init_SeqStack()
{
SeqStack* s;
s = (SeqStack*)malloc(sizeof(SeqStack));
s->top = -1;
return s;
};
carmes* new_car()
{
carmes* car;
car = (carmes*)malloc(sizeof(carmes));
cout << "请输入车牌号";
cin >> car->carplot[10];
cout << "输入到达到达时间";
cin >> car->arrive;
return car;
};
void printcar(carmes car)
{
cout << "********************************" << endl;
cout << "车牌为 :" << car.carplot;
cout << "到达时间为 " << car.arrive;
cout << "********************************" << endl;
}
carmes* ghostcar(){
carmes* car;
car = (carmes*)malloc(sizeof(carmes));
car->carplot[10]='0';
car->arrive=0;
return car;
}
carmes* Push_SeqStack(SeqStack* s, carmes* car) {
if (s->top == 4)
{
cout << "停车场已满 先入便道等待";
return car;
}
else {
cout << "入车厂车辆信息为 :";
printcar(*car);
s->top++;
s->park[s->top] = *car;
return NULL;
}
};
carmes* Out_SeqStack(SeqStack* s, carmes* car) {
if (s->top == 0)
return NULL;
else
{
cout << "出栈车辆为:";
printcar(s->park[s->top]);
*car = s->park[s->top];
s->top--;
return car;
}
};
LQueue* Init_LQueue() {
LQueue* q;
QNode* p;
q = (LQueue*)malloc(sizeof(LQueue));
p = (QNode*)malloc(sizeof(QNode));
p->next = NULL;
q->front = p;
q->rear = p;
return q;
};
void Push_LQueue(LQueue* q, carmes* car) {
QNode* p;
p = (QNode*)malloc(sizeof(QNode));
p->cartrack = *car;
p->next = NULL;
q->rear->next = p;
q->rear = p;
printcar(*car);
};
carmes* Out_LQueue(LQueue* q,carmes*car) {
QNode* p;
if (q->front == q->rear)
{
cout << "便道无车 可直接入停车场";
return NULL;
}else
{
p = q->front->next;
q->front->next = p->next;
*car = p->cartrack;
printcar(*car);
free(p);
if (q->front->next == NULL)
q->rear = q->front;
return car;
}
}
void menu(LQueue*q,SeqStack*s)
{carmes*Ghost;
Ghost=ghostcar();
carmes* temp_car[4];
cout << "************************************ " << endl;
cout << "请输入要选择的功能:" << endl;
cout << "1、停车;" << endl;
cout << "2、取车 " << endl;
cout << "3、查看此时停车场和便道车辆数量 " << endl;
cout << "0、退出 " << endl;
cout << "************************************ " << endl;
int n;
cin >> n;
carmes* newcar;
switch (n) {
case 1: {newcar = new_car();
if (Push_SeqStack(s, newcar))
Push_LQueue(q, newcar); }
case 2:{cout<<"请输入出车场车牌信息: ";
string temp_plot[10];
cin>>temp_plot[10];
int i=0;
while(temp_plot[10]!=s->park[i].carplot[10])
i++;
int j=4,k=0,x;
for(j;j>=i;j--)
{temp_car[k]=Out_SeqStack(s,Ghost);
k++;}
for(x=0;x
Push_SeqStack(s,temp_car[x]);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{LQueue*q=Init_LQueue();
SeqStack *s=Init_SeqStack();
menu(q,s);
system("pause");
return 0;
}
六.实验总结(调试过程中遇到哪些问题,怎么解决的)
这次的实验是这几次中规模最大的也是最难的,这次的实验是对栈和队的综合运用,一些基本的操作如建立空栈空队列我都使用课本上的算法,再编写一个menu函数对各个函数进行模块间的协调合作,模块化的操作让我的代码出现问题可以及时定位与修改。在这个过程中我发现自己指针的使用很不熟练,总是出现无法从carmes类型无法转换为carmes*的错误,这是对指针使用不恰当的后果,同时还有s->park[i].carplot[10],我之前总是写成s->park[i].carplot[10],因为park[i]的类型为carmes型包含carplot,但不是指针不能使用->因为对指针使用不当,不得不制造出ghostcar这一函数满足程序运行需求。