包含随机数生成的停车管理系统模拟

  为了简单,赶着交,没怎么考虑便道的事情,要是车来了,没位子,自个儿找便道吧,便道都没了,那就另觅他处吧。


#include<iostream>
#include<stdlib.h>//需要用到随机数生成函数rand()
#include<ctime>//随机数种子用到(时间作为随机数种子)
using namespace std;

//时 间 类 的 定 义
class TIME
{
	friend class DOPARK;//友元类的声明,后面用到
	friend class BOSS;
private:
	int day;//天,其实可以不要,繁琐了
	int hour;
public:
	TIME(){ day=0; hour=0;}
	void settime(int x,int y){day=x;hour=y;}//设定时间
	void printtime(){cout<<"时间是: "<<day<<"日"<<hour<<"时"<<endl;}//打印时间
	void addtime(){hour++;}//每过一小时小时加1
};

/*--------------------------------------------------------------------------------*/
//car  类 的 定 义
struct CAR
{
	int name;//车名
	int number;//车位号
	int mark;//标记,表示停留时间(0,1,2,3,4)
	TIME reach;		//到来离去时间
	TIME leave;
	CAR *next;
};
/*----------------------------------------------------------------------------------*/

//收 入 统 计 类
class BOSS
{
	friend class DOPARK;//友元类声明
private:
	int car_income;
	TIME clock;
public:
	BOSS();
	void showclock();//显示当前时间
	void addclock();//时间每小时++
	void printboss();//打印收入
	void bosstest();//为了模拟而做的初始化
	void setincome(int x){car_income=car_income+x;}
};
BOSS::BOSS()				//构造函数
{
	car_income=0;
	clock.settime(5,1);
}
void BOSS::printboss()		//打印停车总量
{
	cout<<"车场总收入: "<<car_income<<endl;
}
void BOSS::showclock()
{
	clock.printtime();
}
void BOSS::addclock()
{
	clock.addtime();
}

void BOSS::bosstest()
{
	car_income=0;
}

/*-----------------------------------------------------------------------------------------------*/
//车 道 链 表 类
class DOPARK
{
private:
	CAR * head;
	int car_in;
	int length;//链表长度固定下来
public:
	DOPARK();
	void showout(CAR *q);//展示离开车辆时为了缩减规模的函数,防止重复代码
	void creat(int len);//创建30长度的车道
	void print_park();//打印车道
	void car_add();
	void car_leave(BOSS *B);//检车并打印走掉的车
	void check_park();
	void showcoming();//展示有多少辆车来到
	void car_plus();//每过一小时时对车道中的车的已停小时的+1
	void car_test();//为测试而给车道初始化
	void clear(CAR *);
};
DOPARK::DOPARK()						//构造函数
{
	head=NULL;
	car_in=0;
	length=30;
}


void DOPARK::creat(int len)				//初始化链表
{
	CAR * p1,*p2;
	int i=0;
	head=new CAR;
	head->name=-1;
	head->mark=1;
	head->number=1;
	p1=head;
	p2=head;
	while(i<len)
	{
		i++;
		p1=new CAR;
		p2->next=p1;
		head->name=-1;
		p1->mark=1;
		p1->number=i+1;
		p2=p1;
	};
	p2->next=NULL;
}

void DOPARK::print_park()			//打印车道
{
	CAR *p;
	p=head;
	while(p!=NULL)
	{
		if(p->name==-1)
		{
			p=p->next;
		}
		else
		{
			cout<<"车位号"<<p->number<<"车名"<<p->name<<endl;
			p=p->next;
		};
	}
}

void DOPARK::showout(CAR *q)				//另外设定函数缩减代码规模
{
	BOSS b;
	CAR *p;
	b.addclock();
	p=q;
	cout<<"汽车"<<p->number<<"车名"<<p->name<<"离开";
	cout<<"其到达";
	p->reach.printtime();
	cout<<"其离开";
	p->leave.printtime();
	cout<<"停车费是"<<30*p->mark<<endl;
}
void DOPARK::clear(CAR *q)//车离开后初始化车位,归零。
{
	CAR *p;
	p=q;
	p->name=-1;
	p->mark=0;
	p->reach;
	p->leave;
}

