模拟停车场管理系统

来源:互联网 发布:007出纳软件 编辑:程序博客网 时间:2024/04/29 09:16

问题描述:

设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。

基本要求:

以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费)。栈以顺序结构出现,队列以链表结构实现。

测试数据:

(1)连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、、JF005、JF006、JF007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。

(2)(1)中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF004的让路动作和JF006从便道到停车位上的动作。

(3)随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。

(4)程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。



 // 停车场.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <string>
#define Max 3//停车场的最大数
#define N 10
#define x 2
#define y 1

typedef struct
{
    char license[N];
    double time1,time2;
}Car;          //车辆信息
typedef struct
{
    Car *park[Max];
    int top;
}Parking;     //停车场

typedef struct Node
{
    Car *data;
    struct Node *next;
}QNode;      //链表结点
typedef struct
{
    QNode *front,*rear;
}Pavement;    //便道 链队列

Parking *Init_Parking()  //顺序栈初始化
{
    Parking *s;
    s = new Parking;//申请栈空间
    if(!s)
        return NULL;//未申请到足够大的栈空间,返回空指针
    else
    {
        s->top=-1;  
        return s;  //申请到栈空间,返回栈空间地址
    }
}
Pavement *Init_Pavement()  //链队初始化           
{                                                                                                                             
    QNode *q;
    Pavement *p;  
    q = new QNode;    //申请首尾指针结点
    p = new Pavement;  //申请链队首结点
    q->next=NULL;
    p->front=p->rear=q;
    return p;
}
void come_Car(Parking *pk,Pavement *pm){//进车
    QNode *q;
    q=new QNode;//申请新节点
    Car *c;
    c=new Car;
    cout<<"请输入车牌号:";
    cin>>c->license;
    if(pk->top==Max-1){//停车场内的车辆已满
        cout<<"停车场已满,请将车停在便道上"<<endl;
        cout<<"请输入车辆车辆停在便道上的时间"<<'\t';
        cin>>c->time1;
        q->data=c;
        q->next=NULL;
        pm->rear->next=q;//将新节点插入队尾
        pm->rear=q;//将尾指针指向新的节点
    }
    else{//停车场未满
        cout<<"停车场未满,可将车辆停在停车场内"<<endl;
        cout<<"请输入车辆进入停车场的时间"<<'\t';
        cin>>c->time1;
        pk->top++;//将栈顶指针向上移动
        cout<<"车牌号为"<<c->license<<"的车停在停车场的第"<<pk->top+1<<"的位置上"<<endl;
        pk->park[pk->top]=c;//将c置入新的栈顶
    }    
}
void leave_Car(Parking *pk,Parking *temp,Pavement *pm){//车辆离开停车场
    int position,i;
    double money1=0,money2=0;
    char num[N];
    Car *c1,*c2;
    QNode *q;
    if(pk->top>=0){//停车场里有车
        cout<<"请输入要离开的汽车的车牌号"<<'\t';
        cin>>num;
        for(i=0;i<=pk->top;i++){//找要离开的车辆在停车场中的位置
            if(strcmp(num,pk->park[i]->license)==0){
                position=i;
                break;
            }
        }
        if(i>pk->top){//如果停车场内没有车牌号为num的车辆时
            cout<<"您输入的车牌号有误,请重新输入!"<<'\t';
            cin>>num;
            for(i=0;i<=pk->top;i++){//找要离开的车辆在停车场中的位置
                if(strcmp(num,pk->park[i]->license)==0){
                    position=i;
                    break;
                }
            }

        }
        cout<<"停在停车场的"<<position+1<<"位置上的车辆要离开"<<endl;
        while(pk->top>position){//辅助栈
            temp->top++;
            temp->park[temp->top]=pk->park[pk->top];
            cout<<"车牌号为:"<<pk->park[pk->top]->license<<"的车辆需要暂时退出停车场!"<<endl;
            pk->park[pk->top]=NULL;
            pk->top--;
        }
        c1=pk->park[pk->top];
        cout<<"车牌号为:"<<c1->license<<"的车辆离开停车场!"<<endl;
        cout<<"请输入此车离开停车场的时间"<<'\t';
        cin>>c1->time2;
        money2=money1+x*(c1->time2-c1->time1);
        cout<<"该车需交费:"<<money2<<"元"<<endl;
        pk->park[pk->top]=NULL;
        pk->top--;
        while(temp->top>=0){//辅助栈中有车辆
            pk->top++;
            pk->park[pk->top]=temp->park[temp->top];
            cout<<"车牌号为:"<<pk->park[pk->top]->license<<"的车停回停车场的"<<position+1<<"的位置"<<endl;
            temp->park[temp->top]=NULL;
            temp->top--;
            position++;
        }
        if((pm->front!=pm->rear)&&(pk->top<Max)){//便道上有车并且停车场内有空位时
            q=pm->front->next;
            c2=q->data;
            pk->top++;
            cout<<"便道上车牌号为"<<c2->license<<"的车进入停车场的"<<pk->top+1<<"的位置"<<endl;
            c2->time1=c1->time2;//c1车离开停车场的时间等于c2车进入停车场的时间
            money1=y*(c2->time2-c2->time1);
            pm->front->next=q->next;
            if(q==pm->rear)
                pm->rear=pm->front;
            pk->park[pk->top]=c2;
            delete q;
        }
        else
            cout<<"便道上没有车!"<<endl;
    }
    else
        cout<<"停车场里没有车!"<<endl;
}
void pkdisplay(Parking *pk){//查询栈内信息
    int i;
    cout<<"停车场内的情况为:"<<endl;
    if(pk->top>=0){//停车场内有车时
        for(i=0;i<pk->top+1;i++){
            cout<<"车位"<<i+1<<"的位置上停有车牌号为"<<pk->park[i]->license<<"的车辆"<<endl;
        }
    }
    else
        cout<<"此时停车场内没有车!"<<endl;
}
void pmdisplay(Pavement *pm){//查询便道内的情况
    QNode *q;
    q=pm->front->next;
    int i=1;
    cout<<"便道上的情况为:"<<endl;
    if(pm->front!=pm->rear){//当便道上有车时
        while(q!=NULL){
            cout<<"位置"<<i<<"上停有车牌号为"<<q->data->license<<"的车辆"<<endl;
            q=q->next;
            i++;
        }
    }
    else
        cout<<"便道里没有车!"<<endl;
}
int main(int argc, char* argv[])
{
    int n;
    Parking *pk,*temp;
    Pavement *pm;
    pk=Init_Parking();
    temp=Init_Parking();
    pm=Init_Pavement();

    while(1)
    {
        cout<<"******停车场模拟管理******"<<endl;
        cout<<"    1、有车辆进入停车场   "<<endl;
        cout<<"    2、有车辆出停车场     "<<endl;
        cout<<"    3、查询停车场状态     "<<endl;
        cout<<"    4、查询便道状态       "<<endl;
        cout<<"    5、退出系统              "<<endl;
        cout<<endl;
        cout<<"请输入您的选择:";
        cin>>n;
        switch(n)
        {
        case 1:
            come_Car(pk,pm);
            cout<<endl;
            break;
        case 2:
            leave_Car(pk,temp,pm);
            cout<<endl;
            break;
        case 3:
            pkdisplay(pk);
            cout<<endl;
            break;
        case 4:
            pmdisplay(pm);
            cout<<endl;
            break;
        case 5:
            cout<<"成功退出系统!"<<endl;
            exit(0);
            break;
        default:
            cout<<"您的输入有误,请重新输入!"<<endl;
            break;
        }
    }
    return 0;
}


1 0
原创粉丝点击