如何运用C语言实现停车场的管理?——看这个就够了——课程设计_c语言停车场车辆离开如何实现的-程序员宅基地

技术标签: C语言  停车场管理  课程设计  

 

 

(对于这个程序最关键的是出停车场的模块,在这个程序之中,必须要建立一个链队列和一个停车栈一个备用栈,备用栈在出车时会被调用到。

 

 

一、问题描述
 

    停车场管理软件的主要标是实现停车场用户借助停车场管理软件实现对停车位进行管理和监控。可以实现空闲车位查询、占用车位查询、已停车辆和用户进行管理、以及消费管理。为用户提供强大的数据操纵功能,界面友好、使用简单方便,能够满足用户的基本要求。

停车场管理系统主要涉及到用户、车位、车辆、以及消费等几个要点。管理员可以查询车位及停放车辆,并出入的车辆进行计费及收费管理。

设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。为停车场编制按上述要求进行管理的模拟程序。
 


二、基本要求

     以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“‘离去”的信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若车辆到达,则输出汽车在停车场内或便道上的停车位置;若车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构,队列以链表结构。

三、实现提示

     需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据接到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项。汽车的牌照号码和进入停车场的时刻。

四.测试数据

     设n=2,输入数据为:('A',1,5),('A',2,10),('D',1,15),('A',3,20),('A',4,25),('A',5,30),('D',2,35),('D',4,40),('E',0,0)。其中:'A'表示到达;'D'表示离去(Departure);'E'表示输入结束(End)。

五、选做内容

    完成图形化界面设计。

// 停车场管理系统  
#include"stdio.h"
#include"stdlib.h"
#define OVERFLOW 0
#define STACKSIZE 2       // 车库容量  
typedef struct time      // 时间节点
{
	int hour;
	int min;
}Time; 
typedef struct       // 车辆信息
{
	char CarNum;
	float time; 
	int pos_a;    // 车在停车场中的位置  
	int pos_b;   // 车在便道上的位置  
	int flag;
}Car,Car2;
typedef struct           // 车库信息   (顺序栈)
{
	Car *top;
	Car *base;
	int stacksize;
}SqStack; 
int InitStack(SqStack *&S)        // 栈的初始化
{
	Car *Car1;
	Car1=(Car*)malloc(sizeof(Car));
	S=(SqStack*)malloc(sizeof(SqStack));
	S->base= Car1;
	if(!S->base) 
		exit(0);
	S->top=S->base;
	S->stacksize=STACKSIZE;
	return 1;
}  
int StackEmpty(SqStack *S)       //栈是否为空
{
	if(S->top==S->base) 
		return 1;
	else 
		return 0;
}
int StackFull(SqStack *S)         //栈是否满
{
	if(S->top-S->base>=S->stacksize) 
		return 1;
	else 
		return 0;
}
int Push(SqStack *&S,Car e)       // 入栈
{
	if(S->top-S->base==S->stacksize) 
		return 0;
	*S->top++=e;
	return 1;
} 
int Pop(SqStack *&S,Car &e)      // 出栈
{
	if(S->top==S->base) 
		return 0;
	e=*--S->top; 
	return 1;
} 
int StackTraverse(SqStack *S)   // 遍历栈
{
	Car *p=S->top; 
	Car *q=S->base;
	int l=1;
	if(StackEmpty(S))
	{
		for(int j=1;j<=STACKSIZE;j++)
		{
			printf("\t 车牌:  无  ");
			printf("\t\t 到达时间:   无   ");
			printf("\t 位置 %d :  空闲   ",j);
			printf("\n");
		}
		return 1; 
	}
	while(p!=q)
	{
		Car car=*(q);
		printf("\t 车牌 : %d",car.CarNum);
		printf("\t\t 到达时间: %5.2f",car.time);
		printf("\t\t 位置: %d",l++);
		printf("\n");
		q++;
	}
   return 1;
}

typedef struct      // 备用车道   (顺序栈)
{
	Car2 *top2;
	Car2 *base2; 
	int stacksize2;
}SqStack2; 

 int InitStack2(SqStack2 *&S2)   // 初始化
{
	Car *Car2;
	Car2=(Car*)malloc(sizeof(Car));
	S2=(SqStack2*)malloc(sizeof(SqStack2));
	S2->base2= Car2;
	if(!S2->base2) 
		exit(0);
	S2->top2=S2->base2;
	S2->stacksize2=STACKSIZE;
	return 1;
 } 
 
int StackEmpty2(SqStack2 *S2)    // 判空
{
	if(S2->top2==S2->base2)
		return 1;
	else
		return 0;
} 

int Push2(SqStack2 *&S2,Car2 e2)    // 进栈
{
	if(S2->top2-S2->base2==STACKSIZE)
		return 0;
	*S2->top2++=e2;
	return 1;
} 

int Pop2(SqStack2 *&S2,Car2 &e2)   // 出栈
{
	if(S2->top2==S2->base2)
		return 0;
	e2=*--S2->top2;
	return 1;
}
  
typedef struct QNode    // 车道信息(链队) 
{
	Car data;
	struct QNode *next;
}QNode,*QueuePtr; 

typedef struct
{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

int InitQueue(LinkQueue *&Q)    // 初始化
{ 
	Q=(LinkQueue*)malloc(sizeof(LinkQueue));
	Q->front=Q->rear=(QNode*)malloc(sizeof(QNode));
	Q->front->next=NULL;
	return 1;
} 

int EnQueue(LinkQueue *Q,Car e)    // 进队
{
	QueuePtr p;
	p=(QNode*)malloc(sizeof(QNode));
	p->data=e;
	p->next=NULL;
	Q->rear->next=p;
	Q->rear=p;
	return 1;
} 

int QueueEmpty(LinkQueue Q)     // 判空
{
	if(Q.front==Q.rear) 
		return 1;
	else
		return 0;
} 

int DeQueue(LinkQueue &Q,Car &e)     //出队
{
	QueuePtr p;
	if(Q.front==Q.rear)
		return 0;
	p=Q.front->next;
	e=p->data;
	Q.front->next=p->next;
	delete p; 
	return 1;
} 
  
int main()
{
	int i=1,j=1; 
	int status;
	float time,money;
	system("color 37");
	LinkQueue *Q;
	Car car_I,car_D,car_M;
	SqStack *S;
	SqStack2 *S2;
	InitStack(S); 
	InitStack2(S2);
	InitQueue(Q);
	while(1)
	{
		printf("\t\t\t 欢迎来到 XXXXXX 停车场! \n"); 
		printf("*****************************************************************\n");
		printf("\t\t\t1-- 车辆到达停车场 \n"); 
		printf("\t\t\t2-- 车辆离开停车场 \n"); 
		printf("\t\t\t3-- 停车场存放车辆情况 \n"); 
		printf("\t\t\t0-- 退出程序 \n");
		printf("*****************************************************************\n");
		printf(" 请选择所需要的操作 (0-3):\n"); 
		scanf("%d",&status) ;
		if(status==1)
		{ 
			printf("\t 请输入车牌号: ");
			scanf("%d",&car_I.CarNum);
			printf("\t 请输入车到达的时间: ");
			scanf("%f",&car_I.time);
			if(!StackFull(S))
			{
				Push(S,car_I); // 车进入车库  
				car_I.pos_a=i;
	     		car_I.flag=1;
				i=i+1;
				for(int m=1;m<50;m++)
					// 边线  
					printf("--");
					printf("\n");
					printf("\t 车牌号: ");
					printf("%d",car_I.CarNum);
					printf("\t 到达时间: ");
					printf("%5.1f\t",car_I.time); 
					printf("\t 车库中的位置是: %d\n",car_I.pos_a);
					for(int m=1;m<50;m++)
						// 边线  
						printf("--");
						printf("\n");
						printf("\n");
						printf("\n");
			}
			else
			{
				EnQueue(Q,car_I);
				car_I.pos_b=j;
				car_I.flag=0; 
				++j;
				printf("\n"); 
				printf("\tSorry!  车库已满!!!,您可以把车停在车道上! \n");
				printf("\n");
				for(int m=1;m<50;m++) // 边线  
				printf("..");
				printf("\n");
				printf("\t 车牌号: ");
				printf("%d",car_I.CarNum);
				printf("\t 便道上的位置为: %d\n",car_I.pos_b); 
				for(int m=1;m<50;m++) // 边线  
				printf("..");
				printf("\n");
				printf("\n");
				printf("\n"); 
			}
			system("pause");
			system("cls");
		}
		else if(status==2)
		{
			// 指令为  2 ,   开车离去(如果车在车库里收取停车费;在便道上则免费)  
			printf(" 请输入车主的车牌号: ");
			scanf("%d",&car_D.CarNum);
			printf(" 请输入出场时间: ");
			scanf("%f",&car_D.time);  
			i=i-1; 
			int flag=0;
			// 判断车是否在便道上  
     if(StackFull(S))
	 {
		 Car *p=S->top; 
		 Car *q=S->base;
		 while(p!=q)
		 {
			 Car car=*(q);
			 if(car.CarNum!=car_D.CarNum)
			 {
				flag++;
             }
			 if(car.CarNum==car_D.CarNum)
			 {
				goto loop;
			 }
			q++;
		 }  
       if(flag>=STACKSIZE)
	   {
		   printf(" 您的车停在便道上     "); 
       }
       printf("\n");
       printf("\n");
       printf("\n");  
     } 
	 else
	 {
loop:do
	 {           // 挡在前面的车给要出去的车让路  
       Pop(S,car_M); 
                       // 加一个判断,判断是不是停车场里的车  
       if(car_D.CarNum!=car_M.CarNum)
	   {
		   Push2(S2,car_M);
       }
       else
	   {
		   car_I.time=car_M.time;
       }
	 }
	 while(car_D.CarNum!=car_M.CarNum);    
     while(!StackEmpty2(S2))
	 {
		 // 让路的车返回去  
         Pop2(S2,car_M); 
         Push(S,car_M);
       }
     while(!QueueEmpty(*Q)&&!StackFull(S))
	 { 
         if(!StackFull(S))
		 {
            DeQueue(*Q,car_M); // 便道上的车离开后进入停车场,那么后面的车的位置都得变。
            car_M.flag=1;   
         }
         Push(S,car_M);
         printf(" 车牌为 %d 的车离开车库,车道上车牌为 %d 的车进入车库 \n",car_D.CarNum,car_M.CarNum);
       }  
       time=car_D.time-car_I.time;
       if(time<0.0) 
	   {
           printf(" 输入时间有错!请重新输入! ");
       }
       if(time>0.0&&time<=3.0)
	   {
           money=time*4;
       }
       else money=time*6;
         
       printf(" 你的车牌为 %d 的车,应收费 %5.2f 元。 ",car_D.CarNum,money);
       printf(" 欢迎下次光临我们的车库 \n");
     }
     printf("\n");
     printf("\n");
     printf("\n");
	 system("pause");
	 system("cls");
   } 
 
   else if(status==3) 
   { // 指令为  3  ;查看车库停车情况;  
		StackTraverse(S);
		system("pause");
		system("cls");
   }
   else if(status!=1&&status!=2&&status!=3&&status!=0)
   {
		printf("\t 指令错误 !!!  请在下面重新输入: ");
		system("pause");
		system("cls");
   }
   else if(status==0)
     break; 
 }  
}

 

 


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45581225/article/details/103726573

智能推荐

Chrome 扩展程序——Imagus:图片放大预览工具-程序员宅基地

文章浏览阅读3.3w次,点赞2次,收藏2次。主要介绍 Imagus 的功能及应用,Imagus 是一款简单实用的图片放大预览工具。_imagus

python 描述符_Python黑魔法之描述符-程序员宅基地

文章浏览阅读113次。引言Descriptors(描述符)是Python语言中一个深奥但很重要的一个黑魔法,它被广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧。本文我将讲述描述符的定义以及一些常见的场景,并且在文末会补充一下__getattr__,__getattribute__,__getitem__这三个同样涉及到属性访问的魔术方法。描述符的定义descr__g..._python revealaccess

jenkins自动化部署及三种构建部署方式_jenkins自动和手动部署-程序员宅基地

文章浏览阅读504次。jenkins自动化部署及三种构建部署方式jenkins是基于java开发的一种持续集成工具,用于监控持续重复的工作,功能包括。1、持续的软件版本发布/测试2、监控外部调用执行项目Jenkins其实很早之前就有了,最近火起来的原因是,大家都在关注devops,关注如何来做持续集成,持续交付,如何来做CI/CD。Jenkins作为持续集成的工具,他其实只是一个平台或者是一个大的框架,它的工作完全就是依靠插件,也就是说你想使用什么功能,你就找到什么样的插件。1.2.jenkins好处1、我在工作中部_jenkins自动和手动部署

GMSK调制解调误码率matlab仿真_gmsk码间干扰-程序员宅基地

文章浏览阅读1.6k次,点赞25次,收藏35次。GMSK(高斯最小频移键控)是一种连续相位的频移键控(CPFSK)调制方法,它在数字通信中得到了广泛应用,特别是在移动通信系统中。GMSK通过限制频率偏差的累积来减少带外辐射,并通过使用高斯滤波器对基带信号进行预调制来平滑相位路径。_gmsk码间干扰

Reader类和Writer类_sreader_writer_uoml-程序员宅基地

文章浏览阅读3k次。从键盘读入用户的输入,并显示在屏幕上1. 效果图2. Java代码package com.example.demo.file;import java.io.InputStreamReader;import java.io.OutputStreamWriter;/** * @Description Reader类和Writer类 * @author 大都督 * @date 2..._sreader_writer_uoml

python编码问题之encode、decode、codecs模块_python中encode在什么模块-程序员宅基地

文章浏览阅读2.1k次。原文链接先说说编解码问题编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 Eg:str1.decode('gb2312') #将gb2312编码的字符串转换成unicode编码str2.encode('gb2312') #将unicode编码..._python中encode在什么模块

随便推点

extjs中treepanel属性和方法_ext.tree.treepanel 展开节点适应宽度-程序员宅基地

文章浏览阅读363次。树控件由Ext.tree.TreePanel类定义,TreePanel类继承自Panel面板。TreePanel是ExtJS中最多能的组件之一,它非常适合用于展示分层的数据。树的使用是很频繁的,对树节点的各种操作已经和数据库的互动操作,这些都是需要掌握的。_ext.tree.treepanel 展开节点适应宽度

ORACLE常用傻瓜问题1000问-程序员宅基地

文章浏览阅读678次。1. oracle安装完成后的初始口令?  internal/oracle   sys/change_on_install   system/manager   scott/tiger   sysman/oem_temp 2. orACLE9IAS WEB CACHE的初始默认用户和密码? administrator/administrator 3. oracle 8.0.5怎么创建数据库?

iOS UISearchBar改变搜索框的颜色_ios searchbar 设置搜索狂颜色-程序员宅基地

文章浏览阅读2.1k次。[objc] view plain copy //搜索框 - (UISearchBar *)searchBar{ if (_searchBar == nil) { _searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 27, KScreenWidth_ios searchbar 设置搜索狂颜色

ADADELTA AN ADAPTIVE LEARNING RATE METHOD_adadelta一种自适应学习率方法-程序员宅基地

文章浏览阅读527次。ADADELTA: AN ADAPTIVE LEARNING RATE METHOD参考:[自适应学习率调整AdaDelta](https://www.cnblogs.com/neopenx/p/4768388.html)我们提出了一种新的梯度下降的逐维学习率方法ADADELTA。该方法仅使用一阶信息随时间动态地适应,并且除了一般的随机梯度下降外,具有最小的计算开销。该方法不需要人工调整学习速率,对噪声梯度信息、不同模型结构选择、不同数据模式和超参数选择具有鲁棒性。与其他方法相比,我们在分布式集群环境下_adadelta一种自适应学习率方法

从零开始一个微信小程序版知乎_微信小程序开发 知乎-程序员宅基地

文章浏览阅读1.5k次。以前工作没直接进行过小程序的开发,最近闲了下来就赶紧学习一下。因为从零开始,所以没有使用任何框架及UI库,记录一下本次开发中踩过的坑吧~展示效果(界面样式设计与交互来自iOS 4.8.0版本知乎App):动态效果请移步到GitHub查看。一、开始前的准备申请账号:根据小程序注册文档,填写信息和提交相应的资料,就可以拥有自己的小程序帐号。开发工具:微信开发者工具数据来源:Easy M..._微信小程序开发 知乎

centos uwsgi配置_在CentOS 7下安装uwsgi_uwsgi离线安装centos-程序员宅基地

文章浏览阅读153次。https://blog.csdn.net/weixin_35886269/article/details/112941217_uwsgi离线安装centos

推荐文章

热门文章

相关标签