编写停车场管理程序

目的:深入掌握栈和队列应用的算法设计

内容:编写满足以下要求的停车场管理程序exp3-5.cpp。设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。

汽车在停车场内按车辆到达时间的先后顺序依次由南像北排列(大门在最北端,最先到达的第一辆车停放在停车场的最南端),若停车场内已停满n辆车,则后来的汽车只能在门外的便道(即候车场)上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内的某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场,每辆停放在停车场的车在它离开停车场时必须按停留的时间长短交纳费用。整个停车场的示意图如下图所示:

//计算机 小淇在敲代码  编写停车场管理程序
#include<stdio.h>
#include<malloc.h>
#define N 3                     //停车场内最多的停车数
#define M 4                     //候车场内最多的停车数
#define Price 2                 //每单位停车费用
typedef struct
{
	int CarNo[N];               //车号
	int CarTime[N];             //进场时间
	int top;                    //栈指针
}SqStack;                       //声明顺序栈类型
typedef struct
{
	int CarNo[M];               //车号
	int front,rear;             //队首和队尾指针
}SqQueue;                       //声明环形队列类型

//栈的基本运算操作
//初始化栈
void InitStack(SqStack *&s)
{
	s=(SqStack *)malloc(sizeof(SqStack));
	s->top=-1;
}
//判断栈空
bool StackEmpty(SqStack *s)
{
	return(s->top==-1);
}
//判断栈满
bool StackFull(SqStack *s)
{
	return(s->top==N-1);
}
//进栈
bool Push(SqStack *&s,int e1,int e2)
{
	if(s->top==N-1)
		return false;
	s->top++;
	s->CarNo[s->top]=e1;
	s->CarTime[s->top]=e2;
	return true;
}
//出栈
bool Pop(SqStack *&s,int &e1,int &e2)
{
	if(s->top==-1)
		return false;
	e1=s->CarNo[s->top];
	e2=s->CarTime[s->top];
	s->top--;
	return true;
}
//显示栈中元素
void DispStack(SqStack *s)
{
	for(int i=s->top;i>=0;i--)
		printf("%d",s->CarNo[i]);
	printf("\n");
}


//队列的基本运算操作
//初始化队
void InitQueue(SqQueue *&q)
{
	q=(SqQueue *)malloc(sizeof(SqQueue));
	q->front=q->rear=0;
}
//判断队空
bool QueueEmpty(SqQueue *q)
{
	return(q->front==q->rear);
}
//判断队满
bool QueueFull(SqQueue *q)
{
	return((q->rear+1)%M==q->front);
}
//进队
bool enQueue(SqQueue *&q,int e)
{
	if((q->rear+1)%M==q->front)     //队满
		return false;
	q->rear=(q->rear+1)%M;
	q->CarNo[q->rear]=e;
	return true;
}
//出队
bool deQueue(SqQueue *&q,int &e)
{
	if(q->front==q->rear)          //队空的情况
		return false;
	q->front=(q->front+1)%M;
	e=q->CarNo[q->front];
	return true;
}
//显示队中元素
void DispQueue(SqQueue *q)
{
	int i=(q->front+1)%M;
	printf("%d",q->CarNo[i]);
	while((q->rear-i+M)%M>0)
	{
		i=(i+1)%M;
		printf("%d",q->CarNo[i]);
	}
	printf("\n");
}

