为了简单,赶着交,没怎么考虑便道的事情,要是车来了,没位子,自个儿找便道吧,便道都没了,那就另觅他处吧。
#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;
}