📄 停车场管理系统.cpp
字号:
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
///计时,补上
#include<time.h>
///
#define stack_init_size 10
#define stackincrement 10
#define OK 1
#define ERROR 0
#define chewei 5 //停车场车位个数/
typedef int status;
typedef long selemtype;
typedef long qelemtype;
//栈。
typedef struct{
selemtype stack_size;
long *base;
long*top;
}sqstack;
status initstack(sqstack &s){//新新建空栈
s.base=(long *)malloc(stack_init_size * sizeof(long));
if(!s.base)return 0;
s.top=s.base;
s.stack_size=stack_init_size;
return OK;
}
status push(sqstack &s,selemtype e){//在栈中插入元素。
if((s.top-s.base)>=s.stack_size){//栈满。追加空间
s.base=(selemtype *)realloc(s.base,(s.stack_size+stackincrement) * sizeof(selemtype));
if(!s.base)return 0;
s.top=s.base+s.stack_size;
}
*s.top++ =e;
return OK;
}
status pop(sqstack &s,selemtype &e){//出栈
if(s.top ==s.base)return ERROR;
e= * --s.top;
return OK;
}
int length(sqstack s){//栈长度
return s.top-s.base;
}
int chazhao(sqstack s,selemtype id){//查找元素在栈中的位置
long *bb;bb=s.base;int bbb=0;
int eqe;eqe=length(s);
for(int ii=1;ii<=eqe;ii++){
if(*bb==id){bbb=1;break;}
bb++;
}
if(bbb=0)return 0;
else if(ii>eqe)return 0;
else return ii;
}
void xianshi(sqstack s){//显示栈内所有元素
long *rr;rr=s.base;
if(s.top ==s.base)cout<<"停车场内没有车辆\n";
for(int iii=1;iii<=s.top-s.base;iii++){
cout<<*rr<<" ";
rr++;
}
cout<<"\n";
return;
}
//队列
#define null 0
typedef struct Qnode{
qelemtype data;
struct Qnode *next;
}Qnode, *QueuePtr;
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}linkqueue;
status initqueue(linkqueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode));
if(!Q.front)return ERROR;
Q.front->next=null;
return OK;
}
status enqueue(linkqueue &Q,qelemtype c){//插入元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(Qnode));
if(!p)return ERROR;
p->data=c;p->next = null;
Q.rear->next=p;
Q.rear=p;
if(Q.front->next==null)Q.front->next=p;
return OK;
}
status dequeue(linkqueue &Q,qelemtype &ee){//删除元素
if(Q.front==Q.rear)return ERROR;
QueuePtr p;
p=Q.front->next;
ee=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return OK;
}
status changdu(linkqueue Q){//取得队列的长度
if(Q.front->next==null)return 0;
else if(Q.front==Q.rear)return 1;
else{
QueuePtr h;h=Q.front->next;
for(int n=1;n<100;n++){
if(h->next==null)break;
h=h->next;}
return n;}
}
status find(linkqueue Q,qelemtype t){//查找,返回车在队列中的位置。
QueuePtr k;qelemtype l;int x=0;
if(Q.front==Q.rear)return 0;
k=Q.front->next;
l=k->data;
if(l==t)return 1;
for(int wz=2;wz<=100;wz++){if(k->next==null)break;
k=k->next;l=k->data;
if(l==t){x=1;break;}
}
if(x=0)return 0;
else if(wz>changdu(Q))return 0;
else return wz;
}
void xianshi2(linkqueue Q){//显示队列中所有元素
QueuePtr k1;
if(Q.front->next==null)return;
else{k1=Q.front->next;
for(int n1=1;;n1++){
cout<<k1->data<<" ";
if(k1->next==null)break;
k1=k1->next;
}
}
cout<<"\n";
return;
}
//计费用结构体.后来补上
struct jifei{
long idche;//车牌号
time_t jinruahijian;//此车的进入时间
int full; //判断结构体变量是否写入停车进入时间信息
}caitime[chewei];
//输入转化把字符转换为数字
long convert(char cid1[6]){
long result=0;
for (int cl=0;cl<=6;cl++)
{
if (cid1[cl]=='\0') break;
if (cid1[cl]<'0' || cid1[cl]>'9') {return -1;}
result=result*10+(cid1[cl])-48;
}//把字符串转化为数值,这样的好处是当输入字符串等非正常信息时不会死循环
return result;
}
int buzhijielikai(long carid,linkqueue &Q,sqstack &s,long &e,long &ee){
long linshichedao[chewei];int pl;int lth;
lth=length(s);
pl=chazhao(s,carid);
int n2;
for(n2=0;n2<lth-pl;n2++){pop(s,e);linshichedao[n2]=e;}//出栈lth-pl次,把指定车辆后面的车都出栈赋给数组
pop(s,e);//指定车辆出栈
for(;n2>0;n2--){push(s,linshichedao[n2-1]);}//数组数据再进栈
if(changdu(Q)!=0){dequeue(Q,ee);push(s,ee);
cout<<endl<<"便道里的车"<<ee<<"已经进入车道,开始计费";
//------------------------进栈计时,补上
int h=0;
for(h=0;h<=(chewei-1);h++){if(caitime[h].full==0)break;}
caitime[h].idche=ee;
caitime[h].jinruahijian=time(NULL);
caitime[h].full=1;
//----------------以上为增加的计费模块
}
return 1;
}
int zhijielikai(linkqueue &Q,sqstack &s,long &e,long &ee){
pop(s,e);
if(changdu(Q)!=0){dequeue(Q,ee);push(s,ee);
cout<<endl<<"便道里的车"<<ee<<"已经进入车道,开始计费"<<endl;
//------------------------计时,补上
int h=0;
for(h=0;h<=(chewei-1);h++){if(caitime[h].full==0)break;}
caitime[h].idche=ee;
caitime[h].jinruahijian=time(NULL);
caitime[h].full=1;
}
//----------------以上为增加的计费模块}
return 1;
}
void menu(){
cout<<"\n";
cout<<"\n-------------------------停车场管理系统--------------------------\n";
cout<<" disigned by 黄春亮\n";
cout<<"1.进入停车场停车\n";
cout<<"2.离开停车场\n";
cout<<"3.停车场信息\n";
cout<<"4.退出系统\n";
cout<<"请选择1-4: ";
return;
}
void choose1(sqstack &s,linkqueue &Q){
char cid[6];
long cheid;
loop: cout<<"请输入你的车牌号,不大于7位: ";
cin>>cid;
cheid=convert(cid);
if(cheid==-1){cout<<"输入错误,车牌号必须是数字,请重新输入\n";goto loop;}
if((chazhao(s,cheid)!=0)||(find(Q,cheid)!=0)){cout<<"车辆已存在,请重新输入\n";goto loop;}
if(length(s)<chewei){
push(s,cheid);
//------------------------计时,补上
int h=0;
for(h=0;h<=(chewei-1);h++){if(caitime[h].full==0)break;}
caitime[h].idche=cheid;
caitime[h].jinruahijian=time(NULL);
caitime[h].full=1;
//----------------以上为增加的计费模块
int nn;nn=chazhao(s,cheid);
if(nn)cout<<"请把车停在停车场第"<<nn<<"车位,现在开始计费,谢谢合作!";
else cout<<"系统错误";
}
else {
cout<<"停车场满,";
enqueue(Q,cheid);
int wiiz;
wiiz=find(Q,cheid);
if(wiiz<=0)cout<<"系统错误";
cout<<"请停入便道"<<wiiz<<"车位,谢谢合作~!\n";
}
}
void choose2(sqstack &s,linkqueue &Q,long &e,long &ee){
char qwe[6];time_t likaishijain;int sb;
long qaz;
loop1: cout<<"请输入要离开的车牌号码: ";
cin>>qwe;
qaz=convert(qwe);
if(qaz==-1){cout<<"输入错误,车牌号必须是数字,请重新输入\n";goto loop1;}
int poi;poi=chazhao(s,qaz);
if(poi==0){
poi=find(Q,qaz);
if(poi==0){cout<<"你的车未在本停车场";return;}
else {cout<<"你的车停在本停车场便道里,此刻无法离开";return;}
}
else {
cout<<"你的车在停车场第"<<poi<<"停车位里";
if(poi==length(s)){cout<<",可以直接开走\n";
///////计时,补上
likaishijain=time(NULL);
for(sb=0;sb<=(chewei-1);sb++){if(caitime[sb].idche==qaz)break;}
cout<<"你的停车时间为(便道里不计时)"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"秒";
cout<<",每秒收费1元,请交"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"元";
caitime[sb].full=0;
cout<<endl<<"车辆已经离开\n\n";
////////
zhijielikai(Q,s,e,ee);return;}
else {
cout<<",待后面的车移入临时车道后可开走\n";
///////计时,补上
likaishijain=time(NULL);
for(sb=0;sb<=(chewei-1);sb++){if(caitime[sb].idche==qaz)break;}
cout<<"你的停车时间为(便道里不计时)"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"秒";
cout<<",每秒收费1元,请交"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"元";
caitime[sb].full=0;
cout<<endl<<"车辆已经离开\n\n";
////////
buzhijielikai(qaz,Q,s,e,ee);return;
}
}
}
void choose3(sqstack &s,linkqueue &Q){
cout<<"\n----------------------欢迎光临本停车场----------------------\n";
if(length(s)<chewei)cout<<"本停车场现在还有"<<chewei-length(s)<<"个车位";
else cout<<"本停车场车位已满,您可以把车停在便道";
cout<<"\n";
if(length(s)!=0){cout<<"停车场停车位共"<<length(s)<<"辆车\n";
cout<<"停车位里的车辆:\n";
xianshi(s);}
else cout<<"停车位是空的\n";
if(changdu(Q)!=0){
cout<<"便道里共"<<changdu(Q)<<"辆车\n";
cout<<"便道里的车辆:\n";
xianshi2(Q);}
else cout<<"便道里没有车\n";
return;
}
void main(){
long e;long ee;int quit=1;//e ee位出栈时要用到的返回值
sqstack s;linkqueue Q;char back[1];
initstack(s);
initqueue(Q);
while(quit){
menu();
char choosea[1];
cin>>choosea;
switch(choosea[0]){
case '1':choose1(s,Q);break;
case '2':choose2(s,Q,e,ee);cout<<"\n"<<"输入任何数返回\n";cin>>back;break;
case '3':choose3(s,Q);cout<<"\n"<<"输入任何数返回\n";cin>>back;break;
case '4':cout<<"谢谢使用,再见";quit=0;break;
default:cout<<"选择错误";cout<<"\n"<<"输入任何数返回\n";cin>>back;break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -