用C語言實現簡單的停車場管理
阿新 • • 發佈:2019-02-08
這個程式是利用棧和迴圈佇列實現的,自己得先處理好邏輯關係就好了。由於題目沒有要求,這個程式就沒加重複判斷,比如一輛車已經停在車位上或者便道上,再來一輛就判斷不了了。關於棧,就是先進後出的思想,佇列就是先進先出的思想。這個程式自己沒用鏈棧和鏈佇列做,因為感覺比較耗時。不過棧和佇列的運用大多數都是用陣列,先掌握好陣列的表示再用連結串列寫上手也很快。
專案要求:停車場是一個能放 n 輛車的狹長通道,只有一個大門,汽車按到達的先後次序停放。若車場滿了,車要在門外的便道上等候,一旦有車走,則便道上第一輛車進入。當停車場中的車離開時,由於通道窄,在它後面的車要先退出,待它走後依次進入。汽車離開時按停放時間收費。
基本功能要求:
1)建立三個資料結構分別是:停放佇列,讓路棧,等候佇列
2)輸入資料模擬管理過程,資料(入或出,車號)。
標頭檔案: PLot.h
#ifndef __PLOT_H__
#define __PLOT_H__
#define FALSE 0
#define TRUE 1
#define MONEY 1 // 單價可以自己定義
#define MAX_STOP 10
#define MAX_PAVE 100
// 存放汽車牌號
typedef struct
{
int time1; // 進入停車場時間
int time2; // 離開停車場時間
char plate[10];
// 汽車牌照號碼,定義一個字元指標型別
}Car;
// 停放棧
typedef struct
{
Car Stop[MAX_STOP-1]; // 各汽車資訊的儲存空間
int top; // 用來指示棧頂位置的靜態指標
}Stopping;
// 等候佇列
typedef struct
{
int count; // 用來指示隊中的資料個數
Car Pave[MAX_PAVE-1]; // 各汽車資訊的儲存空間
int front, rear; // 用來指示隊頭和隊尾位置的靜態指標
}Pavement;
// 讓路棧
typedef struct
{
Car Help[MAX_STOP-1]; // 各汽車資訊的儲存空間
int top; // 用來指示棧頂位置的靜態指標
}Buffer;
Stopping s;
Pavement p;
Buffer b;
Car c;
char C[10];
void stop_pave (); // 車停入便道
void car_come (); // 車停入停車位
void stop_to_buff (); // 車進入讓路棧
void car_leave (); // 車離開
void welcome (); // 主介面函式
void Display (); // 顯示車輛資訊
#endif
原始檔 PLot.c
#include "PLot.h"
#include <stdio.h>
#include <time.h> // 包含時間函式的標頭檔案
#include <string.h>
#include <stdlib.h>
void stop_to_pave() // 車停入便道
{
// 判斷隊滿
if (p.count > 0 && (p.front == (p.rear + 1) % MAX_PAVE))
{
printf ("便道已滿,請下次再來\n");
}
else
{
strcpy(p.Pave[p.rear].plate, C);
p.rear = (p.rear + 1) % MAX_PAVE; // 隊尾指示器加1
p.count++; // 計數器加1
printf ("牌照為%s的汽車停入便道上的%d的位置\n", C, p.rear - 1);
}
}
void car_come() // 車停入停車位
{
printf ("請輸入即將停車的車牌號:"); // 輸入車牌號
scanf ("%s", &C);
if (s.top >= MAX_STOP - 1) // 如果停車位已滿,停入便道
{
stop_to_pave(); // 停車位->便道 函式
}
else
{
s.top++; // 停車位棧頂指標加1
time_t t1;
long int t = time (&t1); // 標記進入停車場的時間
char* t2;
t2 = ctime (&t1); // 獲取當前時間
c.time1 = t;
strcpy(s.Stop[s.top].plate, C); // 將車牌號登記
printf ("牌照為%s的汽車停入停車位的%d車位, 當前時間:%s\n", C, s.top + 1, t2);
}
return ;
}
void stop_to_buff() // 車進入讓路棧
{
// 停車位棧壓入臨時棧,為需要出棧的車輛讓出道
while (s.top >= 0)
{
if (0 == strcmp(s.Stop[s.top--].plate, C))
{
break;
}
// 讓出的車進入讓路棧
strcpy(b.Help[b.top++].plate, s.Stop[s.top + 1].plate);
printf ("牌照為%s的汽車暫時退出停車位\n", s.Stop[s.top + 1].plate);
}
b.top --;
// 如果停車位中的車都讓了道,說明停車位中無車輛需要出行
if (s.top < 0)
{
printf ("停車位上無此車訊息\n");
}
else
{
printf ("牌照為%s的汽車從停車場開走\n", s.Stop[s.top + 1].plate);
}
// 將讓路棧中的車輛資訊壓入停車位棧
while (b.top >= 0)
{
strcpy(s.Stop[++s.top].plate, b.Help[b.top--].plate);
printf ("牌照為%s的汽車停回停車位%d車位\n", b.Help[b.top + 1].plate, s.top + 1);
}
// 從便道中 -> 停車位
while (s.top < MAX_STOP-1)
{
if (0 == p.count) // 判斷佇列是否為空
{
break;
}
// 不為空,將便道中優先順序高的車停入停車位
else
{
strcpy(s.Stop[++s.top].plate, p.Pave[p.front].plate);
printf ("牌照為%s的汽車從便道中進入停車位的%d車位\n", p.Pave[p.front].plate, s.top+1);
p.front = (p.front + 1) % MAX_PAVE;
p.count--;
}
}
}
void car_leave() // 車離開
{
printf ("請輸入即將離開的車牌號:\n");
scanf ("%s", &C);
if (s.top < 0) // 判斷停車位是否有車輛資訊
{
printf ("車位已空,無車輛資訊!\n");
}
else
{
stop_to_buff();
}
time_t t1;
long int t = time (&t1);
c.time2 = t; // 標記離開停車場的時間
char* t2;
t2 = ctime (&t1); // 獲取當前時間
printf ("離開時間%s\n需付%ld元\n", t2, MONEY * (c.time2 - c.time1) / 10);
}
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\t當前所需支付金額\n");
while (i != -1)
{
printf ("\t%s\t\t%d秒\t\t\t%d元\n", s.Stop[i].plate, t - c.time1, MONEY * (t - c.time1) / 10);
i--;
}
}
void welcome()
{
printf ("\t*******************目前停車場狀況***********************\n");
printf ("\t停車場共有%d個車位,當前停車場共有%d輛車,等候區共有%d輛車\n", MAX_STOP, s.top+1, (p.rear + MAX_PAVE - p.front)
% MAX_PAVE);
printf ("\t********************************************************\n");
printf ("\t---------------Welcome to our Car Parking---------------\n");
printf ("\t* 1.Parking *\n");
printf ("\t* 2.leaving *\n");
printf ("\t* 3.situation *\n");
printf ("\t* 4.exit *\n");
printf ("\t--------------------------------------------------------\n");
}
主函式 main.c
/**********************************************************
問題描述:停車場是一個能放 n 輛車的狹長通道,只有一個大門,
汽車按到達的先後次序停放。若車場滿了,車要在門外的便道上等候
,一旦有車走,則便道上第一輛車進入。當停車場中的車離開時,由
於通道窄,在它後面的車要先退出,待它走後依次進入。汽車離開
時按停放時間收費。
基本功能要求:
1)建立三個資料結構分別是:停放佇列,讓路棧,等候佇列
2)輸入資料模擬管理過程,資料(入或出,車號)。
***********************************************************/
#include "PLot.h"
int main()
{
// 初始化
s.top = -1;
b.top = 0;
p.rear = 0;
p.count = 0;
p.front = 0;
while(1)
{
system("clear");
welcome();
int i, cho;
scanf ("%d", &i);
if (1 == i) car_come();
if (2 == i) car_leave();
if (3 == i) Display();
if (4 == i) break;
printf ("返回請輸入1\n");
scanf ("%d", &cho);
if (1 == cho)
{
continue;
}
else
{
printf ("您的輸入有誤,請重新輸入\n");
scanf ("%d", &cho);
continue;
}
}
return 0;
}