包含隨機數生成的停車管理系統模擬

  爲了簡單,趕着交,沒怎麼考慮便道的事情,要是車來了,沒位子,自個兒找便道吧,便道都沒了,那就另覓他處吧。


#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章