C++实现数据结构实验停车场管理系统

#include <iostream>
#include<iomanip>
using namespace std;
#define maxsize 20
#define n 3                    //停车场空间
#define fee 10                 //一小时收费10元

//车辆的信息
struct car
{
   char bb;            //状态
   int num;            //车牌号
   int time;           //进(/出)时间
} ;


//停车场栈
typedef struct stack
{
   struct car G[n];
   int top;
}SqStack;


//临时让位车的信息
struct rangweicar
{
   int num;           //让位车的车牌号
   int time;          //让位车的时间状态
};


//临时停车场栈,让位时用来存储让位车 
typedef struct stackk
{
   struct rangweicar H[maxsize];
   int topp;
}SqStackk;

//创建结点结构
typedef struct Node
{
   int data;
   Node *next;
}Node;

typedef struct linkqueue                  //作为便道存储车辆
{
  Node *front, *rear;                     //创建队头与队尾结点
  int geshu;                              //创建队列结点数据域
}LinkQueue;


//对到达车辆进行操作
void A_cars(SqStack *s,LinkQueue *q,struct car a)     //栈,队列,车辆信息结构体
{
	if(s->top != n-1)                        //停车场没有满,车辆进入
	{
	    (s->top)++;                        //扩栈
		(s->G[s->top]).bb = a.bb;
        (s->G[s->top]).num = a.num;
        (s->G[s->top]).time = a.time;
	}
	else
	{
	     cout<<"停车场已满,车辆进入便道等待"<<endl; //将多余的车停进队列中等待
		 
         Node *t = new Node;    
		 t->data = a.num;                //将新来的车的车牌号复制给结点t,此时不计费
		 t->next = NULL;
		 q->rear->next = t;              //将链表结点插入到队列的结尾
		 q->rear = t;                    //扩充队列,将队尾结点指向t
		 q->geshu++;                     //便道(队列)的长度+1
	}
}

//车辆离开
int D_cars(SqStack *s,LinkQueue *q,struct car d)
{
    int i,j,x,y;
    Node *p;                              //创建辅助结点p
	SqStackk *k;

    if(d.num == (s->G[s->top]).num)        //判断离开的车辆是否是最后进入停车场
	{
	   x = d.time-(s->G[s->top]).time;
	   y = fee*x;
	   cout<<"停车时间为:"<<x<<"小时,"<<"停车费用为:"<<y<<"元"<<endl;

	   if(q->geshu == 0)
	   {
		   cout<<"便道为空"<<endl;
		   (s->top)--;                   //如果便道为空,栈顶下移
		   return 0;
	   }
	   else                              //便道不为空,便道中的车辆进入栈
	   {
	       p = q->front->next;
		   q->front->next = p->next;

		   (s->G[s->top]).num = p->data;   //便道进来的车位栈顶
           (s->G[s->top]).time = d.time;   //进入栈的时间为上一辆车离开的时间并开始计费

		   delete p;                       //删除辅助结点p
		   q->geshu--;                     //便道(队列)的长度-1

		   if(q->front->next == NULL)      //判断便道(队列)是否为空
		   {
		      q->rear = q->front;
			  return 1;                                                                                                                         
		   }
	   }
	}
    else                                    //离开的车辆不是最后进入停车场的车
	{
	    for(i = 0; i<(s->top); i++)
		{
		  if((s->G[i]).num != d.num)
			  continue;             
		  else
			  break;                        //找到该离开的车的进入次序
		}
		if(i>= (s->top))                    //在停车场中没有找到该车
		{
		  cout<<"error"<<endl;
		  return -1;
		}
		
		x = d.time-(s->G[i]).time;
		y = fee*x;
        cout<<"停车时间:"<<x<<"小时,"<<"停车费用:"<<y<<"元"<<endl;
		
        k = (SqStackk*)malloc(sizeof(SqStackk));
		k->topp = -1;

		for(j = (s->top);j<i;j--)
		{
		  k->topp++;

		  (k->H[k->topp]).num  = (s->G[j]).num;
          (k->H[k->topp]).time = (s->G[j]).time;

		  s->top--;
		}
		
		s->top--;   //车辆离开
		
		while(k->topp>=0)
		{
		   s->top++;
		   (s->G[s->top]).bb = 'A';
		   (s->G[s->top]).num = (k->H[k->topp]).num;
		   (s->G[s->top]).time = (k->H[k->topp]).time;
		   k->topp--;
		}
		if(q->geshu == 0)
		{
		    cout<<"此时便道为空"<<endl;
		    return 2;
		}
		else
		{
		   s->top++;
		   p = q->front->next;
		   q->front->next = p->next;
		   
		   (s->G[s->top]).num = p->data;
           (s->G[s->top]).time = d.time;
		   
		   delete p;
		   q->geshu--;
		   
		   if(q->front->next == NULL)
		      q->rear = q->front;
		   return 3;
		}
	}
}

