搜索
您的当前位置:首页正文

数据结构作业停车场管理系统

来源:二三娱乐
~ 《数据结构》 课程设计 班 级 201315827 学 号 ********* 姓 名 谢东东 2015 年 9月 14日

一. 课程设计题目

某停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可

供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆汽车停放在最北端),若停车场内已经停满n辆车,则后来的汽车只能在门外的便道即候车场上等候,一旦有车开走,则排在便道上的第一辆车即可开入。 当停车场内某辆车要离开时。在它之后进入的车辆必须先退出车场为它让路,该车辆开出大门外,其它车辆再按原次序进入停车场, 每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为该停车场编制按上述要求进行管理的模拟程序。

二. 流程及图示

停车 显示信息 离开 收费 系统 查询 显示信息 退出

栈2 a 1 a 2 a 3 ……… a n 停车场(栈1)

通道(队列)

三、程序运行及截图

1.开始界面

首先是登陆界面,只要用户名跟密码一样就可以登陆,输入正确后,有一个延迟程序,让使用者感觉更真实

如果输入错误了,就是直接退出了

2.主界面 登录成功后,则是如下的功能界面:

3 . 停车场管理系统 你可以选择停车,离开,或者查看,当操作完了,可以直接选择退出。 当你输入 1 后,会提示你输入停车的车号: 在这里输入你想要停车的车号,然后会提示你停车的时间: 输入停车时间后,则会显示你刚停车的详细的信息:

4.离开 输入 2,则会提示你要离开的车号: 然后输入离开的车号后,会提示你输入该车离

开的时间,输入离开的时间,则 会出现如下界面:

5 停车场管理系统 系统则会把你刚离开的车俩的详细信息给你打印出来:拉开的车号,所用时间 以及应收的费用。这个时间管理员,可以对照表收费了。

6.查看 当你要查看停车场所停车的信息时,你可以选择 3。同样,选择 3 确定后会提 示你要查看的车号,然后则会把信息打印在界面上: 系统会告诉你这俩停在停车场里面的那个位置上。

7.退出 当你一切操作完了后,就可以选择退出了,输入 4 停车场管理系统 随便按个键就退出该系统了。

四、程序代码

#include #include #include #include #include #include #include using namespace std;

#define Max_Size 2//停车的最大容量 #define HourFare 2 //每小时的停车费用 int CountForStack=0; //栈里现有的车数 int CountForQueue=0; //排队等候的车数 typedef struct {

char Condition;//到达或者离开的状态

int Arrivetime;//到达时间,默认为-1,表示没有到达 int Leavetime;//离开时间,默认为-1,表示没有离开 int License;//车牌号 } CarNode;//保存每辆车的信息 typedef struct//栈的定义 {

CarNode *base;//栈底指针 CarNode *top;//栈顶指针 int Stacksize;//栈的最大容量 }

CarStack;

