游戏停车场管理系统 (c语言)

在数据结构这部分学习结束后,写一个小项目,我想是对这部分知识一个很好的运用过程。

我在这 介绍我写的一个项目,游戏停车场(这个版本只是初级版,可以在这之上继续添加很多其他功能,大家可以自己尝试)。

功能要求如下:

《游戏停车场管理系统 (c语言)》

程序如下:

/*************************************************************************** 
项目要求 
游戏VIP停车场 
问题描述:停车场是一个能放10辆车的车场(链表实现), 汽车按到达的先后次序停放
在等候区。若等候区满了(10辆车),按汽车的VIP等级(两种排序方法),依次停入停车场 ,在停
车期间,我们可以通过汽车牌号查找汽车相关信息,并且可以随意删除其中一辆汽车,汽车
离开要按等候区的顺序依次离开(使用队列实现)汽车离开时按停放时间收费。  
***************************************************************************/ 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define LEN sizeof(struct parking)											
#define  MAXSIZE 10						//车库大小,可自定义大小,这里默认为10
#define MONEY 0.002							//收费价格,这里默认为1分钟,收费0.12元

typedef struct parking
{
	char number[10];			//车辆信息
	int vip;					//车辆VIP等级
	int time1;              // 进入停车场时间
	int time2;              // 离开停车场时间
	int count;				//标记车辆,后面入队时使用
	struct parking*next;
}car;
static int n = 0;				//全局变量,用于标记车辆数目,计算车位
car c;
void menu()
{
	printf("\t==============欢迎来到中南国际停车场=============\n");
	printf ("\t******************目前停车场状况*****************\n");
	printf ("\t停车场共有%d个车位,当前停车场剩余%d车位\n", MAXSIZE,MAXSIZE - n);
	printf ("\t*************************************************\n");
	printf("\t================1,停入车辆=======================\n");
	printf("\t================2,VIP等级排序车辆================\n");
	printf("\t================3,驶出所有车辆(队列)==============\n");
	printf("\t================4,查找车辆=======================\n");
	printf("\t================5,遍历停车场全部车辆信息=========\n");
	printf("\t================6,驶出指定车辆===================\n");
	printf("\t================7,退出===========================\n");
}

struct parking *creat()										//创建链表,用于存放车辆信息
{
	struct parking*p1,*p2,*head;
	head = NULL;	//为方便后面排序,这里创建不带头结点的链表
	int i = 1;
	p1=p2=(struct parking*)malloc(LEN);
	printf("输入车辆VIP等级:\n");
	scanf("%d",&p1->vip);
	printf("输入车牌号:\n");
	scanf("%s",p1->number);
	p1->count = i;
	time_t t1;
    long int t = time(&t1);            // 标记进入停车场的时间
    c.time1 = t;
    char* t2;
    t2 = ctime(&t1);                   // 获取当前时间                  
    printf("牌照为%s的汽车停入等候区成功,当前时间:%s\n",p1->number,t2);			//显示停车场状况,以及停入时间
	while(p1->vip != 0 && i <= 10)
	{												//由于不带头结点,这里创建时考虑了三种插入方法
		n = n+1;
		if(n == 1)
			head = p1;
		else
			p2->next = p1;
		p2 = p1;
		p1 = (struct parking*)malloc(LEN);
		printf("输入车辆VIP等级:\n");
		scanf("%d",&p1->vip);
		printf("输入车牌号:\n");
		scanf("%s",p1->number);
		i++;
		p1->count = i;
		time_t t1;
        long int t = time(&t1);            // 标记进入停车场的时间
		c.time1 = t;
        char* t2;
        t2 = ctime(&t1);                   // 获取当前时间                  
        printf("牌照为%s的汽车停入等候区成功,当前时间:%s\n",p1->number,t2);			//显示停车场状况,以及停入时间
        
	}
	p2->next = NULL;
	printf("等候区以满\n");
	return head;
}
	
struct parking *Sort(struct parking *head)//链表排序,冒泡排序
{
    struct parking *p,*q,*s;
    int t,a,m;
    char arr[10];
	printf("请输入排序方式:(1:冒泡排序法 0:选择排序法)\n");
	scanf("%d",&a);
	if(a = 1)
	{
    	for(p = head;p != NULL;p = p->next)
    	{
       	 for(q = p->next;q != NULL;q = q->next)
        	{
          	  if(p->vip < q->vip)//降序
				{
                	t = q->vip;						//按VIP等级交换结点数据
					q->vip = p->vip;
					p->vip = t;
					strcpy(arr,q->number);
					strcpy(q->number,p->number);
					strcpy(p->number,arr);
					m = q->count;						
					q->count = p->count;
					p->count = m;
				}
       	 	}
    	}
		return head;  
    }
	else									//选择排序法
	{
		for(p = head;p != NULL;p = p->next)				
    	{
			s = p;					//s标记为最大值
			for(q = p->next;q != NULL;q = q->next)
        	{
			  if(p->vip < q->vip)//降序
				{
                	s = q;
				}
				if(s != p)
				{	
                	t = q->vip;				//按VIP等级交换结点数据
					q->vip = p->vip;
					p->vip = t;
					strcpy(arr,q->number);			
					strcpy(q->number,p->number);
					strcpy(p->number,arr);
					m = q->count;						
					q->count = p->count;
					p->count = m;
				}
       	 	}
    	}
		return head;
	}
}

typedef struct QueueNode				//先入先出(队列)Vip离场
{
    int data;
    struct QueueNode *next;
}Queue,*QueuePtr;

