如何运用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

智能推荐

解析rtcm32报文工具_学习网络请落实这几款小工具-程序员宅基地

文章浏览阅读1.7k次。在实际开发过程中,熟练使用Linux或者Windows中相关网络工具,可以更快更准地找到故障。所以,今天就跟大家分享几个实用的网络利器。1 ncnc-->“瑞士军刀”。不知大家在渗透过程中,拿了shell有没有使用nc搞点事儿。它用来快速构建网络链接,常用来调试客户端程序。nc参数举例执行任务命令扫描机器A端口号在30-40的服务nc -z A 30-40连接服务器A端口号为5000nc -..._rtcm工具

Facebook’s Tectonic Filesystem: Efficiency from Exascale——论文阅读

对Facebook存储系统进行介绍,之前采用多个子系统独自构建存储栈,不同子系统资源需求不同,导致资源没有充分利用。提出Tectonic,用单个系统实现各种用例,避免资源浪费,实现IOPS和存储空间的均衡,满足EB级别,租户间隔离,共享资源等的需求。包括4个部分:Chunk Store,由存储节点组成;Metadata Store,由 KV 存储和文件系统元数据层组成;Client Library,负责编排;Background services,维护集群一致性和容错。详细介绍了各种组件的实现方法。

【DeepL】菜鸟教程:如何申请DeepL免费API并使用Python的DeepL

DeepL是一个基于人工智能的翻译服务,它以其出色的翻译质量和对语境的深入理解而著称。与其他翻译服务相比,DeepL能够提供更加自然、准确的翻译结果,这得益于其先进的深度学习技术和庞大的训练数据集。

数字文旅重塑旅游发展新格局:以数字化转型为突破口,提升旅游服务的智能化水平,为游客带来全新的旅游体验

通过数字化转型和智能化服务的提升,数字文旅为游客带来了全新的旅游体验,推动了旅游业的持续健康发展。数字文旅以数字化转型为突破口,通过提升旅游服务的智能化水平,为游客带来全新的旅游体验,引领旅游业迈向更加智能化、个性化的未来。“方案365”全新整理智慧文旅、智慧园区、数字乡村-智慧农业、智慧城市、数据治理、智慧应急、数字孪生、乡村振兴、智慧乡村、元宇宙、数据中台、智慧矿山、城市生命线、智慧水利、智慧校园、智慧工地、智慧农业、智慧旅游等300+行业全套解决方案。数字文旅的兴起正在重塑旅游发展的新格局。

DRF JWT认证进阶

实际的案例中,登录的方式有很多种,既可以是用户名,还可以是手机号,还可以是邮箱等,并且他们的登录输入入口都是一个,所以这里将实现这种接口用户表用普通的表创建一个数据表用于侧式认证功能username = models.CharField(max_length=64, verbose_name='用户名')password = models.CharField(max_length=64, verbose_name='密码')

使用VSCODE生成调试Linux下C++的CMake项目_vscode cmake 新建linux工程-程序员宅基地

文章浏览阅读1.4k次。以epoll-server项目为例,通过VSCODE编译并调试。该形目由CMake构建,目标在该目录下生成build目录,通过CMake生成Makefile工程到build目录下,然后在build目录下执行make命令进行编译,最后通过VSCODE进行调试。Build代码目录用VSCODE WSL模式打开该目录。在.vscode文件夹下面创建task.json。task.json{ "version": "2.0.0", "tasks": [ {.._vscode cmake 新建linux工程

随便推点

国学短剧《我是小影星》栏目火热开拍-程序员宅基地

文章浏览阅读72次。节目旨在以中华传统文化为切入点,通过戏剧、歌舞、音乐等多种艺术形式的结合,让孩子们在演绎戏剧的同时,更好地了解和接受中华传统文化的魅力。通过参与国学短剧的表演,小演员们可以更深入地了解和学习中华传统文化和国学知识。通过表演国学短剧,小演员们可以接触到这些思想和价值观,理解它们在现实生活中的意义。在表演过程中,他们需要记住台词,理解角色,并通过身体语言和表情来传达角色的情感。总之,参与国学短剧的表演可以让小演员们更全面地发展自己的才能和能力,同时也可以帮助他们更好地理解和欣赏中华传统文化和国学知识。

深度学习在金融交易中的应用:构建智能投资决策系统

随着人工智能技术的飞速发展,深度学习已经成为金融交易领域中一个强大的工具。通过构建复杂的神经网络模型,我们能够从海量的金融数据中学习并预测市场动向,为投资者提供前所未有的决策支持。

基于Matlab使用深度学习的多曝光图像融合

一、项目背景在图像处理领域,多曝光图像融合技术是一种重要的技术,它可以将不同曝光条件下的多幅图像合并为一幅高动态范围(HDR)图像。这种技术对于改善图像的视觉效果、增强图像的细节和对比度等方面具有重要意义。近年来,随着深度学习技术的快速发展,将深度学习应用于多曝光图像融合领域已成为一个研究热点。本项目旨在利用Matlab平台和深度学习技术,实现高效、准确的多曝光图像融合。二、项目目标构建深度学习模型:基于Matlab深度学习工具箱,构建适用于多曝光图像融合的深度学习模型。

并发情况下,Elasticsearch 保证读写一致的方法

并发情况下,Elasticsearch 保证读写一致的方法

深度学习之视觉特征提取器——LeNet

LeNet是是由深度学习巨头Yann LeCun在1998年提出,可以算作多层卷积网络在图像识别领域的首次成功应用。我们现在通常说的LeNet是指LeNet-5,最早的LeNet-1在1988年即开始研究,前后持续十年之久。但是,受限于当时计算机算力的发展,以及本有的SVM技术效果就十分优秀,这一技术并没有得到广泛重视。然而,在以卷积神经网络为基础构建起的计算机视觉的今天,不得不感慨,二十年后今天的LLM或者是什么模型,会成为曾经的CNN/LeNet。

2024年第十五届蓝桥杯江苏省赛回顾

希望提升自己的小伙伴可以参照我往期的博客,相信下一个是你。

推荐文章

热门文章

相关标签