Linux小项目:停车场的实现。

头文件:

/****************************wddv587*************************************
FileName: 停车场/parking.h  Verson: 1.0   Date: 2018.0814     
Description: 停车场程序头文件定义。
Verson: 1.0
Author: 吴叫兽
*/

#ifndef _PARKING_H
#define _PARKING_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NONE                 "\e[0m"
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"

#define SUCCESS    10000
#define FAILURE    10001
#define TRUE       10002
#define FALSE      10003

#define SIZE   3      //栈的容量


struct num
{
	long time1;
	long time2;
	char *timer[SIZE];	
	char a[20];
};

typedef struct num Car;



struct stack
{
	int top;            //栈顶元素的位置(栈顶指针)
	Car *data;          //各辆车的信息
	
	/*char *a[SIZE];
	int in[SIZE];
	int out[SIZE];*/
};

typedef struct stack Stack;

struct queue
{
	Car data[SIZE];
	int front;            //队头指针(下标)
	int rear;             //队尾指针
};
typedef struct queue Queue;

struct all
{
	long time;
	char *timer_in[50];
	char *timer_out[50];
	char a[20];
};

typedef struct all A;

struct allstack
{
	int top;
	A *data;
};

typedef struct allstack New;


int StackInit(Stack **s);
void push(Stack *s, Queue *q);
void traverse(Stack *s);
void outcar(Stack *s1, Stack *s2, Queue *q, New *n);
int pop(Stack *s);
void seekqueue(Queue q);
int InitQueue(Queue *q);
int EnterQueue(Queue *q, char str[20]);
void welcome();
void menu();
void seekstack(Stack *s);
void traverseNew(New *n, Stack *s);
int Allstackinit(New **s);
int StackClear(Stack *s);
int StackDestroy(Stack **s);
int DeleteQueue(Queue *q);
int ClearQueue(Queue *q);

#endif

功能子函数:

/****************************wddv587*************************************
FileName: 停车场/parking.c  Verson: 1.0   Date: 2018.0814     
Description: 停车场程序功能函数,实现不同功能。
Verson: 1.0
Author: 吴叫兽
*/

#include "parking.h"

int StackInit(Stack **s)   //对栈初始化
{
	int i;
	(*s) = (Stack *)malloc(sizeof(Stack) * 1);   //分配一个结构体,用于保存栈的信息 
	
	//判断是否申请空间成功
	if(NULL == (*s))
	{
		printf("申请空间失败!\n");
		sleep(2);
		return FAILURE;
	}
	(*s)->top = -1;     //空栈,栈顶为-1
	(*s)->data = (Car *)malloc(sizeof(Car) * SIZE);  //为栈分配空间
	
	//判断是否申请空间成功
	if (NULL == (*s)->data)
	{	
		printf("申请空间失败!\n");
		sleep(2);
		return FAILURE;
	}
	

	for(i = 0; i < SIZE; i++)
	{
		(*s)->data[i].timer[i] = malloc(sizeof(char) * 64);//为存放车牌号的字符指针数组分配空间
		
		//判断是否申请空间成功
		if((*s)->data[i].timer[i] == NULL)
		{
			printf("申请空间失败!\n");
			sleep(1);
			return FAILURE;
		}
	}
	
	return SUCCESS;
}

int Allstackinit(New **s) //用于对存放从停车场离开的车辆信息的栈初始化
{
	int i;
	(*s) = (New *)malloc(sizeof(New) * 1);   
	
	//判断是否申请空间成功
	if(NULL == (*s))
	{
		printf("申请空间失败!\n");
		sleep(1);
		return FAILURE;
	}
	(*s)->top = -1;     //空栈,栈顶为-1
	(*s)->data = (A *)malloc(sizeof(A) * 20);  
	
	//判断是否申请空间成功
	if (NULL == (*s)->data)
	{
		printf("申请空间失败!\n");
		sleep(1);
		return FAILURE;
	}
	

	for(i = 0; i < 50; i++)
	{
		(*s)->data[i].timer_in[i] = malloc(sizeof(char) * 64);
		(*s)->data[i].timer_out[i] = malloc(sizeof(char) * 64);
		
		//判断是否申请空间成功,这里任何一个申请失败都是返回错误
		if((*s)->data[i].timer_in[i] == NULL || (*s)->data[i].timer_out[i] == NULL)
		{
			printf("申请空间失败!\n");
			sleep(1);
			return FAILURE;
		}
	}
	
	return SUCCESS;
	
}


