C語言實(shí)現(xiàn)游戲VIP停車場管理系統(tǒng)
在數(shù)據(jù)結(jié)構(gòu)這部分學(xué)習(xí)結(jié)束后,寫一個(gè)小項(xiàng)目,我想是對這部分知識(shí)一個(gè)很好的運(yùn)用過程。
我在這介紹我寫的一個(gè)項(xiàng)目,游戲停車場(這個(gè)版本只是初級(jí)版,可以在這之上繼續(xù)添加很多其他功能,大家可以自己嘗試)。
功能要求如下:
程序如下:
/*************************************************************************** 項(xiàng)目要求 游戲VIP停車場 問題描述:停車場是一個(gè)能放10輛車的車場(鏈表實(shí)現(xiàn)), 汽車按到達(dá)的先后次序停放 在等候區(qū)。若等候區(qū)滿了(10輛車),按汽車的VIP等級(jí)(兩種排序方法),依次停入停車場 ,在停 車期間,我們可以通過汽車牌號(hào)查找汽車相關(guān)信息,并且可以隨意刪除其中一輛汽車,汽車 離開要按等候區(qū)的順序依次離開(使用隊(duì)列實(shí)現(xiàn))汽車離開時(shí)按停放時(shí)間收費(fèi)。 ***************************************************************************/ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #define LEN sizeof(struct parking) #define MAXSIZE 10 //車庫大小,可自定義大小,這里默認(rèn)為10 #define MONEY 0.002 //收費(fèi)價(jià)格,這里默認(rèn)為1分鐘,收費(fèi)0.12元 typedef struct parking { char number[10]; //車輛信息 int vip; //車輛VIP等級(jí) int time1; // 進(jìn)入停車場時(shí)間 int time2; // 離開停車場時(shí)間 int count; //標(biāo)記車輛,后面入隊(duì)時(shí)使用 struct parking*next; }car; static int n = 0; //全局變量,用于標(biāo)記車輛數(shù)目,計(jì)算車位 car c; void menu() { printf("\t==============歡迎來到中南國際停車場=============\n"); printf ("\t******************目前停車場狀況*****************\n"); printf ("\t停車場共有%d個(gè)車位,當(dāng)前停車場剩余%d車位\n", MAXSIZE,MAXSIZE - n); printf ("\t*************************************************\n"); printf("\t================1,停入車輛=======================\n"); printf("\t================2,VIP等級(jí)排序車輛================\n"); printf("\t================3,駛出所有車輛(隊(duì)列)==============\n"); printf("\t================4,查找車輛=======================\n"); printf("\t================5,遍歷停車場全部車輛信息=========\n"); printf("\t================6,駛出指定車輛===================\n"); printf("\t================7,退出===========================\n"); } struct parking *creat() //創(chuàng)建鏈表,用于存放車輛信息 { struct parking*p1,*p2,*head; head = NULL; //為方便后面排序,這里創(chuàng)建不帶頭結(jié)點(diǎn)的鏈表 int i = 1; p1=p2=(struct parking*)malloc(LEN); printf("輸入車輛VIP等級(jí):\n"); scanf("%d",&p1->vip); printf("輸入車牌號(hào):\n"); scanf("%s",p1->number); p1->count = i; time_t t1; long int t = time(&t1); // 標(biāo)記進(jìn)入停車場的時(shí)間 c.time1 = t; char* t2; t2 = ctime(&t1); // 獲取當(dāng)前時(shí)間 printf("牌照為%s的汽車停入等候區(qū)成功,當(dāng)前時(shí)間:%s\n",p1->number,t2); //顯示停車場狀況,以及停入時(shí)間 while(p1->vip != 0 && i <= 10) { //由于不帶頭結(jié)點(diǎn),這里創(chuàng)建時(shí)考慮了三種插入方法 n = n+1; if(n == 1) head = p1; else p2->next = p1; p2 = p1; p1 = (struct parking*)malloc(LEN); printf("輸入車輛VIP等級(jí):\n"); scanf("%d",&p1->vip); printf("輸入車牌號(hào):\n"); scanf("%s",p1->number); i++; p1->count = i; time_t t1; long int t = time(&t1); // 標(biāo)記進(jìn)入停車場的時(shí)間 c.time1 = t; char* t2; t2 = ctime(&t1); // 獲取當(dāng)前時(shí)間 printf("牌照為%s的汽車停入等候區(qū)成功,當(dāng)前時(shí)間:%s\n",p1->number,t2); //顯示停車場狀況,以及停入時(shí)間 } p2->next = NULL; printf("等候區(qū)以滿\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等級(jí)交換結(jié)點(diǎn)數(shù)據(jù) 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標(biāo)記為最大值 for(q = p->next;q != NULL;q = q->next) { if(p->vip < q->vip)//降序 { s = q; } if(s != p) { t = q->vip; //按VIP等級(jí)交換結(jié)點(diǎn)數(shù)據(jù) 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 //先入先出(隊(duì)列)Vip離場 { int data; struct QueueNode *next; }Queue,*QueuePtr; typedef struct { QueuePtr front,rear; //隊(duì)列指針 }LinkQueue; LinkQueue* CreateQueue(LinkQueue *Q) //創(chuàng)建隊(duì)列 { 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) //入隊(duì)操作,按鏈表中一開始車輛標(biāo)號(hào)順序 { struct parking *p; p = head; while(p!=NULL) { QueuePtr s = (QueuePtr)malloc(sizeof(Queue)); s->data = p->count; //隊(duì)列只記錄車輛一開始的標(biāo)號(hào)信息 s->next = NULL; Q->rear->next = s; Q->rear = s; p = p->next; } } struct parking Exert1(struct parking *head,int e) //按等候區(qū)順序出隊(duì)(一輛) { 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); // 標(biāo)記顯示時(shí)的時(shí)間 printf ("車牌號(hào)\tVIP等級(jí)\t\t停放時(shí)長\t當(dāng)前所需支付金額\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) //按等候區(qū)順序出隊(duì)(全部) { QueuePtr p; int i = 1; if(Q->front == Q->rear) { printf("停車場無車輛!\n"); return 0; } else { for(i;i <= 10;i++) //按等候區(qū)順序出隊(duì)(全部) { p = Q->front->next; Q->front->next = p->next; //出隊(duì)操作 if(Q->rear == p) Q->rear = Q->front; Exert1(head,i); //調(diào)用函數(shù),實(shí)現(xiàn)按等候區(qū)順序出一輛車 } } } 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) //不帶頭結(jié)點(diǎn),這里有三種刪除車輛的辨別 { 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; // 標(biāo)記離開停車場的時(shí)間 char* t2; t2 = ctime(&t1); // 獲取當(dāng)前時(shí)間 printf("離開時(shí)間%s\n需付%2.3f元\n",t2,MONEY * (c.time2 - c.time1)); //顯示停車場狀況以及駛出時(shí)間和收費(fèi)情況 } 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); // 標(biāo)記顯示時(shí)的時(shí)間 printf ("車牌號(hào)\tVIP等級(jí)\t\t停放時(shí)長\t當(dāng)前所需支付金額\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) //顯示車庫現(xiàn)有車輛 { struct parking *p; p = head; if(head != NULL) { do { time_t t1; long int t = time(&t1); // 標(biāo)記顯示時(shí)的時(shí)間 printf ("車牌號(hào)\tVIP等級(jí)\t\t停放時(shí)長\t當(dāng)前所需支付金額\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;} //創(chuàng)建鏈表,并創(chuàng)建隊(duì)列 case 2:{head = Sort(head);break;} //按vip排序 case 3:{Pop(head,Q);break;} //按等候區(qū)順序出隊(duì)(全部) case 4: { printf("請輸入查找車輛的車牌號(hào):\n"); //查找指定車輛 scanf("%s",number); find(head,number);break; } case 5:{show(head);break;} //顯示車庫現(xiàn)有車輛 case 6: { printf("請輸入要駛出車輛的車牌號(hào):\n"); //駛出指定車輛 scanf("%s",number); head = Exert(head,number);break; } default:{break;} } } }
功能的實(shí)現(xiàn),有很多方法,如果大家有自己的想法,可以評(píng)論,大家互利共進(jìn)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用c++實(shí)現(xiàn)將文本每個(gè)單詞首字母轉(zhuǎn)換為大寫
本篇文章是對用c++實(shí)現(xiàn)將文本每個(gè)單詞首字母轉(zhuǎn)換為大寫的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語言實(shí)現(xiàn)的統(tǒng)計(jì)素?cái)?shù)并求和代碼分享
這篇文章主要介紹了C語言實(shí)現(xiàn)的統(tǒng)計(jì)素?cái)?shù)并求和代碼分享,來自PAT平臺(tái)(浙江大學(xué)計(jì)算機(jī)程序設(shè)計(jì)能力考試系統(tǒng))的一個(gè)題目,需要的朋友可以參考下2014-08-08C++11右值引用和轉(zhuǎn)發(fā)型引用教程詳解
這篇文章主要介紹了C++11右值引用和轉(zhuǎn)發(fā)型引用教程詳解,需要的朋友可以參考下2018-03-03C語言 數(shù)據(jù)結(jié)構(gòu)之中序二叉樹實(shí)例詳解
這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)之中序二叉樹實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01C/C++哈希表優(yōu)化LeetCode題解997找到小鎮(zhèn)的法官
這篇文章主要為大家介紹了C/C++哈希表優(yōu)化題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C++語言基礎(chǔ) this和static關(guān)鍵字
這篇文章主要介紹了C++語言基礎(chǔ) this和static關(guān)鍵字,需要的朋友可以參考下2020-01-01