//主函数
int main()
{
	int w,i,j;
	int no,e1,time,e2,time1;
	SqStack *St,*St1;
	SqQueue *Qu;
	InitStack(St);
	InitStack(St1);
	InitQueue(Qu);
	printf("计算机 小淇在敲代码\n");
	do
	{   
		printf("1.到达\n2.离开\n3.停车场\n4.候车场\n0.退出\n  请输入: ");
		scanf("%d",&w);
		switch(w)
		{
		case 1:printf("车号  到达时间: ");
			scanf("%d%d",&no,&time);
			if(!StackFull(St))                         //停车场不满
			{
				Push(St,no,time);
				printf("停车场位置:%d\n",St->top+1);
			}
			else                                      //停车场满
			{
				if(!QueueFull(Qu))                    //候车场不满
				{
					enQueue(Qu,no);
					printf("候车场位置:%d\n",Qu->rear);
				}else
					printf("候车场已满,不能停车\n");
			}
			break;
		case 2:printf("车号  离开时间: ");
			scanf("%d%d",&no,&time1);
			while(time1<time)
			{
				printf("离开时间不能小于进入时间,请重新输入离开时间");
					scanf("%d",&time1);
			}
			for(i=0;i<=St->top&&St->CarNo[i]!=no;i++);
			if(i<St->top)
				printf("未找到该编号的汽车\n");
			else
			{
				for(i=i;i<=St->top;j++)
				{
					Pop(St,e1,e2);
					Push(St1,e1,e2);
				}
				Pop(St,e1,e2);
				printf("%d汽车停车费用:%d\n",no,(time1-e2)*Price);
				while(!StackEmpty(St1))
				{
					Pop(St1,e1,e2);
					Push(St,e1,e2);
				}
				if(!QueueEmpty(Qu))
				{
					deQueue(Qu,e1);
					Push(St,e1,time);
				}
			}
			break;
		case 3:
			if(!StackEmpty(St))
			   {
				printf("停车场中的车辆: ");
				DispStack(St);
			}
			else
				printf("停车场中无车辆\n");
			break;
		case 4:
			if(!QueueEmpty(Qu))
			{
				printf("候车场中的车辆: ");
				DispQueue(Qu);
			}
			else
				printf("候车场中无车辆:\n");
			break;
		case 0:
			if(!StackEmpty(St))
			{
				printf("停车场中的车辆: ");
				DispStack(St);
			}
			if(!QueueEmpty(Qu))
			{
				printf("候车场中的车辆: ");
				DispQueue(Qu);
			}
			break;
default:
			printf("输入的命令错误\n");
			break;
		}
	}
	while(w!=0);
	return 0;
}


 

                             

 

 

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
停车场管理系统 浙江农林大学地理信息科学171班 HMc、FZ、HHb、XHc、ZLl、CC小组 模块 模块名 命名空间 介绍 完成度 模型模块 Park.Model 提供数据库模型 99% 服务模块 Park.Service 提供业务处理方法 99% 管理模块 Park.Admin 提供管理页面供管理员对各种信息进行管理、查看和汇总 80% 用户模块 Park.Mobile 提供手机网站,供用户进行查看账户信息和停车场信息 80% 接口模块 Park.API 为停车场硬件设施和Park.Mobile提供API 80% 车位设计模块 Park.Designer 用于设计停车位地图。由于技术不够,故使用WPF作为设计器框架。 99% 测试模块 Park.Test 用于测试,非单元测试 - 日志 20200329 设计器 基本完成车位设计器的主要功能: 画板网格显示 鼠标绘制停车位、通道 停车区的选择 停车区的新增、删除、重命名 使用鼠标浏览画板 使用鼠标选取对象 配置文件的导入导出 配置文件的自动保存和恢复 20200330 设计器 将通道从矩形改为线 通道支持了非横纵方向 通道支持了朝左上方拉伸 通道支持按Shift进行约束 停车位新增支持旋转 鼠标悬浮样式改为图形显示阴影 支持了删除功能 20200331 管理端 搭建了对车主管理表格的基本页面 核心 增加了停车场业务处理相关方法 测试 增加了测试类 20200401 核心 增加了交易充值业务处理相关方法 测试 增加了非会员进出、会员进出的测试方法 20200402 核心 为数据库添加了显式外键声明 管理端 基本完成车主管理表格 基本完成车位管理表格 20200403 核心 支持了从Json文件(设计器导出)导入停车位的功能 基本完成停车区地图的显示(To Bitmap) 20200404 管理端 显示了车主拥有的车辆数量、交易订单数量,点击车辆数量可以跳转到车辆表 提升了”表格模型“基类和js方法,方便之后的编写 基本完成了停车记录表格 20200406 管理端 完成交易记录表格 重新分离编写停车区和停车位管理页面 核心 增加了”墙体“模型 设计器 支持了”墙体“模型 设备接口 做好准备 20200407 管理端 基本完成模拟界面和逻辑 设备接口 基本完成门卫接口、车位传感器接口 20200410 管理端 新增了一个图表 修改数据库初始化代码,符合本系统 基本完成权限角色的分配 新增数据库管理页面 模型 新增了车主的注册时间、最后登录时间字段,新增车辆的准入字段 服务 分离了数据库创建与生成测试数据 进入停车场返回复合类型 20200501 手机 修改为前后端分离项目,前端使用Vue进行编写,后端使用Park.API 20200502 手机 基本完成主页 完成账户验证 完成车辆管理界面和查看停车记录 20200503 模型 新增Config类型,删除了定价策略的停车区字段 服务 将某些服务的参数CarOwner改为CarOwnerID 手机 完成了车辆的删除和新增功能 新增“充值”页,支持了充值和充月卡 20200504 服务 修复了数据库生成的一些时序问题和没有应用定价策略的问题 手机 基本完成交易记录界面 完成停车场地图的显示 完成账户的注销 20200505 服务 修复了数据库生成的一些时序问题,停车记录时间为1-01-01 8:05的问题 手机 修复了一些小BUG,例如格式化代码不正确、宽度过窄等问题 新增点击标题栏文字返回主页 20200515 管理端 完成了导入停车场设计器生成的JSON的功能 20200605 服务 将用户初始化时的用户名改为非随机、顺序的。 修复了设置密码时,有些加了盐有些没加的BUG 管理端 修改初始化密码为1234而非123456 手机 修复了充值金额可以为负数、非数字、很大的数字的BUG 新增修改密码界面 20200610 服务 优化测试数据创建流程,修改了数量、停车记录生成的时间 管理端 完成了首页的数据大屏 20200611 服务 优化测试数据创建流程,支持设置添加用户数量,支持了停车时修改停车位状态,修改模拟当前时间 管理端 数据大屏新增停车场名称标题、新增每个停车区的车位状态饼状图 新增停车场设置界面 数据库管理界面增加了生成测试数据的用户数量输入框 20200616 管理端 删除了车主界面的新建按钮(没写功能)和停车记录、交易记录页面的删除按钮(防止外键出错) 修改了登录页和菜单的图标 设置强制设置指定的主题,删除主题按钮 删除了一些搜索框 20200616 管理端 在车主管理界面新增了管理按钮,可以一键打开用户手机端界面,并修改用户的一些数据 出自 © 2021 GitHub, Inc.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值