⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 停车场管理系统.cpp

📁 停车场管理系统
💻 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<<"1.进入停车场停车\n";
cout<<"2.离开停车场\n";
cout<<"3.停车场信息\n";
cout<<"4.退出系统\n";
cout<<"\n----------------------------------------------------------------\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 + -