基于停车管理系统的分析与理解

这个程序的要求是:停车场是一个能放 n 辆车的狭长通道,只有一个大门,汽车按到达的先后次序停放。若车场满了,车要在门外的便道上等候,一旦有车走,则便道上第一辆车进入。当停车场中的车离开时,由于通道窄,在它后面的车要先退出,待它走后依次进入。汽车离开时按停放时间收费。

基本功能要求:

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

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

项目分析:

此项目需要同时使用栈和队列来实现。由于停车场是个狭长通道,所以无论是汽车进入还是汽车驶出都必须从同一端进行,因此需要借助栈来实现。候车场内为等待进入停车场的车辆,需要按照等待顺序的先后进入停车场。

设计目的:

(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。

(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。

(3)用顺序栈来表示停车场,链队表示停车场外的便道。

(4)显示停车场信息和便道信息。

(5)操作提示界面。

1、所用到的存储定义

车辆定义:

typedef struct

{

int timeIn;              // 进入停车场时间

int timeOut;             // 离开停车场时间

char plate[10];

// 汽车牌照号码,定义一个字符指针类型

}Car;

算法思想分析

(1)、模拟停车场的车辆进出需要输入车辆的信息,比如车辆的车牌号码、自动匹配本地时间,因此,可以定义一个车辆信息结点类型和一个时间节点类型,在链式栈、链式队列中定义结点类型为车辆信息结点类型。

(2)、车辆离开时,需要打印输出车辆的车位号、到达时间、离开时间以及应缴纳的费用。定义expenses函数实现。

(3)、车辆到达时要输入车辆的信息,并以此存放在停车场内;每进入一辆车,要判断停车场(链式栈)是否已经停满,若已满,则提示该车要在便道上等待;若未满,则进行进栈操作。

(4)、车辆的离开,要另外设计一个辅助栈,当一辆汽车要离开时,在其后的车辆要给其让路,让路的汽车就暂时停放在这个栈中。车辆离开后,要判断便道上是否有车辆在等待,若有则进行入栈操作,即将车辆的信息结点进行入栈操作。

(5)、车辆的查询,既可以查询停车场内的车辆,也可以查询便道上等待的车辆,查询显示车辆的当前情况。

 以下代码摘自CSDN:

初始代码:

头文件:

//

// Created by PC-Saw on 2018/12/17.

//

#ifndef  __PLOT_H__

#define __PLOT_H__

#define Price    1          // 单价可以自己定义n

#define MAX_STOP 10

#define MAX_PAVE 10

#include <stdlib.h>

#include <stdio.h>

#include <windows.h>

#include <time.h>                           // 包含时间函数的头文件

#include <string.h>

// 汽车信息

typedef struct

{

int timeIn;              // 进入停车场时间

int timeOut;             // 离开停车场时间

char plate[10];

// 汽车牌照号码,定义一个字符指针类型

}Car;

// 停放栈(用于停放车辆)

typedef struct

{

Car Stop[MAX_STOP];   // 用于停放车辆的栈

int top;                  // 标记栈顶位置

}Stopping;

// 等候队列

typedef struct

{

int count;                // 用来指示队中的数据个数

Car Pave[MAX_PAVE];   // 等候停车的队列

int front, rear;          // 标记队头和队尾位置

}Pavement;

// 让路栈

typedef struct

{

Car Help[MAX_STOP];   // 用于让路的队列

int top;                  // 标记站定位置

}Buffer;

Stopping s;

Pavement p;

Buffer   b;

Car      c;

char     C[10];

void stop_to_pave();       // 车停入便道

void car_come    ();       // 车停入停车位

void stop_to_buff();       // 车进入让路栈

void car_leave   ();       // 车离开

void welcome     ();       // 主界面函数

void Display     ();       // 显示车辆信息

#endif //__PLOT_H__

源文件:

//

// Created by PC-Saw on 2018/12/17.

//

#include "PLot.h"

void stop_to_pave()                         // 车停入便道

{

// 判断队满

if (p.count > 0 && (p.front == (p.rear + 1) % MAX_PAVE))

{

printf ("便道已满,请下次再来\n");

}

else

{

strcpy(p.Pave[p.rear].plate, C);    // 车进入便道

p.rear = (p.rear + 1) % MAX_PAVE;   // 队尾指示器加1

p.count++;                          // 计数器加1

printf ("牌照为%s的汽车停入便道上的%d的位置\n", C, p.rear);

}

}

void car_come()                             // 车停入停车位

{

printf ("请输入即将停车的车牌号:");     // 输入车牌号

scanf ("%s", &C);

if (s.top >= MAX_STOP - 1)              // 如果停车位已满,停入便道

{

stop_to_pave();                     // 停入便道

}

else

{

s.top++;                            // 停车位栈顶指针加1

time_t t1;

long int t = time(&t1);             // 记录进入停车场的时间

char* t2;

t2 = ctime (&t1);                   // 将当前时间转换为字符串

s.Stop[s.top].timeIn = t;

strcpy(s.Stop[s.top].plate, C);     // 将车牌号登记

printf ("牌照为%s的汽车停入停车位的%d车位, 当前时间:%s\n", C, s.top + 1, t2);

}

return ;

}

void stop_to_buff()                         // 车进入让路栈

{

// 停车位栈压入临时栈,为需要出栈的车辆让出道

while (s.top >= 0)

{

if (0 == strcmp(s.Stop[s.top].plate, C))

{

break;

// 让出的车进入让路栈

strcpy(b.Help[b.top++].plate, s.Stop[s.top].plate);

printf ("牌照为%s的汽车暂时退出停车场\n", s.Stop[s.top--].plate);

}

// 如果停车位中的车都让了道,说明停车位中无车辆需要出行

if (s.top < 0)

{

printf ("停车位上无此车消息\n");

}

else

{

printf ("牌照为%s的汽车从停车场开走\n", s.Stop[s.top].plate);

time_t t1;

long int t = time (&t1);

c.timeOut = t;                        // 标记离开停车场的时间

char* t2;

t2 = ctime (&t1);                   // 获取当前时间

printf ("离开时间%s\n需付%ld元\n", t2, Price * (c.timeOut - s.Stop[s.top].timeIn));

s.top--;

}

// 将让路栈中的车辆信息压入停车位栈

while (b.top > 0)

{

strcpy(s.Stop[++s.top].plate, b.Help[--b.top].plate);

printf ("牌照为%s的汽车停回停车位%d车位\n", b.Help[b.top].plate, s.top);

}

// 从便道中 -> 停车位

while (s.top < MAX_STOP-1)

{

if (0 == p.count)               // 判断队列是否为空

{

break;

}   // 不为空,将便道中优先级高的车停入停车位

else

{

strcpy(s.Stop[++s.top].plate, p.Pave[p.front].plate);

printf ("牌照为%s的汽车从便道中进入停车位的%d车位\n", p.Pave[p.front].plate, s.top);

p.front = (p.front + 1) % MAX_PAVE;

p.count--;

}

}

}

void car_leave()                        // 车离开

{

printf ("请输入即将离开的车牌号:\n");

scanf ("%s", &C);

if (s.top < 0)                      // 判断停车位是否有车辆信息

{

printf ("车位已空,无车辆信息!\n");

}

else

{

stop_to_buff();

}

}

void Display()

{

int i = s.top;

if (-1 == i)

{

printf ("停车场为空\n");

}

time_t t1;

long int t = time(&t1);             // 标记显示时的时间

printf ("\t车牌号\t\t\t停放时间\t\t当前所需支付金额\n");

while (i != -1)

{

printf ("\t%s\t\t%d秒\t\t\t%d元\n", s.Stop[i].plate, t - s.Stop[i].timeIn, Price * (t - s.Stop[i].timeIn) / 10);

i--;

}

}

void welcome()

{

printf ("\t*******************目前停车场状况***********************\n");

printf ("\t停车场共有%d个车位,当前停车场共有%d辆车,等候区共有%d辆车\n", MAX_STOP, s.top+1, (p.rear + MAX_PAVE - p.front)

% MAX_PAVE);

printf ("\t********************************************************\n");

printf ("\t---------------Welcome to our Car Parking---------------\n");

printf ("\t*                     1.Parking                        *\n");

printf ("\t*                     2.leaving                        *\n");

printf ("\t*                     3.situation                      *\n");

printf ("\t*                     4.exit                           *\n");

printf ("\t--------------------------------------------------------\n");

}

主函数:

#include "PLot.h"

int main()

{

// 初始化

s.top   = -1;

b.top   =  0;

p.rear  =  0;

p.count =  0;

p.front =  0;

while(1)

{

//system("clear");

welcome();

int i, cho;

scanf ("%d", &i);

if (1 == i) car_come();

if (2 == i) car_leave();

if (3 == i) Display();

if (4 == i) break;

printf ("返回请输入1\n");

scanf ("%d", &cho);

if (1 == cho)

{

continue;

}

else

{

printf ("您的输入有误,请重新输入\n");

scanf ("%d", &cho);

continue;

}

}

return 0;

}

运行成功后程序运行结果图:

程序项目需求(理解):

此程序主要完成的需求是定义了停车车牌号,停车时间,停放所需支付金额以及停放时间等等基础变量,并且撰写代码完成了可以随时输入即将停车的车牌号,并查询其车牌号停入停车位的车位号,停车当前时间。其次可以查询所有已经在停车场的车辆的车牌号,停放时间以及当前所需支付金额。并且能够随时查询展示出即将离开的车牌号,所有的暂时退出停车位的车辆车牌,正在开走的车辆,停回的车辆,以及开走车辆的离开时间已经已付金额。

可能会产生BUG处:

Eg1:在源代码中一处(strcpy(s.Stop[s.top].plate,c);)为了满足用户将车牌登入的功能中,使用到了strcpy的用法,而strcpy的基本用法是:char * strcpy( char * dst, const char * src )。这个函数把字符串src复制到一分配好的字符串空间dst中,复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回dst,否则返回NULL。而第二个字符串src的长度+1(+1是因为字符串以空子符结束)不能超过为dst开辟的空间的大小,否则src里的空字符无法复制到dst里面,dst就成了字符数组,不是字符串了,那样如果后面有一条printf或者puts语句什么的,要打印出dst的,那就会由于没有空字符标志字符串的结束而越界了。所以如果是包含数字的,字节数应该+1.

Eg2:在头文件运行过程中,产生的问题是:

解决方案是:①不能打开exe文件,很大可能性是cf.exe仍然在运行,如果界面上有的话,先关掉exe,再调试运行;如果界面上看不到,你到任务管理器里查看进程,有cf.exe的话结束该进程,然后进行调试运行即可。②还有一种可能win7系统在C:/Program Files/Microsoft Visual Studio/myprojiects下是找不到你写的工程文件的,因为在这个目录下写东西是需要管理员权限的,所以系统才会报“cannot open file”的错误,解决的办法是关闭软件,然后以管理员权限运行该软件,这样就可以完美运行调试程序了。

Eg3:在源文件运行过程中,产生的问题是:

解决方案是:在运行时,没有按照顺序先运行头文件成功,顺着这个目录,你要检查一下能不能打开这个头文件。想办法打开了,就解决了。

Eg4 :在头文件运行过程中,产生的问题是:

解决方案是:控制台项目要使用windows子系统, 而不是console, 设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows.

解决方法方法恰恰相反的情况:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
解决方法是:将project-settings-link的project options里的 /subsystem:windows
改成 /subsystem:console

可以在原本需求上增加的功能但也有可能产生BUG处:(此处的ulCount是指已停车辆)

Eg1:可以增加停车场系统计算更新停车场目前拥有的车辆,新添代码:

unsigned long FUN(unsigned long
ulCount){

unsigned long ulSum=0;

while(0<=ulCount)

{ulSum+=ulCount;

ulCount--;}

return ulSum;}

可是这样会产生的问题是ulCount从0加到它本身的值,但是我们看一个数字之前应该知道他的类型,这个一个无符号长整型的数字,这种类型是没有负数的,如果他到0的时候,在减一,就会变成类型可以表示的最大值4294967295 也就是 (2^32 - 1),很明显这个循环就是一个死循环,因此我们要了解到他的类型。

可以在原本需求上增加的功能但也有可能产生BUG处:

Eg2:如果我们想加入更多查询功能,例如停车,取车,停车状态查询等,我们就需要用到switch-case语句,部分代码如:while(1) {
int sel;
scanf("%d",&sel);
fflush(stdin);
switch(sel)
{
case 1:search();break; //停车状态查询
case 2:taxi();break;//停车
case 3:buy();break;//取车
case 4:put();break;//自助充值
case 5:manage();break; //管理员管理系统
case 0:system("pause");system("cls");break;
default :printf("输入错误,请重新输入\n");
}
if(sel>=0 && sel<=5) break;
}

可能会产生bug处:但是使用switch-case语句需要注意(int a = 2, b = 0; switch(a){ case
1: b = 1; break; case 2: if(2 == a) {break;(这里的break的意图是跳到下行)}b = 2;(意图是跳到这里)break;default:b = 3;}(但事实上是直接跳到这里了)printf("b=%d\n",b);这样会导致整个长话网络的瘫痪。

可以更新增加的一些功能:

1、系统可以增加用户停车卡功能(包括客户名称,停车卡余额,停车卡密码以及充值停车卡的业务),这样也包括了查询停车卡信息,停车卡用户信息,停车卡消费信息等等子功能

2、可以添加帮助用户查询并提示用户是否还存在空位,并具体指出空位号,若没有,提示客户离开等信息。

3、增加等待车辆号,并检验车道、便道是否有车。(大致代码如下)

void list1(SeqStackCar *S)
{
    int i;
    if(S->top > 0)
    {
        printf("\n车场:");
        printf("\n位置 到达时间 车牌号\n");
        for(i = 1; i <= S->top; ++i)
        {
            printf(" %d ",i);
            printf("%d:%d ",S->stack[i]->reach.hour,S->stack[i]->reach.min);
            puts(S->stack[i]->num);
        }
    }
    else
    {
        printf("\n车场里没有车。");
    }
}void list2(LinkQueueCar *W)
{
    QueueNode *p;
    p = W->head->next;
    if(W->head != W->rear)
    {
        printf("\n等待车辆号码为:");
        while(p != NULL)
        {
            puts(p->data->num);
            p = p->next;
        }
    }
    else
    {
        printf("\n便道里没有车。");

测试用例


用例ID


2019/3/3


用例名称


停车管理系统


系统信息验证


用例描述


停车车辆号码输入


号码输入正确,并且可以检测到当前停车时间,以及车牌号


号码输入错误,重新输入


查询目前停车场停车状况,包含停车号,停车位,停车位车辆,等候车辆


查询目前停车场停车信息,应付金额以及已经停车时间


显示即将离开车辆信息,搜索正在离开车辆信息,停入信息


用例入口


打开IE,在地址栏输入相应地址


进入该系统登录页面


测试用例ID


场景


测试步骤


预期结果


备注


TC1


初始页面显示


从用例入口进入


页面元素完整,显示与详细设计一致


TC2


车辆号码输入


输入已存在车辆


输入成功


TC3


号码-容错性验证


输入djidji


系统显示错误,要求重新输入


TC4


停车信息页面显示


从用例入口进入


页面信息展示完整,与详细设计一致


TC5


查询即将离开车辆


输入已存在车辆


输入成功,显示出离开车辆信息

原文地址:https://www.cnblogs.com/cocoyoyoa/p/10467877.html

时间: 2024-08-02 12:15:51

基于停车管理系统的分析与理解的相关文章

基于UML的毕业设计管理系统的分析与设计

基于UML的毕业设计管理系统的分析与设计 <本段与标题无关,自行略过 最近各种忙,天气不错,导师心情不错:"我们要写一个关于UNL的专著",一句话:"一个完整的系统贯穿整个UML的知识":我:"--o---k--".忙里偷闲,先回顾一下吧> 毕业设计是实现本科教学培养目标的重要环节,从选题到答辩一般需要四至六个月的时间,其间工作量很大,尤其需要保留大量的文件,以便于管理者对毕业设计工作进行监督.传统的.人工的方式管理各项事务和文件档案

转:基于内容的视频分析与检索

摘要 文章简要介绍了从基于内容的视频分析与检索问题的提出到所涉及的关键技术以及目前研究状况,并简要介绍了现阶段在这方面的研究热点及以后要做的工作. 一.问题的提出: 互联网的出现给人类带来了很大的便利,特别是实现资源共享之后的互联网,但面对这浩如烟海的资源到底哪些是对自己有利用价值的呢?而90年代以来,多媒体技术和网络技术的突飞猛进,人们正快速的进入一个信息化社会.现代技术已能运用各种手段采集和生产大量各种类型的多媒体信息数据,出现了数字图书馆.数字博物馆.数字电影.可视电话.交互电视.会议电视

VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然后进行转换. 概述 小程序主界面如下: 首先选择一个日期和类别,从命名上对待分析的Excel文件进行过滤.点击[浏览]选择待分析的Excel文件所在的目录, 程序中会获取所有子目录.然后点击[执行分析]就会按照左边CheckBox中的选择进行分析,分析结果显示在每一行中间.[修改配置]可以对分析规则

SSM在线停车管理系统

每天记录学习,每天会有好心情.*^_^* 最近了解了基于SSM的在线停车管理系统项目,在这个平台记录一下这个基于SSM的在线停车管理系统项目,方便以后再次使用或学习的时候能够及时的翻阅.在完成基于SSM的在线停车管理系统项目的时候,考虑了很多框架.最终决定选用SSM(MYECLIPSE),该框架具有极强的移植性,多平台性,便于操作性等优点.此框架能在MYECLIPSE开发工具中完美的编写和运行,基于SSM的在线停车管理系统为一个 后台项目.采用当前非常流行的B/S体系结构,以JSP作为开发技术,

基于社交网络的情绪化分析II

基于社交网络的情绪化分析II By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 上一篇进行了微博数据的抓取,这一篇进行数据的处理介绍. 无意义微博的定义 观察发现微博中有很多的微博是用户参与某些活动而转发的微博,比如:"SmashHit,作者:MediocreAB.推荐!"http://t.cn/8Fkgg9k":"刚刚下载了豆丁文档:项目公司运营简报模板"http://t.cn/RPjFZKf&qu

基于社交网络的情绪化分析IV

基于社交网络的情绪化分析IV By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 前面进行了微博数据的抓取,简单的处理,相似度分析,后面两篇进行学校微博的情感分析. 微博情感分析 这里试图通过字典分析的方式计算学校微博的情感倾向,主要分为积极情感,消极情感,客观. 这里字典分析的情感分析和机器学习方式进行情感分析均参考rzcoding的博客,这里只是根据他的思路和代码改装成了微博的情感分析. 字典分析 字典分析的原理是,给定一句微博,判断这句

基于tiny210的barebox分析(二)

代码分析 在上一篇文章中,我们已经对barebox的编译.烧写和运行有了一个大致的了解, 现在我们就要开始学习代码了. arch/arm/cpu/start.c line126 void __naked __section(.text_entry) start(void) { barebox_arm_head(); } 一般的bootloader都会以一个汇编文件作为起始,但是barebox没有这样. 这个c函数作为了整个iamge的入口,关键是__section(.text_entry)和ld

基于Qt的信号分析简单应用软件的设计

一.需求描述: 1.读取data.asc文件,分析其连续性: 2.绘制信号图像,并保存. 二.UI界面组成: 该应用的UI由以下几个控件组成: 3个PushButton:打开文件.图像保存.退出: 1个Combox:下拉框用于信号的选择: 1个Widget:用于确定绘图区域的坐标,并在Widget部件上绘制图像曲线. 3个Label:用于标注注释,及坐标轴 三.主要功能的实现 信号分析结果如下: 其中最主要的涉及信号数据的标准化处理,标准化处理计算公式: std=(当前信号值-此类信号的最小值)

基于社交网络的情绪化分析III

基于社交网络的情绪化分析III By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 前面进行了微博数据的抓取,简单的处理,这一篇进行学校微博的相似度分析. 微博相似度分析 这里试图计算任意两个学校之间的微博用词的相似度. 思路:首先对学校微博进行分词,遍历获取每个学校的高频用词词典,组建用词基向量,使用该基向量构建每个学校的用词向量,最后使用TF-IDF算法和余弦函数计算两个学校微博之间的相似度. 注:TF-IDF算法和余弦函数使用可以参照我