数据结构 停车场管理系统

停车场管理系统

本人是刚入门的小菜鸡,这个学期刚好学数据结构,想着把写过的问题记录一下,一开始不会写,参考了别人写的,然后才有了点思路,但还是感觉写的有点冗长
欢迎各位大佬指出问题,我会努力改进的
问题描述:
设停车场是一个可停放n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆达到时间的先后顺序,依次由北向南排列(大门在最南端,最先达到的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退车车场为它让路,待赶辆车开出大门外,其它车辆在按原次序进入车场, 每辆停放在车场的车在它离开停车场时必须按它停留的时间长短叫纳费用。试为停车场编制按上述要求进行管理的模拟程序。
基本要求
(1)以栈模拟停车场,以队列模拟车场外的便道, 按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“达到”或“离去”信息、汽车牌照号码以及达到或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆达到、则输出汽车在停车场内或便道上停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
(2)最好有操作菜单。
3实现提示:
需另设一个栈,临时停放 为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。 输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包括两个数据项:汽车的牌照号码和进入停车场的时刻。

#include <stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define ok 1
#define false 0
#define TIMEMAX 40
#define Parksite 3
#define Price 0.1//每秒收0.1元
typedef int status;
struct car
{
    int timein;//进停车场时间
    int timeout;//出停车场时间
    char t[TIMEMAX];//字符串记录进入时间
    char k[TIMEMAX];//字符串记录出场时间
    char lincense[20];//汽车车牌
};
struct sqstack//以停车场为顺序栈
{
    car park[Parksite];
    int top;//栈顶的位置,停车场有多少辆车
};
typedef sqstack letstack;//为要离开的车让路而退出来的车的栈
struct node
{
    car p;
    node* next;
};
struct queue//便道为链队列,带头结点
{
    node* front;//头指针
    node* rear;//尾指针
    int length;//记录长度
};
int main()
{
    status now();
    status creat(queue & L);
    status stop1(sqstack & Q, queue & L);
    status stop2(queue & L, car a);
    int find(car a, sqstack Q, queue L);
    status departure(sqstack & Q, car a, queue & L);
    status situation(sqstack Q, queue L);
    status display(sqstack Q);
    status show(queue L);
    now();
    sqstack Q;
    Q.top = 0;//初始顺序栈
    queue L;
    creat(L);
    printf("\t\t\tWelcome to the Parking Lot\n");
    //操作菜单
    printf("\n\t\t\t1.停车场内的具体停车情况\n");
    printf("\t\t\t2.车辆到达\n");
    printf("\t\t\t3.车辆离开\n");
    printf("\t\t\t4.查找车辆\n");
    printf("\t\t\t5.便道内的停车情况\n");
    printf("\t\t\t6.退出系统\n");
    
    for (;;)
    {
        situation(Q, L);
        printf("\n请输入要进行的操作:");
        int x;
        scanf_s("%d", &x);
        if (x == 6)
            break;
        if (x == 1)
            display(Q);
        if (x == 2)
            stop1(Q, L);
        if (x == 3)
        {
            car a;
            printf("请输入要离开车辆的车牌号:");
            scanf_s("%s", a.lincense, 20);
            departure(Q, a, L);
        }
        if (x == 4)
        {
            car b;
            printf("请输入要查找的车辆的车牌号:");
            scanf_s("%s", b.lincense, 20);
            int y;
            y = find(b, Q, L);
        }
        if (x == 5)
            show(L);
        if(x!=1&&x!=2&&x!=3&&x!=4&&x!=5&&x!=6)
            printf("输入有误,请重新输入");
    }
}

status now()//现在时间
{
    time_t timer;
    struct tm timed;
    char a[TIMEMAX];
    timer = time(NULL);
    localtime_s(&timed,&timer);
    asctime_s(a,&timed);
    printf("%s", a);
    return ok;
}
status creat(queue& L)//建一个空队列
{
    L.front = L.rear = (node*)malloc(sizeof(node));
    if (!L.front)
        return OVERFLOW;
    L.rear->next = NULL;
    L.length = 0;
    return ok;
}
status stop1(sqstack& Q,queue& L)//停车
{
    status stop2(queue & L, car a);
    printf("请输入停车的车牌号:");
    car a;
    scanf_s("%s", a.lincense, 20);
    int i = Q.top;//在栈和队列查询该辆车是否已经存在
    while (i != 0)
    {
        if (strcmp(a.lincense, Q.park[i-1].lincense) == 0)//栈中查询
        {
            printf("该车辆已在停车场\n");
            return false;
        }
        i--;
    }
    node* k = L.front;
    while (k->next!=NULL)
    {
        if (strcmp(a.lincense, k->p.lincense) == 0)//队列查询
        {
            printf("该车辆已在便道\n");
            return false;
        }
        k = k->next;
    }
    //如果停车场位满,停便道
    if (Q.top == Parksite)
        stop2(L,a);
    //停入停车场
    else
    {
        time_t curtime;
        long int g = curtime = time(NULL);
        ctime_s(Q.park[Q.top].t,sizeof Q.park[Q.top].t,&curtime);//登记入场时间
        Q.park[Q.top].timein = g;
        strcpy_s(Q.park[Q.top].lincense, a.lincense);//登记车牌
        Q.top++;
    }
}
//入便道
status stop2(queue&L,car a)
{
    node* h;
    h = (node*)malloc(sizeof node);
    h->next = NULL;
    L.rear->next = h;
    L.rear = h;
    time_t curtime;
    long int g = curtime = time(NULL);
    ctime_s(a.t, sizeof a.t, &curtime);//登记入道时间
    a.timein = g;
    h->p = a;
    L.length++;
    return ok;
}
//查找车的位置
int find(car a,sqstack Q,queue L)//i<=5为停车场,i>5为便道
{
    node* e = L.front->next;
    for (int i = 1;i<=5+L.length;i++)
    {//在停车场
        if (i <= 5 && strcmp(Q.park[i - 1].lincense, a.lincense)==0)
        {
            printf("在停车场的第%d个位置\n", i);
            return i;
        }
     //在便道
        if (i > 5 && strcmp(e->p.lincense, a.lincense)==0)
        {
            printf("在便道的第%d个位置\n", i - 5);
            return 5;
        }
    }
    //不在现场
        printf("不在现场");
    return false;
}


//停车场内有车离开
status departure(sqstack& Q, car a, queue& L)
{
    //先找到要离开的车的位置
    int i;
    i = find(a, Q, L);
    //停车场中的车及它后边的车离开
    letstack T;
    T.top = 0;//初始让路栈
    while(Q.top>i)
    {
        T.park[T.top] = Q.park[Q.top-1];
        printf("车牌号为%s的车辆暂时从停车场中离开\n", T.park[T.top].lincense);
        T.top++;
        Q.top--;
    }
    printf("车牌号为%s的车辆从停车场中离开\n", Q.park[Q.top - 1].lincense);
    time_t curtime;
    long int g = curtime = time(NULL);
    Q.park[Q.top-1].timeout = g;
    ctime_s(Q.park[Q.top - 1].k, sizeof Q.park[Q.top - 1].k, &curtime);//登记离开时间
    float money;
    money = (Q.park[Q.top-1].timeout - Q.park[Q.top-1].timein) * Price;
    printf("\n车牌号为%s的车辆应支付%0.1f元\n", Q.park[Q.top-1].lincense, money);//停车费用
    Q.top--;
    //让路的车重新进来
    while (T.top > 0)
    {
        Q.park[Q.top] = T.park[T.top - 1];
        printf("车牌号为%s的车辆重新进入停车场\n", Q.park[Q.top].lincense);
        T.top--;
        Q.top++;
    }
    //若便道有车,则让便道中的第一辆车进来
    if (L.length != 0)
    {
        printf("车牌号为%s的车辆从便道进入停车场\n", L.front->next->p.lincense);//带头结点,头节点没数据
        car a;
        strcpy_s(a.lincense, L.front->next->p.lincense);
        time_t curtime;
        long int g = curtime = time(NULL);
        a.timein = g;
        ctime_s(a.t, sizeof a.t, &curtime);
        Q.park[Q.top] = a;
        Q.top++;
        node* p = L.front->next;
        free(p);
        L.length--;
    }
    return ok;
}

//停车场内和便道的停车情况
status situation(sqstack Q, queue L)
{
    printf("\t\t\t目前停车场情况\t\t\t\n");
    printf("\t停车场内的车位情况为%d/%d,便道的目前已停%d辆车", Q.top, Parksite,L.length);
    return ok;
}

//展示停车场内的停车情况
status display(sqstack Q)
{
    printf("车牌号\t\t已停时间\t目前费用\t位置\n");
    for (int i = 1;i <= Q.top;i++)
    {
        time_t curtime;
        curtime = time(NULL);
        time_t g = curtime - Q.park[i - 1].timein;
        int min, second;
        min = g / 60;
        second = g % 60;
        printf("%s\t\t%d分%d秒\t\t%0.1f\t\t第%d个位置\n", Q.park[i - 1].lincense, min, second, g * Price, i);
    }
    return 0;
}

//展示便道的停车情况
status show(queue L)
{
    printf("车牌号\t\t位置\n");
    node* k = L.front;
    int i = 0;
    while (k!=L.rear)
    {
        i++;
        k = k->next;
        printf("%s\t\t", k->p.lincense);
        printf("第%d个位置\n", i);
    }
    return ok;
}

在这里插入图片描述在这里插入图片描述

  • 29
    点赞
  • 237
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实验二 停车场管理 班级:A0712 学号:12 姓名:冷清淼 成绩:__________ 指导教师签名:__________ 一、问题描述 设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场 ,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若停车场已停满 n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开 入。当停车场某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该 辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时 间的长短交费(在便道上停留的时间不收费)。 设计要求: 1.模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。 2.从终端读入汽车到达或离去的数据,每组数据包括三项: (1)是"到达"还是"离开"; (2)汽车牌照; (3)"到达"或"离开"的时刻。 3.与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或 便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。 二、算法说明 1.数据结构说明 (1)用到两个堆栈:一个为车场栈;另一个为临时栈temp typedef struct NODE{ CarNode *stack[MAX+1]; int top; }SeqStackCar; /*模拟车场*/ 一个队列结构,存储便道车辆信息: typedef struct Node{ QueueNode *head; QueueNode *rear; }LinkQueueCar; /*模拟便道*/ 2.算法说明 (1) 功能模块说明:停车场管理系统含有三个模块,即:车辆到达、离开、列表显示 图1 (2)以模块为单位分析算法 1、"到达"模块:到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到 便道等待。如图2。 图2 2."离开"模块:离开时,当车库为空时,提示没有车,结束;否则车辆离开。如图3。 图3 3. "显示"模块:显示模块有两个显示选项,即:车场与便道。如图4。 图4 三、测试结果 (一)测试用例(说明:测试用例要合理并且足够,既要有正确用例,也要有错误用例 ,同时检验程序的正确性和强壮性) 1.第一组测试用例 (1)测试输入:停车场的车辆离开,如下表: "服务选择 "车牌号/车位 "到达/离开时间 " "1 "QH058 "15:25 " "1 "AB123 "18:45 " "1 "EA642 "23:15 " "2 "2 "0:30 " "2 "1 "0:65(错误) " (2)测试目的:测试离开方法时间格式控制以及费用计算是否正确。 (3)正确输出:第一次离开的是AB123,应交费3.45元。第二次时,当在输入65时, 应该提示输入错误,重输。 (4)实际输出: (5)错误原因:第一个错误是在计算时,一个数字错了;第二个是没有对时间格式 控制。 (6)当前状态:已改正 2.第二组测试用例 (1)测试输入:连续6辆车到达,如下表: " 服务选 " 车牌号 " 到达时间 " "择 " " " "1 "A8828 "7:56 " "1 "S2296 "8:25 " "1 "WW666 "8:45 " "1 "HK456 "15:50 " "1 "GH999 "12:30 " "1 "DD555 "13:40 " 测试目的:测试到达方法与列表显示方法能否正确完成。 (3)正确输出:先到达的五辆车先进入停车场,最后到达的一辆在便道等候。 (4)实际输出: (5)错误原因:没有作出时间先后的判断,而是先输入先进入。 (6)当前状态:待修改 3.第三组测试用例 (1)测试输入:接上一步输入离开信息,下表: "服务选择"离开车位"离开时间"便道车进入时 " " " " "间 " "2 "3 "13:30 "13:40 " (2)测试目的:测试离开方法功能是否成功以及便道进入车场是否正确。 (3)正确输出:输出3号车位的车辆离开信息清单,便道1号车进入停车场。 (4)实际输出: 错误原因:没有错误。 (6)当前状态:通过 (二)测试结果分析 此停车管理系统基本可能实现一个小的停车场的管理,其"到达"与"离开"方法都相对比 较完整,以及结算清单明了。尽管在时间先后上有出现混乱,但当其用到实际应用时, 那个时间先后就可以避免了。但在输入数据时,要按照严格的格式输入,否则有可能出 现死去或崩溃。若本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关 机等,而此系统的缺点却是没有保存功能,关闭之后就要重新建立了。会慢慢完善。 附录:源代码 ///系统说明:本系统适应于小型停车场,且停车时间在一天之的短期停放停车场。 //在此系统中,车库容量设置为5,便于测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值