詳細代碼討論加我QQ:1271370903
程序設計課程實踐
基于C語言的停車管理系統(tǒng)編程設計
1.課程目的
本程序旨在訓練學生的C語言基本編程能力,通過串聯(lián)C語言輸入輸出、循環(huán)語句、子函數(shù)設計、數(shù)組、結構體等知識點,完成一個簡單系統(tǒng)的設計開發(fā)。
2.系統(tǒng)功能
(1)通過菜單的形式實現(xiàn)人機交互界面
(2)實現(xiàn)便道上停車信息顯示
(3)實現(xiàn)錄入進入停車場的車輛信息
(4)實現(xiàn)刪除離去停車場的車輛信息
(5)實現(xiàn)查詢指定汽車功能
(6)實現(xiàn)對車輛的停車時間計費功能
3.設計思想
(1)人機交互界面
設有一個可以停放n(n>=5)輛汽車的狹長停車場,它只有一個大門可以供車輛進出。車輛按到達停車場時間的早晚依次從停車場最里面向大門口處停放(最先到達的第一輛車放在停車場的最里面)。如果停車場已放滿n輛車,則后來的車輛只能在停車場大門外的便道上等待,一旦停車場內(nèi)有車開走,則排在便道上的第一輛車就進入停車場。停車場內(nèi)如有某輛車要開走,在他之后進入停車場的車都必須先退出停車場為它讓路,待其開出停車場后,這些車輛在依原來的次序進場。每輛車在離開停車場時,都應依據(jù)它在停車場內(nèi)停留的時間長短交費。如果停留在便道上的車 未進停車場就要離去,允許其離去,不收停車費,并且仍然保持在便道上等待的車輛的次序。編制模擬該停車場的管理的程序。
人機交互界面可以自己設計,可以加上開發(fā)者信息,體現(xiàn)每個學生的差異。
(2)停車信息顯示
設首先定義結構體要包含車輛的這些信息:車牌、進入(離開)的狀態(tài)、進入(離開)的時間,為了清晰地表示汽車的位置,結構體中還應該設置有表示位置信息的變量。
輸入1后可查看當前??康能囕v信息,輸入2后可查看便道上的停車信息。
3)錄入進入停車場的車輛信息
實現(xiàn)順序棧和鏈隊的數(shù)據(jù)結構,分析程序的結構。有車入場,停車場數(shù)據(jù)加一,若車輛已滿,將車輛信息存入便道,輸入3后可輸入車輛信息。
(4)刪除離去停車場的車輛信息
停車場車輛出場,將便道第一輛加進停車場,修改位置信息。輸入4后可刪除車輛信息。
5)實現(xiàn)查詢指定汽車功能文章來源:http://www.zghlxwxcb.cn/news/detail-501501.html
根據(jù)輸入需要查找車輛的車牌號,遍歷當前結構體數(shù)組,判斷是否含有一致車牌,若有則顯示輸出相應的車輛,否則不顯示車輛,輸入5后可查詢指定汽車。
(6)實現(xiàn)對車輛的停車時間計費功能
停車場內(nèi)的車輛離開停車場時需要根據(jù)停放時間進行計費,則需要調(diào)用<time.h>庫的函數(shù),保存車輛的進出時間,并且設立一個容易更改的停車單價,用宏定義Price,方便在頭部修改。文章來源地址http://www.zghlxwxcb.cn/news/detail-501501.html
部分詳細代碼
// 汽車信息的結構體
typedef struct{
int TimeIn; // 進入停車場時間
int TimeOut; // 離開停車場時間
char ct[50];
char Lincense[10]; // 字符類型 車牌號
}Car;
// 停放車輛的棧
typedef struct{
Car Stop[MAX_STOP]; // 用來停放車輛的棧
int top; // 標記棧頂位置
}Stopping;
// 等候隊列
typedef struct{
Car Pave[MAX_PAVE]; // 便道上的隊列
int count; // 標記隊列等候車輛個數(shù)
int front, rear; // 標記隊頭和隊尾
}Pavement;
// 用來讓路的棧
typedef struct{
Car Let[MAX_STOP]; // 用來讓路的棧
int top; // 標記棧頂位置
}Buffer;
// 用來讓路的隊列
typedef struct{
Car Wait[MAX_PAVE]; // 臨時便道的隊列
int count; // 標記隊列等候車輛個數(shù)
int front, rear; // 標記隊頭和隊尾
}Waiting;
// 聲明每個全局變量/結構體
Stopping s;
Pavement p;
Buffer b;
Car c;
Waiting w;
char C[10];
void Car_Come(); // 車輛進入函數(shù)
void Car_Leave(); // 車輛離開函數(shù)
void Stop_To_Pave(); // 當停車場滿時車輛駛入便道
void Stop_To_Buff(); // 有車輛駛出時車輛暫時駛入緩沖棧
void Leave_Pavement(); // 車輛離開便道(說明要出停車場的汽車在便道上)
void DisPlay(); // 展示停車場內(nèi)的車輛位序
void DisPlayPave(); // 展示便道上的車輛位序
void Welcome(); // 顯示菜單
void SmallWelcome();
void Car_Leave_menu();
void Search();
// 車輛進入函數(shù)
void Car_Come(){
printf("請輸入即將停車的車牌號:");
scanf("%s", &C); // 先分別在棧和隊列中檢測是否已經(jīng)停入
int i = s.top;
while(i != -1){
if(0 == strcmp(s.Stop[i].Lincense, C)){
printf("輸入有誤,此汽車已存在!\n");
return;
}
i--;
}
int k = MAX_PAVE;
while(k != 0){
if(0 == strcmp(p.Pave[k].Lincense, C)){
printf("輸入有誤,此汽車已存在!\n");
return;
}
k--;
}
if (s.top >= MAX_STOP - 1){
Stop_To_Pave(); // 當停車棧已滿,停入便道函數(shù)
}
else{
time_t t1;
long int t = time(&t1); // 記錄停入時間
char* t2; // 將當前時間轉換程字符串
t2 = ctime(&t1);
s.Stop[++s.top].TimeIn = t;
strcpy(s.Stop[s.top].ct, t2);
strcpy(s.Stop[s.top].Lincense, C); // 登記車牌號
printf("牌照為%s的汽車停入停車位的%d車位,當前時間:%s\n", C, s.top+1, t2);
}
}
// 停車場查找汽車
void Search(){
printf("請輸入要搜索的車牌號:\n");
scanf("%s", &C);
int i, j, k, flag = 0; // flag用來標記車輛位置,如果在停車場內(nèi)會置為1
time_t t1;
long int t = time(&t1);
if(s.top >= 0){
for(i = s.top; i >= 0; i--){
if(0 == strcmp(s.Stop[i].Lincense, C)){
printf("此汽車在停車場內(nèi),信息如下:\n");
printf("\t車牌號\t\t停車位序\t當前所需支付金額\t進入時間\t\n");
printf("\t%s\t第%d個\t\t%0.f元\t\t\t%s", s.Stop[i].Lincense, i+1, Price * (t - s.Stop[i].TimeIn), s.Stop[i].ct);
flag = 1;
break;
}
}
}
if(flag == 0 && p.count > 0){
i = p.front, k = 1, j = p.rear;
while(i != j ){
if(0 == strcmp(p.Pave[i].Lincense, C)){
printf("此汽車在停便道上\n");
printf("\t車牌號\t\t停車位序\n");
printf("\t%s\t第%d個",p.Pave[i].Lincense, k);
flag = 2;
break;
}
i++;
k++;
}
}
if(0 == flag)
printf("停車場內(nèi)外不存在該汽車信息!\n");
}
// 車輛離開函數(shù)
void Car_Leave(){ // 還需要加上檢測車輛是否在隊列中
printf("請輸入即將離開的車牌號:");
scanf("%s", &C);
int i, j, flag = 1, flag2 = 1;
if(s.top >= 0){ // 在停車場棧內(nèi)尋找該車牌,
for(i = s.top; i >=0; i-- ){ // 存在則flag會變?yōu)?
flag = flag * strcmp(s.Stop[i].Lincense, C);
i--;
}
}
if(0 == flag){ // 當flag == 0 汽車必在停車場棧內(nèi)
Stop_To_Buff(); // 調(diào)用緩沖棧函數(shù)
}
if(flag !=0 /*&& flag2 != 0*/) // 此情況說明汽車一定不在停車場內(nèi)外
printf("停車場內(nèi)沒有該汽車的信息!\n");
}
// 車輛離開便道(說明要出停車場的汽車在便道上)
void Leave_Pavement(){
int i, j, flag = 0;
printf("請輸入即將離開的車牌號:");
scanf("%s", &C);
if(p.count <= 0){
printf("便道上不存在汽車!\n");
return;
}
while(p.count > 0){ // 找到該車位置時退出while循環(huán)
i = p.front;
if(0 == strcmp(p.Pave[i].Lincense, C)){
break;
}
printf("牌照為%s的汽車暫時從便道進入臨時便道\n", p.Pave[p.front].Lincense);
strcpy(w.Wait[w.rear].Lincense, p.Pave[p.front].Lincense);
p.front = (p.front + 1) % MAX_PAVE; // 出p隊:隊頭指針的移動
w.rear = (w.rear + 1) % MAX_PAVE; // 入w隊:隊尾指針的移動
w.count++; // w.count + 1
p.count--; // p.count - 1
}
printf("\n牌照為%s的汽車從便道上開走,不收取任何費用!\n\n", p.Pave[i].Lincense); // 讓該車輛駛出
p.front = (p.front + 1) % MAX_PAVE;
p.count--;
while(p.count > 0){ // 讓其后的車輛繼續(xù)駛入臨時便道
printf("牌照為%s的汽車暫時從便道進入臨時便道\n", p.Pave[p.front].Lincense);
strcpy(w.Wait[w.rear].Lincense, p.Pave[p.front].Lincense);
p.front = (p.front + 1) % MAX_PAVE;
w.rear = (w.rear + 1) % MAX_PAVE;
w.count++;
p.count--;
}
while(w.count > 0){ // 將臨時便道的車輛全部駛回便道中
printf("\n牌照為%s的汽車返回便道\n",w.Wait[w.front].Lincense);
strcpy(p.Pave[p.rear].Lincense, w.Wait[w.front].Lincense);
w.front = (w.front + 1) % MAX_PAVE;
p.rear = (p.rear + 1) % MAX_PAVE;
w.count--;
p.count++;
}
}
// 車輛暫時駛入緩沖棧
void Stop_To_Buff(){
while (s.top >= 0){ // 當該車為棧頂時退出while循環(huán)
if(0 == strcmp(s.Stop[s.top].Lincense, C)){
break;
}
strcpy(b.Let[b.top++].Lincense, s.Stop[s.top].Lincense);
printf("牌照為%s的汽車暫時退出停車場\n", s.Stop[s.top--].Lincense);
}
printf("牌照為%s的汽車從停車場開走\n", s.Stop[s.top].Lincense); // 駛出該車并收費
time_t t1;
long int t = time(&t1);
s.Stop[s.top].TimeOut = t;
char* t2;
t2 = ctime(&t1);
printf("離開時間%s\n需付費%.0f元\n", t2, Price * (s.Stop[s.top].TimeOut - s.Stop[s.top].TimeIn));
s.top--;
while(b.top > 0){
strcpy(s.Stop[++s.top].Lincense, b.Let[--b.top].Lincense);
printf("牌照為%s的汽車停回停車位%d車位\n", b.Let[b.top].Lincense, s.top+1);
}
while(s.top < MAX_STOP-1){
if(0 == p.count)
break;
else{
strcpy(s.Stop[++s.top].Lincense, p.Pave[p.front].Lincense);
printf("牌照為%s的汽車從便道中進入停車位的%d車位\n", p.Pave[p.front].Lincense, s.top+1);
time_t t1;
long int t = time(&t1);
char* t2;
s.Stop[s.top].TimeIn = t;
p.front = (p.front + 1) % MAX_PAVE;
p.count--;
}
}
}
// 當停車場滿時車輛駛入便道
void Stop_To_Pave(){
if(p.count > 0 && (p.front == (p.rear + 1) % MAX_PAVE))
printf("便道已滿,請下次再來!\n");
else{
strcpy(p.Pave[p.rear].Lincense, C);
p.rear = (p.rear + 1) % MAX_PAVE;
p.count++;
printf("牌照為%s的汽車停入便道上\n", C);
}
}
// 展示停車場內(nèi)的車輛位序
void DisPlay(){
int i = s.top;
if(-1 == i)
printf("停車場目前為空\n");
time_t t1;
long int t = time(&t1);
printf("\t車牌號\t\t停放時間\t當前所需支付金額\t停放位序\n");
while(i != -1){
printf("\t%s\t%d分%d秒\t\t%.0f元\t\t\t第%d個\n", s.Stop[i].Lincense,
(t - s.Stop[i].TimeIn)/60,(t - s.Stop[i].TimeIn) % 60, Price * (t - s.Stop[i].TimeIn), i+1);
i--;
}
}
// 展示便道上的車輛位序
void DisPlayPave(){
int i = p.front;
int k = 1; // 用k模擬便道上汽車的位序 /***********/
if(0 == p.count) // 0 == p.count
printf("便道目前為空\n");
printf("\t車牌號\t\t停放位序\n");
while(i != p.rear && k <= p.count){
printf("\t%s\t第%d個\n", p.Pave[i].Lincense, k++);
i = (i + 1) % MAX_PAVE;
}
}
// 4.汽車離去子菜單
void Car_Leave_menu(){
while(1){
system("cls"); // 清屏
SmallWelcome(); // 重新顯示界面
int i, cho;
scanf("%d", &i);
if(1 == i) Car_Leave();
if(2 == i) Leave_Pavement();
if(3 == i) return;
printf("\n返回請輸入0\n");
top: // goto 標志位
scanf("%d", &cho);
if(0 == cho){
continue;
}
else{
printf("您的輸入有誤,請重新輸入\n");
goto top; // goto 到指定標志位 top
}
}
}
// 子菜單的welcome
void SmallWelcome(){
printf ("\t*******************目前停車場狀況***********************\n");
printf ("\t停車場共有%d個車位,當前停車場共有%d輛車,等候區(qū)共有%d/%d輛車\n",
MAX_STOP, s.top+1, (p.rear + MAX_PAVE - p.front) % MAX_PAVE, MAX_PAVE-1);
printf ("\t********************************************************\n");
printf ("\t---------Welcome to Ep's Car Parking next time----------\n");
printf ("\t* *\n");
printf ("\t* 1.從停車場內(nèi)駛出汽車 *\n");
printf ("\t* 2.從便道上駛出汽車 *\n");
printf ("\t* 3.退出子管理系統(tǒng) *\n");
printf ("\t*請注意:從停車場內(nèi)駛離的汽車按照%.0f元/分鐘計費 *\n",60*Price);
printf ("\t*望周知:從便道上駛離的汽車不收取費用 *\n");
printf ("\t* *\n");
printf ("\t*------------------------------------------------------*\n");
printf ("\t--------Press key(1/2/3) to continue the program--------\n");
}
void HideCursor(){
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
// 顯示菜單
void Welcome(){
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ("\t\t\t%s", asctime(timeinfo) );
HideCursor();
printf ("\t*******************目前停車場狀況***********************\n");
printf ("\t停車場共有%d個車位,當前停車場共有%d輛車,等候區(qū)共有%d/%d輛車\n",
MAX_STOP, s.top+1, (p.rear + MAX_PAVE - p.front) % MAX_PAVE, MAX_PAVE-1);
printf ("\t********************************************************\n");
printf ("\t--------------Welcome to Ep's Car Parking---------------\n");
printf ("\t* *\n");
printf ("\t* 1.停車場停車信息顯示 *\n");
printf ("\t* 2.便道上停車信息顯示 *\n");
printf ("\t* 3.汽車到達停車場操作 *\n");
printf ("\t* 4.汽車離去停車場操作 *\n");
printf ("\t* 5.查找汽車功能 *\n");
printf ("\t* 6.退出管理系統(tǒng) *\n");
printf ("\t*收費標準:本停車場按照%.0f元/分鐘計費,望周知 *\n",60*Price);
printf ("\t* *\n");
printf ("\t*------------------------------------------------------*\n");
printf ("\t---------Press key(1/2/3/4/5/6) to run program----------\n");
}
int main(){
s.top = -1;
b.top = 0;
p.rear = 0;
p.count = 0;
p.front = 0;
w.count = 0;
w.front = 0;
w.rear = 0;
while(1){
system("color 0B");
system("cls"); // 清屏
Welcome(); // 重新顯示界面
int i, cho;
scanf("%d", &i);
if(1 == i) DisPlay();
if(2 == i) DisPlayPave();
if(3 == i) Car_Come();
if(4 == i) Car_Leave_menu(); //汽車離去:停車場內(nèi)和便道上
if(5 == i) Search();
if(6 == i) {
printf("\n歡迎您再次使用本系統(tǒng)呦 ε=ε=ε=(~ ̄▽ ̄)~\n\n");
break;
}
printf("\n返回請輸入0\n");
begin: // goto 標志位
scanf("%d", &cho);
if(0 == cho){
continue;
}
else{
printf("您的輸入有誤,請重新輸入\n");
goto begin; // goto 到指定標志位 begin
}
}
return 0;
}
到了這里,關于基于C/C++語言的停車場管理系統(tǒng)編程課程設計超詳細的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!