嵌入式课程设计——学习日志 (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;
}

猜你喜欢

转载自blog.csdn.net/qq_41009234/article/details/82694423