//判断车辆状态并执行相关操作
void Judge_Output(SqStack *s,LinkQueue *q,struct car r)
{
    if((r).bb == 'e'||(r).bb == 'E')
	    cout<<"程序结束,再见!"<<endl;
	else if((r).bb == 'p'||(r).bb == 'P')
		cout<<"停车场车辆数:"<<(s->top)+1<<endl;
	else if((r).bb == 'w'||(r).bb == 'W')	
        cout<<"便道中车辆数:"<<q->geshu<<endl;
	else if((r).bb == 'a'||(r).bb == 'A')
        A_cars(s,q,r);
	else if((r).bb == 'd'||(r).bb == 'D')
        D_cars(s,q,r);
	else cout<<"error!"<<endl;
	  
}
 
void main()
{
  SqStack *s;                          //创建栈对象
  LinkQueue *q;                        //创建队列对象
  Node *p;
  struct car aa[maxsize];
  int i;
  s = (SqStack*)malloc(sizeof(SqStack)); 
  //分配一块不小于sizeof(sqstack)个字节的连续空间,并将这段空间的首地址显式转换为SqStack类型后赋予变量s。

  s->top = -1;                         //-1是判断标准

  q = (LinkQueue*)malloc(sizeof(LinkQueue));
  p = new Node;
  p->next = NULL;
  q->front = q->rear= p;
  q->geshu = 0;

  cout <<"停车场管理系统"<<endl;
  cout<<endl;
  cout <<"注:A(a)车辆到达;D(d)车辆离开;P(p)停车场车辆总数;W(w)便道车辆总数;E(e)退出"<<endl;
  cout<<endl;
  for(i=0;i<maxsize;i++)
  {
    cout<<"请输入汽车的状态,车牌号和时间:"<<endl;

	cin>> aa[i].bb >> aa[i].num >> aa[i].time;
	
	Judge_Output(s, q, aa[i]);           //判断输入的车辆状态并执行相关操作    
	cout<<endl;
	
	if(aa[i].bb == 'E' || aa[i].bb == 'e')
		break;
  }
}

运行结果如下:
在这里插入图片描述

1需求分析……………………………………………………………………(页码) 2概要设计……………………………………………………………………(页码) 3详细设计……………………………………………………………………(页码) 4 测试与分析………………………………………………………………………(页码) 5 用户使用说明……………………………………………………………………(页码) 6.发现问题及错误分析 7总结…………………………………………………………………………………(页码)  参考文献 ……………………………………………………………………………(页码)  附录:程序源代码 …………………………………………………………………(页码) 1、需求分析:   根据题目要求,充分地分析和理解问题,描述系统的功能要求,明确问题要求做什么?以及限制条件是什么? 问题描述 随着我国人民生活水平提高和汽车工业的高速发展.越来越多的家庭拥有了汽车,但受到土地的限制,所以采用立体停车场是解决停车难的必然出路。立体停车场占地少,容量大.利用效率高;泊车与取车全自动化,省时省力,安全防盗。本文主要以两层停车场为例,设计一能完成存车与取车的停车场系统。 有一个两层的停车场, 每层有6个车位, 当第一层车停满后才允许使用第二层. ( 停车场可用一个二维数组实现, 每个数组元素存放一个车牌号 ) 每辆车的信息包括车牌号、 层号、 车位号、停车时间共4项, 其中停车时间按分钟计算 。 假设停车场初始状态为第一层已经停有4辆车, 其车位号依次为1—4 , 停车时间依次为20, 15, 10 , 5 . 即先将这四辆车的信息存入文件”car.dat”中( 数组的对应元素也要进行赋值 ) 。  停车操作:当一辆车进入停车场时, 先输入其车牌号, 再为它分配一个层号和一个车位号, 停车时间设为5 , 最后将新停入的汽车的信息添加文件”car.dat”中, 并将在此之前的所有车的停车时间加5。 收费管理(取车): 当有车离开时, 输入其车牌号, 先按其停车时间计算费用, 每5分钟0.2元. (停车费用可设置一个变量进行保存), 同时从文件”car.dat”中删除该车的信息, 并将该车对应的车位设置为可使用状态(即二维数组对应元素清零). 按用户的选择来判断是否要输出停车收费的总计。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小二康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值