void push(Stack *s, Queue *q)  //该函数是对进入停车场的车辆操作
{
	time_t t;
	char str[20] = {0};
	if (NULL == s || q == NULL)  //入参判断
	{
		printf("程序运行出错!\n");
		return;
	}
	
	char flag = 'y';  //flag的作用是重复进车
	while(flag == 'y')
	{	printf("请输入您的车牌号:\n");
		scanf("%s", str);
		
		if(s->top == SIZE - 1)   //判断停车场是否已满
		{
			printf("停车场已满!即将进入等候区。。。\n");
			sleep(1);
			/*xxxxxxxxx*/
			EnterQueue(q, str);  //若是满了的话,就进去等候队列
			return;
		}
		
		
		strcpy(s->data[s->top + 1].a, str);     //停车场没有满,正常进栈
		t = time(NULL);
		s->data[s->top + 1].time1 = time(&t);
		strcpy(s->data[s->top + 1].timer[s->top + 1], ctime(&t));
		printf("车    牌:%s\n停车时间:%s\n", str, s->data[s->top + 1].timer[s->top + 1]);
		s->top++;
		
		printf("您还有车吗,是否继续入库, y or n ?\n");
		
		getchar();
		scanf("%c", &flag);
	}
}


void traverse(Stack *s)  //通过下标副本实现对停车场栈的遍历(栈是没有遍历的,只能一个一个出一个一个读取)
{
	if(NULL == s) //入参判断
	{
		printf("程序运行出错!\n");
		return;
		
	}
	
	if(s->top == -1) //判断停车场是否为空
	{
		printf("停车场是空的!\n");
		return;
	}
	int lp = -1;
	printf("停车场内信息如下:\n");
	time_t t;
	long tmp, tmp1;
	tmp = time(&t);
	while(lp != s->top)  //这里定义一个时间变量,可以求出目前挺溜的时间
	{
		lp++;
		
		tmp1 = tmp - s->data[lp].time1;
		
		printf("车 牌 号:%s\n", s->data[lp].a);
		printf("停车时间:%s\n", s->data[lp].timer[lp]);
		printf("已 停 留:%d\n", tmp1);
		
	}
	sleep(1);
}

