C語(yǔ)言實(shí)現(xiàn)停車管理系統(tǒng)
本題為大家分享了C語(yǔ)言實(shí)現(xiàn)停車管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計(jì)題目
設(shè)停車場(chǎng)是一個(gè)可以停放n輛汽車的南北方向的狹長(zhǎng)通道,且只有一個(gè)大門可供汽車進(jìn)出。汽車在停車場(chǎng)內(nèi)按車輛到達(dá)時(shí)間的先后順序,依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車停放在車場(chǎng)的最北端),若車場(chǎng)內(nèi)已停滿n輛車,那么后來的車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場(chǎng)內(nèi)某輛車要離開時(shí),在它之后進(jìn)入的車輛必須先退出車場(chǎng)為它讓路,待該輛車開出大門外,其它車輛再按原次序進(jìn)入車場(chǎng),每輛停放在車場(chǎng)的車在它離開停車場(chǎng)時(shí)必須按它停留的時(shí)間長(zhǎng)短交納費(fèi)用。試為停車場(chǎng)編制按上述要求進(jìn)行管理的模擬程序。要求程序輸出每輛車到達(dá)后的停車位置(停車場(chǎng)或便道上),以及某輛車離開停車場(chǎng)時(shí)應(yīng)繳納的費(fèi)用和它在停車場(chǎng)內(nèi)停留的時(shí)間。
需求分析
由于停車場(chǎng)只有一個(gè)大門,當(dāng)停車場(chǎng)內(nèi)某輛車要離開時(shí),在它之后進(jìn)入的車輛必須先退出車場(chǎng)為它讓路,先進(jìn)停車場(chǎng)的后退出,后進(jìn)車場(chǎng)的先退出,符合棧的“后進(jìn)先出,先進(jìn)后出”的操作特點(diǎn),因此,可以用一個(gè)棧來模擬停車場(chǎng)。而當(dāng)停車場(chǎng)滿后,繼續(xù)來到的其它車輛只能停在便道上,根據(jù)便道停車的特點(diǎn),先排隊(duì)的車輛先離開便道進(jìn)入停車場(chǎng),符合隊(duì)列的“先進(jìn)先出,后進(jìn)后出”的操作特點(diǎn),因此,可以用一個(gè)隊(duì)列來模擬便道。排在停車場(chǎng)中間的車輛可以提出離開停車場(chǎng),并且停車場(chǎng)內(nèi)在要離開的車輛之后到達(dá)的車輛都必須先離開停車場(chǎng)為它讓路,然后這些車輛依原來到達(dá)停車場(chǎng)的次序進(jìn)入停車場(chǎng),因此在前面已設(shè)的一個(gè)棧和一個(gè)隊(duì)列的基礎(chǔ)上,還需要有一個(gè)地方保存為了讓路離開停車場(chǎng)的車輛,由于先退出停車場(chǎng)的后進(jìn)入停車場(chǎng),所以很顯然保存讓路車輛的場(chǎng)地也應(yīng)該用一個(gè)棧來模擬。因此,本題求解過程中需用到兩個(gè)棧和一個(gè)隊(duì)列。棧以順序結(jié)構(gòu)實(shí)現(xiàn),隊(duì)列以鏈表結(jié)構(gòu)實(shí)現(xiàn)。
程序代碼
#include #include<stdlib.h> #include<stdio.h> #include #define MAXSIZE 5 #define price 0.01 #pragma warning(disable: 4996) using namespace std; typedef struct time { int hour; int min; }Time;/時(shí)間結(jié)點(diǎn)/ typedef struct carnews { char num[10]; Time reach; Time leave; }CarNode;/車輛信息結(jié)點(diǎn)/ typedef struct NODE { CarNode* stack[MAXSIZE + 1]; int top; //??捎玫淖畲笕萘? }SeqStackCar;/模擬停車場(chǎng)/ typedef struct car { CarNode* data; struct car* next; }QueueNode; //模擬車進(jìn)入便道,便道的車進(jìn)入停車場(chǎng) typedef struct Node { QueueNode* head; //頭指針 QueueNode* rear; //尾指針 }LinkQueueCar;/模擬便道/ void InitStack(SeqStackCar*); //創(chuàng)建空棧 int InitQueue(LinkQueueCar*); //創(chuàng)建空隊(duì)列 int Arrival(SeqStackCar*, LinkQueueCar*); //車輛到達(dá) void Leave(SeqStackCar*, SeqStackCar*, LinkQueueCar*); //車輛離開 void PRINT(CarNode*, int); //輸出離開車輛的信息清單 void List(SeqStackCar, LinkQueueCar); //對(duì)所用到的函數(shù)作提前聲明 int main() { SeqStackCar Enter, Temp; LinkQueueCar Wait; int ch; InitStack(&Enter);//初始化車站 InitStack(&Temp);//初始化讓路的臨時(shí)棧 InitQueue(&Wait);//初始化通道 while (1) { cout << "@歡迎使用本停車管理系統(tǒng)@" << endl; cout << “----------------------------------------------------------------” << endl; cout << " # # 1.車輛到達(dá) # # " << endl; cout << " # # 2.車輛離開 # # " << endl; cout << " # # 3.列表顯示 # # " << endl; cout << " # # 4.退出系統(tǒng) # # " << endl; cout << “----------------------------------------------------------------” << endl; cout << “!說明:請(qǐng)注意正確輸入時(shí)間,在輸入‘時(shí)'后,按‘ENTER'或者‘空格',再輸入‘分'。不要為非數(shù)字” << endl; cout << “請(qǐng)輸入所需要的服務(wù)!(1-4).” << endl;//進(jìn)入系統(tǒng)的目錄顯示 while (1) { cin >> ch; if (ch >= 1 && ch <= 4)break; else cout << “輸入錯(cuò)誤!請(qǐng)選擇:(1-4).” << endl; } switch (ch) { case 1:Arrival(&Enter, &Wait); break;//車輛到達(dá) case 2:Leave(&Enter, &Temp, &Wait); break;//車輛離開 case 3:List(Enter, Wait); break;//列表顯示信息 case 4:exit(0);//退出主程序 default:break; } } } void InitStack(SeqStackCar s) {//初始化棧 int i; //停車數(shù)量 s->top = 0; //棧頂元素置為0 for (i = 0; i <= MAXSIZE; i++) s->stack[s->top] = NULL; } int InitQueue(LinkQueueCar Q) {//初始化便道 Q->head = (QueueNode*)malloc(sizeof(QueueNode)); //malloc函數(shù)為動(dòng)態(tài)分配空間 if (Q->head != NULL) { Q->head->next = NULL; Q->rear = Q->head; //頭尾指針置為相等,隊(duì)列為空 return(1); } else return(-1); } int Arrival(SeqStackCar* Enter, LinkQueueCar* W) {//車輛到達(dá) CarNode* p; QueueNode* t; p = (CarNode*)malloc(sizeof(CarNode));//malloc函數(shù)為動(dòng)態(tài)分配空間 flushall();//清除所有的緩存區(qū) cout << “請(qǐng)輸入車牌號(hào)(例如:AB123):” << endl; cin >> p->num; if (Enter->top < MAXSIZE)//車場(chǎng)未滿,車進(jìn)車場(chǎng) { Enter->top++; cout << “車輛在車場(chǎng)第” << Enter->top << “位置!” << endl; cout << “請(qǐng)輸入到達(dá)時(shí)間:(小時(shí):分鐘)” << endl; cin >> p->reach.hour; while (p->reach.hour < 0 || p->reach.hour>23) {//控制時(shí)間格式正確 cout << “輸入錯(cuò)誤!” << endl; cout << “請(qǐng)重新輸入到達(dá)時(shí)間的時(shí)(0-23)!” << endl; cin >> p->reach.hour; } cin >> p->reach.min; while (p->reach.min < 0 || p->reach.min>59) {//控制分鐘格式正確 cout << “輸入錯(cuò)誤!” << endl; cout << “請(qǐng)重新輸入到達(dá)時(shí)間的分(0-59)!” << endl; cin >> p->reach.min; } Enter->stack[Enter->top] = p; return(1); } else//車場(chǎng)已滿,車進(jìn)便道 { cout << “車場(chǎng)已滿,請(qǐng)?jiān)诒愕赖却?!?<< endl; t = (QueueNode*)malloc(sizeof(QueueNode)); t->data = p; t->next = NULL; W->rear->next = t; W->rear = t; return(1); } } void Leave(SeqStackCar* Enter, SeqStackCar* Temp, LinkQueueCar* W) {//車輛離開 int room; CarNode* p; QueueNode* q; //判斷車場(chǎng)內(nèi)是否有車 if (Enter->top > 0)//有車 { while (1) {//輸入離開車輛的信息 cout << “請(qǐng)輸入車在車場(chǎng)的位置1–” << Enter->top << “:”; cin >> room; if (room >= 1 && room <= Enter->top)break; } while (Enter->top > room) {//車輛離開 Temp->top++;//臨時(shí)通道棧頂指針 Temp->stack[Temp->top] = Enter->stack[Enter->top]; Enter->stack[Enter->top] = NULL; Enter->top–; } p = Enter->stack[Enter->top]; Enter->stack[Enter->top] = NULL; Enter->top–; while (Temp->top >= 1) {//判斷臨時(shí)通道上是否有車 Enter->top++; Enter->stack[Enter->top] = Temp->stack[Temp->top]; Temp->stack[Temp->top] = NULL; Temp->top–; } PRINT(p, room); if ((W->head != W->rear) && Enter->top < MAXSIZE) {//車站是未滿 //便道的車輛進(jìn)入車場(chǎng) q = W->head->next; p = q->data;//p指向鏈隊(duì)頭 Enter->top++; cout << “便道的” << p->num << “號(hào)車進(jìn)入車場(chǎng)第” << Enter->top << “位置!” << endl; cout << “請(qǐng)輸入現(xiàn)在的時(shí)間(小時(shí):分鐘):” << endl; cin >> p->reach.hour; if (p->reach.hour < 0 || p->reach.hour>23) { cout << “輸入錯(cuò)誤!” << endl; cout << “請(qǐng)重新輸入到達(dá)時(shí)間的時(shí)(0-23):” << endl; cin >> p->reach.hour; } cin >> p->reach.min; if (p->reach.min < 0 || p->reach.min>59) { cout << “輸入錯(cuò)誤!” << endl; cout << “請(qǐng)重新輸入到達(dá)時(shí)間的分(0-59):” << endl; cin >> p->reach.min; } Enter->stack[Enter->top] = p; W->head->next = q->next; if (q == W->rear)W->rear = W->head; free(q);//釋放q地址 } else cout << “便道里沒有車!” << endl;//便道沒車 } else cout << “車場(chǎng)里沒有車!” << endl;//車場(chǎng)沒車 } void PRINT(CarNode* p, int room) {//輸出離開車輛的信息清單 int A1, A2, B1, B2; cout << “請(qǐng)輸入離開的時(shí)間:(小時(shí):分鐘)” << endl; cin >> p->leave.hour; while (p->leave.hour < 0 || p->leave.hour>23) { cout << “輸入錯(cuò)誤!” << endl; cout << “請(qǐng)重新輸入離開的時(shí)間的時(shí)(0-23):” << endl; cin >> p->leave.hour; B1 = p->leave.hour; } cin >> p->leave.min; if (p->leave.min < 0 || p->leave.min>59) { cout << “輸入錯(cuò)誤!” << endl; cout << “請(qǐng)重新輸入離開的時(shí)間的分(0-59):” << endl; cin >> p->leave.min; } cout << endl << “離開車輛的車牌號(hào)為:” << endl; puts(p->num); cout << “其到達(dá)的時(shí)間為:” << p->reach.hour << “:” << p->reach.min << endl; cout << “其離開的時(shí)間為:” << p->leave.hour << “:” << p->leave.min << endl; A1 = p->reach.hour; A2 = p->reach.min; B1 = p->leave.hour; B2 = p->leave.min; cout << “應(yīng)交費(fèi)用為:” << (((B1 - A1) * 60 + (B2 - A2)) + 1440) % 1440 * price << “元!” << endl; } void List1(SeqStackCar* S) {//列表顯示車場(chǎng)信息 cout << “您選擇的是車場(chǎng)停車情況!” << endl; int i; if (S->top > 0) {//判斷車站內(nèi)是否有車 cout << “位置 到達(dá)時(shí)間 車牌號(hào)” << endl; for (i = 1; i <= S->top; i++) { cout << " " << i << " " << S->stack[i]->reach.hour << “:” << S->stack[i]->reach.min << " " << S->stack[i]->num << endl; } } else cout << “車場(chǎng)里沒有車!” << endl; } void List2(LinkQueueCar* W) {//列表顯示便道信息 cout << “您選擇的是便道停車情況!” << endl; int j = 1; QueueNode* p; p = W->head->next; if (W->head != W->rear) {//判斷通道上是否有車 cout << “等待車輛的車牌號(hào)碼為:” << endl; while (p != NULL) { cout << j; puts(p->data->num); cout << j << " " << p->data->num << endl; p = p->next; j++; } } else cout << “便道里沒有車!”; } void List(SeqStackCar S, LinkQueueCar W) {//列表界面 int flag, tag; //列表和標(biāo)簽 flag = 1; while (flag) {//列表顯示循環(huán)控制 cout << “請(qǐng)選擇您要顯示的信息!(1-3):” << endl; cout << “#——1.車場(chǎng)——#” << endl; cout << “#——2.便道——#” << endl; cout << “#——3.返回——#” << endl; while (1) { cin >> tag; if (tag >= 1 || tag <= 3)break; else cout << “輸入錯(cuò)誤!請(qǐng)選擇(1-3):” << endl; } switch (tag) { case 1:List1(&S); break;//列表顯示車場(chǎng)信息 case 2:List2(&W); break;//列表顯示便道信息 case 3:flag = 0; break; default:break; } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易停車場(chǎng)管理系統(tǒng)
- C語(yǔ)言版停車位管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的停車場(chǎng)管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)游戲VIP停車場(chǎng)管理系統(tǒng)
- C語(yǔ)言源碼實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單停車場(chǎng)管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)
- C語(yǔ)言設(shè)計(jì)圖書登記系統(tǒng)與停車場(chǎng)管理系統(tǒng)的實(shí)例分享
相關(guān)文章
C語(yǔ)言算法金手指摩爾投票法手撕絕大多數(shù)問題
這篇文章主要為大家介紹了C語(yǔ)言算法之金手指摩爾投票法手撕絕大多數(shù)問題的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度
這篇文章主要介紹了C語(yǔ)言算法的時(shí)間復(fù)雜度和空間復(fù)雜度,算法在編寫成可執(zhí)行程序后,運(yùn)行時(shí)需要耗費(fèi)時(shí)間資源和空間(內(nèi)存)資源,更多相關(guān)需要的朋友可以參考一下2022-07-07C++類和對(duì)象之類的6個(gè)默認(rèn)成員函數(shù)詳解
類是對(duì)某一事物的抽象描述,具體地講類是C++中的一種構(gòu)造的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于C++類和對(duì)象之類的6個(gè)默認(rèn)成員函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02C語(yǔ)言手寫多級(jí)時(shí)間輪定時(shí)器
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)手寫多級(jí)時(shí)間輪定時(shí)器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09C語(yǔ)言運(yùn)算符深入探究?jī)?yōu)先級(jí)與結(jié)合性及種類
C語(yǔ)言運(yùn)算符號(hào)指的是運(yùn)算符號(hào)。C語(yǔ)言中的符號(hào)分為10類:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號(hào)運(yùn)算符、指針運(yùn)算符、求字節(jié)數(shù)運(yùn)算符和特殊運(yùn)算符2022-05-05