数据结构实验一(C语言):停车场管理系统

停车场管理系统

一、实验目的

  1. 熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;
  2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;
  3. 掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;
  4. 通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)
  5. List item

二、实验内容及要求

【问题描述】设有一个可以停放n辆汽车的停车场,它有二个大门可以供车辆进出,其中一个进,一个出。车辆到达停车场后任意选择空闲停车位停放,每个停车位按顺序编号。如果停车场已放满n辆车,则后来的车辆只能停在停车场大门外的便道上等待,一旦停车场里有车开走,则排在便道上的第一辆车就进入停车场。每辆车离开停车场时,都应根据其在停车场的逗留时间交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆顺序。编制一程序模拟停车场的管理。
[基本要求]
1、要求程序输出每辆车到达后的停车位置(停车场或便道上);
2、某辆车离开停车场时应交纳的费用和停留时间;
3、可以随时查看停车场及便道的状态。
4、可以随时查看空闲停车位。
概要设计

   停车场管理实验可以采用静态链表作为存储结构
输入形式:汽车模拟输入格式为:(到达\ 离去, 汽车牌照号码,到达\离去的时刻), 例如: (‘A’,1,5)  表示1号车在5时刻到达;(‘D’, 5,20) 表示5号车在20时刻离开;结束标志为: (‘E’,0,0)。
输出形式:若是车辆到达,则输出汽车在停车场或便道上,还有停车场或便道上有几辆车,以及停车场内还有几个空闲车位。若是车辆离开,则输出在停车场停留几个小时和需要收费多少。
测试数据:请输入停车场的收费标准(元/小时):2
请输入停车场容量:3
请依次输入车辆状态(A为到达,D为离开)车辆编号和时间
若结束程序请输入E 0 0:
A 1 1
该车在停车场,停车场已有1辆车,还有2个空闲车位
A 2 2
该车在停车场,停车场已有2辆车,还有1个空闲车位
A 3 3
该车在停车场,停车场已有3辆车,还有0个空闲车位
A 4 4
停车场已满,该车在便道上,便道上有1辆车
D 1 4
该车在停车场内共消费6元,共停车3小时
D 2 5
该车在停车场内共消费6元,共停车3小时
A 5 5
该车在停车场,停车场已有3辆车,还有0个空闲车位
E 0 0
源代码:
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
typedef long long ll;
int n, money, k = 0;
/**线性表的静态链表存储结构**/
typedef struct
{
    ElemType num, time;
    int cur;//为0时无指向
} component, Slinklist[MAXSIZE];
/**初始化备用空间**/
void InitSpace(component *L)
{/*将数组L中各分量链接成一个备用链表,L[0].cur代表头指针,0表示空指针*/
    for(int i = 0; i < MAXSIZE - 1; i++)
        L[i].cur = i + 1;
    L[MAXSIZE - 1].cur = 0;
}
/**从备用空间取得一个结点**/
int Malloc(component *space)
{/* 若备用链表非空,则返回分配的结点下标,否则返回0*/
    int i;
    i = space[0].cur;
    if(i) /* 备用链表非空 */
    {
        space[0].cur = space[i].cur;
        /* 备用链表的头结点指向原备用链表的第二个结点*/
    }
    return i;//返回新开辟结点的坐标
}
/**将空闲结点链接到备用链表中**/
void Free(component *space, int k)
{/* 将下标为k的空闲结点回收到备用链*/
    space[k].cur = space[0].cur;
    /* 回收结点的游标指向备用链表第一个结点*/
    space[0].cur = k;
    /* 备用链表的头结点指向新回收的结点 */
}
/**到达停车场**/
int arrive(int x, int y, int *p, component *space, int r)
{
    int t;
    while(r)
    {
        if(space[r].num == x)
        {
            printf("已经有该车辆,请检查是否输入有错\n");
            return 0;
        }
        r = space[r].cur;
    }
    t = Malloc(space);
    space[t].num = x;
    space[t].time = y;
    space[*p].cur = t;
    *p = t;
    space[t].cur = 0;
    k++;
    if(k <=n)
        printf("该车在停车场,停车场已有%d辆车,还有%d个空闲车位\n", k,n-k);
    if(k > n)
    {
        printf("停车场已满,该车在便道上,便道上有%d辆车\n", k - n);
    }
    return 1;
}
/**离开停车场**/
int leave(int x, int y, component *space, int r)
{
    int biaoji = 0, m= r, sum = -1;
    while(r)
    {
        sum++;
        if(x == space[r].num)
        {
            if(sum > n)
            {
                printf("该车未进停车场,该车在便道上\n");
                space[m].cur = space[r].cur;
            }
            else
            {
                printf("该车在停车场内共消费%d元,共停车%d小时\n", money * (y - space[r].time),y - space[r].time);
                space[m].cur = space[r].cur;
            }
            biaoji = 1;
            break;
        }
        m = r;
        r = space[r].cur;
    }
    if(biaoji == 0)
    {
        printf("该车不在停车场和便道上\n");
        return 0;
    }
    else
    {
        k--;
        return 1;
    }
}
/**停车场管理目录**/
void menu(int m, int n)
{
    printf("\n");
    printf("停车场标准:\n\n");
    printf("                      停车场收费标准:%d元/小时\n\n", m);
    printf("                      停车场最多停%d辆车\n\n",n);
    printf("\t\t 1.输出每辆车到达后的停车位置(停车场或便道)\n\n");
    printf("\t\t 2.某辆车离开停车场时应交的费用和停留时间\n\n");
    printf("\t\t 3.查看停车场及便道的状态\n\n");
    printf("\t\t 4.查看空闲停车位\n\n");
    printf("********************************************************************************\n");
}
int main()
{
    int num, time, S, r;
    char c;
    Slinklist Space;
    InitSpace(Space);//初始化备用空间
    S = Malloc(Space); //生成S的头结点
    r = S; //r指向S的当前最后结点
    printf("请输入停车场的收费标准(元/小时):\n");
    scanf("%d", &money);
    printf("请输入停车场容量:\n");
    scanf("%d", &n);
    getchar();
    Space[1].cur = 0;
    menu(money, n);
    printf("请依次输入车辆状态('A'为到达,'D'为离开)车辆编号和时间\n若结束程序请输入E 0 0:\n");
    while(1)
    {
        int R = S;
        scanf("%c %d %d", &c, &num, &time);
        getchar();
        if(c == 'E')
            break;
        if(c == 'A')
            arrive(num, time, &r, Space, R);
        if(c == 'D')
            leave(num, time, Space, R);
    }
    return 0;
}
  • 16
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实验二 停车场管理 班级: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,便于测
这个停车场管理系统是基于C语言数据结构中栈和队列思想的,以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、到达或离去的时刻。这个系统的基本要求是要求以顺序栈模拟停车场,以链队列模拟便道。具体的算法思想如下: 1.车辆停入停车场的流程:首先判断停车场的车位是否停满。两种情况:(1)停满时此时后来的车辆只能停在走道上 (2)未停满时后来的车辆继续入栈。 2.车辆出站的思想。两种情况:(1)车辆在栈顶时,此时直接出栈而用不到辅助栈(2)车辆不在车顶时排在前面的车辆必须让位,此时它才能出栈,算法思想是首先根据输入的车牌号进行在栈中搜索,返还一个角标,根据角标来,找到出栈的车辆,这时前面的车辆入辅助栈,当循环的目标车辆时,这时不需要入辅助栈,直接出栈即可! 总体结构思路如下:这时车位停满的情况,若非栈顶出栈则需要把他前面的车让位进辅助栈,当目标车出栈的再回来。 以下是一个简单的栈和队列停车场管理系统C语言代码的范例,仅供参考: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 #define MAXCAR 20 #define PRICE 1 typedef struct{ char num[10]; int time; }Car; typedef struct{ Car stack[MAXSIZE]; int top; }Stack; typedef struct{ Car queue[MAXSIZE]; int front,rear; }Queue; Stack park; Queue road; void InitStack(Stack *s){ s->top=-1; } int IsFull(Stack *s){ if(s->top==MAXSIZE-1) return 1; else return 0; } int IsEmpty(Stack *s){ if(s->top==-1) return 1; else return 0; } void Push(Stack *s,Car c){ if(IsFull(s)){ printf("停车场已满!\n"); return; } s->top++; s->stack[s->top]=c; } Car Pop(Stack *s){ Car temp; if(IsEmpty(s)){ printf("停车场已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=s->stack[s->top]; s->top--; return temp; } void InitQueue(Queue *q){ q->front=q->rear=0; } int IsQueueFull(Queue *q){ if((q->rear+1)%MAXSIZE==q->front) return 1; else return 0; } int IsQueueEmpty(Queue *q){ if(q->front==q->rear) return 1; else return 0; } void InQueue(Queue *q,Car c){ if(IsQueueFull(q)){ printf("便道已满!\n"); return; } q->queue[q->rear]=c; q->rear=(q->rear+1)%MAXSIZE; } Car OutQueue(Queue *q){ Car temp; if(IsQueueEmpty(q)){ printf("便道已空!\n"); temp.num[0]='\0'; temp.time=-1; return temp; } temp=q->queue[q->front]; q->front=(q->front+1)%MAXSIZE; return temp; } void Arrive(){ Car temp; printf("请输入车牌号和到达时间:\n"); scanf("%s%d",temp.num,&temp.time); if(park.top<MAXCAR-1){ Push(&park,temp); printf("停车成功!\n"); } else{ InQueue(&road,temp); printf("停车场已满,停在便道上!\n"); } } void Leave(){ Car temp; int time,cost,i,flag=0; printf("请输入车牌号和离开时间:\n"); scanf("%s%d",temp.num,&time); while(!IsEmpty(&park)){ temp=Pop(&park); if(strcmp(temp.num,num)==0){ flag=1; cost=(time-temp.time)*PRICE; printf("停车时间为%d小时,应缴纳停车费%d元!\n",time-temp.time,cost); for(i=0;i<park.top;i++){ Push(&park,Pop(&park)); } return; } else{ Push(&road,temp); } } if(flag==0){ printf("未找到该车辆!\n"); return; } while(!IsEmpty(&road)){ Push(&park,OutQueue(&road)); } } void List(){ int i; if(IsEmpty(&park)){ printf("停车场为空!\n"); return; } printf("停车场:\n"); for(i=park.top;i>=0;i--){ printf("%s %d\n",park.stack[i].num,park.stack[i].time); } if(IsQueueEmpty(&road)){ printf("便道为空!\n"); return; } printf("便道:\n"); for(i=road.front;i!=road.rear;i=(i+1)%MAXSIZE){ printf("%s %d\n",road.queue[i].num,road.queue[i].time); } } int main(){ int choice; InitStack(&park); InitQueue(&road); while(1){ printf("停车场管理系统\n"); printf("1.车辆到达\n"); printf("2.车辆离开\n"); printf("3.显示车辆信息\n"); printf("4.退出系统\n"); printf("请输入操作编号:\n"); scanf("%d",&choice); switch(choice){ case 1:Arrive();break; case 2:Leave();break; case 3:List();break; case 4:exit(0); default:printf("输入有误,请重新输入!\n"); } } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值