void outcar(Stack *s1, Stack *s2, Queue *q, New *n) //这个函数是最长的,不过应该还能看懂
{
	if(NULL == s1 || NULL == s2)//入参判断
	{
		printf("run error !\n");
		sleep(1);
		return;
	}
	
	if(s1->top == -1)  //判断停车场是否为空,若为空则不用出车
	{
		printf("empty!\n");
		sleep(1);
		return;
	}
	
	char str[20] = {0};
	printf("请选择你要卖掉的车的车牌号:\n");
	scanf("%s", str);
	
	while(strcmp(s1->data[s1->top].a, str) != 0)  //该步骤是从stack1顶端元素开始判断,车辆是否是想要出去的那辆,若不是,则出栈,进入stack2里
	{
		strcpy(s2->data[s2->top + 1].a, s1->data[s1->top].a);     //进栈stack2
		s2->top++;
		
		pop(s1);	
		
		if(s1->top == -1)
		{
			printf("停车场内没有这辆车!\n");
			sleep(2);
			return;
			
		}
	}
	//下面进行的就是将出去的车辆信息保存在第四个栈里面
	long tmp_time;
	time_t t;
	
	s1->data[s1->top].time2 = time(&t);
	
	strcpy(n->data[n->top + 1].timer_in[n->top + 1], s1->data[s1->top].timer[s1->top]);//进车时间
	strcpy(n->data[n->top + 1].a, str);//车牌号写入第四个栈
	
	strcpy(s1->data[s1->top].timer[s1->top], ctime(&t));//车辆离开时间覆盖写入stack1
	
	strcpy(n->data[n->top + 1].timer_out[n->top + 1], ctime(&t));//车辆离开时间写入第四个栈
	
	tmp_time = s1->data[s1->top].time2 - s1->data[s1->top].time1;//计算这辆车停放的时间
	
	n->data[n->top + 1].time = tmp_time;//把停留时间也写入第四个栈里
	
	n->top++;
	
	
	printf("车    牌:%s\n出车时间:%s\n停留时间:%d\n", s1->data[s1->top].a, s1->data[s1->top].timer[s1->top], tmp_time);
	
	
	pop(s1);
	sleep(1);
	
	while(s2->top != -1) //把让路栈全部写入stack1
	{
		strcpy(s1->data[s1->top + 1].a, s2->data[s2->top].a);     
		s1->top++;
		s2->top--;	
	}
	
	if(q->front != q->rear)//此时若等候区有车,则默认将第一辆车进入stack1
	{
		printf("停车场内已有位置,等候区第一辆车即将进入停车场。。。\n");
		strcpy(s1->data[s1->top + 1].a, q->data[q->front].a);
		time_t t;
		s1->data[s1->top + 1].time1 = time(&t);
		strcpy(s1->data[s1->top + 1].timer[s1->top + 1], ctime(&t));
		printf("车    牌:%s\n停车时间:%s\n", s1->data[s1->top + 1].a, s1->data[s1->top + 1].timer[s1->top + 1]);
		s1->top++;
		q->front = (q->front + 1) % SIZE;
		sleep(1);
	}
}

void traverseNew(New *n, Stack *s) //遍历第四个栈
{	
	if(NULL == n || NULL == s)
	{
		printf("run error!\n");
		sleep(1);
		return;
	}

	if(n->top == -1)
	{
		printf("目前没有车出过停车场!\n");
	}
	else
	{
		int lp = -1;
		printf("之前来过的车辆信息如下:\n");
		while(lp != n->top)
		{	lp++;
			printf("车 牌 号:%s\n", n->data[lp].a);
			printf("停车时间:%s\n", n->data[lp].timer_in[lp]);
			printf("出车时间:%s\n", n->data[lp].timer_out[lp]);
		}
	}
	
	printf("目前停车场内车辆信息如下:\n");
	
	if(s->top == -1)
	{
		printf("停车场是空的!\n");
	}
	else
	{
		int lpp = -1;
		printf("停车场内信息如下:\n");
		time_t t;
		long tmp, tmp1;
		tmp = time(&t);
		while(lpp != s->top)
		{
			lpp++;
		
			tmp1 = tmp - s->data[lpp].time1;
			
			printf("车 牌 号:%s\n", s->data[lpp].a);
			printf("停车时间:%s\n", s->data[lpp].timer[lpp]);
			printf("已 停 留:%d\n", tmp1);	
		}
	}
	
	sleep(3);
}

void seekstack(Stack *s)
{
	if (NULL == s)  //入参判断
	{
		printf("程序运行出错!\n");
		return;
	}
	
	int lp = s->top;
	char str[20];
	printf("请输入想要查询的车牌号:\n");
	scanf("%s", str);
	while(lp != -1)
	{
		if(strcmp(s->data[lp].a, str) == 0)
		{
			time_t t;
			long tmp;
			tmp = time(&t) - s->data[lp].time1;
			printf("车 牌 号:%s\n", s->data[lp].a);
			printf("停车时间:%s\n", s->data[lp].timer[lp]);
			printf("停留时间:%d\n", tmp);
			sleep(2);
			break;
		}
		lp--;
	}
	
	if(lp == -1)
	{
		printf("停车场内没有这辆车!\n");
		sleep(1);
	}
}


