一. 课程设计题目
某停车场内只有一个可停放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 #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.Stacksize=Max_Size; return true; } bool InitQueue(Queue &Q) { Q.front=(QNode*)malloc(sizeof(QNode)); if(!Q.front) { cout<<\"队列 Q 内存分配失败!\"< 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->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<<\"队列为空!\"< } 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<<\"此栈已满,不能压入新的信息\"< bool Pop(CarStack &S1,CarNode &t)//出栈操作 { if(S1.top==S1.base) { cout<<\"栈 S1 为空,不能执行出栈操作\"< 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<<\"车号\"< EnQueue(Q,qnode);//停在通道上 ++CountForQueue; cout<<\"车号:\"< { if(SearchInStack(S1,a)) { cout<<\"车号:\"<if(SearchInQueue(Q,a)) {