第一篇:停车场管理系统销售员摸底考试
潍 坊 恒 盛 智 能 控 制 科 技 有 限 公 司
停车场管理系统销售人员培训
摸底考试(含参考答案)
1、标准软件最多支持几路图像对比(选择题)
A:2路B:4路C:6路D:8路
2、无电脑模式下,P001可以脱机发卡吗?
A:是B:否
3、一体机可以装吐卡机临时收费吗?
不可以4、9021控制板是IC/ID互读的吗?
不是,P001是
5、车辆检测器的作用有那些?
防砸车,车过自动落杆
6、蓝牙远距离系统的优势,适用范围。
优势:
1、读卡距离为1—30米,可以在较远的距离内读到卡片信息,挡车杆自动感应升起,不需要停车就可以经过系统验证,实现车辆通过并收费;
2、拥有完善的管理中心软件,能够进行财务管理,可查询打印详细信息,并进行收费,方便管理;
3、能够对车牌号进出图像对比,提高停车场安全系数,大大增强停车场的防盗措施;
4、在没有剩余车位(满位)时会提示已满位,并且禁止读卡,即车辆不能入内;
5、支持脱机运行功能;
适用范围:商业大厦、住宅小区、花园别墅停车场、高速路口、军队、物流管理、医院、党政机关、弯道、上下坡道地下车库出入口
7、一套简易的蓝牙,出口和入口不在一起,相隔100米,基本配置有哪些? 普通蓝牙设备的接线说明。
入口:一个道闸,一个车辆检测器,一个地感线圈,一个蓝牙主机,一个蓝牙立柱,一个9021控制板
入口出口一样
接线说明:读卡器——控制板(9021)——道闸
8、有商住两用地下停车场一个,两个口均可进出,客户想要标准收费系统,临时车收费、长期用户用远距离,图像对比功能,配置清单。
入口*2:一个道闸,两个车辆检测器,两个地感线圈,一个LED,一个P001,一个语音模块,读卡器(一个IC,一个蓝牙),一个24V/3A的电源,一个12V/3A的电源,一个吐卡机,一个蓝牙立柱
出口*2:一个道闸,两个车辆检测器,两个地感线圈,一个LED,一个P001,一个语音模块,读卡器(一个IC,一个蓝牙),一个12V/3A的电源,一个蓝牙立柱 管理中心:一台电脑,一个485转换器,一个视频采集卡,一个加密狗,一套管理软件,四个摄像头
9.同行做停车场系统的知道哪些?(选答)
全国:捷顺、富士、红门
济南:蓝鹏
潍坊:昌通
第二篇:停车场收费管理系统
大手控制 www.xiexiebang.com |引|领|停|车|管|理|新|概|念|
停车场收费管理系统
停车场收费管理系统是指基于现代化电子与信息技术,在停车区域的出入口处安装自动识别装置,通过非接触式卡或车牌识别来对出入此区域的车辆实施判断识别、准入/拒绝、引导、记录、收费、放行等智能管理,其目的是有效的控制车辆与人员的出入,记录所有详细资料并自动计算收费额度,实现对场内车辆与收费的安全管理。
出入口处安装自动识别装置,通过非接触式卡或车牌识别来对出入此区域的车辆实施判断识别、准入/拒绝、引导、记录、收费、放行等智能管理,其目的是有效的控制车辆与人员的出入,记录所有详细资料并自动计算收费额度,实现对场内车辆与收费的安全管理。停车场收费管理系统集感应式智能卡技术、计算机网络、视频监控、图像识别与处理及自动控制技术于一体,对停车场内的车辆进行自动化管理,包括车辆身份判断、出入控制、车牌自动识别、车位检索、车位引导、会车提醒、图像显示、车型校对、时间计算、费用收取及核查、语音对讲、自动取(收)卡等系列科学、有效的操作。这些功能可根据用户需要和现场实际灵活删减或增加,形成不同规模与级别的豪华型、标准型、节约型停车场收费管理系统。
停车场收费管理系统的组成
1、入口部分:
入口部分主要由入口票箱(内含感应式ID卡读写器、自动出卡机、车辆感应器、语音提示系统、语音对讲系统)、自动路闸、车辆检测线圈、入口摄像系统等组成。
2、出口部分:
出口部分主要由出口票箱(内含感应式ID卡读写器、自动吞卡机、语音提示系统、语音对讲系统)、自动路闸、车辆检测线圈、出口摄像系统等组成。
3、收费控制处:
收费控制处设备由收费控制电脑、UPS,报表打印机、操作台、入口手动按
大手控制 www.xiexiebang.com |引|领|停|车|管|理|新|概|念|
钮、出口手动按钮、语音提示系统、语音对讲系统组成[2]。
主要设备
停车场收费管理系统配置包括停车场控制器(也叫停车场出入口控制器)、自动吐卡机、远程遥控、远距离卡读感器、感应卡(有源卡和无源卡)、自动道闸、车辆感应器、压力波检测器、地感线圈、通讯适配器、摄像机、传输设备、停车场系统管理软件等。
这种系统有助于公司企业、政府机关等对于内部车辆和外来车辆的进出进行现代化的管理,对加强企业的管理力度和提高公司的形象有较大的帮助。
控制器介绍
停车场专用控制器:专为停车场系统自主研制,四层板设计,信号和电源分层走线,集成度高、可靠性强,功能全面,接口丰富,电压适应范围大,防脉冲冲击,确保使用的安全性和可靠性。
停车场收费管理系统设立在小区内,有若干入口和出口。所有出入口都要求联网,实现数据通讯,并采用统一的计算机管理。最远的出入口之间的距离约为800米,和两个办公楼的地下室设有一个出入口,整个停车场采用IC卡和视频图像管理。
停车场收费管理系统流程
车辆感应IC卡,可以存储持卡人的各种信息。感应IC卡安装在每辆车的驾驶室里面,当车驶过读感器的感应区(离读感器2米左右)时,感应IC卡通过读感器发过来的激发信号产生回应信号发回给读感器。读感器再将这个读取信号传递给停车场控制器,停车场控制器收到信息后,经自动核对为有效卡后,车闸自动开启,数字录像机开始录像,拍下该车进入时的照片,电脑记录车子牌号及驾驶员姓名和进出入的信息。
临时车收费功能,临时车进场时从出票机中领取临时卡,出场时需缴纳规定的费用,并经保安确认后方能离开。临时车进入停车场时,地感线圈自动检测到车辆的到来,自动出票机的中文电子显示屏上显示“欢迎光临,请取卡”。根据出票机上的提示,司机按“入口自动出票机”上的出票按钮,自动出票机将自己
大手控制 www.xiexiebang.com |引|领|停|车|管|理|新|概|念|
吐出一张感应IC卡,并且读卡器已自动读完临时卡。道闸开启,MP4NET数字录像机启动拍照功能,控制器记录下该车进入时间。临时车驶出停车场时,司机将感应IC卡(临时卡)在出口票箱处的感应区一晃,停车场控制自动检测出是临时卡,道闸将不会自动开启。出口票箱的中文电子显示屏上显示“请交**元”,司机将卡还给保安,交完费后,保安将各市停车特用发票给司机。交完费后,经保安载收费电脑上确认,道闸开启,数字录像机启动拍照功能,照片存入电脑硬盘,控制器记录下该出场时间。临时车将实行按次和时间停车交费,交费条件由用户自己在电脑的管理软件中设置。
大手控制 www.xiexiebang.com |引|领|停|车|管|理|新|概|念|
停车场收费管理系统功能
可选用读感距离和近距离两种形式,选远距离时,采用车载 有源卡最远可达到3-25米。可以根据用户实际需要进行选择。
图像对比功能:车辆进出停车场时,摄像机自动启动摄像功能,并将照片文件存储在电脑里。出场时,电脑自动将新照片和该车最后入场的照片进行对比,监控人员能实时监视车辆的安全情况。
常用卡管理:固定车主使用常用卡,确定有效期限(可精确到分、秒),在确认的时限内可随意进出车场,否则不能进入车场,常用卡资料包括卡号、车号、有效时间等。常用卡实行按月交费,到期后软件和中文电子显示屏上将提示该卡已到期,请办理续期和交款手续。
临时车收费功能,临时车进场时从出票机中领取临时卡,出场时需缴纳规定的费用,并经保安确认后方能离开。临时车进入停车场时,地感线圈自动检测到车辆的到来,自动出票机的中文电子显示屏上显示“欢迎光临,请取卡”。根据出票机上的提示,司机按“入口自动出票机”上的出票按钮,自动出票机将自己吐出一张感应IC卡,并且读卡器已自动读完临时卡。道闸开启,摄像机启动拍照功能,控制器记录下该车进入时间。临时车驶出停车场时,司机将感应IC卡(临时卡)在出口票箱处的感应区一晃,停车场控制自动检测出是临时卡,道闸将不会自动开启。出口票箱的中文电子显示屏上显示“请交**元”,司机将卡还给保安,交完费后,保安将各市停车特用发票给司机。交完费后,经保安载收费电脑上确认,道闸开启,MP4NET数字录像机启动拍照功能,照片存入电脑硬盘,控制器记录下该出场时间。临时车将实行按次和时间停车交费,交费条件由用户自己在电脑的管理软件中设置。
自动切换视频,进出场无冲突。所有摄入的车辆照片文件存在电脑的硬盘中,可备以后查证。每一幅图片都有时间记录,查验方便。
实时监视功能:无车进入时,可在监控电脑上实时监视进出口的车辆及一切事物的活动情况。
支持永久卡和临时卡的工作方式,自动识别,记录存储。
防砸车功能:当车辆处于道闸的正下方时,地感线圈检测到车辆存在,道闸
大手控制 www.xiexiebang.com |引|领|停|车|管|理|新|概|念|
将不会落下,直至车辆全部驶离其正下方。
满位检测功能:在管理电脑中设置好该停车场的车位,如进入该停车场的车辆到达车位数时,电脑提醒管理员,并在电子显示屏上显示车位已满。
支持脱机运行,网络中断或PC故障时,停车场系统工作正常。手动控制功能,停电时道闸能正常使用。系统自动维护,数据自动更新,自动检测复位。
停车场控制器支持局域网网络通讯功能,可实现多个出入口的联网。出入口联网时,必须安装局域网网络服务器和通讯服务器。
支持Wiegand26、Wiegand27、Wiegand32读感器格式,自动检测输入。支持5000个用户,可编辑用户详细信息。各种事件查询功能,提供摄像的图片时间查询。
强大的报表功能,能生成各类报表,并提供多功能数据检索。具有延时、过压、欠压自动保护。
停车场收费管理系统应用
随着科技的进步和人类文明的发展停车场无论是从外形、功能、操作方面都有跨越式的改进,国内目前最薄的停车场收费管理系统达到令人惊讶的170MM的厚度,而且配备双发卡模式和双倍卡量来降低故障率。
智能停车场收费管理系统在住宅小区、大厦、机关单位的应用越来越普遍。而人们对停车场管理的要求也越来越高,智能化程度也越来越高,使用更加方便快捷,也给人类的生活带来了方便和快乐。不仅提高了现代人类的工作效率,也大大的节约了人力物力,降低了公司的运营成本,并使得整个管理系统安全可靠。包括车辆人员身份识别、车辆资料管理、车辆的出入情况、位置跟踪和收费的管理等等。
停车场收费管理系统发展
前些年,我国停车场智能管理技术还是一片空白,也谈不上技术理念。为了摆脱这种现状,有关部门采取了相应的措施,制定了长远的发展规划,为我国停
大手控制 www.xiexiebang.com |引|领|停|车|管|理|新|概|念|
车场收费管理系统奠定了坚实的基础,技术获得较快发展。
目前,随着新的智能化停车管理技术不断发展,停车场管理正在向更开放、更灵活的方向发展。今后,车库系统将作为楼宇自控系统的一个子系统纳入建筑自动化网络,形成一个综合的计算机管理网络信息系统。远距离的管理人员可以通过联网的方式,直接监视与控制车库情况;停车场的信息也可通过网络传送到各部门,再由中心计算机对各部门的信息统一管理,形成决策支持信息系统,确保管理人员做出正确的决策。
停车场收费管理系统的一个主流技术是采用感应式IC/ID卡和图像识别作为管理手段,同时具有红外遥感控车门开关和防盗报警及倒车限位等功能。这套系统是伴随着ID/IC卡、近距RF射频识别卡、远距离RF射频识别卡等新型识别技术的兴起而发展起来的。它克服了磁卡及条码技术的缺点,具有寿命长、使用方便、不易损坏、高保密性等特点,使停车场智能管理上升到一个新的高度。
感应式ID/IC卡加图像识别的管理技术,支持远距离和近距离两种读感器,支持永久卡和临时卡的工作方式,具有自动识别、记录存储等功能,能够防止资金流失。由于这项技术是图形对比与ID卡配合使用,达到防盗车的目的。
此外,目前业内还有一种主流技术:非接触RFID卡识别技术。它继承了IC/ID卡技术的优点,保密性高,省去了刷卡过程,提高了识别速度。由于该技术在识别系统中不存在活动机械装置,杜绝了塞卡现象,提高了系统的可靠性。对于收费停车场而言,识别系统的可靠性就意味着停车场的可靠性。因此,只读式RFID非接触识别卡成为停车场收费管理系统中理想的识别技术。
停车场收费系统是小区建设的必然趋势
随着社会的进步和科学技术的迅猛发展,社会生活方式在不断变化,人类开始迈入以数字化、网络化为平台的智能化社会。人们追求人性化、智能化的生活条件。其中正在兴起的智能化小区,反映和适应了社会信息化和智能化的要求,是21世纪住宅的发展方向。
智能化小区为住户提供了一种更加安全、舒适、方便、快捷和开放的智能化、信息化的生活空间,同时,它依靠高科技,实现了回归自然的环境氛围,促进了
大手控制 www.xiexiebang.com |引|领|停|车|管|理|新|概|念|
优秀的人文环境发展,并依托先进的科学技术,实现小区物业运行的高效化、节能化、环保化。
根据这一发展形势,建设部1999年发布了《全国住宅小区智能化技术示范工程工作大纲》。目前,建设部正组织实施全国住宅小区智能化示范工程,根据建设部规定,将智能建筑分为三个层次:即普及型住宅小区、先进型住宅小区与领先型住宅小区。三个层次都将一卡通管理系统作为大纲的基本要求,如今一卡通系统已成为楼市经营的必备内容和重要卖点,而智能停车场收费管理系统又是一卡通管理系统的重要组成部分,是智能小区建设的必然。
智能停车场收费管理系统采用先进技术和高度自动化的机电设备,将机械、电子计算机和自控设备以及智能IC卡技术有机地结合起来,通过电脑管理可实现车辆出入控制管理、自动数据存储等功能,实现自动化运行,并提供—种高效管理服务的系统。非接触式IC卡是智能IC卡技术中应用最广的一种。非接触式IC卡停车场收费管理系统是目前较先进的电脑收费管理系统之一,具有方便快捷、收费准确可靠、保密性好、灵敏度高、使用寿命长、形式灵活、功能强大等众多优点,是磁卡、接触式IC卡所不能比拟的,它已取代磁卡、接触式IC卡而成为应用的主流。文章来源自:www.xiexiebang.com
第三篇:《停车场管理系统》实验设计报告
重庆邮电大学计算机科学与技术学院
《数据结构》实验设计报告
题目:停车场管理系统 姓名:** 学号: 2010211998 班级:0491002 学院:计算机科学与技术学院
重庆邮电大学计算机科学与技术学院
目录
一、问题描述………………………………………………………03
二、问题分析………………………………………………………03
三、数据结构描述…………………………………………………04
四、算法设计………………………………………………………04
五、程序优缺点分析及优化………………………………………05
六、程序源代码……………………………………………………07
七、程序运行结果…………………………………………………13
八、心得体会………………………………………………………15 附
一、优化后的程序…………………………………………………16 附
二、优化后程序的运行结果………………………………………23
重庆邮电大学计算机科学与技术学院
一、问题描述
设计一个停车场管理系统。
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。【基本要求】
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车‚到达‛或‚离去‛信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。【选作内容】
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则他们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
(3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
二、问题分析
该问题需要以栈和队列作为基本的存储结构,以顺序栈模拟停车场,以链队列模拟车场外的便道。汽车进入停车场,即是在顺序栈上执行进栈操作,退出停车场即是在顺序栈上执行出栈操作;汽车进入便道,即是在链队列上执行入队操作,退出便道即是在链队列上执行出队操作。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。设要删除的元素在顺序表St中位置为i,则从i到top之间的全部元素进入到一个临时栈St1中, 其次再删除该元素,然后将临栈St1的元素按照‚先进后出‛的原则重新回到St中。若链队不空,则使队头进栈St,并以当前时刻开始计费。
程序需要构造两个顺序栈St和St1,其中St用于模拟停车场,St1用作临时栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。此外还需要构
重庆邮电大学计算机科学与技术学院
造一个链队列Qu用于模拟便道。
三、数据结构描述
/*定义顺序栈类型*/ typedefstruct { intCarNo[N];
/*车牌号*/ intCarTime[N];
/*进场时间*/ int top;
/*栈指针*/ } SqStack;
/*定义顺序栈类型*/
/*定义链队类型*/ typedefstructqnode { intCarNo;
/*车牌号*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*队首和队尾指针*/ QNode *rear;} LiQueue;
四、算法设计
1.对于子函数模块,则调用顺序栈的基本操作和链队列的基本操作。如下:
/*顺序栈的基本运算算法*/ voidInitStack(SqStack *&s)
intStackEmpty(SqStack *s)
intStackFull(SqStack *s)
/*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2)
重庆邮电大学计算机科学与技术学院
/*删除S的栈顶元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2)
voidDispStack(SqStack *s)
/*以下为链队列的基本运算算法*/ voidInitQueue(LiQueue *&q)
intQueueLength(LiQueue *q)
intQueueEmpty(LiQueue *q)
voidenQueue(LiQueue *&q, int e)} intdeQueue(LiQueue *&q,int&e)
voidDisplayQueue(LiQueue *q)
2.主程序模块 void main(){ 初始化; do { 接受命令;
处理命令;
} while(命令!=‛退出‛); }
五、程序优缺点分析及优化
1.程序的优点
在程序中设置了kind变量,用于保存车的类别,便于计算不同类别车的停车费用,如下程序段:
printf(“n请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);scanf(“%d”,&kind);
其中kind可取值1,2,3;若kind取2,则表示一辆客车单位时间内的停车费用
重庆邮电大学计算机科学与技术学院
是一辆小汽车的2倍,若kind取3,则表示一辆卡车单位时间内的停车费用是一辆小汽车的3倍。
当然printf(“n请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);中的1.2.3也可以根据实际情况改变。比如,若实际中,一辆小汽车单位时间内的停车费用
是一辆客车的2倍,一辆卡车单位时间内的停车费用是一辆客车的4倍,则可以改成:
printf(“n请输入车的类别【车的类别:1.代表客车2.代表小汽车 4.代表卡车】:n”);
则kind可取值1,2,4; kind取1时对应的是客车,表示计算停车费用时以一辆客车单位时间内的停车费用为基数,若kind取2,则表示一辆小汽车单位时间内的停车费用是一辆客车的2倍,若kind取4,则表示一辆卡车单位时间内的停车费用是一辆客车的4倍。
2.程序的缺点
(1)输入时间时,程序没有检测错误功能 程序的输入形式如下: 设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。其中:‘A’表示到达(arrival);‘D’表示离去(departure);‘E’表示输出结束(end)。
设每个输入项的形式为(Choose, CarNumber, Time),其中Choose表示每个括号中的第一项数据,即A/D/E; CarNumber表示每个括号中的第二项,即1/2/3;Time表示每个括号中的第三项,即5/10/15。设前后两次输入的数据中的第三项分别为Time1,Time2;则必须满足Time2≧Time1。而在实际输入过程中用户可能会忽略这一点,所以应该在输入Time是设置一个判断语句,若前后两次输入的Time不满足Time2≧Time1,则要求用户重新输入,直至满足要求为止。
(2)程序的界面不够清晰,一次性输入的数据项比较多,容易出错。3.改进思想(1)
为了保证前后两次输入的Time必须满足Time2≧Time1,使程序具有错误检测功能,在程序输入部分添加了如下代码:
printf(“输入现在的时刻:n”);
scanf(“%d”,&time2);
while(time2 { printf(“时间输入错误,请重新输入:n”); scanf(“%d”,&time2); 重庆邮电大学计算机科学与技术学院 } time1=time2;//time1定义为静态变量 (2)为了使程序有更清晰的界面,可在主函数中加入菜单的显示方式。且数据可以采用一次输入一个数据项,分步输入的方式,使输入过程少出错。于是可以将主函数进行修改。(见附录一) 六、程序源代码 #include /*停车场内最多的停车数*/ #define Price 2 /*每单位停车费用*/ typedefstruct { intCarNo[N]; /*车牌号*/ intCarTime[N]; /*进场时间*/ int top; /*栈指针*/ } SqStack; /*定义顺序栈类型*/ /*定义链队类型*/ typedefstructqnode { intCarNo; /*车牌号*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*队首和队尾指针*/ QNode *rear;} LiQueue; /*顺序栈的基本运算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1; 重庆邮电大学计算机科学与技术学院 } intStackEmpty(SqStack *s){ return(s->top==-1);} intStackFull(SqStack *s){ return(s->top==N-1);} /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2){ if(s->top==N-1) return 0;s->top++;s->CarNo[s->top]=e1;s->CarTime[s->top]=e2;return 1;} /*删除S的栈顶元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2){ if(s->top==-1) return 0;e1=s->CarNo[s->top];e2=s->CarTime[s->top];s->top--;return 1;} voidDispStack(SqStack *s){ int i;for(i=0;i<=s->top;i++) printf(“%d ”,s->CarNo[i]);printf(“n”);} /*以下为链队列的基本运算算法*/ 重庆邮电大学计算机科学与技术学院 voidInitQueue(LiQueue *&q){ q=(LiQueue *)malloc(sizeof(LiQueue));q->front=q->rear=NULL;} intQueueLength(LiQueue *q){ int n=0;QNode *p=q->front;while(p!=NULL){ n++; p=p->next;} return(n);} intQueueEmpty(LiQueue *q){ if(q->rear==NULL) return 1;else return 0;} voidenQueue(LiQueue *&q, int e){ QNode *s;s=(QNode *)malloc(sizeof(QNode));s->CarNo=e;s->next=NULL;if(q->rear==NULL)/*若链队为空,则新结点是队首结点又是队尾结点*/ q->front=q->rear=s;else { q->rear->next=s;/*将*s结点链到队尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*队列为空*/ return 0; 重庆邮电大学计算机科学与技术学院 if(q->front==q->rear)/*队列中只有一个结点时*/ { t=q->front; q->front=q->rear=NULL;} else /*队列中有多个结点时*/ { t=q->front; q->front=q->front->next;} e=t->CarNo;free(t);return 1;} voidDisplayQueue(LiQueue *q){ QNode *p=q->front;while(p!=NULL){ printf(“%d ”,p->CarNo); p=p->next;} } void main(){ char choose;/*用于选择命令*/ int no,e1,time,e2,kind;/*用于存放车牌号、当前停车时刻*/ inti,j;SqStack *St,*St1;/*临时栈St1,当停车场中间的车要推出去时,用于倒车*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ #”);printf(“n# #”);printf(“n# 欢迎使用停车场管理系统 #”); 重庆邮电大学计算机科学与技术学院 printf(“n# #”);printf(“n# 【输入提示】:汽车状态由A、D、E 表示。其中,A:表示汽车到达 D:表示汽车离去, #”);printf(“n# E:表示输出结束。每次输入的数据由三项构成,即:(汽车状态,车牌号,当前时刻)#”);printf(“n# 数据项之间以逗号分开。例如输入示范:A,1,5 #”);printf(“n #n”);printf(“n正在读取汽车信息...n”); do { printf(“n*****************************************************************”);printf(“n请分别输入汽车状态(A/D/E)、车牌号和当前时刻(数据之间以逗号分开):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); switch(choose){ /*************************** 汽车到达 ******************************/ case 'A': case 'a': if(!StackFull(St)) /*停车场不满*/ { Push(St,no,time); printf(“该车在停车场中的位置是:%dn”,St->top+1); } else /*停车场满*/ { enQueue(Qu,no); printf(“n停车场已满,该车进入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break;/************************* 汽车离开 ********************************/ case 'D': case 'd': 重庆邮电大学计算机科学与技术学院 printf(“n请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);scanf(“%d”,&kind); for(i=0;i<=St->top && St->CarNo[i]!=no;i++); if(i>St->top)/*要离开的汽车在便道上*/ { /*汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾*/ while(Qu->front->CarNo!=no) { enQueue(Qu,Qu->front->CarNo); // deQueue(Qu,Qu->front->CarNo); Qu->front = Qu->front->next; } deQueue(Qu,no);printf(“n便道上车牌号为%d的汽车已离开!n”,no); printf(“n当前便道中的车辆的车牌号分别是:”); DisplayQueue(Qu); printf(“n”); } else /*要离开的汽车在停车场中*/ { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用来返回被删元素的车牌号和停车时刻*/ Push(St1,e1,e2);/*倒车到临时栈St1中,将e1,e2插入到临时栈中*/ } Pop(St,e1,e2); /*该汽车离开*/ printf(“n车牌号为%d的汽车停车时间为:%d。停车费用为:%dn”,no,time-e2,(time-e2)*Price*kind); /*对小汽车而言:当前时刻 减去 该车当时停车的时刻,再乘以价格就是费用,而对于客车和卡车而言,就要乘以kind倍小汽车的价格*/ while(!StackEmpty(St1))/*将临时栈St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*队不空时,将队头进栈St*/ { 重庆邮电大学计算机科学与技术学院 deQueue(Qu,e1); Push(St,e1,time);/*以当前时间开始计费*/ } printf(“n当前停车场中的车辆的车牌号分别是:”);//输出停车场中的车辆 DispStack(St); } break;/************************ 结束 *********************************/ case 'E': case 'e': printf(“n正在退出系统...n”); if(!StackEmpty(St))//显示停车场情况 { printf(“n当前停车场中的车辆的车牌号分别是:”);//输出停车场中的车辆 DispStack(St); printf(“n”); } else printf(“n当前停车场中无车辆nn”); break;/************************ 结束 *********************************/ default: /*其他情况*/ printf(“输入的命令错误!n”); break;} } while(choose!='E'&&choose!='e');} 七、程序运行结果 取N=2,即停车场内最多的停车数为2 取 Price=2,即每单位停车费用为2 输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),重庆邮电大学计算机科学与技术学院 (‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。程序演示结果如下图所示: 重庆邮电大学计算机科学与技术学院 八、心得体会 (1)该实验涉及到顺序栈的建立、插入、删除等操作,涉及到了链队列的建立、插入、删除等操作。做这个实验,加深了我对以上知识点的认识和理解。(2)提高了 C 语言编程的能力。在程序设计过程中,需要经过反复地编写,调试,运行,发现问题并解决问题,在这次实验的设计中,我加深对程序的了解,提高自己的实际动手能力和独立思考的能力同时我也学会了综合以前学到的基本知识来解决较大问题的方法。 (3)一方面我养成了注重程序细节的意识。例如: printf(“n请分别输入汽车状态(A/D/E)、车牌号和当前时刻(数据之间以逗号分开):n”);scanf(“ %c,%d,%d”,&choose,&no,&time); 重庆邮电大学计算机科学与技术学院 %c,前面必须留一个空格,否则程序在显示的时候就会有一些问题。 (4)另一方面我也深刻地认识到了《数据结构》这门课程的重要性。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构的研究不仅涉及到计算机硬件的研究,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须 考虑如何组织数据,以便使查找和存取数据元素更为方便。可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一个核心内容,是从事计算机科学研究及其应 用的科技工作者必须掌握的重要内容 附 一、优化后的程序 #include /*停车场内最多的停车数*/ #define Price 2 /*每单位停车费用*/ typedefstruct { intCarNo[N]; /*车牌号*/ intCarTime[N]; /*进场时间*/ int top; /*栈指针*/ } SqStack; /*定义顺序栈类型*/ /*定义链队类型*/ typedefstructqnode { intCarNo;/*车牌号*/ structqnode *next;} QNode;typedefstruct { QNode *front;/*队首和队尾指针*/ QNode *rear;} LiQueue; /*顺序栈的基本运算算法*/ voidInitStack(SqStack *&s){ s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;} 重庆邮电大学计算机科学与技术学院 intStackEmpty(SqStack *s){ return(s->top==-1);} intStackFull(SqStack *s){ return(s->top==N-1);} /*S中的插入新元素*/ int Push(SqStack *&s,int e1,int e2){ if(s->top==N-1) return 0;s->top++;s->CarNo[s->top]=e1;s->CarTime[s->top]=e2;return 1;} /*删除S的栈顶元素,并用e1,e2返回其值*/ int Pop(SqStack *&s,int&e1,int &e2){ if(s->top==-1) return 0;e1=s->CarNo[s->top];e2=s->CarTime[s->top];s->top--;return 1;} voidDispStack(SqStack *s){ int i;for(i=0;i<=s->top;i++) printf(“%d ”,s->CarNo[i]);printf(“n”);} /*以下为链队列的基本运算算法*/ voidInitQueue(LiQueue *&q){ q=(LiQueue *)malloc(sizeof(LiQueue)); 重庆邮电大学计算机科学与技术学院 q->front=q->rear=NULL;} intQueueLength(LiQueue *q){ int n=0;QNode *p=q->front;while(p!=NULL){ n++; p=p->next;} return(n);} intQueueEmpty(LiQueue *q){ if(q->rear==NULL) return 1;else return 0;} voidenQueue(LiQueue *&q, int e){ QNode *s;s=(QNode *)malloc(sizeof(QNode));s->CarNo=e;s->next=NULL;if(q->rear==NULL)/*若链队为空,则新结点是队首结点又是队尾结点*/ q->front=q->rear=s;else { q->rear->next=s;/*将*s结点链到队尾,rear指向它*/ q->rear=s;} } intdeQueue(LiQueue *&q,int&e){ QNode *t;if(q->rear==NULL)/*队列为空*/ return 0;if(q->front==q->rear)/*队列中只有一个结点时*/ { t=q->front; 重庆邮电大学计算机科学与技术学院 q->front=q->rear=NULL;} else /*队列中有多个结点时*/ { t=q->front; q->front=q->front->next;} e=t->CarNo;free(t);return 1;} voidDisplayQueue(LiQueue *q){ QNode *p=q->front;while(p!=NULL){ printf(“%d ”,p->CarNo); p=p->next;} printf(“n”);} void main(){ int choose;/*用于选择命令*/ int no,e1,time2,e2,no_away;/*no_away:汽车离开时输入车牌号;time2:当前停车时刻;*/ static int time1;/*静态变量time1用于存放上次时刻*/ inti,j;int kind;/*车的类别*/ time1=time2=0;SqStack *St,*St1;/*临时栈St1,当停车场中间的车要推出去时,用于倒车*/ LiQueue *Qu;InitStack(St);InitStack(St1);InitQueue(Qu);printf(“ ”);printf(“n# #”); 重庆邮电大学计算机科学与技术学院 printf(“n# 欢迎使用停车场管理系统 #”);printf(“n# #”);printf(“n n”);do { printf(“n******************** 主菜单 ****************************n”); printf(“** 1:车辆到达 **n”); printf(“** 2:车辆离开 **n”); printf(“** 3:显示停车场的车辆 **n”); printf(“** 4:显示便道中的车辆 **n”); printf(“** 0:退出 **n”); printf(“********************************************************n”); printf(“请选择:”); scanf(“%d”,&choose); switch(choose) { case 1: // #汽车到达 ###### printf(“输入输入车牌号、当前时刻(数据之间以逗号隔开):n”); scanf(“%d,%d”,&no,&time2);/*依次输入车牌号、当前停车时刻*/ while(time2 { printf(“时间输入错误,请重新输入当前时刻:n”); scanf(“%d”,&time2); } time1=time2; if(!StackFull(St)) /*停车场不满*/ { Push(St,no,time1); printf(“该车在停车场中的位置是:%dn”,St->top+1); 重庆邮电大学计算机科学与技术学院 } else /*停车场满*/ { enQueue(Qu,no); printf(“n停车场已满,该车进入便道,在便道中的位置是:%dn”,QueueLength(Qu)); } break; case 2: // ##汽车离开 #### printf(“输入车牌号:n”); scanf(“%d”,&no_away); printf(“请输入车的类别【车的类别:1.代表小汽车 2.代表客车 3.代表卡车】:n”);scanf(“%d”,&kind); printf(“输入现在的时刻:n”);/*现在的时刻time1得大于之前的时刻time1*/ scanf(“%d”,&time2); while(time2 { printf(“时间输入错误,请重新输入:n”); scanf(“%d”,&time2); } time1=time2; for(i=0;i<=St->top && St->CarNo[i]!=no_away;i++); if(i>St->top)/*汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾*/ { while(Qu->front->CarNo!=no_away) { enQueue(Qu,Qu->front->CarNo); Qu->front = Qu->front->next; } deQueue(Qu,no_away);printf(“n便道上车牌号为%d的汽车已离开!n”,no_away); printf(“n当前便道中的车辆的车牌号分别是:”); DisplayQueue(Qu); printf(“n”); } else 重庆邮电大学计算机科学与技术学院 { for(j=i;j<=St->top;j++) { Pop(St,e1,e2);/*e1,e2用来返回被删元素的车牌号和停车时刻*/ Push(St1,e1,e2);/*倒车到临时栈St1中,将e1,e2插入到临时栈中*/ } Pop(St,e1,e2); /*该汽车离开*/ printf(“n车牌号为%d的汽车停车费用为:%dn”,no_away,(time2-e2)*Price*kind);/*对小汽车而言:当前时刻 减去 该车当时停车的时刻,再乘以价格就是费用,而对于客车和卡车而言,就要乘以kind倍小汽车的价格*/ while(!StackEmpty(St1))/*将临时栈St1重新回到St中*/ { Pop(St1,e1,e2); Push(St,e1,e2); } if(!QueueEmpty(Qu))/*队不空时,将队头进栈St*/ { deQueue(Qu,e1); Push(St,e1,time1);/*以当前时间开始计费*/ } } break; case 3: // #####显示停车场情况 if(!StackEmpty(St)) { printf(“当前停车场中的车辆的车牌号分别是:”);/*输出停车场中的车辆*/ DispStack(St); } else printf(“停车场中无车辆!n”); break; case 4: // ######显示便道情况 # if(!QueueEmpty(Qu)) { 重庆邮电大学计算机科学与技术学院 printf(“ 当前便道中的车辆的车牌号分别是:”);/*输出便道中的车辆*/ DisplayQueue(Qu); } else printf(“便道中无车辆!n”); break; case 0: // # 结束 ### printf(“n正在退出系统...n”); if(!StackEmpty(St)) { printf(“当前停车场中的车辆的车牌号分别是:”);/*输出停车场中的车辆*/ DispStack(St); } if(!QueueEmpty(Qu)) { printf(“ 当前便道中的车辆的车牌号分别是:”);/*输出便道中的车辆*/ DisplayQueue(Qu); } break; /**********************************************************/ default: /*其他情况*/ printf(“输入的命令错误!n”); break; } } while(choose!=0);} 附 二、优化后程序的运行结果 取N=2,即停车场内最多的停车数为2 取 Price=2,即每单位停车费用为2 输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。程序演示结果如下图所示: 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 重庆邮电大学计算机科学与技术学院 停车场收费管理系统 需求报告 目录 1 2 3 摘要 项目背景介绍 停车场收费管理系统的现状 功能需求 4.1 通用基本功能 4.2 图像识别比较功能 4.3 先进的闸机安全安装 4.4 可增设中远距离车辆感应 5 性能需求 5.1 系统基本要求 5.2 数据管理能力要求 5.3 故障处理要求 外部接口说明 6.1 入口和出口部分 6.2 数据流程 7 修正系统开发计划 摘要 停车场电脑收费管理系统是现代化停车场车辆收费及设备自动化管理的统称,是将车场完全置于计算机管理下的高科技机电一体化产品。 根据多年设计、安装停车场收费系统的实际经验,我们在软件和系统设计上为停车场提供了一套最严格、最先进、易用、便于维护和运行可靠的收费系统;一套能有效的堵塞收费漏洞,降低操作成本,提高经济效益和减轻劳动强度,提高工作效率的现代化收费管理系统 随着时代的发展,私家车越来越多,而车位却十分紧张。在市区内有很多空间没 有被充分利用,大多车辆是停在路边或者简易停车场,缺乏管理,这样导致了资源的浪费,也造成了街道的拥堵。为了适应社会的发展,大量的现代化大规模的停车场会被投入使用,但管理方面又容易出现问题。因此,停车场管理系统的开发和应用是十分必要的。 此报告的目的重在分析此程序的总体需求,实现方案,并分析开发系统的可行性,为决策者提供是否开发该系统的依据和建议。项目背景介绍 2.1 开发软件名称:停车场管理系统 2.2项目开发者: 某软件开发小组 2.3用户单位: 某公司 2.4大体框架: 智能停车场收费管理系统 门禁管理系统 智能通道管理系统 考勤管理系统 智能巡更管理系统 收费管理系统等子系统 闭路监视系统(CCTV) 消防安全系统(FA)和保安系统(SA)紧急广播系统 停车场收费管理系统的现状 该系统具有很大的市场潜力,以现在的车辆增长速度推测,在不久的将来肯定会有许多大规模停车场(包括住宅小区)建成,此系统的开发很有价值。本系统现有的技术条件完全有能力顺利完成开发工作,硬件、软件上的配置也很容易满足开发者的要求,开发系统的计算机硬件已经非常普及,完全没有问题;现在的计算机各方面的技术都非常成熟,相对来说开发此系统的技术也要求比较简单,因此在技术方面是可行的;各类技术人员的数量、水平、来源等也能很容易满足;而且此系统的专业性不强,因此不需要相关行业人士,开发人员的选择就有很大余地。停车场计费管理系统的主要工作是减少人工计费带来的不便,提高办事效率,使车辆管理工作更加信息化,电子化。充分发挥计算机的信息传输速度快、准确度高的优势。功能需求 4.1通用基本功能: 入口读卡升闸、出口读卡验卡收费、车满显示、出入口与收费亭对讲、公正收费等等。 4.2 图像识别比较功能: 其他有图像识别功能的系统,其识别都是单向识别,即仅入口摄取,出口须由管理员目测比较。本系统入口、出口均采用摄像机比较,方便管理员直观比较。 4.3 先进的闸机安全安装: 道闸栏杆配的自动平稳装置,以及防抬杆、防砸车功能,检测功能具有高灵敏度和高可靠性。能很好地识别非机动车及人员等误报情况。 4.4 可增设中远距离车辆感应: 采用50-80cm中距离或5-8m远距离感应范围的读卡器,经多次实际认证为最方便的操作距离。系统如果没有特殊要求一般车辆经过读卡器的距离约为10--15cm。性能需求 5.1 系统基本要求 响应时间:系统的响应时间不能超过1分钟 警告时间及次数:每隔三分钟重复警告一次,每次警告时间持续一分钟。主存容量:内存:128MB RAM 磁盘容量:不小于1G 显示器:256色,800*600以上的兼容显示器 5.2 车辆管理能力要求 计费 分为入口和出口,中间设立岗楼,一人操作,高峰时期可两人操作,入口处发放计费卡,出口处凭借计费卡缴费,放行,操作简单快速方便。长期客户可办理月票。客户也可购买车位,实现车位预留 监控 全范围监控,无死角,监控画面与保安室相连接,可录像。一旦出现事故或意外,保安可第一时间赶到现场,必要时可以直接报警。出现紧急情况,如火灾时,会自动启动消防设备,并自动开启大门,放行车辆。自动引导车位 停车更加快速,有效,方便。 5.3 故障处理要求 列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。输出发生错误时,在系统的代码部分进行修改 外部接口说明 6.1 入口和出口部分 入口控制部分: 智能停车场收费管理系统 门禁管理系统 智能通道管理系统 考勤管理系统 智能巡更管理系统 出口控制部分: 收费管理系统等子系统 闭路监视系统(CCTV) 消防安全系统(FA)和保安系统(SA)紧急广播系统 6.2 数据流程 修正系统开发计划 对于车辆的管理有待提高,如停车位置,出场路线等。在以后的系统中,会提供诸如此类的更加人性化的服务。 本系统会提供多国语言的电子录音,使此系统对不懂中文的客户也适用。 一.问题描述 1.实验题目: 设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。若停车场内已经停满 n辆车,那么后来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管理的模拟程序。 要求:根据各结点的信息,调用相应的函数或者语句,将结点入栈入队,出栈或者出队。 二.需求分析 1.程序所能达到的基本可能: 程序以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。栈以顺序结构实现,队列以链表结构实现。同时另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。输入数据按到达或离去的时刻有序。当输入数据包括数据项为汽车的“到达”(‘A’表示)信息,汽车标识(牌照号)以及到达时刻时,应输出汽车在停车场内或者便道上的停车位置;当输入数据包括数据项为汽车的“离去”(‘D’表示)信息,汽车标识(牌照号)以及离去时刻时,应输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费);当输入数据项为(‘P’,0,0)时,应输出停车场的车数;当输入数据项为(‘W’, 0, 0)时,应输出候车场车数;当输入数据项为(‘E’, 0, 0),退出程序;若输入数据项不是以上所述,就输出“ERROR!”。2.输入输出形式及输入值范围: 程序运行后进入循环,显示提示信息:“Please input the state,number and time of the car:”,提示用户输入车辆信息(“到达”或者“离开”,车牌编号,到达或者离开的时间)。若车辆信息为“到达”,车辆信息开始进栈(模拟停车场),当栈满,会显示栈满信息:“The parking place is full!”,同时车辆进队列(模拟停车 场旁便道),并显示该进入便道车辆的车牌编号,让用户知道该车的具体位置;若车辆信息为“离开”,会显示该车进入停车场的时间以及相应的停车费用,若该车较部分车早进停车场,这部分车需先退出停车场,暂时进入一个新栈为其让道,会显示进入新栈的车辆的车牌编号及其入停车场的时间,当待离开车离开停车场后,这部分车会重新进入停车场,同时便道上的第一辆车进入停车场;若输入(‘P’,0,0),会显示停车场的车数;若输入(‘W’,0,0),会显示便道上的车数;若输入(‘E’,0,0),程序会跳出循环,同时程序结束;若输入为其他字母,程序会显示“ERROR!”报错。若便道上没有车辆停靠,会显示便道为空的信息:用户每输入一组数据,程序就会根据相应输入给出输出。输入值第一个必须为字母,后两个为数字。 三.概要设计 为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让路而从停车场退出来的汽车的场地,以队列模拟车场外的便道,因此需要栈和队列这两个抽象数据类型。1.栈抽象数据类型定义: ADT SqStack{ 数据对象:D={ai,bi,ci,di|aiint,biint,ciint,dichar,i=1,2,3....,n,n0} 数据关系:R={(ai,bi,di)|ai,bi,diD,ai,bi,distruct car}; 基本操作: Judge_Output(s,q,r);//根据r中车辆信息控制车辆是入栈s还是 入队q以及相关操作 A_cars(s,q, a);//将到达车辆a的信息入栈s或者入队q D_cars(s,q, d);//将待离开车辆d出栈s,并将q中相应车辆 入栈并进行相关的操作 }ADT SqStack 2.队列抽象数据类型定义: ADT LinkQueue{ 2 数据对象:D={ai,bi,ci|aiQnode *,biQnode *,ciint,i=1,2,3....,n,n0}; 数据关系:R=; 基本操作: Judge_Output(s,q,r);//根据r中车辆信息控制车辆是入栈s 还是入队q以及相关操作 A_cars(s,q, a);//将到达车辆a的信息入栈s或者入队q D_cars(s,q, d);//将待离开车辆d出栈s,并将q中相应车 辆入栈并进行相关的操作 }ADT LinkQueue 3.主要算法流程图: I.Judge_Output算法流程图: 开始F输入为E(e)TF输出输入为P(p)“STOP!”TF输入为W(w)输出停车场车辆的数目TF输入为A(a)输出便道上车辆数目T输入为D(d)调用A_cars函数调用D_cars函数结束II.A_cars算法流程图: 开始停车场未满TF车进停车场车进便道结束III.D_cars算法流程图: 开始该车是最后进T停车场的车F在该车后进的车退结账离开出停车场后让其结账离开便道上有车TF便道上第一辆车进停车场结束 4.本程序保护模块: 主函数模块 栈单元模块:实现栈的抽象数据类型 队列单元模块:实现队列的抽象数据类型 调用关系: 栈单元模块主函数模块队列单元模块四.详细设计 1.相关头文件库的调用说明: #include #include { char bb; int num; int time; };struct rangweicar {int num;int time;};typedef struct stackk {struct rangweicar H[MAXSIZE];int topp; }SqStackk;#define QNODE struct Qnode QNODE { int data; QNODE *next; };3.栈类型和队列类型: typedef struct stack {struct car G[n]; int top;}SqStack;typedef struct linkqueue {QNODE *front,*rear; int geshu;}LinkQueue;//部分基本操作的伪码实现 void Judge_Output(SqStack *s,LinkQueue *q,struct car *r){ if((*r).bb=='E'||(*r).bb=='e')printf(“STOP!n”);else if((*r).bb=='P'||(*r).bb=='p')printf(“The number of parking cars is %dn”,(s->top)+1);else if((*r).bb=='W'||(*r).bb=='w')printf(“The number of waiting cars is %dn”,q->geshu);else if((*r).bb=='A'||(*r).bb=='a')A_cars(s,q,*r);else if((*r).bb=='D'||(*r).bb=='d')D_cars(s,q,*r);else printf(“ERROR!n”);} A_cars(SqStack *s,LinkQueue *q,struct car a){QNODE *t;if(s->top!=n-1){(s->top)++;(s->G[s->top]).bb=a.bb;(s->G[s->top]).num=a.num;(s->G[s->top]).time=a.time;} else {printf(“The parking place is full!n”);t=(QNODE *)malloc(sizeof(QNODE));t->data=a.num;t->next=NULL;q->rear->next=t;q->rear=t;printf(“the number of the car in the access road is:%dn”,q->rear->data);q->geshu++;} } int D_cars(SqStack *s,LinkQueue *q,struct car d){int i,j,l;float x,y;QNODE *p;SqStackk *k;if(d.num==(s->G[s->top]).num){x=d.time-(s->G[s->top]).time;y=fee*x;printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y);if(q->geshu==0){printf(“The queue is empty!n”); return 0;} else {p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; return 1; } } else {for(i=0;i<(s->top);i++) {if((s->G[i]).num!=d.num)continue;else break;} if(i>=(s->top)) {printf(“ERROR!n”); return-1; } x=d.time-(s->G[i]).time; y=fee*x; printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); k=(SqStackk *)malloc(sizeof(SqStackk)); k->topp=-1; for(j=(s->top);j>i;j--) {k->topp++;(k->H[k->topp]).num=(s->G[j]).num; (k->H[k->topp]).time=(s->G[j]).time; s->top--; } for(l=0;l<=(k->topp);l++){printf(“the information(number and time)in the new stack is:n”); printf(“%d,%dn”,(k->H[l]).num,(k->H[l]).time);} s->top--; while(k->topp>=0) {s->top++; (s->G[s->top]).bb='A'; (s->G[s->top]).num=(k->H[k->topp]).num; (s->G[s->top]).time=(k->H[k->topp]).time; k->topp--; } if(q->geshu==0) {printf(“The access road is empty!n”); return 2; } else {s->top++; p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; return 3; } } } 4.主函数的伪码: main() {SqStack *s; LinkQueue *q; QNODE *p; struct car aa[MAXSIZE]; int i; s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; q=(LinkQueue *)malloc(sizeof(LinkQueue)); p=(QNODE *)malloc(sizeof(QNODE)); p->next=NULL; q->front=q->rear=p; q->geshu=0;printf(“******************************************************************************n”); printf(“************************* *************************n”); printf(“************************* 停车场管理系统 *************************n”); printf(“************************* *************************n”); printf(“******************************************************************************n”); for(i=0;i {printf(“Please input the state,number and time of the car:n”); scanf(“%c,%d,%d”,&(aa[i].bb),&(aa[i].num),&(aa[i].time)); getchar();Judge_Output(s,q,&aa[i]); if(aa[i].bb=='E'||aa[i].bb=='e')break; } } 5.函数调用关系: 调用A_cars函数调用Judge_Output函数main函数调用D_cars函数 五.测试分析: 1.出现问题及解决办法: 该程序是四个程序调试中最顺利的一个,只在一个地方上出了问题,就是输入字符时由于回车键也是字符,回车键总会被读入,导致经常输出“ERROR!”。后来找到原因后在scanf函数后紧接着加了一个getchar();语句后就恢复了正常。 2.方法优缺点分析: 优点:用栈和队列来模拟停车场让整个问题显得简单,易于实现; 缺点:栈和队列这两个数学模型用在停车场管理上还是有失妥当的,现实中停车场出口入口不可能为同一处,不可能当一辆车要离开,在它后面进来的车必须为它让路,因此无法用栈的“后进先出”原则来模拟;而且没有考虑便道上的车在等待过程中可以中途开走等情况,而这些都无法用队列的“先进先出”原则来模拟。 3.主要算法的时间和空间复杂度分析: (1)由于算法Judge_Output函数根据判断条件,每次只选择一个程序段执行,所以其时间复杂度是O(1); (2)由于算法A_cars函数根据判断条件,将数据入栈或入队列,所以其时间复杂度也是O(1); (3)由于算法D_cars函数在出栈数据不在最顶端时需将n个数据先出该栈,再入新栈,再回旧栈的操作,故其时间复杂度是O(n);(4)所有算法的空间复杂度都是O(1)。六.使用说明 程序运行后用户根据提示一次输入车辆的状态信息,车牌编号,时间,程序会根据车辆的状态信息调用相应的函数,并输出用户想得到的信息。 七.调试结果 输入数据:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘P’,0,0),(‘W’,0,0),(‘F’,0,0),(‘E’,0,0)。 输出数据:1号车停放时间为10小时,收费100元;2号车停放时间为25小时,收费250元;4号车停放5小时,收费50元;此时停车场有两辆车,便道上无车。若停车场已满,则会显示停车场已满的信息;若便道上无车等待停车,会显示便道上无车的信息;若中途有车离开,需其后的车让道,会显示进入临时停车场的车辆的信息;若输入(‘F’,0,0),输出“ERROR!”;若输入(‘E’,0,0),程序结束。运行结果截屏: 八.附录 源程序文件清单: #include /*调用的头文件库声明*/ #include /*用该结构体来存放车的状态,编号和时间信息 */ { char bb; int num; int time; };typedef struct stack /*用该栈来模拟停车场*/ {struct car G[n]; int top;}SqStack;struct rangweicar /*用该结构体来存放临时让出的车辆的编号以及时间信息*/ {int num;int time;};typedef struct stack /*用该栈来模拟临时让出的车辆的停靠场地*/ {struct rangweicar H[MAXSIZE];int topp;}SqStackk;#define QNODE struct Qnode QNODE { int data; /*链队结点的类型*/ QNODE *next; };typedef struct linkqueue /*用该链队来模拟便道*/ {QNODE *front,*rear; int geshu; }LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r)/*该算法通过传递来的车辆信息调 { 用相关函数实现操作*/ if((*r).bb=='E'||(*r).bb=='e') /*若车辆状态为‘E’,终止程序*/ printf(“STOP!n”);else if((*r).bb=='P'||(*r).bb=='p') /*若车辆状态为‘P’,输出停车场车辆数*/ printf(“The number of parking cars is %dn”,(s->top)+1);else if((*r).bb=='W'||(*r).bb=='w') /*若车辆状态为‘W’,输出便道车辆数*/ printf(“The number of waiting cars is %dn”,q->geshu);else if((*r).bb=='A'||(*r).bb=='a') /*若车辆状态为‘A’,调用A_cars函数*/ A_cars(s,q,*r); else if((*r).bb=='D'||(*r).bb=='d') /*若车辆状态为‘D’,调用D_cars函数*/ D_cars(s,q,*r);else printf(“ERROR!n”); /*若车辆状态为其他字母,报错*/ } A_cars(SqStack *s,LinkQueue *q,struct car a) /*该算法实现对车辆状态为到达的车辆的操 {QNODE *t; 作*/ if(s->top!=n-1) /*若停车场还没有满,则车进停车场,并存入车辆的状态,车牌编 {(s->top)++; 号和到达时间信息*/ (s->G[s->top]).bb=a.bb; (s->G[s->top]).num=a.num; (s->G[s->top]).time=a.time;} else {printf(“The parking place is full!n”); /*若停车场已满,车进便道,并显示该车的车牌编 t=(QNODE *)malloc(sizeof(QNODE)); 号,同时记录便道车辆数目*/ t->data=a.num; t->next=NULL; q->rear->next=t; q->rear=t; printf(“the number of the car in the access road is:%dn”,q->rear->data); q->geshu++;} } int D_cars(SqStack *s,LinkQueue *q,struct car d) /*该算法实现车辆状态为离开的车 {int i,j,l; 辆的操作*/ float x,y;QNODE *p;SqStackk *k;if(d.num==(s->G[s->top]).num) /*若待离开车为最后进停车场的车的情况*/ {x=d.time-(s->G[s->top]).time; y=fee*x; /*直接计算停车时间,费用并离去*/ printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); if(q->geshu==0) /*若便道上无车,函数返回*/ {printf(“The queue is empty!n”); return 0; } Else /*若便道上有车,第一辆车进停车场*/ {p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; /*并存入其车牌编号及进停车场的时间*/ (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; /*若此时便道上无车,返回1*/ return 1; } } Else /*待离开的车不是最后进停车场的那辆车的情况*/ {for(i=0;i<(s->top);i++) /*先找到待离开车在停车场中的位置*/ {if((s->G[i]).num!=d.num)continue;else break;} if(i>=(s->top)) {printf(“ERROR!n”); return-1; } x=d.time-(s->G[i]).time; /*计算待离开车的停车时间并计算费用*/ y=fee*x; printf(“The time is %.2f hours,the fee is %.2f yuann”,x,y); k=(SqStackk *)malloc(sizeof(SqStackk)); /*设立一个新栈临时停放为该车离开而让 k->topp=-1; 路的车辆*/ for(j=(s->top);j>i;j--) {k->topp++;(k->H[k->topp]).num=(s->G[j]).num; (k->H[k->topp]).time=(s->G[j]).time; s->top--; } for(l=0;l<=(k->topp);l++){printf(“the information(number and time)in the new stack is:n”); printf(“%d,%dn”,(k->H[l]).num,(k->H[l]).time);} /*显示在新栈中的车辆信息*/ s->top--; while(k->topp>=0) /*将新栈中的车重新开入停车场中*/ {s->top++; (s->G[s->top]).bb='A'; (s->G[s->top]).num=(k->H[k->topp]).num; (s->G[s->top]).time=(k->H[k->topp]).time; k->topp--; } if(q->geshu==0) /*若便道上无车,则返回2,无车开入停车场中*/ {printf(“The access road is empty!n”); return 2; } Else /*若便道上有车,则第一辆车开入停车场中*/ {s->top++; p=q->front->next; q->front->next=p->next; (s->G[s->top]).num=p->data; (s->G[s->top]).time=d.time; free(p); q->geshu--; if(q->front->next==NULL) q->rear=q->front; return 3; } } } main() {SqStack *s; LinkQueue *q; QNODE *p; struct car aa[MAXSIZE]; int i; s=(SqStack *)malloc(sizeof(SqStack)); /*对停车场初始化*/ s->top=-1; q=(LinkQueue *)malloc(sizeof(LinkQueue)); p=(QNODE *)malloc(sizeof(QNODE)); /*对便道初始化*/ p->next=NULL; q->front=q->rear=p; q->geshu=0;printf(“******************************************************************************n”); printf(“************************* *************************n”); printf(“************************* 停车场管理系统 *************************n”); printf(“************************* *************************n”); printf(“******************************************************************************n”); for(i=0;i /*输入车辆信息*/ {printf(“Please input the state,number and time of the car:n”); scanf(“%c,%d,%d”,&(aa[i].bb),&(aa[i].num),&(aa[i].time)); getchar();Judge_Output(s,q,&aa[i]); if(aa[i].bb=='E')break; } } 17第四篇:停车场管理系统需求报告
第五篇:停车场模拟管理系统实验报告