嵌入式課程設計——學習日誌 (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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章