int pop(Stack *s)
{
	if (s->top == -1)
	{
		return FAILURE;
	}
	s->top--;

	return SUCCESS;
}


void seekqueue(Queue q)
{ 
	if (q.rear == q.front)
	{
		printf("queue is empty!\n");
		sleep(2);
		return;
	}
	printf("等候区信息如下:\n");
	while(q.front != q.rear)
	{
		printf("%s\n", q.data[q.front].a);
		q.front = (q.front + 1) % SIZE;
	}
	sleep(3);
}
int StackClear(Stack *s)
{
	if (NULL == s)
	{
		return FAILURE;
	}

	s->top = -1;

	return SUCCESS;
}

int StackDestroy(Stack **s)
{
	if (s == NULL || *s == NULL)
	{
		return FAILURE;
	}

	free((*s)->data);
	free(*s);
	(*s) = NULL;

	return SUCCESS;
}


//队列功能子函数
int InitQueue(Queue *q)
{
	if (NULL == q)
	{
		return FAILURE;
	}

	q->rear = q->front = 0;   //初始化空队

	return SUCCESS;
}



int EnterQueue(Queue *q, char str[20])
{
	if (NULL == q)
	{
		return FAILURE;
	}

	if ((q->rear + 1) % SIZE == q->front)   //队满
	{
		printf("等候区已满!请去秦鹏的停车场。。。\n");
		sleep(2);
		return FAILURE;
	}

	strcpy(q->data[q->rear].a, str);
	q->rear = (q->rear + 1) % SIZE;

	return SUCCESS;
}


int DeleteQueue(Queue *q)
{
	if (NULL == q)
	{
		return FAILURE;
	}
	if (q->rear == q->front)
	{
		return FAILURE;
	}

	q->front = (q->front + 1) % SIZE;

	return SUCCESS;
}

int ClearQueue(Queue *q)
{
	if (NULL == q)
	{
		return FAILURE;
	}

	q->front = q->rear;

	return SUCCESS;
}


//炫酷的进入界面
void welcome()
{
	system("clear");
	printf(YELLOW"wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 \n"NONE);
	printf("\n\n\n\n\n\n\n\n\n");
	printf(L_PURPLE"                  接\n"NONE);
	printf(L_BLACK"                  下\n"NONE);
	printf(L_BLUE"                  来\n"NONE);
	printf(L_GREEN"                  你\n"NONE);
	printf(L_CYAN"                  所\n"NONE);
	printf(PURPLE"                  见\n"NONE);
	printf(YELLOW"                  的\n"NONE);
	printf(BLUE"                  是\n"NONE);
	printf("\n\n\n\n\n\n");
	printf(YELLOW"wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 \n"NONE);
	sleep(3);
	
	system("clear");
	printf(YELLOW"wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 \n"NONE);
	printf("\n\n\n\n\n\n\n\n\n");
	printf(L_PURPLE"                  \n"NONE);
	printf("\033[41;32m                       吴叫兽的停车场!\033[0m\n");
	printf("\033[31;5m                       吴叫兽的停车场!\033[0m\n");
	printf("\033[41;32m                       吴叫兽的停车场!\033[0m\n");
	printf("\n\n\n\n\n\n\n\n\n\n");
	printf(YELLOW"wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 wddv587 \n"NONE);
	sleep(3);
	
	system("clear");

	printf(YELLOW"\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"NONE);
	printf(L_BLUE"**________**________**_______**____\n"NONE);
	printf(L_PURPLE"\n     欢迎来到吴叫兽的停车场!\n"NONE);
	printf(L_BLUE"**________**________**_______**____\n"NONE);
	printf(YELLOW"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"NONE);
	
	sleep(1);
}

