1. 程式人生 > >嵌入式課程設計——學習日誌 (4)

嵌入式課程設計——學習日誌 (4)

姓名: 張春林
日期: 2018-9-13

一.今日任務
用c語言的棧和佇列的知識編寫出具有定時功能停車場的程式。
1.車輛出棧
2.出去的車進來
3.等候佇列進來。
停車場的初步設計分為:停車棧,讓路棧,等候車棧,等候車棧是鏈式儲存 。
這裡寫圖片描述

二.今日任務完成情況
今日任務按計劃順利完成,上課程式碼除錯全部正常執行,完成課後程式的編寫。今日程式碼量:500。

三.今日開發中出現的問題彙總
發現把之前知識一起拿出來使用時不熟練,還有一些地方有BUG,慢慢除錯後正常執行。

四.今日未解決問題
今天老師講的非常好,解決了我心中的許多疑問,但還是有一個小BUG無法解決。

五.今日開發收穫
今天的收貨主要是之前幾天學習到的相關知識的一個總結或者說是複習,學會了如何將他們混為一起去開發一個小專案,經過這些天的練習,相信通過後期勤加練習,一定能進步不少。

六.自我評價
今天開發了一個停車場專案,當自己編完整個專案的時候,感到很有成就感,雖然過程中有很些錯誤,通過自己的能力都及時解決了問題。我會在日後的學習中努力練習,希望以後能夠更加出色!

七.相關程式碼
park.h

#ifndef PARK_H
#define PARK_H
#include <time.h>
#include <string.h>

#define MAXSIZE 5
//標誌位 #define SUCCESS 1000 //成功 #define FAILURE 1001 //失敗 #define FULL 1002 //已滿 struct carinfo //車輛資訊 { char number[10]; //車牌號 time_t park_time; //進場時間 struct carinfo *next; //指向下一輛車 }; typedef struct carinfo car; //給struct carinfo取個car別名
struct stackinfo //順序棧 { car data[MAXSIZE]; //結構體陣列 int top; //棧頂指標 }; typedef struct stackinfo stack; //給struct stackinfo取個stack別名 struct queueinfo //等候佇列 { car *front; //隊頭指標 car *rear; //隊尾指標 }; typedef struct queueinfo queue; //給struct queueinfo取個queue別名 void welcome(); //程式啟動提示資訊 void menu(); //選項選單 void bye(); //退出程式 void Init(stack *s1, stack *s2, queue *q); //初始化函式 int InitStack(stack *s); //棧的初始化 int InitQueue(queue *q); //初始化佇列 void EnterPark(stack *s, queue *q); //停車函式 int push(stack *s, char *id); //進棧操作 int EnterQueue(queue *q, char *id); //進隊操作 void ShowParkInfo(stack *s); //檢視場內車輛資訊函式 int EmptyQueue(queue *q); //判斷佇列是否為空 void ShowWaitInfo(queue *q); //檢視等候車輛資訊 void LeavePark(stack *s1, stack *s2, queue *q);//出車 car pop(stack *s); //出棧操作 int EmptyStack(stack *s); //判斷棧是否為空 char *DelQueue(queue *q); //出隊操作,返回車牌號 #endif

park.c

#include "park.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void welcome()                      //程式啟動提示資訊
{
    system("clear");                    //清屏
    printf("\n\n\n");
    printf("\t\t\t*******************************\n");
    printf("\t\t\t************WELCOME************\n");
    printf("\t\t\t*******************************\n");

    sleep(2);                       //睡眠兩秒
}

void menu()                         //選項選單
{
    system("clear");
    printf("\n\n\n");
    printf("\t\t1、停車\n");
    printf("\t\t2、出車\n");
    printf("\t\t3、檢視場內車輛資訊\n");
    printf("\t\t4、檢視等候車輛資訊\n");
    printf("\t\t5、退出系統\n");
    printf("請輸入你的選擇:");
}

