数据结构课程设计——停车场管理系统

main.cpp

#include "Park.h"
#include <iostream>
using namespace std;

//进入停车场
int InPark(Queue &sqPark,Queue &sqAisle);
//离开停车场
int OutPark(Queue &sqPark, Queue &sqAisle);
//查看停车场
int ViewPark(Queue &sqPark, Queue &sqAisle);

/*
函数名称\main
函数功能\程序主函数,即应用程序的入口
函数参数\无
返回值\int  说明程序退出的状态
*********************************/

int main(void)
{
	//声明队列
	Queue sqPark;//停车场
	Queue sqAisle;//临时车道

	//初始化队列
	InitQueue(sqPark,MAX_PAKING_SPACE);//初始化停车场
	InitQueue(sqAisle,AISLE_SIZE);//初始化临时车道


	bool running = true;//程序运行标志
	char key[10] = {0};//用户输入的选项

	cout<<"******************************************************"<<endl
		<<"--Welcome!-----------停车场管理-----------------------"<<endl
		<<"------------------------------------------------------"<<endl
		<<"------------------------------------------------------"<<endl;
	while(running)
	{
		//输出界面
		cout<<"------------------------------------------------------"<<endl;
		cout<<"1. 车辆入场 "<<endl;
		cout<<"2. 车辆离开 "<<endl;
		cout<<"3. 查看停车场 "<<endl;
		cout<<"4. 退出 "<<endl;

		//输入选项
		cout<<"请选择(1~4): ";
		cin>> key;

		//处理用户输入
		switch(key[0]){
		case'1'://车辆入场
			{
				InPark(sqPark,sqAisle);
				break;
			}
		case'2'://车辆离开
			{
				OutPark(sqPark,sqAisle);
				break;
			}
		case'3'://查看停车场
			{
				ViewPark(sqPark,sqAisle);
				break;
			}
		case'4'://退出
			running = false;
			cout<<"再见!"<<endl;
			break;
		}
	}
	//销毁队列
	DestoryQueue(sqPark);
	DestoryQueue(sqAisle);

	return 0;
}

/*
函数名称\InPark
函数功能\车进入停车场
函数参数\Queue AsqPark:停车场
函数参数\Queue AsqAisle:临时车道
返回值\int:说明程序退出的状态
*/
int InPark(Queue &sqPark, Queue &sqAisle)
{
	cout<<"----------进入停车场----------------"<<endl;

	//输入车辆信息
	Car car;
	cout<<"请输入车牌号:";
	cin>>car.lisence_plate;
	cout<<"请输入入场时间: ";
	cin>>car.time;

	if(OK==EnQueue(sqPark,car))
	{
		//进入停车场
		cout<<"进入停车场"<<QueueLength(sqPark)<<"号位置."<<endl;
	}
	else if(OK==EnQueue(sqAisle,car))
	{
		//进入过道
		cout<<"停车场已满,进入过道"<<QueueLength(sqAisle)<<"号位置."<<endl;
	}
	else
	{
		//离开
		cout<<"没有空余车位,请离开停车场."<<endl;
	}
	return 0;
}

/*
函数名称\OutPark
函数功能\汽车离开停车场
函数参数\Queue AsqPark:停车场
函数参数\Queue AsqAisle:临时车道
返回值\int:说明程序退出的状态
*/

int OutPark(Queue &sqPark, Queue &sqAisle)
{
	cout<<"----------离开停车场----------------"<<endl;

	Car car;
	if(OK==DeQueue(sqPark,car))
	{
		//车辆离开,计时收费
		int time;
		cout<<car.lisence_plate<<"号车离开!"<<endl<<"请输入离场时间:";
		cin>>time;

		int fee = (time - car.time)*2;//每小时两元
			cout<<"收费: "<<fee<<"元"<<endl;

			if(OK==DeQueue(sqAisle,car))
			{
			//过道上排队的车进入停车场
			cout<<car.lisence_plate<<"从过道进入停车场"<<endl;
			cout<<"请输入入场时间:";
			cin>>car.time;//输入时间,开始计费
			EnQueue(sqPark,car);
			}
	}
	else
	{
		//队列为空,停车场内没有汽车
		cout<<"停车场没有车要离开"<<endl;

	}
	return 0;
}

/*
函数名称\ViewPark
函数功能\查看停车场
函数参数\eue AsqPark:停车场
函数参数\Queue AsqAisle:临时车道
返回值\nt:说明程序退出的状态
*/