void DOPARK::car_leave(BOSS *X)				//检车并打印走掉的车,因为用到类,所以麻烦的用到了对象的指针。
{
	srand((unsigned)time(NULL));
	CAR *p;
	BOSS *BO;
	BO=X;
	int i,j;
	p=head;
	while(p!=NULL)
	{
		i=p->mark;
		switch(i)
		{
		case 1:
			{
				j=rand()%4;
				if(j==0)
				{
				showout(p);
				(*BO).setincome(30);
				clear(p);
				}
			}
			break;
		case 2:
			{
				j=rand()%2;
				if(j==0)
				{
				showout(p);
				(*BO).setincome(60);
				clear(p);
				}
			};
			break;
		case 3:
			{
				j=rand()%4;
				if(j==0||j==1||j==2)
				{
					showout(p);
					(*BO).setincome(90);
					clear(p);
				}
			};break;
		case 4:
			{
				showout(p);
				(*BO).setincome(120);
				clear(p);
			};break;
		default:break;
		}
		p=p->next;
	}
}

void DOPARK::showcoming()//展示来到的车
{
	int coming;
	srand((unsigned)time(NULL));
	coming=rand()%21;
	car_in=coming;
	cout<<"---------另外现在有"<<car_in<<"车要来----------"<<endl;
	cout<<endl;
	cout<<endl;
}
void DOPARK::car_plus()			//每过一小时时对车道中的车的已停小时的+1
{
	CAR *p;
	p=head;
	while(p!=NULL)
	{
		if(p->name==-1)
		{
			p=p->next;
		}
		else
		{
			p->mark++;
			p->leave.addtime();
			p=p->next;
		};
	};
	return ;
}
void DOPARK::car_test()			//为了测试,于是给车道初始化了。
{
	srand((unsigned)time(NULL));
	CAR *p;
	p=head;
	while(p!=NULL)
	{
		p->name=(rand()%(2000-1000)+1000);
		p->mark=0;
		p->reach.settime(5,1);
		p->leave.settime(5,1);
		p=p->next;
	}
}


void DOPARK::car_add()//车到来,加入车道
{
	srand((unsigned)time(NULL));
	int free=0;
	int temp;
	CAR *p;
	p=head;
	while(p!=NULL)					判断空位
	{
		if(p->name==-1)
		{
			free++;
		};
		p=p->next;
	};
	cout<<free<<endl;
	p=head;
	if(free==0)								//若没有空位
	{
		cout<<"车道已满!"<<endl;
	}
	else if(free>=car_in)			//空位富足
	{
		cout<<"车道充足"<<endl;
		while(p!=NULL&&car_in!=0)
		{
			if(p->name==-1)
			{
				p->name=(rand()%(2000-1000)+1000);
				p->mark=0;
				cout<<"汽车"<<p->name<<"进入"<<p->number<<"车道"<<endl;
				car_in--;
				p=p->next;
			}
			else
			{
				p=p->next;
			};
		};
	}
	else if(free<car_in)					//空位少于来车数
	{
		cout<<"只有"<<free<<"辆车能进入车道"<<endl;
		while(p!=NULL)
		{
			if(p->name==-1)
			{
				p->name=(rand()%(2000-1000)+1000);
				p->mark=0;
				cout<<"汽车"<<p->name<<"进入"<<p->number<<"车道"<<endl;
				free--;
				p=p->next;
			}
			else
			{
				p=p->next;
			}
		};
	};
}

/*-------------------------------------------------------------------------------------------------------*/
//主函数*****************************************



int main()
{
	class DOPARK x,y;
	class BOSS b;
	BOSS *B;
	B=&b;
	b.bosstest();
	x.creat(29);
	x.car_test();
	y.creat(4);
	y.car_test();



	int choice;
	while(1)
	{
		cout<<"||*******停车场管理系统*******||"<<endl;
		cout<<"    当前时间:";
		b.showclock();
		cout<<"        "<<endl;
		cout<<"1.查询当前车道情况"<<endl;
		cout<<"2.查询当前便道情况"<<endl;
		cout<<"3.查询当前总车场统计"<<endl;
		cout<<"4.我想看下一小时"<<endl;
		cout<<"5.退出系统"<<endl;
		cout<<"||*****************************||"<<endl;
		cout<<"请选择:";
		cin>>choice;
		switch(choice)
		{
		case 1:
			{
				x.print_park();
				
			};
			break;
		case 2:
			{
				y.print_park();
			};
			break;
		case 3:
			{
				b.printboss();
			};
			break;
		case 4:
			{
				b.addclock();
				x.car_plus();
				x.car_leave(B);
				x.showcoming();
				x.car_add();
			};
			break;
		case 5: exit(0);
		default: break;
		}
	}
	
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值