当前位置 主页 > 网站技术 > 代码类 >

    C语言实现游戏VIP停车场管理系统

    栏目:代码类 时间:2019-12-27 21:07

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

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

    功能要求如下:

    程序如下:

    /*************************************************************************** 
    项目要求 
    游戏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;}
     }
     }
    }