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

智能推荐

nginx无网络启动失败——proxy_pass域名DNS解析出错-程序员宅基地

文章浏览阅读1k次。问题:nginx启动或者reload的时候,会对proxy_pass后面的域名进行DNS解析,如果解析失败,启动就会失败或者reload失败。我们是to B的产品,客户的环境可能是不通公网的,因此不能使用公网DNS服务,进而导致在ng启动的时候,对proxy_pass后紧跟域名的dns解析失败,最终导致nginx启动失败。解决方案:不直接在proxy_pass后写域名..._nginx没网络启动不了

Unity相关性能检测工具介绍_unity性能检测-程序员宅基地

文章浏览阅读1.6k次。Unity相关性能检测工具介绍UWAgot Profile Xcode分析工具 Wetext(Cube->UPA) .._unity性能检测

libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0_../../lib/libopencv_imgcodecs.so.4.9.0: undefined -程序员宅基地

文章浏览阅读6k次,点赞7次,收藏23次。libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0错误如下:/usr/local/lib/libopencv_imgcodecs.so.4.2.0: undefined reference to `TIFFReadRGBAStrip@LIBTIFF_4.0'/usr/local/lib/libopencv_imgcodecs.so.4.2.0: undefined referenc_../../lib/libopencv_imgcodecs.so.4.9.0: undefined reference to tiffreaddirec

OpenCV3.4.0学习笔记(一)——cv::Mat的内存结构与访问_cv::mat data-程序员宅基地

文章浏览阅读5.3k次,点赞8次,收藏23次。cv::Mat的内存结构与访问cv::Mat 是新版opencv主打的也是最为常用的一种数据类型, 可以用于存储任意维度的多通道数组。本文目的在于记录学习过程中得到关于 cv::Mat 内存结构,成员变量的一些认识。从数组、指针的角度解释 cv::Mat ,提供从最底层操作 cv::Mat 的任一内容的方法。首先,cv::Mat 被认为是一个多维数组,那么对任何数组最重要的操作就是数组任意元..._cv::mat data

Android bugreport 分析方法-程序员宅基地

文章浏览阅读98次。文章来源:https://www.jianshu.com/p/20e1bfdf5161作者:特立独行的佩奇Android bugreport 概述bugreport 是Android 系统下的一个工具,功能类似于系统的一个黑匣子;通过执行相应的命令可以获取到bugreport 包,其中包含设备日志,堆栈跟踪和其他诊断信息,可帮助您查找和修复系统错误;bugreport信息量非常之大,几乎涵盖整个系..._bugreport 日志目录结构

物联网|探索cortex-M系列CPU的内核|实验课程前的准备|开发环境构建|开发资料|物联网开发系列课程之零基础玩转Cortex-M系列CPU-学习笔记(5)_基于arm cortex的物联网开发软件-程序员宅基地

文章浏览阅读120次。物联网|探索cortex-M系列CPU的内核|实验课程前的准备|开发环境构建|开发资料|物联网开发系列课程之零基础玩转Cortex-M系列CPU-学习笔记(5)_基于arm cortex的物联网开发软件

随便推点

二叉排序树(BST)_二叉排序树【bst】-程序员宅基地

文章浏览阅读344次。二叉排序树一、二叉排序树的介绍二、二叉排序树创建和遍历一、二叉排序树的介绍BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。下图就是一颗二叉排序树:如果有相同的值,将该节点放在左子节点或右子节点都可以二、二叉排序树创建和遍历数组Array(7, 3, 10, 12, 5, 1, 9) 创建成对应的二叉排序树,并使用中序遍历二叉排序树代码实现:package binaryS_二叉排序树【bst】

联想Y7000P 2019装Ubuntu双系统遇到的问题_拯救者y7000安装ubuntu出现acpi bios error:-程序员宅基地

文章浏览阅读2.9k次。联想Y7000P 2019装Ubuntu双系统遇到的问题(仅供参考,请通篇阅读完以后,再考虑是否使用本教程)首先电脑买回来有自带的Windows系统,然后装Ubuntu19.04双系统,之所以选择19而不是18是因为听同学说ubuntu18系统有无线网卡不能用,还得修改文件的问题,然而19也遇到了,不过这个后面会介绍到。一 制作装有Ubuntu19.04的U盘1.Ubuntu19.04可以从..._拯救者y7000安装ubuntu出现acpi bios error:

php插件 pycharm_pycharm 安装插件-程序员宅基地

文章浏览阅读412次。打开file——settings——plugings,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已安装的相关的插件:1.英语翻译.可以看源码注释2.statisticstatistic是一个项目统计插件,简单来说就是可以给出一个项目的统计信息,包括文件和代码量等,关于统计信的具体内容一会再讲,先来看下Statistic的使用方法。在Pycharm的左下角增加一个Statistic选项..._pycharm php

R7-1 数据结构实验之链表一:顺序建立链表 (20 分)_r7-1 栈的基本操作输入第1行为1个正整数n,表示操作个数; 第2行为给出的n个整数,非-程序员宅基地

文章浏览阅读523次。输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。输入格式:第一行输入整数的个数N(1 <= N <= 100000)。第二行依次输入每个整数。输出格式:输出这组整数。输入样例:812 56 4 6 55 15 33 62输出样例:12 56 4 6 55 15 33 62#include<stdio.h>#include <stdlib.h>struct node{..._r7-1 栈的基本操作输入第1行为1个正整数n,表示操作个数; 第2行为给出的n个整数,非

JVM调优(二)——Linux下监控java线程_linux详细监控java程序-程序员宅基地

文章浏览阅读2.1k次。Linux环境下,当发现java进程占用CPU资源非常高,且又要想更进一步查出哪一个java线程占用了CPU资源时该如何做呢?一、采用命令行形式查看线程,最终用dump进行文本分析1、top命令既可以看进程,又可以看线程1、top命令找出占用资源厉害的java进程id# top2、上图所看到的。java的进程id为’52554’,接下来用top命令单独对这个进程中的全部线程作监视t..._linux详细监控java程序

C语言 在一维数组中找出值最小的元素,并将其与第一个元素的值对调_在一维数组中找出值最小的元素,并将其值与第一个元素的值对调。-程序员宅基地

文章浏览阅读9.6k次,点赞7次,收藏21次。因本人才疏学浅,见识浅薄,有不当之处望指正,谢谢!在一维数组中找出值最小的元素,并将其与第一个元素的值对调思路:每次比较过程中,若一个数比最小的数还要小。那它就是最小的数// 找最小,并和第一个元素的值互换#include &amp;lt;stdio.h&amp;gt;#define N 10int main(void){ int a[N],i,t,min =0; printf(&quot;input ..._在一维数组中找出值最小的元素,并将其值与第一个元素的值对调。