1. 程式人生 > 程式設計 >C語言實現遊戲VIP停車場管理系統

C語言實現遊戲VIP停車場管理系統

在資料結構這部分學習結束後,寫一個小專案,我想是對這部分知識一個很好的運用過程。

我在這介紹我寫的一個專案,遊戲停車場(這個版本只是初級版,可以在這之上繼續新增很多其他功能,大家可以自己嘗試)。

功能要求如下:

程式如下:

/*************************************************************************** 
專案要求 
遊戲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->number);
 i++;
 p1->count = i;
 time_t t1;
    long int t = time(&t1); // 標記進入停車場的時間
 c.time1 = t;
    char* t2;
    t2 = ctime(&t1);  // 獲取當前時間         
    printf("牌照為%s的汽車停入等候區成功,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,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->vip,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",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;}
 }
 }
}

功能的實現,有很多方法,如果大家有自己的想法,可以評論,大家互利共進。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。