void bye()                          //退出程式
{
    system("clear");                    //清屏

    printf("\n\n\n\n\n\t\t\tbyebye...\n");
    sleep(1);                       //睡眠1妙
    system("clear");                    //清屏
    exit(1);                        //退出程式
}

void Init(stack *s1, stack *s2, queue *q)
{
    int ret;

    ret = InitStack(s1);                    //初始化停車棧
    if (FAILURE == ret)
    {
        printf("Init Stack Failure!\n");
    }

    ret = InitStack(s2);                    //初始化讓路棧
    if (FAILURE == ret)
    {
        printf("Init Stack Failure!\n");
    }

    ret = InitQueue(q);                 //初始化等候佇列
    if (FAILURE == ret)
    {
        printf("Init Queue Failure!\n");
    }
}

void EnterPark(stack *s, queue *q)              //停車函式
{
    char id[10] = {0};
    if (NULL == s || NULL == q)
    {
        return;
    }

    printf("請輸入車牌號:");
    scanf("%s", id);

    int ret = push(s, id);              //進棧操作
    if (ret == FAILURE)
    {
        printf("進場失敗!\n");
    }
    else if (ret == FULL)
    {
        printf("停車場已滿,進入等待佇列!\n");
        sleep(1);
        EnterQueue(q, id);              //把車放在等候佇列
    }
    else
    {
        printf("停車成功!\n");
        sleep(1);
    }
}

void ShowParkInfo(stack *s)                 //檢視場內車輛資訊函式
{
    int i;                          //迴圈變數
    if (NULL == s)                  //入參判斷
    {
        return;
    }
    for (i = 0; i <= s->top; i++)           //依次列印車輛資訊
    {
        printf("車牌號:%s\n", s->data[i].number);
        printf("停車時長:%d\n",(int)(time(NULL) - s->data[i].park_time));

        printf("*******\n");
    }
    printf("Press Enter Continue...\n");
    getchar();
    getchar();
}

void ShowWaitInfo(queue *q)                 //檢視等候車輛資訊
{
    if (NULL == q)                  //入參判斷
    {
        return;
    }

    if (EmptyQueue(q) == SUCCESS)           //等候佇列為空
    {
        printf("等候佇列沒有車輛\n");
        sleep(1);                   //睡眠一秒
    }
    else
    {
        car *p = q->front->next;            //指向第一輛車

        while (p)                   //逐個遍歷
        {
            printf("車牌號:%s\n",p->number);
            p = p->next;                //指標p指向下一輛車
        }
        printf("Press Enter Continue...\n");
        getchar();
        getchar();
    }
}

void LeavePark(stack *s1, stack *s2, queue *q)      //出車
{
    char id[10] = {0};
    int i,length;
    if (NULL == s1 || NULL == s2 || NULL == q)      //入參判斷
    {
        return;
    }
    printf("請輸入車牌號:");
    scanf("%s",id);

    length = s1->top;
    for (i = 0; i <= length; i++)
    {
        if (!strcmp(id, s1->data[s1->top].number))  //匹配到車牌號碼
        {
            pop(s1);                //匹配到的車輛出棧

            while (EmptyStack(s2) != SUCCESS)   //讓路棧不為空車輛就要出來
            {
                car c = pop(s2);        //從讓路棧出來
                push(s1, c.number);     //進入停車棧
            }

            if (EmptyQueue(q) != SUCCESS)   //如果等候佇列不為空,則第一輛車進棧
            {
                char *id = DelQueue(q);
                push(s1, id);
                free(id);
            }
            break;
        }
        else                        //沒匹配到
        {
            car c = pop(s1);            //不匹配則出棧並且進入讓路棧
            push(s2, c.number);     

        }

    }

    if (i > length)
    {
        while (EmptyStack(s2) != SUCCESS)   //車輛回到停車棧
        {
            car c =pop(s2);                 //從讓路棧出來
            push(s1, c.number);             //進入停車棧

        }
        printf("沒有該車!\n");

    }
    else
        printf("出車成功!\n");
    sleep(1);

}

stack.c

#include "park.h"
#include <string.h>

