1. 程式人生 > >用C語言實現簡單的停車場管理

用C語言實現簡單的停車場管理

這個程式是利用棧和迴圈佇列實現的,自己得先處理好邏輯關係就好了。由於題目沒有要求,這個程式就沒加重複判斷,比如一輛車已經停在車位上或者便道上,再來一輛就判斷不了了。關於棧,就是先進後出的思想,佇列就是先進先出的思想。這個程式自己沒用鏈棧和鏈佇列做,因為感覺比較耗時。不過棧和佇列的運用大多數都是用陣列,先掌握好陣列的表示再用連結串列寫上手也很快。
專案要求:停車場是一個能放 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;
}