热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【嵌入式系统学习记录】小项目:停车场管理系统的体会

停车场项目需求问题描述:停车场是一个能放n辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门外
停车场项目需求

问题描述:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要停在门

          外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车


  要先退出,待它走后在依次进入。汽车离开时按停放时间收费。

基本功能要求:

          (1)建立三个数据结构分别是:停放栈、让路栈、等候队列。

          (2)输入数据模拟管理过程,数据(入或出,车号)

功能描述:进车登记、出车登记、按车牌号查询停车车辆信息、查询出入车记录、

          查询场内车辆信息、查询等候车辆信息、退出系统。

          (1)linux系统编写(链表、栈、队列);

          (2)进车登记:登记车牌号以及入场时间;

          (3)出车登记:计算出停车时间,记录车辆车牌;


  (4)按车牌号查询车辆信息:停车时间,是否来过停车场,是否还在停车场

          (5)查询出入记录:所有车辆,包括已经离开的

          (6)查询场内车辆信息:列出所有场内车辆信息


  (7)查询等候车辆信息:显示等候车辆数量以及所有车牌号

  (8)退出系统。

#ifndef _PARK_H
#define _PARK_H#define TRUE 10000
#define FALSE 10001#define P_MAX 3
#define W_MAX 3
#define PRICE 2struct car
{char *carnum;char *timein;char *timeout;int InsertSeconds;int total;struct car *next;
};
typedef struct car Car;struct park
{Car *top;int length;
};
typedef struct park Park;struct waitcar
{Car *front;Car *rear;int length;
};
typedef struct waitcar Wait;void Menu();
void Init(Park **p, Park **r, Wait **w, Park **h);
int EmptyStack(Park *p);
int FullStack(Park *p);
int EnterStack(Park *p, Car *c);
Car *PopStack(Park *p);
int TraverStackP(Park *p);
int TraverStackH(Park *p);
int EmptyQueue(Wait *w);
int FullQueue(Wait *w);
Car *PopQueue(Wait *w);
int TraverQueue(Wait *w);
char *now_time(void);
int Seconds();
int InsertCar(Park *p, Wait *w);
int PopCar(Park *p,Park *r, Wait *w, Park *h);
int QueryCar(Park *p, Wait *w, Park *h);
int ListAll(Park *p, Wait *w, Park *h);
#endif