typedef struct QNode { char Condition;//到达或者离开的状态

int Arrivetime;//到达时间,默认为-1,表示没有到达 int Leavetime;//离开时间,默认为-1,表示没有离开 int License;//车牌号 QNode *next; }

QNode;

typedef struct//队列的定义 {

QNode *front;//对头指针 QNode * rear;//队尾指针 }

Queue;

bool InitStack(CarStack &S1)//初始化栈 S1 {

S1.base=(CarNode*)malloc(Max_Size*sizeof(CarNode)); if(!S1.base) { cout<<\"栈 S1 内存分配失败\"<S1.top=S1.base;

S1.Stacksize=Max_Size; return true; }

bool InitQueue(Queue &Q) { Q.front=(QNode*)malloc(sizeof(QNode)); if(!Q.front)

{

cout<<\"队列 Q 内存分配失败!\"<Q.rear=Q.front;

Q.front->next=NULL; return true; }

bool EnQueue(Queue &Q,QNode &e)//插入元素 e 为 Q 的新的队尾元素 {

QNode *p=(QNode *)malloc(sizeof(QNode)); if(!p) { cout<<\"p 内存分配失败\"<p->Arrivetime=e.Arrivetime; p->Leavetime=e.Leavetime; p->Condition=e.Condition;

p->License=e.License;//将 e 赋给 P p->next=NULL; Q.rear->next=p; Q.rear=p; return true; }

bool DeQueue(Queue &Q,QNode &t)//出队列函数 { if(Q.front==Q.rear) { cout<<\"队列为空!\"<next; t.Arrivetime=p->Arrivetime; t.Condition=p->Condition; t.Leavetime=p->Leavetime; t.License=p->License; Q.front->next=p->next; if(Q.rear==p) { Q.rear=Q.front; } free(p); return true;

}

void InitCarNode(CarNode &C,char condition,int arrivetime,int leavetime,int license) { C.Arrivetime=arrivetime; C.Condition=condition; C.Leavetime=leavetime; C.License=license; }

bool Push(CarStack &S1,CarNode &car)//插入新的元素 car 为的栈顶元素 { if(S1.top-S1.base>=S1.Stacksize) { }

cout<<\"此栈已满,不能压入新的信息\"<(*S1.top).Arrivetime=car.Arrivetime; (*S1.top).Condition=car.Condition; (*S1.top).Leavetime=car.Leavetime; (*S1.top).License=car.License; ++S1.top;//栈顶指针上移 return true;

bool Pop(CarStack &S1,CarNode &t)//出栈操作 { if(S1.top==S1.base) { cout<<\"栈 S1 为空,不能执行出栈操作\"<bool IsStackFull(CarStack &S1)//判断 S1 栈是否已满 { if(S1.top-S1.base>=S1.Stacksize) return true; else return false; }

bool IsStackEmpty(CarStack &S1)//判断 S1 栈是否已空

{ if(S1.top==S1.base) return true; else return false; }

bool IsQueueEmpty(Queue &Q)//判断队列是否为空 { if(Q.front==Q.rear) return true; else return false; }

bool SearchInStack(CarStack &S1,int a)//a 表示要查找的车牌号,如果在停车场里 面,就返回 true { bool tag=false; if(!IsStackEmpty(S1))//如果栈 S1 非空 { CarNode *p=S1.top-1; while(p!=S1.base) { if((*p).License==a) tag=true; --p; } if((*p).License==a) tag=true; } return tag; }

bool SearchInQueue(Queue &Q,int a)//a 表示要查找的车牌号,如果在通道里面,就 返回 true { bool tag=false; if(!IsQueueEmpty(Q))//如果队列非空 { QNode *p=Q.front->next; while(p!=Q.rear) { if((*p).License ==a) tag=true; p=p->next; }//退出此 while 循环时 p 指向最后一个元素

}

if((*p).License ==a) tag=true; }

return tag;

void InCar(CarStack &S1,Queue &Q,int a1,int a2)//表示进入车辆,a1 表示到达时 间,a2 表示车牌号码 { if(SearchInStack(S1,a2)) {

cout<<\"车号\"<if(SearchInQueue(Q,a2)) { cout<<\"车号\"<if(IsStackFull(S1))//如果堆栈已满,说明停车场已满,需要停车在通道里面 { QNode qnode; qnode.Arrivetime=-1;//在通道里面不收费,所以不计时 qnode.Condition='A'; qnode.Leavetime=-1;//定义为-1,说明还没有开始离开 qnode.License=a2;

EnQueue(Q,qnode);//停在通道上 ++CountForQueue;

cout<<\"车号:\"<void Sreach(CarStack &S1,Queue &Q,int a)

