热门标签 | 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都有了更深入的理解。


推荐阅读
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 查找最小值的操作是很简单的,只需要从根节点递归的遍历到左子树节点即可。当遍历到节点的左孩子为NULL时,则这个节点就是树的最小值。上面的树中,从根节点20开始,递归遍历左子 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
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社区 版权所有