目录
前言
为了巩固学生的C++、C语言、数据结构的相关内容,从而进行编写停车场的管理系统。综合锻炼学生的编程能力和合作能力,成为学生们在入职之前的第一个合作小项目。这是我们学院为我们实训所给出的一个实训项目。这是由我和我的一个同组搭档共同完成的。我放在这里希望可以帮助到大家!
一、停车场的主要功能
1 .上班
2 .车辆入库
3 .车辆驶离
4.查询
5.统计
6.帮我找车
7.基础数据维护
8.下班
二、主要步骤
1.上班
此功能是对于停车记录表、等待队列、停车区域表、停车位状态信息、停车场各区域间间隔文件进行文件读取。
void readFile_record(SqList &L) { ifstream in("./停车记录表.txt",ios::in); if(!in) { cout<<"文件打开失败!"<<endl; return; } int i=0; cout<<"停车记录表:"<<endl; cout<< setw(10) << std::right <<"入场日期"<<" " << setw(10) << std::right <<"入场时间"<<" " << setw(10) << std::right <<"车牌号"<<" " << setw(10) << std::right <<"所停车位"<<" " << setw(10) << std::right <<"离场日期"<<" " << setw(10) << std::right <<"离开场时间"<<" " << setw(10) << std::right <<"停车费"<<" " << setw(10) << std::right <<"记录状态(0入场 1出场)"<<endl; while(in>>L.elem[i].date_in>>L.elem[i].time_in>> L.elem[i].license_car>>L.elem[i].area_car>> L.elem[i].date_out>>L.elem[i].time_out>> L.elem[i].money>>L.elem[i].state_car) { cout << setw(10) << std::right <<L.elem[i].date_in<< " " << setw(10) << std::right <<L.elem[i].time_in<< " " << setw(10) << std::right <<L.elem[i].license_car<<" " << setw(10) << std::right <<L.elem[i].area_car<<" " << setw(10) << std::right <<L.elem[i].date_out<<" " << setw(10) << std::right <<L.elem[i].time_out<<" " << setw(10) << std::right <<L.elem[i].money<<" " << setw(10) << std::right <<L.elem[i].state_car<<" " <<endl; i++; } L.length=i; in.close(); } void readArea(Parking park[]) { //停车区域表 ifstream inArea("./停车区域.txt",ios::in); if(!inArea) { cout<<"文件打开失败!"<<endl; return ; } cout<<"停车区域:"<<endl; int i=0; while(inArea>>park[i].name) { cout<< setw(9) << std::right <<park[i].name<<endl; i++; } inArea.close(); //停车状态表 ifstream inState("./停车状态表.txt",ios::in); if(!inState) { cout<<"文件打开失败!"<<endl; return; } cout<<"停车状态表:"<<endl; for(int i=0;i<10;i++) { park[i].sum=0; for(int j=0;j<10;j++) { park[i].space[j].area_space[0]=park[i].name; park[i].space[j].area_space[1]='0'; park[i].space[j].area_space[2]=((j+1)/10)+'0'; park[i].space[j].area_space[3]=(j+1)%10+'0'; inState>>park[i].space[j].license_space; cout<< setw(9) << std::left <<park[i].space[j].license_space<< " "; if(park[i].space[j].license_space[0]=='0') { park[i].space[j].state_space=0; } else { park[i].space[j].state_space=1; park[i].sum++; } } cout<<endl; } inState.close(); } void readGraph(AMGraph &G) { VerTexType v1[20],v2[20]; int i,j,k; ArcType w[20]; G.vexnum=10; G.arcnum=12; ifstream inArea("./停车区域.txt",ios::in); if(!inArea) { cout<<"文件打开失败!"<<endl; return; } for(i=0;i<G.vexnum;++i) { inArea>>G.vexs[i]; } for(i=0;i<G.vexnum;++i) { for(j=0;j<G.vexnum;++j) { G.arcs[i][j]=MaxInt; } } inArea.close(); ifstream inGraph("./各区域间距离表.txt",ios::in); if(!inGraph) { cout<<"文件打开失败!"<<endl; return; } for(k=0;k<G.arcnum;++k) { inGraph>>v1[k]>>v2[k]>>w[k]; i=LocateVex(G,v1[k]); j=LocateVex(G,v2[k]); G.arcs[i][j]=w[k]; G.arcs[j][i]=G.arcs[i][j]; } for(int i=0;i<G.vexnum;i++) { cout<<G.vexs[i]<<" "; for(int j=0;j<G.vexnum;j++) { if(G.arcs[i][j]==MaxInt) cout<<setw(6)<<std::left<<0; else cout<<setw(6)<<std::left<<G.arcs[i][j]; } cout<<endl; } inGraph.close(); }
2.车辆入库
输入车辆的车牌号,并且判断输入的车牌号的合法性,同时对停车场目前的状态进行查询(有车,无车)。
若有空车位,将空车位分配给该车辆,记录车辆的入库时间和停车位(用到自动获取时间的结构体),入库操作完成。若无空车位,将该车辆加入到等待队列中,等停车场中出现空间车位时,按顺序序从队伍中进入停车场。
void enterList(SqList &L,Parking park[],LinkQueue &Q) 车辆入库 { Car car; time_t tt; struct tm *t; cout<<"输入您爱车的车牌号(前两位字母,后五位数字):"<<endl; cin>>car.license_car; //判断车牌号方法 if(strlen(car.license_car)!=7){ cout<<"车牌号长度不合法!"<<endl; return; } if(isalpha(car.license_car[0])==0||isalpha(car.license_car[1])==0){ cout<<"车牌号前两位不是字母!"<<endl; return; } for(int i=2;i<7;i++){ if(isdigit(car.license_car[i])==0){ cout<<"车牌号不后五位不是数字!"<<endl; cout<<"请从新输入!"<<endl; return; } } for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { if(strcmp(car.license_car,park[i].space[j].license_space)==0) { cout<<"车牌号重复!"<<endl; return; } } } //获取时间信息 time(&tt); t=localtime(&tt); int year=t->tm_year+1900; int mon=t->tm_mon+1; int day=t->tm_mday; car.date_in=year*10000+mon*100+day; car.time_in=t->tm_hour*10000+t->tm_min*100+t->tm_sec; car.date_out=0; car.time_out=0; car.money=0; //找车位 for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { if(park[i].space[j].state_space==0) { park[i].space[j].state_space=1; park[i].sum++; strcpy(park[i].space[j].license_space,car.license_car); car.state_car=0; strcpy(car.area_car,park[i].space[j].area_space); L.elem[L.length]=car; L.length++; cout<<"停车成功!"<<endl; return; } } } QNode *p; p=Q.front->next; while(p) { if(strcmp(car.license_car,p->date.license_car)==0) { cout<<"车牌号重复! 已在等待队列中!"<<endl; return; } p=p->next; } EnQueue(Q,car); cout<<"停车场已满,进入等待队列!"<<endl; }
3.车辆出库
输入车牌号,并且判断输入车牌号的合法性将指定车牌号的汽车出库,记录下离开的时间和停车费,一边统计中使用。
void outList(SqList &L,Parking park[],LinkQueue &Q,int &charge) 车辆出库 { int o=0; int p=1;//定义有无车的一个标志 1:没查到 0:查到 Car car_in; char icense[10]; int m=0,n=0; time_t tt; struct tm *t; time_t tt1; struct tm *t1; cout<<"输入您爱车的车牌号(前两位字母,后五位数字):"<<endl; cin>>icense; //判断车牌号方法 if(strlen(icense)!=7) { cout<<"车牌号长度不合法!"<<endl; return; } if(isalpha(icense[0])==0||isalpha(icense[1])==0) { cout<<"车牌号前两位不是字母!"<<endl; return; } for(int i=2;i<7;i++) { if(isdigit(icense[i])==0) { cout<<"车牌号不后五位不是数字!"<<endl; cout<<"请从新输入!"<<endl; return; } } for(int i=L.length-1;i>=0;i--) { if(strcmp(L.elem[i].license_car,icense)==0) { p=0; time(&tt); t=localtime(&tt); int year=t->tm_year+1900; int mon=t->tm_mon+1; int day=t->tm_mday; L.elem[i].date_out=year*10000+mon*100+day; L.elem[i].time_out=t->tm_hour*10000+t->tm_min*100+t->tm_sec; L.elem[i].state_car=1; if(((day-L.elem[i].date_in%100)*24+t->tm_hour-L.elem[i].time_in/10000)<=1) { o=L.elem[i].money=0; } else { L.elem[i].money=((day-L.elem[i].date_in%100)*24+t->tm_hour-L.elem[i].time_in/10000)*charge; o=L.elem[i].money; } break; } } if(p==1){ cout<<"该车不在停车场内!"<<endl; return; } for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { if(strcmp(icense,park[i].space[j].license_space)==0) { park[i].space[j].state_space=0; park[i].sum--; strcpy(park[i].space[j].license_space,"0"); m=i; n=j; } } } cout<<"出库成功!"<<endl; cout<<"需要交纳 "<<o<<" RMB^.^"<<endl; if(Q.front!=Q.rear) { DeQueue(Q,car_in); time(&tt1); t1=localtime(&tt1); int year=t->tm_year+1900; int mon=t->tm_mon+1; int day=t->tm_mday; car_in.date_in=year*10000+mon*100+day; car_in.time_in=t->tm_hour*10000+t->tm_min*100+t->tm_sec; car_in.date_out=0; car_in.time_out=0; car_in.money=0; park[m].space[n].state_space==1; park[m].sum++; strcpy(park[m].space[n].license_space,car_in.license_car); car_in.state_car=0; strcpy(car_in.area_car,park[m].space[n].area_space); L.elem[L.length]=car_in; L.length++; cout<<"等待队列的车停车成功!"<<endl; } else{ cout<<"等待队列无车!"<<endl; system("pause"); return; } }
4.查询
查询主要包括:查询车辆状态、查询停车场状态、查询所有车辆信息。
1>车辆状态的查询:输入车牌号查询到该车辆的状态。(等候、已入场和已离开)。
2>停车场状态的查询。
1)查询当前停车场使用状况:输入停车场区域编号,输出该区域的车位总数、空余车位、当前等待队列中的车辆数。
2)查询指定车位当前状态:输入车位编号,判断该车位是否有车。
3>显示所有信息的主要功能:输出停车记录表、停车信息表、等待队列。
void CarState(SqList &L,LinkQueue &Q) //查询车辆状态 { char c[10]; int flog=0; cout<<"请输入查询的车牌号:"; cin>>c; if(strlen(c)!=7) { cout<<"车牌号长度不合法!"<<endl; return; } if(isalpha(c[0])==0||isalpha(c[1])==0) { cout<<"车牌号前两位不是字母!"<<endl; return; } for(int i=2;i<7;i++) { if(isdigit(c[i])==0) { cout<<"车牌号不后五位不是数字!"<<endl; cout<<"请从新输入!"<<endl; return; } } for(int i=L.length-1;i>=0;i--) { if(strcmp(L.elem[i].license_car,c)==0) { flog=1; if(L.elem[i].state_car==0) cout<<"该车已经入库!"<<endl; else if(L.elem[i].state_car==1) { cout<<"该车已经出库!"<<endl; break; } else cout<<"该车处在等待队列!"<<endl; } } if(flog==0) cout<<"没有该车牌号的车辆"<<endl; } void ParkingState(Parking park[],LinkQueue &Q) //查询停车场状态 { char c; int flag=0; cout<<"请输入查询的停车场区域编号:"; cin>>c; for(int i=0;i<10;i++) if(c==park[i].name) { flag=1; cout<<"该区域车位总数:10"<<endl;; cout<<"当前空余车位数:"<<10-park[i].sum<<endl; cout<<"等待队列车数:"<<Q.length<<endl; } if(flag==0) cout<<"没有该区域"<<endl; } void SpaceState(Parking park[]) //查询车位状态 { char c[6]; cout<<"请输入要查询的车位编号:"<<endl; cin>>c; if(strlen(c)!=4) { cout<<"车位长度不合法"<<endl; system("pause"); return; } if(isalpha(c[0])==0) { cout<<"车位号不合法"<<endl; system("pause"); return; } for(int i=1;i<4;i++) { if(isdigit(c[i])==0) { cout<<"车位号不合法"<<endl; system("pause"); return; } } for(int i=0;i<10;i++) if(park[i].name==c[0]) for(int j=0;j<10;j++) { if(strcmp(park[i].space[j].area_space,c)==0) { if(park[i].space[j].state_space==0) cout<<"该车位为空车位!"<<endl; else cout<<"该车位有车!"<<endl; } } } void Show(SqList &L,Parking park[]) //显示所有信息 { cout<<"停车信息表:"<<endl; cout<< setw(10) << std::right <<"入场日期"<<" " << setw(10) << std::right <<"入场时间"<<" " << setw(10) << std::right <<"车牌号"<<" " << setw(10) << std::right <<"所停车位"<<" " << setw(10) << std::right <<"离场日期"<<" " << setw(10) << std::right <<"离开场时间"<<" " << setw(10) << std::right <<"停车费"<<" " << setw(10) << std::right <<"记录状态(0入场 1出场)"<<endl; for(int i=0;i<L.length;i++) { cout << setw(10) << std::right <<L.elem[i].date_in<< " " << setw(10) << std::right <<L.elem[i].time_in<< " " << setw(10) << std::right <<L.elem[i].license_car<<" " << setw(10) << std::right <<L.elem[i].area_car<<" " << setw(10) << std::right <<L.elem[i].date_out<<" " << setw(10) << std::right <<L.elem[i].time_out<<" " << setw(10) << std::right <<L.elem[i].money<<" " << setw(10) << std::right <<L.elem[i].state_car<<" " <<endl; } cout<<"停车记录表:"<<endl; for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { cout<<setw(9)<<std::right<<park[i].space[j].license_space<< " "; } cout<<endl; } }
5.统计
统计:当天收入、当月收入、高峰期。
1>当天收入:输入车牌号,判断是否合法。用自动获取时间的结构体,%或/去获得时间的年、月、日。再根据定义的每小时停车费计算该车停车费,在计算当天收入
2>当月收入:输入车牌号,判断是否合法。用自动获取时间的结构体,%或/去获得时间的年、月、日。再根据定义的每小时停车费计算该车停车费,在计算当天收入。在累加当月的日收入。在按费用大到小排序。
3>高峰期:在最近一天中,记录下不同时间段入库车辆的综合,输出入库车辆最多的时间段。(本次实验我们定义了6个时间段)
void dayMoney(SqList L) //统计天收入 { time_t tt; struct tm *t; time(&tt); t=localtime(&tt); int day=t->tm_mday; //今天的日期 int totalMoney=0; //当日停车费总计 int totalCar=0; //当日共停了多少辆车 int leaveCar=0; //当日离开了多少辆车 int nowCar=0; //当日当前的停车场称量总数 for(int i=0;i<L.length;i++) { if(L.elem[i].date_in%100==day) { totalCar++; } if(L.elem[i].date_out%100==day) { leaveCar++; totalMoney=totalMoney+L.elem[i].money; } } nowCar=totalCar-leaveCar; cout<<"停车费总计:"<<totalMoney<<" RMB"<<endl; cout<<"共停 "<<totalCar<<" 辆车"<<endl; cout<<"离开 "<<leaveCar<<" 辆车"<<endl; cout<<"现在剩余 "<<nowCar<<" 辆车"<<endl; } void monthMoney(SqList L) //统计月收入 { int m;//月份中介 int n;//停车费中介 time_t tt; struct tm *t; time(&tt); t=localtime(&tt); int month=t->tm_mon; //今天的月份 int totalMM[12][2]; //当月停车费总计 for(int i=0;i<12;i++) { totalMM[i][0]=i+1; totalMM[i][1]=0; } for(int i=0;i<L.length;i++) { for(int j=0;j<12;j++){ if(L.elem[i].date_out%10000/100==(j+1)){ //若某一辆车的出场月份=(1——12)月份的一个 totalMM[j][1]=totalMM[j][1]+L.elem[i].money; } continue; } } for(int i=0;i<12-1;i++) { for(int j=0;j<12-i-1;j++) { if(totalMM[j][1]<totalMM[j+1][1]){ //月份交换 m=totalMM[j][0]; totalMM[j][0]=totalMM[j+1][0]; totalMM[j+1][0]=m; //停车费交换 n=totalMM[j][1]; totalMM[j][1]=totalMM[j+1][1]; totalMM[j+1][1]=n; } } } cout<<"停车场总账单:"<<endl; cout<< setw(10) << std::right <<"月份"<<" "<<"总停车费用"<<endl; for(int i=0;i<12;i++) { for(int j=0;j<2;j++) { cout<< setw(10) << std::right <<totalMM[i][j]<<" "; } cout<<endl; } } void fastigiumCar(SqList L) //停车高峰期 { int b=0; int max=0; int a[6]={0,0,0,0,0,0}; for(int i=0;i<L.length;i++){ if(((L.elem[i].time_in/10000)>=06)&&((L.elem[i].time_in/10000)<10)) { a[0]++; } else if(((L.elem[i].time_in/10000)>=10)&&((L.elem[i].time_in/10000)<14)) { a[1]++; } else if(((L.elem[i].time_in/10000)>=14)&&((L.elem[i].time_in/10000)<18)) { a[2]++; } else if(((L.elem[i].time_in/10000)>=18)&&((L.elem[i].time_in/10000)<22)) { a[3]++; } else if(((L.elem[i].time_in/10000)>=22)&&((L.elem[i].time_in/10000)<24)) { a[4]++; } else{ a[5]++; } } for(int i=0;i<6;i++) { if(max<a[i]){ max=a[i]; b=i+1; } } cout<<"第一时段:06--10点;"<<endl; cout<<"第二时段:10--14点;"<<endl; cout<<"第三时段:14--18点;"<<endl; cout<<"第四时段:18--22点;"<<endl; cout<<"第五时段:22--24点;"<<endl; cout<<"第六时段:00--06点;"<<endl; cout<<"停车高峰期为第"<<b<<"个时段 "<<"高峰期车辆数为: "<<max<<" 辆车"<<endl; }
6. 帮我找车
按照迪杰斯特拉的算法,寻找输入的自己所在位置到输入的车牌号的最短路径。
int LocateVex(AMGraph G,VerTexType v) //找到顶点的下标 { for(int i=0;i<G.vexnum;i++) { if(G.vexs[i]==v) { return i; } } } void ShortestPath_DIJ(AMGraph G,DIJ dij[],int v0) //迪杰斯特拉算法找最短路径 { float n=G.vexnum; int v,min,w; for(v=0;v<n;v++) { dij[v].S=false; dij[v].D=G.arcs[v0][v]; if(dij[v].D<MaxInt) { dij[v].Path=v0; } else{ dij[v].Path=-1; } } dij[v0].S=true; dij[v0].D=0; for(int i=0;i<n;i++) { min=MaxInt; for(w=0;w<n;w++) if(!dij[w].S&&dij[w].D<min) { v=w;min=dij[w].D; } dij[v].S=true; for(w=0;w<n;w++) if(!dij[w].S&&(dij[v].D+G.arcs[v][w]<dij[w].D)) { dij[w].D=dij[v].D+G.arcs[v][w]; dij[w].Path=v; } } } void ShowPath(AMGraph G,DIJ dij[],int v0,int v1) //显示最短路径 { stack<VerTexType>s; int i=0; double distance; //距离 distance=dij[v1].D; while(v1!=v0) { s.push(G.vexs[v1]); v1=dij[v1].Path; i++; } s.push(G.vexs[v0]); for(int j=0;j<=i;j++) { cout<<"->"<<s.top(); s.pop(); } cout<<" "<<distance; } void CarSearch(Parking park[],AMGraph G,DIJ dij[]) //帮我找车 { char c; int v0,v1,flag=0; char license[8]; cout<<"请输入您当前所在停车区域:"; cin>>c; if(c<'A'||c>'j') { cout<<"输入停车区域不合法!"; return; } for(int i=0;i<10;i++) { if(park[i].name==c) v0=i; } cout<<"请输入您爱车的车牌号:"; cin>>license; for(int i=0;i<10;i++) for(int j=0;j<10;j++) if(strcmp(park[i].space[j].license_space,license)==0) { flag=1; v1=i; } if(flag==1) { ShortestPath_DIJ(G,dij,v0); ShowPath(G,dij,v0,v1); } else cout<<"未找到该车辆"; }
7.基础信息维护
基础信息维护:修改每小时停车费、禁止停车区域、解禁停车区域
1>修改每小时停车费:输入你要定义的停车费金额。
2>禁止停车区域:输入禁止停车的区域,使得该区域无法停车
3>解禁停车区域:输入解禁停车的区域,使得该区域从禁止停车状态变为可以停车状态。
void changeCharge(int &charge) //更改收费标准 { int newcharge; cout<<"请输入新的每小时停车费"<<endl; cin>>newcharge; if(isdigit(newcharge)==0) { while(isdigit(newcharge)!=0) { cout<<"输入的数据非数字!请重新输入!"<<endl; cin>>newcharge; } } charge=newcharge; cout<<"修改成功!"<<endl; } void contolArea(Parking park[]) //限制停车区域 { int n=0; int lable; char area; cout<<"请输入禁止停车区域的名称(A-J):"<<endl; cin>>area; while(area>'J'||area<'A'){ cout<<"输入停车区域错误!"<<endl; cout<<"请输入A-J当中的区域!"<<endl; break; } for(int i=0;i<10;i++) { if(area==park[i].name) { for(int j=0;j<10;j++){ if(park[i].space[j].state_space==0) { park[i].space[j].state_space=1; } else{ n++; } } cout<<"禁止停车场区域成功!"<<endl; cout<<"该被禁止区域仍有"<<10-n<<"个空位"<<endl; } } } void uncontrolArea(Parking park[]) //解封停车区域 { int n=0; char area; cout<<"请输入解禁停车区域的名称(A-J):"<<endl; cin>>area; while(area>'J'||area<'A'){ cout<<"输入停车区域错误!"<<endl; cout<<"请输入A-J当中的区域!"<<endl; break; } for(int i=0;i<10;i++) { if(area==park[i].name) { for(int j=0;j<10;j++) { if(park[i].space[j].license_space[0]=='0') { park[i].space[j].state_space=0; } else{ n++; } } cout<<"解禁停车场区域成功!"<<endl; cout<<"该被解禁区域有"<<10-n<<"个空位"<<endl; } } }
8.下班
将改变后的停车记录表、停车状态表、等待队列文件保存
void FileWriet_C(SqList L) { ofstream out("./停车记录表.txt",ios::out); //以写的方式打开文件 if(!out) //打开失败 { cout<<"文件打开失败!"<<endl; return; } for(int i=0;i<L.length;i++) { out <<L.elem[i].date_in <<" "<<L.elem[i].time_in <<" "<<L.elem[i].license_car <<" "<<L.elem[i].area_car <<" "<<L.elem[i].date_out <<" "<<L.elem[i].time_out <<" "<<L.elem[i].money <<" "<<L.elem[i].state_car<<endl; } out.close(); //关闭文件 } void writeFile_status(Parking park[]) { ofstream out("./停车状态表.txt",ios::out); if(!out) { cout<<"文件打开失败!"<<endl; return; } for(int i=0;i<10;i++){ for(int j=0;j<10;j++) { out <<setw(10)<<std::right<<park[i].space[j].license_space; } out<<endl; } out.close(); }
三、总结
以上就是我今天要向大家推荐的内容,这是我和我的小伙伴共同完成的,这是我们两个共同努力的结果,今天放在这里希望大家可以拿去学习。