int ViewPark(Queue &sqPark, Queue &sqAisle)
{
	cout<<"---------查看停车场------------"<<endl;

		QueueTraverse(sqPark);
		cout<<"-----------过道------------"<<endl;
		QueueTraverse(sqAisle);
		cout<<endl;
		return 0;
}
park.cpp

#include "Park.h"
#include <stdlib.h>
#include <iostream>
using namespace std;

/*
函数名称\InitQueue
函数功能\初始化队列
函数参数\Queue &q:队列
函数参数\int nSize: 最大队列长度
返回值\int: 说明程序退出的状态
*/

int InitQueue(Queue &q, int nSize)
{
	q.base = (Car *)malloc((nSize+1) *sizeof(Car));
	if(!q.base)
	{//内存分配失败
		return ERROR;
	}
	q.front = q.rear = 0;
	q.size = nSize+1;
	return OK;
}
/*
函数名称\DestoryQueue
函数功能\销毁队列
函数参数\Queue q:队列
返回值\t: 说明程序退出的状态
*/
int DestoryQueue (Queue &q)
{
	//释放空间
	if(q.base)
	{
		free(q.base);
		q.base = NULL;
	}
	q.front = q.rear = 0;
	q.size = 0;
	return OK;
}
/*
函数名称\QueueLength
函数功能\获得队列长度
函数参数\Queue q:队列
返回值\int: 说明程序退出的状态
*/
int QueueLength(Queue q)
{
	return(q.rear - q.front + q.size)% q.size;
}

/*
函数名称\QueueEmpty
函数功能\判断队列是否为空
函数参数\Queue q:队列
返回值\int: 说明程序退出的状态
*/
int QueueEmpty(Queue q)
{
	return(q.front == q.rear);
}
/*
函数名称\EnQueue
函数功能\插入元素到队尾
函数参数\Queue &q:队列
函数参数\Car car: 车辆元素
返回值\int: 说明程序退出的状态
*/
int EnQueue(Queue &q,Car car)
{
	if((q.rear+1)%q.size == q.front)
	{
		return ERROR;
	}
	q.base[q.rear] = car;
	q.rear = (q.rear+1)%q.size;
	//cout<<"尾指针"<<q.rear<<endl;
	return OK;
}


/*
函数名称\DeQueue
函数功能\若队列不空,则删除队头元素
函数参数\Queue &q:队列
函数参数\Car car: 车辆元素
返回值\int: 说明程序退出的状态
*/
int DeQueue(Queue &q,Car &car)
{
	//队列空
	if(q.front==q.rear)
	{
		return ERROR;
	}
	car = q.base[q.front];
	q.front = (q.front+1)%q.size;
	return OK;
}
/*
函数名称\QueueTraverse
函数功能\遍历队列,输出车辆信息
函数参数\Queue q: 队列
返回值\int: 说明程序退出的状态
*/
int QueueTraverse(Queue q)
{
	if(q.front==q.rear)
	{
		return ERROR;
	}
	int i=q.front;
	while(i!=q.rear)
	{
		Car car = q.base[i];
		cout<<"车牌号码:"<<car.lisence_plate<<"\t停车位: "<<i+1<<"\t入场时间:"<<car.time<<endl;
		i = (i+1)%q.size;
	}
	return OK;
}

park.h

#ifndef PARK_H_INCLUDED
#define PARK_H_INCLUDED
#define MAX_PAKING_SPACE 3 //停车场最大车位
#define AISLE_SIZE 10 //过临时车位数量
#define ERROR -1
#define OK 0

//定义时间结构体
typedef struct time
{
    int hour;
    int min;
}Time
}
//汽车节点
typedef struct Car
{
	char lisence_plate[10]; //车牌
	Time reach;
	Time leave               //进出停车场的时间
};

//循环队列
typedef struct CirQueue
{
	Car *base; //数组
	int front; //队头指针
	int rear; //队尾指针
	int size; //最大队列长度
}Queue;

//初始化队列
int InitQueue(Queue &q, int size);
//销毁队列
int DestoryQueue(Queue &q);
//判断队列是否为空
int QueueEmpty(Queue q);
//获得队列长度
int QueueLength(Queue q);
//插入元素到队尾
int EnQueue(Queue &q,Car car);
//删除队头元素
int DeQueue(Queue &q,Car &car);
//遍历队列
int QueueTraverse(Queue q);


#endif // PARK_H_INCLUDED
运行结果图




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”中删除该车的信息, 并将该车对应的车位设置为可使用状态(即二维数组对应元素清零). 按用户的选择来判断是否要输出停车收费的总计。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值