停车场管理系统
一、实验目的
- 熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;
- 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;
- 掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;
- 通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)
- 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;
}