小小项目3:停车场管理

这个项目没有什么实际意义,关键是为了体验栈和队的实际使用 。

我就发个主函数和关键几个函数。

先是栈和队列的头文件

/*
本题我需要一个栈和一个队列
栈用来停车和让车
队用来候车
*/

#ifndef __STACKQUEUE_H__
#define __STACKQUEUE_H__

#include"error.h"

#define SIZE_MAX 2


//停车信息
typedef struct _node
{
	int id;
	char car[10];
	long int time;
}NODE;

//------------队列(用链表)
typedef struct node_queue    //链表结点
{
	NODE data;
	struct node_queue *next;
}NODEQUEUE;

typedef struct _queue   
{
	NODEQUEUE *front;
	NODEQUEUE *rear;
}QUEUE;

//------------栈(用数组)
typedef struct stack
{
	int top;
	NODE arr[SIZE_MAX];
}STACK;


//————————————————————————————————————————————————————————队列

//创建链表队列
QUEUE * Crate_queue();

//清空队列
int QueueEmpty(QUEUE *q);

//进队
int PushQueue(QUEUE *q,NODE data);

//出队(出队是从front开始的)
int PopQueue(QUEUE *q,NODE *data);

//删除队列
int DelQueue(QUEUE *q);


//————————————————————————————————————————————————————————栈

//清空栈
int Init_stack(STACK * s);

//判断是否空栈
int Stack_Empty (STACK * s);

//判断是满空栈
int Stack_Full (STACK * s);

//入栈
int PushStcak(STACK * s,NODE data);

//出栈
int PopStcak(STACK * s,NODE *data);

#endif

然后是关键函数头文件

#ifndef __CAR_H__
#define __CAR_H__

#define D (24*60*60)
#define H (60*60)
#define M (60)

//停车
void stop_char(QUEUE * wait,STACK * stop);

//进入候车
int wait_car(QUEUE* wait);

//进入停车
int in_car(STACK* stop,NODE car);

//获取当前时间
long int now_time();

//离车
int leave_car(QUEUE * wait,STACK * stop,STACK * give);

//找到离开的车(返回:离车所要求车所需要出栈的次数)
int find(STACK * stop,int x);

//输出情况
int Risplay(STACK * stop,QUEUE * wait);

//查看一辆车的数据
void look_car(STACK * stop,int x);


#endif


关键函数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"StackQueue.h"
#include"Car.h"

//-------------------------------------------------------------停车
int stop_car(QUEUE * wait,STACK * stop)
{    
	system("clear\n");
	if(Stack_Full (stop) == TRUE)
	{
		printf("目前已没有车位,请进入候车道等待。\n\n");
		wait_car(wait);
		printf("请耐心等待。谢谢配合!\n");
	}
	else
	{
		printf("欢迎停车,请进。\n");
		NODE car;
		car.id = 0;
		printf("请输出车牌号:");
		scanf("%s",car.car);
		car.time = 0;
		in_car(stop,car);
		printf("停车成功,祝您停车愉快!\n");
	}
	getchar();
	getchar();
	return TRUE;
}

//进入候车
int wait_car(QUEUE * wait)
{
	NODE car;
	car.id = 0;
	printf("请输出车牌号:");
	scanf("%s",car.car);
	car.time = 0;
	
	PushQueue(wait,car);
	
	return TRUE;
}

//进入停车
int in_car(STACK* stop,NODE car)
{
	static int i = 1;
	car.id = i++;
	printf("您的停车号是%d\n",car.id);
	car.time = now_time();
	printf("您的停车时间为:%s\n",ctime(&(car.time)));
	
	//入栈
	PushStcak(stop,car);
}

//获取当前时间
long int now_time()
{
	time_t t1;
	time(&t1);
	return t1;
}

//-------------------------------------------------------------离车
int leave_car(QUEUE * wait,STACK * stop,STACK * give)
{
	system("clear\n");
	printf("请输出您要结束停车的停车号:");
	int x ;
	scanf("%d",&x);
	int num = find(stop,x);
	if (num == 0)
	{
		printf("系统在三秒后返回。\n");
		sleep(3);
		return FALSE;
	}
	//车进入让车栈
	int i;
	NODE data;
	for (i=0;i<num-1;i++)
	{
		PopStcak(stop,&data);
		PushStcak(give,data);
	}
	//车出栈
	PopStcak(stop,&data);
	long int now = now_time();
	int time = now - data.time;
	int d = time/D;
	time = time%D;
	int h = time/H;
	time = time%H;
	int m = time/M;
	int s = time%M;
	float money = 20*d + 3*h + 0.1*m + 2;
	printf("谢谢本次停车!\n");
	printf("您停车时间为:%s\n",ctime(&(data.time)));
	printf("结束停车时间为:%s\n",ctime(&now));
	printf("总共停车%d天%d时%d分%d秒。收费%.1f元。欢迎下次光临铠源集团。\n\n",d,h,m,s,money);
	
	//车回停车栈
	for (i=0;i<num-1;i++)
	{
		PopStcak(give,&data);
		PushStcak(stop,data);
	}
	//候车队停车
	if(wait->front != NULL)
	{	
		PopQueue(wait,&data);
		printf("欢迎车牌号为%s的车入场停车。\n",data.car);
		in_car(stop,data);
		printf("停车成功,祝您停车愉快!\n");
	}
	
	getchar();
	getchar();
	return TRUE;
}