{

if(SearchInStack(S1,a)) { cout<<\"车号:\"<if(SearchInQueue(Q,a)) {

cout<<\"停车场已满,车号\"<void OutCar(CarStack &S1,Queue &Q,int a1,int a2)//出车函数,a1 表示离开时间, a2 表示车牌号码 { if(SearchInQueue(Q,a2)) { cout<<\"车号\"<CarStack tempstack;

InitStack(tempstack);//新建一个栈,存放让路的汽车

bool tag1=false;//标志这个停车场出车以前是否已满,默认为没有满 tag1=IsStackFull(S1);

bool tag2=true;//标志通道是否有汽车在等待,默认为通道为空 tag2=IsQueueEmpty(Q); CarNode temp;//用来保存暂时取出的汽车 bool tag3=false; while(1) { Pop(S1,temp); if(temp.License==a2) { if(a1{

cout<<\"离开失败!\"<QNode tempqnode;//用来暂时保存从通道出来的汽车

if(tag1==true&&tag2==false&&tag3==false)//如果出车前停车场已满,并且通 道不为空,并且离开没有失败 { DeQueue(Q,tempqnode); --CountForQueue; temp.Arrivetime=a1; temp.Condition=tempqnode.Condition; temp.Leavetime=tempqnode.Leavetime; temp.License=tempqnode.License; Push(S1,temp); }

if(tag3==false)//如果停车通道是空的,停车场没有满,并且离开成功 { --CountForStack; } } }

void showmenu(CarStack &S1,Queue &Q) { cout<<\"******************************选择菜单 *******************************\"<cout<<\" 2: 离开停车场\"<>tag; while(tag!=1&&tag!=2&&tag!=3&&tag!=4) cin>>tag; int a1; unsigned int a2; switch(tag) { case 1:

cout<<\"请输入到达的车号:\"<>a1;

请按键选择

cout<<\"请输入到达的时间:\"<>a2; InCar(S1,Q,a2,a1); Sreach(S1,Q,a1); break; case 2:

cout<<\"请输入离开的车号:\"<>a1; cout<<\"请输入离开的时间:\"<>a2; OutCar(S1,Q,a2,a1); break; case 3:

cout<<\"请输入你要查看的车号:\"<>a1; Sreach(S1,Q,a1); break; case 4: return; break; } showmenu(S1,Q); }

void loging(CarStack &S1,Queue &Q) { char Administrator[15],password[15]; int a; printf(\"\*****************************************************\\n\"); printf(\"\*****************************************************\\n\"); printf(\"\** **\\n\");

printf(\"\** 欢迎使用停车场管理系统 **\\n\"); printf(\"\** **\\n\"); printf(\"\** **\\n\"); printf(\"\*****************************************************\\n\"); printf(\"\*****************************************************\\n\"); printf(\"\\n\(提示:账号跟密码一样就行)\"); printf(\"\\n\\n\\n\\n\ 请输入管理员帐号:\"); fflush(stdin);

gets(Administrator);

printf(\"\\\\\\\\\\\ 请输入密码:\"); fflush(stdin);

gets(password); //比较用户名和密码

if(strcmp(Administrator,Administrator) == 0 && strcmp(password,Administrator) == 0) { printf(\"\\n\\n\\\ 您已成功登陆,请稍侯!\\n\\n\\\\"); // 延迟 for(a = 0;a<20;a++) { printf(\">\"); Sleep(150); } //进入页面时清屏 system(\"cls\"); showmenu(S1,Q); } else printf(\"\\n\\n\\\ 您输入的帐号或者密码错误!\\n\\n\\\\"); return; }

void main() {

CarStack carstack;

InitStack(carstack);//建立并且初始化用于停车场的堆栈 Queue carQueue;

InitQueue(carQueue);//建立并且初始化用于通道的队列 loging(carstack,carQueue); }

五、心的体会

在生活与工作中许多领域都用到数据结构,但关键是如何将问题模型转换,变

换成我们熟知的知识应用,即抽象具体化。首先是要把所学的知识重新好 好巩固下,其次,每次课程设计总会有些东西不懂的,这时我们就要上网去查资 料,这样会让我们养成一个好的自主学习的习惯。这次的课程设计,我开始是分 析了这个系统需要做些什么,然后分析要用到哪些代码,哪些结构,哪些算法开 实

现这些功能。它让我明白了栈和队列实 际会用在哪些方面,同时我有些不懂的,我会看书,或是在网上找,慢慢的也增 加了自己的知识量。 这次的停车场系统做的很简单,和真正的停车场系统来比,根本就不算什么 了。真正的停车场是不会那么退出停车场的,每次离开都要人家后面的让道,还不被人骂么?不过这次只是一次小小的试手,更难得还在后面,因此我们也需不断学习充实自己。

六、参考资料

Visual c++程序设计 数据结构(c++版)

因篇幅问题不能全部显示,请点此查看更多更全内容

Top