void menu()
{
	system("clear");
	
	printf(GREEN"\n\n\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\n"NONE);
	printf(BLUE"        1、停车登记               2、出车登记\n"NONE);
	printf(PURPLE"        3、查询车辆信息           4、查询出入记录\n"NONE);
	printf(L_GREEN"        5、查询场内车辆信息       6、查询等候车辆信息\n"NONE);
	printf(L_BLUE"        7、退出系统\n"NONE);
	printf(GREEN"\n******************************************************************\n\n\n"NONE);
}

主函数:

/****************************wddv587*************************************
FileName: 停车场/car.c  Verson: 1.0   Date: 2018.0814     
Description: 停车场程序主函数,用户可以选择相应的功能
Verson: 1.0
Author: 吴叫兽
*/
#include <stdio.h>
#include "parking.h"

int main()
{
	int ret, i, choice;
	
	//定义两个栈,stack1是停车栈,stack2是让路栈
	Stack *stack1, *stack2;
	
	ret = StackInit(&stack1);   //stack是野指针,要修改stack的值(地址)
	if (ret == SUCCESS)
	{
		printf("Init Sequence Stack1 Success!\n");
	}
	else
	{
		printf("Faliure!\n");
		exit(0);
	}
	
	ret = StackInit(&stack2);//同理
	if (ret == SUCCESS)
	{
		printf("Init Sequence Stack1 Success!\n");
	}
	else
	{
		printf("Faliure!\n");
		exit(0);
	}
	
	Queue queue;   //定义一个车辆等候队列,先到先出,进入停车场

	ret = InitQueue(&queue);//同理
	if (ret == SUCCESS)
	{
		printf("Init Success!\n");
	}
	else
	{
		printf("Init Failure!\n");
		exit(0);
	}
	
	New *new;
	ret = Allstackinit(&new);//这边定义的是另外一个栈,它的功能是存放从停车场出来的车辆信息
	if (ret == SUCCESS)
	{
		printf("Init Success!\n");
	}
	else
	{
		printf("Init Failure!\n");
		exit(0);
	}
	system("clear");
	printf(YELLOW"\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"NONE);
	printf(L_BLUE"**________**________**_______**____\n"NONE);
	printf(L_PURPLE"\n初始化成功!即将进入系统服务。。。\n"NONE);
	printf(L_BLUE"**________**________**_______**____\n"NONE);
	printf(YELLOW"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"NONE);
	sleep(1);
	
	welcome();

	
	while(1)
	{
		menu();

		printf("请输入功能选项:\n");
		printf("Please input:\n");

		scanf("%d", &choice);

		switch(choice)
		{
			case 1:
				push(stack1, &queue);
				break;
			case 2:
				outcar(stack1, stack2, &queue, new);
				break;
			case 3:
				seekstack(stack1);
				break;
			case 4:
				traverseNew(new, stack1);
				break;
			case 5:
				traverse(stack1);
				break;
			case 6:
				seekqueue(queue);
				break;
			case 7:
				StackClear(stack1);
				StackClear(stack1);
				StackDestroy(&stack1);
				StackDestroy(&stack2);
				printf("龙卷风摧毁停车场!\n");
				DeleteQueue(&queue);
				ClearQueue(&queue);
				printf("老板有钱啊,这么多车,下次还来呀! bye bye ~~\n");
				sleep(1);
				system("clear");
				float y;
				float x;
				float z;
				float f;
				for ( y = 1.5f; y > -1.5f; y -= 0.1f) 
				{
					for ( x = -1.5f; x < 1.5f; x += 0.05f)
					{
						z = x * x + y * y - 1;
						f = z * z * z - x * x * y * y * y;
						putchar(f <= 0.0f ? ".:-=+*#%@"[(int)(f * -8.0f)] : ' ');
					}
					putchar('\n');
				}
				sleep(1);
				exit(0);
		
		}
	}
	
	
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42720703/article/details/81674873