头文件:
/****************************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;
}