爲了簡單,趕着交,沒怎麼考慮便道的事情,要是車來了,沒位子,自個兒找便道吧,便道都沒了,那就另覓他處吧。
#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;
}