int InitStack(stack *s)             //棧的初始化
{
    if (NULL == s)              //入參判斷
    {
        return FAILURE;
    }
    s->top = -1;

    return SUCCESS;
}

int push(stack *s, char *id)                //進棧操作
{
    if (NULL == s)              //入參判斷
    {
        return FAILURE;
    }

    if (s->top == MAXSIZE - 1)          //判斷已滿
    {
        return FULL;
    }

    strcpy(s->data[s->top + 1].number, id); //拷貝車牌號
    s->data[s->top + 1].park_time = time(NULL); //記錄進場時間
    s->top++;                   //棧頂指標加一
    return SUCCESS;
}

car pop(stack *s)                   //出棧操作
{
    car c;
    if (NULL == s)              //入參判斷
    {
        return c;
    }

    if(s->top == -1)
    {
        return c;
    }


    strcpy(c.number, s->data[s->top].number);   //複製
    c.park_time = s->data[s->top].park_time;

    s->top--;
    return c;
}

int EmptyStack(stack *s)                //判斷棧是否為空
{
    if (NULL == s)              //如參判斷
    {
        return FAILURE;
    }

    return (s->top == -1) ? SUCCESS : FAILURE;

}

queue.c

#include "park.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int InitQueue(queue *q)         //初始化佇列
{
    if (NULL == q)          //入參判斷
    {
        return FAILURE;
    }

    car *p = (car *)malloc(sizeof(car));
    if (NULL == p)          //返回值判斷
    {
        return FAILURE;
    }
    p->next = NULL;
    q->front = q->rear = p;

    return SUCCESS;
}

int EnterQueue(queue *q, char *id)      //進隊操作
{
    if (NULL == q || NULL == id)        //入參判斷
    {
        return FAILURE;
    }

    car *p = (car *)malloc(sizeof(car));

    if (NULL == p)          //入參判斷
    {
        return FAILURE;
    }

    strcpy(p->number, id);

    p->next = NULL;
    q->rear->next = p;
    q->rear = p;

    return SUCCESS;

}

int EmptyQueue(queue *q)            //判斷佇列是否為空
{
    if (NULL == q)          //入參判斷
    {
        return FAILURE;
    }
    return (q->front == q->rear) ? SUCCESS:FAILURE;
}

char *DelQueue(queue *q)            //出隊操作,返回車牌號
{


    if (NULL == q)
    {
        return NULL;
    }
    char *id = (char *)malloc(sizeof(char) * 10);
    car *c = q->front->next;

    if(c != NULL)
    {
        strcpy(id, c->number);  //儲存車牌號
        q->front->next = c->next;
        free(c);
    }
    if (c == q->rear)           //如果佇列只剩一輛車
    {
        q->rear = q->front;
    }
    return id;
}

main.c

#include "park.h"
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
    int num;
    char choice[20] = {0};
    stack park_stack;                               //停車棧
    stack leave_stack;                              //讓路棧
    queue wait_queue;                               //等候佇列
    welcome();                                  //程式啟動提示資訊

    Init(&park_stack, &leave_stack, &wait_queue);               //初始化函式



    while (1)
    {   
        menu();                             //選項選單
        scanf("%s",choice);

        num = strlen(choice);


        if (num == 1)
        {
            switch(choice[0])
            {
                case '1':
                    EnterPark(&park_stack, &wait_queue);        //停車
                    break;
                case '2':
                    LeavePark(&park_stack, &leave_stack, &wait_queue);  //出車
                    break;
                case '3':
                    ShowParkInfo(&park_stack);              //檢視場內車輛資訊
                    break;
                case '4':
                    ShowWaitInfo(&wait_queue);              //檢視等候車輛資訊
                    break;
                case '5':
                    bye();                          //退出程式
                    break;
                default:
                    printf("輸入有誤\n");
sleep(1);
                    break;
            }
        }
        else
        {
            printf("輸入有誤,請重新輸入!\n");
            sleep(1);
        }
    }

    return 0;
}