C語言實(shí)現(xiàn)停車管理系統(tǒng)
本題為大家分享了C語言實(shí)現(xiàn)停車管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計題目
設(shè)停車場是一個可以停放n輛汽車的南北方向的狹長通道,且只有一個大門可供汽車進(jìn)出。汽車在停車場內(nèi)按車輛到達(dá)時間的先后順序,依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車停放在車場的最北端),若車場內(nèi)已停滿n輛車,那么后來的車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當(dāng)停車場內(nèi)某輛車要離開時,在它之后進(jìn)入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其它車輛再按原次序進(jìn)入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費(fèi)用。試為停車場編制按上述要求進(jìn)行管理的模擬程序。要求程序輸出每輛車到達(dá)后的停車位置(停車場或便道上),以及某輛車離開停車場時應(yīng)繳納的費(fèi)用和它在停車場內(nèi)停留的時間。
需求分析
由于停車場只有一個大門,當(dāng)停車場內(nèi)某輛車要離開時,在它之后進(jìn)入的車輛必須先退出車場為它讓路,先進(jìn)停車場的后退出,后進(jìn)車場的先退出,符合棧的“后進(jìn)先出,先進(jìn)后出”的操作特點(diǎn),因此,可以用一個棧來模擬停車場。而當(dāng)停車場滿后,繼續(xù)來到的其它車輛只能停在便道上,根據(jù)便道停車的特點(diǎn),先排隊(duì)的車輛先離開便道進(jìn)入停車場,符合隊(duì)列的“先進(jìn)先出,后進(jìn)后出”的操作特點(diǎn),因此,可以用一個隊(duì)列來模擬便道。排在停車場中間的車輛可以提出離開停車場,并且停車場內(nèi)在要離開的車輛之后到達(dá)的車輛都必須先離開停車場為它讓路,然后這些車輛依原來到達(dá)停車場的次序進(jìn)入停車場,因此在前面已設(shè)的一個棧和一個隊(duì)列的基礎(chǔ)上,還需要有一個地方保存為了讓路離開停車場的車輛,由于先退出停車場的后進(jìn)入停車場,所以很顯然保存讓路車輛的場地也應(yīng)該用一個棧來模擬。因此,本題求解過程中需用到兩個棧和一個隊(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;/時間結(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;/模擬停車場/ typedef struct car { CarNode* data; struct car* next; }QueueNode; //模擬車進(jìn)入便道,便道的車進(jìn)入停車場 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); //對所用到的函數(shù)作提前聲明 int main() { SeqStackCar Enter, Temp; LinkQueueCar Wait; int ch; InitStack(&Enter);//初始化車站 InitStack(&Temp);//初始化讓路的臨時棧 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 << “!說明:請注意正確輸入時間,在輸入‘時'后,按‘ENTER'或者‘空格',再輸入‘分'。不要為非數(shù)字” << endl; cout << “請輸入所需要的服務(wù)!(1-4).” << endl;//進(jìn)入系統(tǒng)的目錄顯示 while (1) { cin >> ch; if (ch >= 1 && ch <= 4)break; else cout << “輸入錯誤!請選擇:(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ù)為動態(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ù)為動態(tài)分配空間 flushall();//清除所有的緩存區(qū) cout << “請輸入車牌號(例如:AB123):” << endl; cin >> p->num; if (Enter->top < MAXSIZE)//車場未滿,車進(jìn)車場 { Enter->top++; cout << “車輛在車場第” << Enter->top << “位置!” << endl; cout << “請輸入到達(dá)時間:(小時:分鐘)” << endl; cin >> p->reach.hour; while (p->reach.hour < 0 || p->reach.hour>23) {//控制時間格式正確 cout << “輸入錯誤!” << endl; cout << “請重新輸入到達(dá)時間的時(0-23)!” << endl; cin >> p->reach.hour; } cin >> p->reach.min; while (p->reach.min < 0 || p->reach.min>59) {//控制分鐘格式正確 cout << “輸入錯誤!” << endl; cout << “請重新輸入到達(dá)時間的分(0-59)!” << endl; cin >> p->reach.min; } Enter->stack[Enter->top] = p; return(1); } else//車場已滿,車進(jìn)便道 { cout << “車場已滿,請?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; //判斷車場內(nèi)是否有車 if (Enter->top > 0)//有車 { while (1) {//輸入離開車輛的信息 cout << “請輸入車在車場的位置1–” << Enter->top << “:”; cin >> room; if (room >= 1 && room <= Enter->top)break; } while (Enter->top > room) {//車輛離開 Temp->top++;//臨時通道棧頂指針 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) {//判斷臨時通道上是否有車 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)入車場 q = W->head->next; p = q->data;//p指向鏈隊(duì)頭 Enter->top++; cout << “便道的” << p->num << “號車進(jìn)入車場第” << Enter->top << “位置!” << endl; cout << “請輸入現(xiàn)在的時間(小時:分鐘):” << endl; cin >> p->reach.hour; if (p->reach.hour < 0 || p->reach.hour>23) { cout << “輸入錯誤!” << endl; cout << “請重新輸入到達(dá)時間的時(0-23):” << endl; cin >> p->reach.hour; } cin >> p->reach.min; if (p->reach.min < 0 || p->reach.min>59) { cout << “輸入錯誤!” << endl; cout << “請重新輸入到達(dá)時間的分(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 << “車場里沒有車!” << endl;//車場沒車 } void PRINT(CarNode* p, int room) {//輸出離開車輛的信息清單 int A1, A2, B1, B2; cout << “請輸入離開的時間:(小時:分鐘)” << endl; cin >> p->leave.hour; while (p->leave.hour < 0 || p->leave.hour>23) { cout << “輸入錯誤!” << endl; cout << “請重新輸入離開的時間的時(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 << “輸入錯誤!” << endl; cout << “請重新輸入離開的時間的分(0-59):” << endl; cin >> p->leave.min; } cout << endl << “離開車輛的車牌號為:” << endl; puts(p->num); cout << “其到達(dá)的時間為:” << p->reach.hour << “:” << p->reach.min << endl; cout << “其離開的時間為:” << 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) {//列表顯示車場信息 cout << “您選擇的是車場停車情況!” << endl; int i; if (S->top > 0) {//判斷車站內(nèi)是否有車 cout << “位置 到達(dá)時間 車牌號” << 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 << “車場里沒有車!” << endl; } void List2(LinkQueueCar* W) {//列表顯示便道信息 cout << “您選擇的是便道停車情況!” << endl; int j = 1; QueueNode* p; p = W->head->next; if (W->head != W->rear) {//判斷通道上是否有車 cout << “等待車輛的車牌號碼為:” << 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 << “請選擇您要顯示的信息!(1-3):” << endl; cout << “#——1.車場——#” << endl; cout << “#——2.便道——#” << endl; cout << “#——3.返回——#” << endl; while (1) { cin >> tag; if (tag >= 1 || tag <= 3)break; else cout << “輸入錯誤!請選擇(1-3):” << endl; } switch (tag) { case 1:List1(&S); break;//列表顯示車場信息 case 2:List2(&W); break;//列表顯示便道信息 case 3:flag = 0; break; default:break; } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++類和對象之類的6個默認(rèn)成員函數(shù)詳解
類是對某一事物的抽象描述,具體地講類是C++中的一種構(gòu)造的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于C++類和對象之類的6個默認(rèn)成員函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02C語言運(yùn)算符深入探究優(yōu)先級與結(jié)合性及種類
C語言運(yùn)算符號指的是運(yùn)算符號。C語言中的符號分為10類:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號運(yùn)算符、指針運(yùn)算符、求字節(jié)數(shù)運(yùn)算符和特殊運(yùn)算符2022-05-05