⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3(ok).c

📁 该程序主要实现停车场的模拟管理。总共使用了一个队列俩个堆栈。其中一个堆栈用来描述停车场
💻 C
字号:
#include "stdio.h"
#include "time.h"
#include "malloc.h"
#define SIZE 5 //车位
//////////////////////////////////////////////////////////////////////////
//栈的数据结构描述
typedef struct  
{
	char flag;//进出标志
	int num;//车牌号
	int io_time;//进出时刻
}parkingNode;
typedef struct  
{
	parkingNode cars[SIZE];
	int top;
}Carparking_Stack;
//////////////////////////////////////////////////////////////////////////
//新建并初始化栈
Carparking_Stack *SetStack()
{
	Carparking_Stack *S;
	S=(Carparking_Stack *)malloc(sizeof(Carparking_Stack));
	S->top=-1;
	return S;
}
//////////////////////////////////////////////////////////////////////////
//判栈空
int StackEmpty(Carparking_Stack *S)
{
	if (S->top>=0) 
		return 0;
	else
		return 1;
}
//////////////////////////////////////////////////////////////////////////
//判栈满
int StackFull(Carparking_Stack *S)
{
	if(S->top<SIZE-1&&S->top>=0)
		return 0;
	else
		return 1;
}
//////////////////////////////////////////////////////////////////////////
//取栈顶元素
parkingNode *GetTop(Carparking_Stack *S)
{
	if(S->top<=SIZE-1&&S->top>=0)
		return &S->cars[S->top];
	else
		printf("error");
}
//////////////////////////////////////////////////////////////////////////
//入栈
Carparking_Stack *Push(Carparking_Stack *S,parkingNode *x)
{
	if(S->top<SIZE-1&&S->top>=-1)
	{
		S->top++;
		S->cars[S->top].flag=x->flag;
		S->cars[S->top].num=x->num;
		S->cars[S->top].io_time=x->io_time;
	}
	else
		printf("error");
	return S;
}
//////////////////////////////////////////////////////////////////////////
//出栈
Carparking_Stack *Pop(Carparking_Stack *S)
{
	if (S->top>=0)
		S->top--;
	else
		printf("error");
	return S;
}
//////////////////////////////////////////////////////////////////////////
//循环队列数据类型定义
#define maxlen 100
typedef struct  
{
	parkingNode cars[maxlen];
	int front;
	int rear;
}Carparking_Queue;
//////////////////////////////////////////////////////////////////////////
//类似的,新建一个空队列:
Carparking_Queue *SetQueue()
{
	Carparking_Queue *Q;
	Q=(Carparking_Queue *)malloc(sizeof(Carparking_Queue));
	Q->front=0;
	Q->rear=0;
	return Q;
}
//////////////////////////////////////////////////////////////////////////
//判队满
int QueueFull(Carparking_Queue *Q)
{
	if (Q->front==(Q->rear+1)%maxlen) 
		return 1;
	else
		return 0;
}
//////////////////////////////////////////////////////////////////////////
//判队列空
int QueueEmpty(Carparking_Queue *Q)
{
	if (Q->front==Q->rear)
		return 1;
	else
		return 0;
}
//////////////////////////////////////////////////////////////////////////
//入队
Carparking_Queue *Add(Carparking_Queue *Q,parkingNode *x)
{
	if (!QueueFull(Q)) 
	{
		Q->rear=(Q->rear+1)%maxlen;
		Q->cars[Q->rear].flag=x->flag;
		Q->cars[Q->rear].num=x->num;
		Q->cars[Q->rear].io_time=x->io_time;
	}
	else
		printf("Queue Full!!");
	return Q;
}
//////////////////////////////////////////////////////////////////////////
//出队
Carparking_Queue *Delete (Carparking_Queue *Q)
{
	if(!QueueEmpty(Q))
		Q->front=(Q->front+1)%maxlen;
	else
		printf("Queue Empty!!");
	return Q;
}
//////////////////////////////////////////////////////////////////////////
parkingNode *GetHead(Carparking_Queue *Q)//取队头元素
{
	if (QueueEmpty(Q)) 
		printf("the Queue is Empty!!\n");
	else
		return &Q->cars[(Q->front+1)%maxlen];
}
//////////////////////////////////////////////////////////////////////////
void yanshi()//延时效果函数,3秒
{
	time_t tm1,tm2;
	time(&tm1);
	while (time(&tm2)) 
	{
		if (tm2-tm1==3)
			break;
	}
}
//////////////////////////////////////////////////////////////////////////
//收费
void charge(parkingNode *k)
{
	int t;
	char ch;
	printf("\n请输入此车出场时间:");
	scanf("%d",&t);
	t=t-k->io_time;
	printf("\n请输入车辆类型代码(A—轿车类\tB—货车类\tC—客车类): ");
	while (1) 
	{
		scanf("%c",&ch);
		if(ch==0x0A)
			continue;
		else
			break;
	}
	switch(ch) 
	{
	case 'A':
		printf("\t停车%d小时,费用:%d ¥!",t,10*t);
		break;
	case 'B':
		printf("\t停车%d小时,费用:%d ¥!",t,7*t);
		break;
	case 'C':
		printf("\t停车%d小时,费用:%d ¥!",t,5*t);
	}
	printf("\n\n");
}
//////////////////////////////////////////////////////////////////////////
//用户初始化栈
parkingNode *in()//??????如何有问题?????
{
	parkingNode *k=(parkingNode *)malloc(sizeof(parkingNode));
	printf("进出选择:(A-进,D-出): ");
	while (1) 
	{
		scanf("%c",&k->flag);
		if(k->flag==0x0A)
			continue;
		else
			break;
	}
	printf("车牌号: ");
		scanf("%d",&k->num);
	printf("进出时刻: ");
		scanf("%d",&k->io_time);
	return k;
}
void out(parkingNode *k)
{
	printf("车牌号为: %d\n",k->num);
	printf("入场停车的时间为: %d\n",k->io_time);
}