//找到离开的车(返回:离车所要求车所需要出栈的次数)
int find(STACK * stop,int x)
{
	int i = 0;
	int num = 0;
	int tmp = stop->top;
	int flag = 0;
	for(i=tmp;i>-1;i--)
	{
		num++;
		if(stop->arr[i].id == x)
		{
			flag = 1;
			break;
		}
	}
	if(flag == 0)
	{
		printf("请输出正确的停车号,查无此车。\n");
		return 0;
	}
	return num;
}

//-------------------------------------------------------------查看车
int Risplay(STACK * stop,QUEUE * wait)
{
	system("clear\n");
	if(stop->top == -1)
	{
		printf("目前没有车停。\n");
		printf("系统在三秒后返回。\n");
		sleep(3);
		return FALSE;
	}
	int i;
	int max = SIZE_MAX;
	printf("本停车场一共有%d个车位。\n",max);
	printf("目前停车场有%d辆车。\n",stop->top+1);
	for(i=0;i<=stop->top;i++)
	{
		look_car(stop,i);
	}
	NODEQUEUE *tmp = wait->front;
	if(tmp != NULL)
	{
		printf("等候车辆:\n");
		while(tmp != NULL)
		{
		printf("等候车牌号:%s\n\n",tmp->data.car);
		tmp = tmp->next;	
		}
	}
	else
	{
		printf("没有等候车辆。\n");
	}
	
	getchar();
	getchar();
}

//查看一辆车的数据
void look_car(STACK * stop,int x)
{
	printf("停车号:%d\n",stop->arr[x].id);
	printf("车牌号:%s\n",stop->arr[x].car);
	long int time = stop->arr[x].time;
	printf("进入停车场时间:%s\n\n",ctime(&(time)));
}


最后主函数

/*
2017年8月1日08:55:43
停车场管理 
问题描述:停车场是一个能放n辆车的狭长通道, 只有一个大门,汽车按到达的先后次序停放。若 车场满了,车要停在门外的便道上等候,一旦有 
车走,则便道上第一辆车进入。当停车场中的车 离开时,由于通道窄,在它后面的车要先退出, 待它走后再依次进入。汽车离开时按停放时间收费。 
基本功能要求: 
		(1) 建立三个数据结构分别是:停放栈、让路 栈、等候队列。 
		(2) 输入数据模拟管理过程,数据(入或出,车号)。
*/

#include<stdio.h>
#include<stdlib.h>
#include"StackQueue.h"


int main()
{
	
	QUEUE* wait = Crate_queue();  								//创建候车队列
	STACK* stop = (STACK *)malloc(sizeof(STACK)/sizeof(char)); 	//创建停车栈
	STACK* give = (STACK *)malloc(sizeof(STACK)/sizeof(char)); 	//创建让车栈
	
	Init_stack(stop);   //清空栈
	Init_stack(give);
	
	char *str[] = 
	{
		"                        -----------------------------------------------\n",
		"                       |               铠源集团停车管理系统            |\n",
		"                       |                                               |\n",
		"                       |                                               |\n",
		"                       |      1:停车                 2:离车          |\n",
		"                       |                                               |\n",
		"                       |                                               |\n",
		"                       |      3:看停车情况           4:退出          |\n",
		"                       |                                               |\n",
		"                       |                                               |\n",
		"                        -----------------------------------------------\n"
	};
	while(1)
	{
		system("clear\n");
		int i;
		for(i=0;i<11;i++)
		{
			printf("%s",str[i]);
		}
		char ch;
		printf("请输出命令\n");
		scanf("%c",&ch);
		switch (ch)
		{
			case '1':
				stop_car(wait,stop);
				break;
			case '2':
				leave_car(wait,stop,give);
				break;
			case '3':
				Risplay(stop,wait);
				break;
			case '4':
				return 0;
			default :
				break;
		}
	}	
	return 0;
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值