typedef struct
{
    QueuePtr front,rear;					//队列指针
}LinkQueue;

LinkQueue* CreateQueue(LinkQueue *Q)			//创建队列
{
    Q = (LinkQueue*)malloc(sizeof(LinkQueue));
    Q->front = Q->rear = (QueuePtr)malloc(sizeof(Queue));
    Q->front->next = NULL;
    return Q;
}

void Push(struct parking *head,LinkQueue* Q)			//入队操作,按链表中一开始车辆标号顺序
{
    struct parking *p;
	p = head;
    while(p!=NULL)
    {
        QueuePtr s = (QueuePtr)malloc(sizeof(Queue));
        s->data = p->count;								//队列只记录车辆一开始的标号信息
        s->next = NULL;
        Q->rear->next = s;
        Q->rear = s;
        p = p->next;									
    }
}

struct parking Exert1(struct parking *head,int e)				//按等候区顺序出队(一辆)
{
    struct parking *p;
    p = head;
    while(p != NULL && p->count != e)
    {
        p = p->next;
    }
    if(p->count == e)
    {
        time_t t1;
		long int t = time(&t1);             // 标记显示时的时间
		printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n");  //打印查到的车辆信息    
		printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p->number,p->vip,t - c.time1, MONEY * (t - c.time1));
    }
}
int Pop(struct parking *head,LinkQueue *Q)				//按等候区顺序出队(全部)
{
    QueuePtr p;
    int i = 1;
    if(Q->front == Q->rear)
    {
        printf("停车场无车辆!\n");
        return 0;
    }
    else
    {
       for(i;i <= 10;i++)						//按等候区顺序出队(全部)
       	{	
        	p = Q->front->next;
        	Q->front->next = p->next;				//出队操作
        	if(Q->rear == p)  
            	Q->rear = Q->front;
       	 Exert1(head,i);				//调用函数,实现按等候区顺序出一辆车
       	 }
    }
}



struct parking *Exert(struct parking *head,char number[10])					//驶出指定车辆
{	
	struct parking *p1,*p2;
	p1 = head;
	p2 = p1;
	while(p1->next !=NULL && strcmp(p1->number,number) != 0)
	{
		p2=p1;
		p1=p1->next;		
	}
	if(strcmp(p1->number,number) == 0)					//不带头结点,这里有三种删除车辆的辨别
	{
		if(p1 == head)
		{
			head = head->next;						//头,中间,尾,三种删除方式
			printf("驶出车辆成功\n");
			n--;
		}
		else
		{
			p2->next = p1->next;
			printf("驶出车辆成功\n");
			n--;
		}
		time_t t1;      
		long int t = time(&t1);                
		c.time2 = t;                        // 标记离开停车场的时间
		char* t2;
		t2 = ctime(&t1);                   // 获取当前时间
		printf("离开时间%s\n需付%2.3f元\n",t2,MONEY * (c.time2 - c.time1));		//显示停车场状况以及驶出时间和收费情况
	}
	else
	{
		printf("停车场没此车辆!\n");
	}
	free(p1);
	return head;
}

struct parking *find(struct parking *head,char number[20])					//查找指定车辆
{
	struct parking *p1;
	p1 = head;
	while(p1->next != NULL && strcmp(p1->number,number)!=0)
	{
		p1 = p1->next;	
	}
	if(strcmp(p1->number,number)==0)					//打印查到的车辆信息
	{
		printf("查找成功,车辆信息如下:\n");
		time_t t1;
		long int t = time(&t1);             // 标记显示时的时间
		printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n");  //打印查到的车辆信息    
		printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p1->number,p1->vip,t - c.time1, MONEY * (t - c.time1));
	}
	else
		printf("停车场没此车辆!\n");	
}
	
void show(struct parking *head)						//显示车库现有车辆
{
	struct parking *p;
	p = head;
	if(head != NULL)
	{
		do
			{
				time_t t1;
				long int t = time(&t1);             // 标记显示时的时间
				printf ("车牌号\tVIP等级\t\t停放时长\t当前所需支付金额\n");  //打印查到的车辆信息    
				printf ("%s\t%d\t\t%d秒\t\t%2.3f元\n",p->number,p->vip,t - c.time1, MONEY * (t - c.time1));
				p = p->next;
			}while(p != NULL);
	}	
	else
	printf("停车场无车辆!\n");
}

int main()
{
	int n = 1;
	int i;
	struct parking *head;				//初始化链表
	LinkQueue q;
	LinkQueue* Q = &q;
	Q = CreateQueue(Q);
	char number[10];						
	while(n)
	{
		system("clear");
		menu();
		printf("请输入你的骚操作:\n");
		scanf("%d",&i);
		switch(i)
		{
			case 1:{head = creat();Push(head,Q);break;}		//创建链表,并创建队列
			case 2:{head = Sort(head);break;}					//按vip排序
			case 3:{Pop(head,Q);break;}							//按等候区顺序出队(全部)
			case 4:
			{
				printf("请输入查找车辆的车牌号:\n");				//查找指定车辆
				scanf("%s",number);
				find(head,number);break;
			}
			case 5:{show(head);break;}							//显示车库现有车辆
			case 6:
			{ 
				printf("请输入要驶出车辆的车牌号:\n");				//驶出指定车辆
				scanf("%s",number);
				head = Exert(head,number);break; 
			}
			default:{break;}
		}
	}
}

功能的实现,有很多方法,如果大家有自己的想法,可以评论,大家互利共进。

    原文作者:停车场模拟问题
    原文地址: https://blog.csdn.net/MyFamily_IT/article/details/79166631
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