#include <bits/stdc++.h>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int N,flag1=0,flag2=0;
map<string,bool>mp;//输入相同车牌号提示输入错误
//时间
typedef struct Time{
int Year=0,Month=0,Day=0,Hour=0,Minute=0;
}Time;
//车(车牌号、车型、驶入时间、驶出时间)
typedef struct Car {
string CarNumber="",CarSize="";
Time BeginTime,EndTime;
bool tog=0;//标记是否进入停车场,分类计算收费
}Car;
//大、中、小停车场(数组模拟栈)
//大型车位
typedef struct LParkingLot{
Car LargeSpace[20];
int topLarge=-1;
}LParkingLot;
//中型车位
typedef struct MParkingLot{
Car MiddleSpace[20];
int topMiddle=-1;
}MParkingLot;
//小型车位
typedef struct SParkingLot{
Car SmallSpace[20];
int topSmall=-1;
}SParkingLot;
//便道(链式队列)
typedef struct node{
Car data;
struct node *next=NULL;
}node;//结点
typedef struct Roadway{
node *head=NULL,*tail=NULL;
}Roadway;
//新建便道
Roadway* InitRoadway(){
Roadway* p=new Roadway();
node* q=new node();
p->head=q;
p->tail=q;//头指针与尾指针均指向同一个结点
q->next=NULL;
return p;
}
//打印时间
void TimePrint(Time x){
cout<<x.Year<<"年"<<x.Month<<"月"<<x.Day<<"日"<<x.Hour<<"时"<<x.Minute<<"分"<<"\n";
}
//打印车牌号
void CarNumberPrint(Car x){
cout<<"车牌号为:"<<x.CarNumber<<"\n";
}
//进停车场(大、中、小)
LParkingLot* PutLParkingLot(LParkingLot* Lpl,Car car){
Lpl->LargeSpace[++Lpl->topLarge]=car;//栈顶指针初始赋-1,入栈时栈顶指针先加1
CarNumberPrint(car);
cout<<"驶入时间为:";
TimePrint(car.BeginTime);
car.tog=1;//打标记,标记汽车进入停车场
return Lpl;
}
MParkingLot* PutMParkingLot(MParkingLot* Mpl,Car car){
Mpl->MiddleSpace[++Mpl->topMiddle]=car;
CarNumberPrint(car);
cout<<"驶入时间为:";
TimePrint(car.BeginTime);
car.tog=1;//打标记
return Mpl;
}
SParkingLot* PutSParkingLot(SParkingLot* Spl,Car car){
Spl->SmallSpace[++Spl->topSmall]=car;
CarNumberPrint(car);
cout<<"驶入时间为:";
TimePrint(car.BeginTime);
car.tog=1;//打标记
return Spl;
}
//出停车场(大、中、小)
LParkingLot* OutLParkingLot(LParkingLot* Lpl,Car car){
LParkingLot* giveway=new LParkingLot();//新建一个临时停车栈
while(Lpl->LargeSpace[Lpl->topLarge].CarNumber!=car.CarNumber){//停车场内其他车给要退出的车让路
giveway->LargeSpace[++giveway->topLarge]=Lpl->LargeSpace[Lpl->topLarge--];
}
while(giveway->topLarge!=-1){//让路的车按原次序进入停车场
Lpl->LargeSpace[Lpl->topLarge++]=giveway->LargeSpace[giveway->topLarge--];
}
Lpl->topLarge--;
mp[car.CarNumber]=0;//重置
return Lpl;
}
MParkingLot* OutMParkingLot(MParkingLot* Mpl,Car car){
MParkingLot* giveway=new MParkingLot();
while(Mpl->MiddleSpace[Mpl->topMiddle].CarNumber!=car.CarNumber){
giveway->MiddleSpace[++giveway->topMiddle]=Mpl->MiddleSpace[Mpl->topMiddle--];
}
while(giveway->topMiddle!=-1){
Mpl->MiddleSpace[Mpl->topMiddle++]=giveway->MiddleSpace[giveway->topMiddle--];
}
Mpl->topMiddle--;
mp[car.CarNumber]=0;//重置
return Mpl;
}
SParkingLot* OutSParkingLot(SParkingLot* Spl,Car car){
SParkingLot* giveway=new SParkingLot();
while(Spl->SmallSpace[Spl->topSmall].CarNumber!=car.CarNumber){
giveway->SmallSpace[++giveway->topSmall]=Spl->SmallSpace[Spl->topSmall--];
}
while(giveway->topSmall!=-1){
Spl->SmallSpace[Spl->topSmall++]=giveway->SmallSpace[giveway->topSmall--];
}
Spl->topSmall--;
mp[car.CarNumber]=0;//重置
return Spl;
}
//入队列
Roadway* PutRoadway(Car car,Roadway* p){
cout<<"已驶入便道!"<<"\n";
if(p->head->next==NULL){//若头结点后无结点,使用头插法
node* u=new node();
u->data=car;
p->head->next=u;
p->tail=p->head->next;
return p;
}
else{//若头结点后有结点,使用尾插法
node* q=new node();
q->data=car;
p->tail->next=q;
p->tail=q;
return p;
}
}
//判断车的位置
int flag=0;//位置标记,0表示不在停车场内,1表示在大型停车位,2表示在中型停车位,3表示在小型停车位
Car Search(LParkingLot* Lpl,MParkingLot* Mpl,SParkingLot* Spl,Roadway* rd,Car car){
//在停车场内找
for(int i=0;i<=Lpl->topLarge;i++){
if(Lpl->LargeSpace[i].CarNumber==car.CarNumber){
cout<<"车在停车场内第"<<i+1<<"号车位"<<"\n";
flag=1;
return Lpl->LargeSpace[i];
}
}
for(int i=0;i<=Mpl->topMiddle;i++){
if(Mpl->MiddleSpace[i].CarNumber==car.CarNumber){
cout<<"车在停车场内第"<<i+1+N<<"号车位"<<"\n";
flag=2;
return Mpl->MiddleSpace[i];
}
}
for(int i=0;i<=Spl->topSmall;i++){
if(Spl->SmallSpace[i].CarNumber==car.CarNumber){
cout<<"车在停车场内第"<<i+1+2*N<<"号车位"<<"\n";
flag=3;
return Spl->SmallSpace[i];
}
}
//在便道找
int ver=0;
node* p=rd->head->next;
while(car.CarNumber!=p->data.CarNumber&&p->next!=NULL){
p=p->next;
ver++;
}
cout<<"车在便道的第"<<ver+1<<"号车位"<<"\n";
return p->data;
}
//计算费用
int MoneyCalculate(Car car,int Lfee,int Mfee,int Sfee){
int money=0;
struct tm t1,t2;
t1.tm_min = car.BeginTime.Minute;
t1.tm_hour = car.BeginTime.Hour;
t1.tm_mday = car.BeginTime.Day;
t1.tm_mon = car.BeginTime.Month;
t1.tm_year = car.BeginTime.Year-1900;
t2.tm_min = car.EndTime.Minute;
t2.tm_hour = car.EndTime.Hour;
t2.tm_mday = car.EndTime.Day;
t2.tm_mon = car.EndTime.Month;
t2.tm_year = car.EndTime.Year-1900;
time_t now1=mktime(&t1);
time_t now2=mktime(&t2);
time_t now3;
now3=difftime(now2,now1);
tm *ltm = gmtime(&now3);
if(car.CarSize=="L"){
if(ltm->tm_min>=30)
money=Lfee*24*30*12*(ltm->tm_year-70)+Lfee*24*30*(ltm->tm_mon)+Lfee*24*(ltm->tm_mday-1)+Lfee*(ltm->tm_hour)+Lfee;
else money=Lfee*24*30*12*(ltm->tm_year-70)+Lfee*24*30*(ltm->tm_mon)+Lfee*24*(ltm->tm_mday-1)+Lfee*(ltm->tm_hour);
}
if(car.CarSize=="M"){
if(ltm->tm_min>=30)
money=Mfee*24*30*12*(ltm->tm_year-70)+Mfee*24*30*(ltm->tm_mon)+Mfee*24*(ltm->tm_mday-1)+Mfee*(ltm->tm_hour)+Mfee;
else money=Mfee*24*30*12*(ltm->tm_year-70)+Mfee*24*30*(ltm->tm_mon)+Mfee*24*(ltm->tm_mday-1)+Mfee*(ltm->tm_hour);
}
if(car.CarSize=="S"){
if(ltm->tm_min>=30)
money=Sfee*24*30*12*(ltm->tm_year-70)+Sfee*24*30*(ltm->tm_mon)+Sfee*24*(ltm->tm_mday-1)+Sfee*(ltm->tm_hour)+Sfee;
else money=Sfee*24*30*12*(ltm->tm_year-70)+Sfee*24*30*(ltm->tm_mon)+Sfee*24*(ltm->tm_mday-1)+Sfee*(ltm->tm_hour);
}
return money;
}
//收费提示牌
void feePrint(Car car,int Lfee,int Mfee,int Sfee){
cout<<"车牌号为:"<<car.CarNumber<<"\n";
cout<<"驶入时间为:";
TimePrint(car.BeginTime);
cout<<"驶出时间为:";
TimePrint(car.EndTime);
//离开时仍在便道费用为0元
if (!flag){
cout<<"未进入停车场内,应缴费0元!"<<"\n";
}else {
int money=MoneyCalculate(car,Lfee,Mfee,Sfee);
cout<<"应缴纳:"<<money<<"元"<<"\n";
car.tog=0;//重置
}
}
void FunctionWindow() {
cout<<"*** 欢迎您进入 简洁版停车场管理系统功能界面 ***\n\n"
<<"停车场不同类型的停车位收费标准不同,且上一级别的车不能在下一级别的停车位停车"<<"\n"
<<"停车场超过半小时按一小时收费"<<"\n"
<<"输入序号选择您需要的功能:\n\n"
<<"1.车辆 进/出 停车场 2.显示停车场基本信息\n"
<<"3.查询当前停车场内车辆信息 4.查看便道车辆信息\n"
<<"5.清空停车场车辆 6.查看停车场车位余量\n"
<<"7.清空便道车辆 8.停止停车场开放\n\n";
}
//1.车辆进出
void load(LParkingLot* Lpl,MParkingLot* Mpl,SParkingLot* Spl,Roadway* rd,Car car,int Lfee,int Mfee,int Sfee){
char Operator;
cout<<"停车请按A"<<"\n";
cout<<"取车请按D"<<"\n";
cout<<"需要结束程序请按E"<<"\n";
while (1){
cin>>Operator;
if (Operator=='E') {
mp.clear();//初始化
break;
}
else if (Operator=='A'){
cout<<"请输入车牌号:";
cin>>car.CarNumber;
cout<<"请输入车型(L、M、S):";
cin>>car.CarSize;
cout<<"请输入停车时间(年、月、日、时、分):";
cin>>car.BeginTime.Year>>car.BeginTime.Month>>car.BeginTime.Day>>car.BeginTime.Hour>>car.BeginTime.Minute;
cout<<endl;
if (!mp[car.CarNumber])
{
mp[car.CarNumber]=1;//打标记
}else
{
cout<<"车牌号输入错误,请重新输入!"<<"\n";
continue;
}
if (car.CarSize=="L")
{
if(Lpl->topLarge==N-1)
{
flag1=1;
PutRoadway(car,rd);
}
else
{
PutLParkingLot(Lpl,car);
}
}
else if (car.CarSize=="M")
{
if(Mpl->topMiddle==N-1)
{
if (Lpl->topLarge==N-1)
{
flag1=1;
PutRoadway(car,rd);
}
else
{
PutLParkingLot(Lpl,car);
}
}
else
{
PutMParkingLot(Mpl,car);
}
}
else if (car.CarSize=="S")
{
if(Spl->topSmall==N-1)
{
if (Mpl->topMiddle==N-1)
{
if (Lpl->topLarge==N-1)
{
flag1=1;
PutRoadway(car,rd);
}
else
{
PutLParkingLot(Lpl,car);
}
}
else
{
PutMParkingLot(Mpl,car);
}
}
else
{
PutSParkingLot(Spl,car);
}
}
else
{
mp[car.CarNumber]=0;//重置
cout<<"输入错误,请重新输入!"<<"\n";
}
if(flag1==0)
{
//1、创建流对象
fstream fs; //可输入输出
//2、指定打开方式
fs.open("D:\\tingchechang.txt", ios::out|ios::app);
//3、文件写入
fs<<car.CarNumber<<" "<<car.CarSize<<"\n";
//<<car.BeginTime.Year<<"年"<<car.BeginTime.Month<<"月"<<car.BeginTime.Day<<"日"<<car.BeginTime.Hour<<"时"<<car.BeginTime.Minute<<"分"<<"\n";
fs.close();
}
else {
flag1=0;
//1、创建流对象
fstream fs; //可输入输出
//2、指定打开方式
fs.open("D:\\biandao.txt", ios::out|ios::app);
//3、文件写入
fs<<car.CarNumber<<" "<<car.CarSize<<"\n";
//<<car.BeginTime.Year<<"年"<<car.BeginTime.Month<<"月"<<car.BeginTime.Day<<"日"<<car.BeginTime.Hour<<"时"<<car.BeginTime.Minute<<"分"<<"\n";
fs.close();
}
}
//取车
else if (Operator=='D'){
cout<<"请输入车牌号:"<<"\n";
cin>>car.CarNumber;
//判断车是否在停车场和便道内
if (!mp[car.CarNumber]){
cout<<"未查询到车辆信息!"<<"\n";
continue;
}
car=Search(Lpl,Mpl,Spl,rd,car);//先找到车的位置
if (!flag){
cout<<"车在便道内!";
flag2=1;//标记车在便道内
//出队列
node* p=rd->head;
node* q=p->next;
while(q!=NULL)//遍历链表
{
Car outcar=q->data;
if (outcar.CarNumber==car.CarNumber)//找到要删除的结点
{
p->next=q->next;
free(q);
q=p->next;
break;
}
p=q;
q=q->next;
}
feePrint(car,Lfee,Mfee,Sfee);
mp[car.CarNumber]=0;//重置
continue;
}
else if (flag==1){
OutLParkingLot(Lpl,car);
}
else if (flag==2){
OutMParkingLot(Mpl,car);
}
else if(flag==3){
OutSParkingLot(Spl,car);
}
cout<<"请输入取车时间(年、月、日、时、分):";
cin>>car.EndTime.Year>>car.EndTime.Month>>car.EndTime.Day>>car.EndTime.Hour>>car.EndTime.Minute;
feePrint(car,Lfee,Mfee,Sfee);
//flag2标记取停车场还是便道的车辆
if(flag2==0)
{//取车时要删除文件中的某项内容
fstream in("D:\\tingchechang.txt", ios::in);//原文件
fstream out("D:\\temp.txt", ios::out);//中间文件
string name, pass, str, estr;
str = car.CarNumber.append(" ").append(car.CarSize);
//append(car.BeginTime.Year).append("年").append(car.BeginTime.Month).append("月").append(car.BeginTime.Day).append("日").append(car.BeginTime.Hour).append("时").append(car.BeginTime.Minute).append("分");//test.txt中需要删除的某一行内容,可根据自己的需要修改
while (getline(in, estr))//得到tingchechang.txt中一行的内容
{
if (!estr.compare(str))//比较tengchechang.txt每一行的内容和要删除的是否一致,一致就跳过
continue;
out << estr << "\n";//不一致的内容写到temp.txt中,注意换行
}
in.close();//关闭流
out.close();
fstream outfile("D:\\tingchechang.txt", ios::out);
fstream infile("D:\\temp.txt", ios::in);
while (getline(infile, estr)) //将temp.txt的内容写到停车场.txt
{
outfile<< estr << "\n";
}
const char* path = "D:\\temp.txt";
remove(path);//删除temp.txt
outfile.close();//关闭流
infile.close();
}
else
{
flag2=0;
//取车时要删除文件中的某项内容
fstream in("D:\\biandao.txt", ios::in);//原文件
fstream out("D:\\temp1.txt", ios::out);//中间文件
string name, pass, str, estr;
str = car.CarNumber.append(" ").append(car.CarSize);
//append(car.BeginTime.Year).append("年").append(car.BeginTime.Month).append("月").append(car.BeginTime.Day).append("日").append(car.BeginTime.Hour).append("时").append(car.BeginTime.Minute).append("分");//test.txt中需要删除的某一行内容,可根据自己的需要修改
while (getline(in, estr))//得到biandao.txt中一行的内容
{
if (!estr.compare(str))//比较biandao.txt每一行的内容和要删除的是否一致,一致就跳过
continue;
out << estr << "\n";//不一致的内容写到temp.txt中,注意换行
}
in.close();//关闭流
out.close();
fstream outfile("D:\\biandao.txt", ios::out);
fstream infile("D:\\temp1.txt", ios::in);
while (getline(infile, estr)) //将temp.txt的内容写到biandao.txt
{
outfile<< estr << "\n";
}
const char* path = "D:\\temp1.txt";
remove(path);//删除temp.txt
outfile.close();//关闭流
infile.close();
}
flag=0;//重置位置标记
//便道上的车驶入停车场
node* p=rd->head;
node* q=p->next;
while(q!=NULL){
//停车场内没有余位时,便道内的车停止进入
if ((Lpl->topLarge==N-1)&&(Mpl->topMiddle==N-1)&&(Spl->topSmall==N-1)){
break;
}
Car outcar=q->data;
if (outcar.CarSize=="L"){
if (Lpl->topLarge==N-1){
p=q;
q=q->next;
}
else {
PutLParkingLot(Lpl,outcar);
p->next=q->next;
free(q);
q=p->next;
}
}
else if (outcar.CarSize=="M"){
if (Mpl->topMiddle==N-1){
if (Lpl->topLarge==N-1){
p=q;
q=q->next;
}
else {
PutLParkingLot(Lpl,outcar);
p->next=q->next;
free(q);
q=p->next;
}
}
else {
PutMParkingLot(Mpl,outcar);
p->next=q->next;
free(q);
q=p->next;
}
}
else if(outcar.CarSize=="S"){
if (Spl->topSmall==N-1){
if (Mpl->topMiddle==N-1){
if (Lpl->topLarge==N-1){
p=q;
q=q->next;
}
else {
PutLParkingLot(Lpl,outcar);
p->next=q->next;
free(q);
q=p->next;
}
}
else {
PutMParkingLot(Mpl,outcar);
p->next=q->next;
free(q);
q=p->next;
}
}
else {
PutSParkingLot(Spl,outcar);
p->next=q->next;
free(q);
q=p->next;
}
}
}
}
}
}
//2.显示停车场基本信息
void parkInformation(int N,int Lfee,int Mfee,int Sfee)
{
cout<<"\n Name:Vehicle parking area"
<<"\n Number of parking spaces: "
<<N<<"(大型停车位数量) "
<<N<<"(中型停车位数量) "
<<N<<"(小型停车位数量) "
<<"\n Hourly parking fee: "
<<Lfee<<"(大型停车位收费) "
<<Mfee<<"(中型停车位收费) "
<<Sfee<<"(小型停车位收费) "<<endl;
}
//3.查询当前停车场内车辆信息
void seeCarInformation(LParkingLot* Lpl,MParkingLot* Mpl,SParkingLot* Spl,Car car)
{
int l=Lpl->topLarge;
int m=Mpl->topMiddle;
int s=Spl->topSmall;//定义三个整型变量表示栈顶指针数值
if(l==-1&&m==-1&&s==-1) cout<<"\n停车场内无车辆存在!\n";
else
{
cout<<"--------------------------------------------------\n"
<<" 车型(L M S) | 车牌号 | 进入时间 \n";
while(l!=-1)
{
cout<<" L | "<<Lpl->LargeSpace[l].CarNumber<<" | ";
TimePrint(Lpl->LargeSpace[l].BeginTime);
cout<<endl;
l--;//逐个遍历
}
while(m!=-1)
{
cout<<" M | "<<Mpl->MiddleSpace[m].CarNumber<<" | ";
TimePrint(Mpl->MiddleSpace[m].BeginTime);
cout<<endl;
m--;//逐个遍历
}
while(s!=-1)
{
cout<<" S | "<<Spl->SmallSpace[s].CarNumber<<" | ";
TimePrint(Spl->SmallSpace[s].BeginTime);
cout<<endl;
s--;//逐个遍历
}
}
}
//4.查看便道车辆信息
void pavementCarInformation(Roadway* rd)
{
node* r=new node();
r=rd->head->next;
if(r==NULL)
{
cout<<"\n便道内无车辆存在!\n";
}
cout<<"--------------------------------------------------\n"
<<" 车型(L M S) | 车牌号 | 进入时间 \n";
while(r!=NULL)
{
cout<<" "<<r->data.CarSize<<" | "<<r->data.CarNumber<<" ";
TimePrint(r->data.BeginTime);
r=r->next;//后移遍历
}
cout<<"--------------------------------------------------\n\n";
}
//5.清空停车场车辆
void emptyParking(LParkingLot* Lpl,MParkingLot* Mpl,SParkingLot* Spl) {
while(Lpl->topLarge!=-1) {
Lpl->topLarge--;
}
while(Mpl->topMiddle!=-1) {
Mpl->topMiddle--;
}
while(Spl->topSmall!=-1) {
Spl->topSmall--;
}
cout<<"停车场车辆已清空!\n";
}
//6.查看停车场车位余量
void parkingPosition(LParkingLot* Lpl,MParkingLot* Mpl,SParkingLot* Spl,Car car)
{
cout<<"大型车位当前余位编号为:";
if(Lpl->topLarge==N-1){
cout<<"无!"<<"\n";
}else {
for(int i=Lpl->topLarge+1;i<N;i++){
cout<<i+1<<' ';
}
cout<<"\n";
}
cout<<"中型车位当前余位编号为:";
if(Mpl->topMiddle==N-1){
cout<<"无!"<<"\n";
}else {
for(int i=Mpl->topMiddle+1;i<N;i++){
cout<<i+1+N<<' ';
}
cout<<"\n";
}
cout<<"小型车位当前余位编号为:";
if(Spl->topSmall==N-1){
cout<<"无!"<<"\n";
}else {
for(int i=Spl->topSmall+1;i<N;i++){
cout<<i+1+2*N<<' ';
}
cout<<"\n";
}
if (Lpl->topLarge==N-1){
cout<<"大型车位已满!"<<"\n";
}else {
cout<<"大型车当前余位为:"<<N-(Lpl->topLarge+1)<<"\n";
}
if (Mpl->topMiddle==N-1){
cout<<"中型车位已满!"<<"\n";
}else {
cout<<"中型车当前余位为:"<<N-(Mpl->topMiddle+1)<<"\n";
}
if (Spl->topSmall==N-1){
cout<<"小型车位已满!"<<"\n";
}else {
cout<<"小型车当前余位为:"<<N-(Spl->topSmall+1)<<"\n";
}
}
//7.清空便道车辆
void emptyPavement(Roadway* rd)
{
node *r=new node();
r=rd->head->next;
while(r!=NULL) {
rd->head->next=r->next;
if(rd->tail==r) {
rd->tail=rd->head;//使队尾指针回到初始位置
}
delete(r);//释放p所指结点空间
}
cout<<"便道车辆已清空!\n";
}
//8.停止停车场开放
void closeParking(LParkingLot* Lpl,MParkingLot* Mpl,SParkingLot* Spl,Roadway* rd) {
emptyParking(Lpl,Mpl,Spl);//清空停车场
emptyPavement(rd);//清空便道
cout<<"车辆已全部离开停车场......\n停车场已关闭!\n";
}
signed main(){
LParkingLot* Lpl=new LParkingLot;
MParkingLot* Mpl=new MParkingLot;
SParkingLot* Spl=new SParkingLot;
Roadway* rd=InitRoadway();
Car car;
FunctionWindow();
int Lfee,Mfee,Sfee;//size各类型停车场容量,fee各类型每小时停车费
cout<<"请输入一个数代表大中小类型停车场的最大容量(/辆):";
cin>>N;
cout<<"请分别输入大、中、小类型车在停车场每小时的费用(/元):";
cin>>Lfee>>Mfee>>Sfee;
int choose;
while(true) {
cout<<"\n请选择功能:";
cin>>choose;
switch(choose) {
case 1: {
load(Lpl,Mpl,Spl,rd,car,Lfee,Mfee,Sfee);
break;
}
case 2: {
parkInformation(N,Lfee,Mfee,Sfee);
break;
}
case 3: {
seeCarInformation(Lpl,Mpl,Spl,car);
break;
}
case 4: {
pavementCarInformation(rd);
break;
}
case 5: {
emptyParking(Lpl,Mpl,Spl);
break;
}
case 6:{
parkingPosition(Lpl,Mpl,Spl,car);
break;
}
case 7:{
emptyPavement(rd);
break;
}
}
if(choose==8) {
closeParking(Lpl,Mpl,Spl,rd);
break;
}
}
return 0;
}