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