#include
#include
#include
#include
#include"park.h"void Menu()
{printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~~~~~欢迎使用停车管理系统~~~~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~1、停入车辆 2、车辆离开~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~3、查询车辆信息 4、显示所有车辆~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~5、显示在场车辆 6、显示等待中的车辆~~~~~~~\n");printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~~~~~~~~7、退出系统~~~~~~~~~~~~~~~~~~~~~~~~\n");printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");}void Init(Park **p, Park **r, Wait **w, Park **h)
{(*p) = (Park *)malloc(sizeof(Park));(*r) = (Park *)malloc(sizeof(Park));(*h) = (Park *)malloc(sizeof(Park));(*w) = (Wait *)malloc(sizeof(Wait));if(NULL == (*p) || NULL == (*r) || NULL == (*w) || NULL == (*h)){printf("malloc failure!\n");}(*p) -> top = NULL;(*r) -> top = NULL;(*h) -> top = NULL;(*p) -> length = 0;(*r) -> length = 0;(*h) -> length = 0;Car *wn = (Car *)malloc(sizeof(Car));if(NULL == wn){printf("ERROR!\n");}wn -> next = NULL;(*w) -> rear = (*w) -> front = wn;(*w) -> length = 0;
}int EmptyStack(Park *p)
{if(NULL == p){return FALSE;}return(NULL == p -> top)? TRUE: FALSE;
}int FullStack(Park *p)
{if(NULL == p){return FALSE;}if(p -> length == P_MAX){return TRUE;}else{return FALSE;}
}int EnterStack(Park *p, Car *c)
{if(NULL == p){return FALSE;}Car *t = (Car *)malloc(sizeof(Car));if (NULL == t){return FALSE;}t = c;t -> next = p -> top;p -> top = t;p -> length++;
}Car *PopStack(Park *p)
{if(NULL == p){printf("ERROR\n");}Car *tmp = p -> top;p -> top = tmp -> next;p -> length--;return tmp;
}int TraverStackP(Park *p)
{if(NULL == p){return FALSE;}Car *c = p -> top;while(c){printf("车牌号%s 入场时间为%s 正在计时\n", c -> carnum, c -> timein);c = c -> next;}printf("\n");
}int TraverStackH(Park *p)
{if(NULL == p){return FALSE;}Car *c = p -> top;while(c){printf("车牌号%s 入场时间为%s 离开时间为%s 费用为%d\n", c -> carnum, c -> timein, c -> timeout, c -> total);c = c -> next;}printf("\n");
}
int EmptyQueue(Wait *w)
{if(NULL == w){return FALSE;}return(w -> length == 0)? TRUE: FALSE;}
int FullQueue(Wait *w)
{if(NULL == w){return FALSE;}if(w -> length == W_MAX){return TRUE;}else{return FALSE;}
}Car *PopQueue(Wait *w)
{if(NULL == w || w -> front == w -> rear){printf("ERROR\n");}Car *tmp = w -> front -> next;w -> front -> next = tmp -> next;if (tmp == w -> rear){w -> rear = w -> front;}return tmp;
}int TraverQueue(Wait *w)
{if(NULL == w){return FALSE;}Car *c = w -> front ->next;while(c){printf("车牌%s正在等待入栈\n", c -> carnum);c = c -> next;}printf("\n");
}char *now_time()
{time_t timep;time(&timep);return ctime(&timep);
}int Seconds()
{time_t timep;return time(&timep);
}int InsertCar(Park *p, Wait *w)
{if(NULL == p || NULL == w){printf("error!\n");}if(FullStack(p) == TRUE){if(FullQueue(w) == TRUE){printf("等候区已满!\n");}else{Car *c = (Car *)malloc(sizeof(Car));c -> carnum = (char *)malloc(sizeof(char) * 8) ;if(NULL == c){return FALSE;}printf("请输入车牌之后进入等待队列:\n");scanf("%s", c -> carnum);c -> next = NULL;w -> rear -> next = c;w -> rear = c;w -> length++;printf("已进入等待队列!\n");}printf("车库已满!\n");}else{Car *c = (Car *)malloc(sizeof(Car));c -> carnum = (char *)malloc(sizeof(char) * 8) ;c -> timein = (char *)malloc(sizeof(char) * 30) ;c -> timeout = (char *)malloc(sizeof(char) * 30) ;if(NULL == c){return FALSE;}printf("请输入车牌号:\n");scanf("%s", c -> carnum);strcpy(c -> timein, now_time());c -> InsertSeconds = Seconds();c -> total = 0;c -> next = p -> top;p -> top = c;p -> length++;printf("%s已经成功进入停车栈\n",c -> carnum);}
}int PopCar(Park *p, Park *r, Wait *w, Park *h)
{if(NULL == p || NULL == r || NULL == w || NULL == h){return FALSE;}char *goalnum = (char *)malloc(sizeof(char) * 20);printf("请输入需要离开的车牌号:\n");scanf("%s", goalnum);Car *n = p -> top;int count = 0;while(n != NULL && strcmp(goalnum, n -> carnum) != 0){count++;n = n -> next;}n = p -> top;if(count == p -> length){printf("该车辆不在停车场内!\n");}else{while(n){if(strcmp(goalnum, n -> carnum) == 0){strcpy(n -> timeout, now_time());n -> total = (Seconds() - n -> InsertSeconds) * PRICE;EnterStack(h, PopStack(p));printf("%s已经退出停车栈,费用为%d元\n", n -> carnum, n -> total);break;}EnterStack(r, PopStack(p));printf("%s已经退出停车栈,暂时进入让路栈\n",n -> carnum);n = p-> top;//关键问题!!!!!!!}while(FullStack(p) == FALSE && EmptyStack(r) == FALSE) {EnterStack(p, PopStack(r));printf("%s已经回到停车栈\n", p -> top -> carnum);if(EmptyStack(r) == TRUE){printf("让路栈已空!\n");break;}}}while( EmptyQueue(w) == FALSE && FullStack(p) == FALSE){EnterStack(p, PopQueue(w));printf("%s已经从候车队列进入停车栈!\n", p -> top -> carnum);p -> top -> timein = now_time();}
}int QueryCar(Park *p, Wait *w, Park *h)
{int flag = 0;char *goal = (char *)malloc(sizeof(char));if(NULL == p || NULL == h || NULL == w){return FALSE;}printf("请输入想要查找的车牌号:\n");scanf("%s",goal);Car *p1 = p -> top;Car *w1 = w -> front -> next;Car *h1 = h -> top;while(p1){if(strcmp(goal, p1 -> carnum) == 0){printf("车牌为%s的车辆正在计时停车,入场时间为%s\n",p1 -> carnum, p1 -> timein);flag = 1;break;}p1 = p1 -> next;}while(w1){if(strcmp(goal, w1 -> carnum) == 0){printf("车牌为%s的车辆正在等候队列\n",w1 -> carnum);flag = 1;break;}}while(h1){if(strcmp(goal, h1 -> carnum) == 0){printf("车辆%s已离开,入场时间%s,离开时间%s,计费%d元\n",h1 -> carnum, h1 -> timein, h1 -> timeout, h1 -> total);flag = 1;break;}}if(flag == 0){printf("没有找到这辆车!\n");}}int ListAll(Park *p, Wait *w, Park *h)
{if(NULL == p || NULL == w || NULL == h){return FALSE;}TraverStackP(p);TraverStackH(h);TraverQueue(w);
}


#include"park.h"
#include
#includeint main()
{system("clear");Park *park;Park *road;Wait *waitcar;Park *history;Init(&park, &road, &waitcar, &history);int choice;while(1){Menu();printf("请选择:");scanf("%d",&choice);getchar();switch(choice){case 1:InsertCar(park, waitcar);break;case 2:PopCar(park, road, waitcar, history);break;case 3:QueryCar(park, waitcar, history);break;case 4:ListAll(park, waitcar, history);break;/* case 5:ListCarIn(park);break;case 6:ListCarWait(wait);break;*/case 7:printf("欢迎下次使用!\n");sleep(1);exit(1);break;default:printf("请重新选择!\n");break;}}return 0;
}


跟通讯录相比,本人在该项目中主要通过对初始化、入栈、出栈、进队列、出队列等接口函数的调用实现了对整个停车场的管理操作。对比通讯录,在这个项目中,数据结构更加的多元化,不是单一的单向链表,而是结合了链式队列、链式栈、结构体指针等。在函数调用时,实参与形参的数量和类型都变得丰富,数据类型的一致是实现功能的关键。对于栈中top指针和队列中front和rear都有了更深入的理解。


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
author-avatar
悠闲的大黄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有