Carparking_Stack *input_stack(Carparking_Stack *S)//堆栈初始化
{
	parkingNode *k;	
	char ch;
	S=SetStack();
	printf("用户初始化栈,输入停车场现况...\n");	
ITEM:
	while (1) 
	{
		k=in();
		S=Push(S,k);
		printf("\n是否继续?(Y/N) :");
		while (1) 
		{
			scanf("%c",&ch);
			if(ch==0x0A)
				continue;
			else
				break;
		}
		if (ch=='Y'||ch=='y') 
			goto ITEM;
		else
			break;
	}
	return S;
}
//////////////////////////////////////////////////////////////////////////
//汽车入场停车
Carparking_Stack *car_in(Carparking_Stack *S,Carparking_Queue *Q)
{
	parkingNode *k;
	k=in();
	
		if (StackFull(S)) 
		{
			printf("场内车位已满,将新来的车进入便道等候...\n");
			Q=Add(Q,k);
		}
		/*else if (!StackFull(S)&&!QueueEmpty(Q))//场内还有空位,便道有车载等候
		{
			printf("场内尚有空位,将便道等候的车子入场...\n");
			while (!StackFull(S)) 
			{
				k=GetHead(Q);
				S=Push(S,k);
				Q=Delete(Q);
			}
		}*/
		else  //便道无车等候,而且场内有空位
		{
			printf("场内尚有空位,直接入场...\n");	
			S=Push(S,k);
		}
	
	return S;
}
//////////////////////////////////////////////////////////////////////////
//汽车出场
Carparking_Stack *car_out(Carparking_Stack *S,Carparking_Queue *Q)
{
	parkingNode *k;
	Carparking_Stack *T;
	int i,j,c=S->top;
	T=SetStack();
ITEM_1:	
	printf("输入即将出场的车位号:\n");
	scanf("%d",&i);
	j=i;
	if (i==c) 
	{
		printf("此车位于最后一个车位,直接离去!!\n");
		printf("\n=======车辆离开,请工作人员计算费用======\n");
		k=GetTop(S);
		charge(k);
		S=Pop(S);
	}
	else if (i>c)
	{
		printf("尚无此车位!!重新输入!!\n");
		goto ITEM_1;
	}
	else
	{
		printf("\n此车位于第%d号车位,下面先将其前面的%d个车位腾空...",j,c-j);
		//延时效果
		yanshi();
		while((c-i)>0)
		{	
			k=GetTop(S);
			Pop(S);
			T=Push(T,k);
			i++;
		}
		printf("\n将第%d个车位的车子出场...\n",i);
		k=GetTop(S);
		////输出车子信息///////
		out(k);
		printf("\n=======车辆离开,请工作人员计算费用======\n");
		charge(k);
		yanshi();
		S=Pop(S);//将第i个车位的车子出场
		printf("\n要求出场的车子出场完毕,将被移出的车子再依次入场停放...\n");
		yanshi();
		while (!StackEmpty(T)) 
		{
			k=GetTop(T);
			Pop(T);
			S=Push(S,k);
		}
		if (!StackFull(S)&&!QueueEmpty(Q)) //将便道内的车辆入场
		{
			printf("此时场内已有空位,将便道内的车辆入场...\n");
			yanshi();
			while (!StackFull(S)) 
			{
				k=GetHead(Q);
				S=Push(S,k);
				Q=Delete(Q);
			}
		}
	}
	return S;
}
//////////////////////////////////////////////////////////////////////////
//信息输出
void out_Stack(Carparking_Stack *S)
{
	int c;
	c=S->top;
	printf("场中有%d辆车,信息如下:\n",c+1);
	while (c>=0) 
	{
		printf("车位号: %d \t车牌号: %d \t入场时间: %d \n",c,S->cars[c].num,S->cars[c].io_time);
		c--;
	}
}
void out_Queue(Carparking_Queue *Q)
{
	int i,j;
	i=Q->front+1;
	j=Q->rear;
	printf("便道中有%d辆车!!信息如下:\n",j-i+1);
	while (i<=j) 
	{
		printf("车牌号: %d \t进入便道时刻: %d\n",Q->cars[i].num,Q->cars[i].io_time);
		i++;
	}
}
//////////////////////////////////////////////////////////////////////////
//菜单
int selete_main_menu()
{
	int j;
	printf("\n============停车场管理模拟程序============\n");
	printf("	     1  录入原始信息                  \n");
	printf("             2  停车场维护                    \n");
	printf("             3  停车场信息查看                \n");
	printf("             4  退出系统                      \n");
	printf("==========================================\n");
	printf("请选择:");
	scanf("%d",&j);
	return j;
}
int selete_submenu_do()
{
	int j;
	printf("\n========维护子系统========\n");
	printf("        1  车辆入场停车     \n");
	printf("        2  车辆出场离开     \n");
	printf("        3  返回             \n");
	printf("  ==========================\n");
	printf("请选择:");
	scanf("%d",&j);
	return j;
}
int selete_submenu_look()
{
	int j;
	printf("\n======信息查看子系统=======\n");
	printf("      1  查看场内情况        \n");
	printf("      2  查看便道情况        \n");
	printf("      3  返回                \n");
	printf("  ===========================\n");
	printf("请选择:");
	scanf("%d",&j);
	return j;
}
//////////////////////////////////////////////////////////////////////////
void main()
{
	Carparking_Stack *S;
	Carparking_Queue *Q;
	S=SetStack();Q=SetQueue();
	while (1) 
	{
		switch(selete_main_menu()) 
		{
		case 1:
			S=input_stack(S);
			break;
		case 2:
			switch(selete_submenu_do())
			{
			case 1:
				S=car_in(S,Q);
				break;
			case 2:
				S=car_out(S,Q);
				break;
			case 3:
				break;
			}
			break;
		case 3:
			switch(selete_submenu_look()) 
			{
			case 1:
				if (!StackEmpty(S)) 
					out_Stack(S);
				else
					printf("场内尚未停任何车辆!!\n\n");
				break;
			case 2:
				if (!QueueEmpty(Q)) 
					out_Queue(Q);
				else
					printf("\n便道中尚无等候车辆!!\n\n");
				break;
			case 3:
				break;
			}
			break;
		case 4:
			exit();
			break;
	
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -