数据结构课程设计~~立体停车场管理系统(改进版)

<pre name="code" class="cpp">/*****************************************
*版权所有(C)2015.LiHao
*
*文件名称main.cpp
*文件标识:无
*内容摘要:该项目的主函数文件
*其他说明:无
*当前版本:V1.0
*作者:李浩
*完成日期:20151224
*
*修改记录:无
*修改日期:20151224
*版本号:V1.0
*修改人:lihao
*修改内容:无
*****************************************/
#include"liti.h"
/*****************************************
*功能描述:统筹全局以及全部函数的调用
*输入参数:是否进入系统
*输出参数:系统界面
*返回值:无
*其他声明:无
*****************************************/

int main()
{
    system("color f3");
	Welcome();
	//初始化还没有出库的车
	Car cars[FLOOR][PNUMBER];
	int i,j;
	for(i=0;i<FLOOR;i++)
	{
		for(j=0;j<PNUMBER;j++)
		{
			cars[i][j].floor =0;
			cars[i][j].pnumber=0;
			cars[i][j].ptime=0;
			cars[i][j].empty=0;
			strcpy(cars[i][j].license ,"0");
		}
	}
  Load(cars);//加载最初的四辆车
	//加载历史文件
	CustList *cl,*clr;//cl保存当天的修改信息,clr保存以前的历史信息,当推出程序时,自动把当天信息cl修改的动态历史保存到clr中
	InitCustList1(cl,cars);//cl保存当天的修改信息
	InitCustList(clr);//保留历史文件list.txt的内容
	while(1)
	{
		ShowStarM();
		cout<<"1 客户界面"<<endl;
		cout<<"2 车管界面"<<endl;
		cout<<"3 退出整个程序"<<endl;
		cout<<"请选择:";
		cin>>i;
		if(i<1||i>3)
		{
			cout<<"您的操作非法!!!"<<endl;
			continue;

		}
		system ("cls");
		switch(i)
		{
		case 1:
			{
				Customer(cars,cl);
		    	SaveList(cl);
			    SaveListTemp(cl);
			}
			break;
		case 2:
			{
				LoadList(clr);
				Manage(cars,cl,clr);
			}
			break;
		case 3:
			{
				SaveList(cl);
				SaveListTemp(cl);
			}
			exit(-1);
		}
	}
	return 0;
}
/*****************************************
*版权所有(C)2015.LiHao
*
*文件名称liti.h
*文件标识:无
*内容摘要:该项目定义的各种数据的结构体以及各种函数的定义
*其他说明:无
*当前版本:V1.0
*作者:李浩
*完成日期:20151224
*
*修改记录:无
*修改日期:20151224
*版本号:V1.0
*修改人:lihao
*修改内容:无
*****************************************/
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>//standard library标准库文件
#include <time.h>//得到当前时间的头文件
#define FLOOR 2 //全局变量定义两层楼
#define PNUMBER 6//全局变量定义每层楼有六个车位
using namespace std;
struct Car//定义每辆车的结构体
{
	char license[8];//车牌号
	int floor;//楼层
	int pnumber;//对应楼层的车位
	int ptime;//停车时间
	int empty;//标志位,有车为1,无车为0
};
struct Date//时间结构体
{
	char day[11];//日期
	char shike[9];//时间
	char weekday[10];//星期几
};
typedef struct Snode//节点的结构体
{
	char license[8];//车牌号
	Date date;//停车的时刻
	Date dateleave;//车离开的的时刻
	int floor;//楼层
	int pnumber;//对应车位
	int ptimecount;//本次停车总时间
	float cost;//停车费
	Snode *next;
}CustList;
struct User//管理员结构体
{
	char id[10];//账户
	char name[10];//姓名
	char password[10];//密码

};
void Welcome();//欢迎界面
void ShowStarA();//展示界面a
void ShowStarM();//展示界面b
void ShowStarC();//展示界面c
int Enterpark(Car cars[FLOOR][PNUMBER],char *license,int &floor,int &pnumber);//存车函数
void Savecars(Car cars[FLOOR][PNUMBER]);//保存车辆信息
bool IsEmpty(Car cars[FLOOR][PNUMBER]);//取车时判断车场是否为空
bool IsFull(Car cars[FLOOR][PNUMBER]);//存车时判断车场是否为空
bool IsSame(Car cars[FLOOR][PNUMBER],char *license);//查看存的车牌号是否存在
void Print(char license[],int floor,int pnumber,int ptime,float &cost);//输出	收费后 个人 凭据
void Leavepark(Car cars[FLOOR][PNUMBER],char license[],int &floor,int &pnumber,int &ptime);//取车函数
int CarOutMenu(char license[],int &floor,int &pnumber,int &ptime,float &cost,char note[100]);//取车的菜单项
void Customer(Car cars[FLOOR][PNUMBER],CustList *cl);//顾客界面
void Manage(Car cars[FLOOR][PNUMBER],CustList *cl,CustList *clr);//后台程序
void GetDate(Date &date);//得到当前时间
int UsertestAdd();//登陆界面或者注册用户
void Load(Car cars[FLOOR][PNUMBER]);//加载初始化的四辆汽车
void Loadfile(Car cars[FLOOR][PNUMBER],char license[8],int floor,int pnumber,int ptime,int empty);//加载每一个停车位的状态
void Showcars(Car cars[FLOOR][PNUMBER],CustList *cl);//展示现有汽车停车信息
void Message(CustList *clr);//历史停车信息
void MessageIntoFile(char note[100],char license[8]);//保存信息至文件
void CheckOneCar(CustList *clr,char *license);//查找某一车辆的停车信息
void InitCustList(CustList *&cl);//初始化链表
void InitCustList1(CustList *&cl,Car cars[FLOOR][PNUMBER]);//建立链表保存信息
void InsertToFirst(CustList *cl,char *license,int floor,int pnumber,Date date);//头插法,插入节点
void InsertToLst(CustList *cl,char *license,int floor,int pnumber,int ptime,float cost,Date date,Date dateleave);//从文件中读出时,尾差法,使得时间降序排列
void SearchUpdate(CustList *&cl,char *license,float cost,int ptimecount,char note[]);//修改当前的当天的链表 cl
void SaveListTemp(CustList *cl);//将链表的信息保存到历史文件today.dat中
void SaveList(CustList *cl);//保存历史信息至文件
void DeleteAll(CustList *cl);//删除链表
void LoadList(CustList *clr);//加载历史文件
/*****************************************
*版权所有(C)2015.LiHao
*
*文件名称liti.cpp
*文件标识:无
*内容摘要:该项目的所有函数的具体内容
*其他说明:无
*当前版本:V1.0
*作者:李浩
*完成日期:20151224
*
*修改记录:无
*修改日期:20151224
*版本号:V1.0
*修改人:lihao
*修改内容:无
*****************************************/
#include"liti.h"
void Welcome()
{
	int i;
	char choice;
	for(i=1;i<=160;i++)
		cout<<"\003";
	cout<<endl;
	cout<<"       ****************       立体停车场管理系统        ****************       "<<endl;
	cout<<endl;
	cout<<"          **********             制作人:李浩              **********         "<<endl;
	cout<<endl;
	cout<<"            ******                班级:146-2                ******           "<<endl;
	cout<<endl;
	cout<<"********************************************************************************"<<endl;
	cout<<"                             是否进入该系统(Y/N)?                            "<<endl;
	cin>>choice;
	while(1)
	{
		if(choice=='Y'||choice=='y')
		{
			for(i=0;i<100000000;i++);
			system ("cls");//清屏
			break;
		}
		else
			if(choice=='N'||choice=='n')
				exit(0);
			else
			{
            cout<<"请做出正确的选择!"<<endl;
				cin>>choice;
			}
	}
}
void ShowStarA()
{
	cout<<"********************************************************************************"<<endl;
	cout<<"                               欢迎进入管理员界面                             "<<endl;
	cout<<endl;
	cout<<"********************************************************************************"<<endl;
}
void ShowStarM()
{
	cout<<"********************************************************************************"<<endl;
	cout<<"                               欢迎进入停车场系统                             "<<endl;
	cout<<endl;
	cout<<"********************************************************************************"<<endl;
}
void ShowStarC()
{
	cout<<"********************************************************************************"<<endl;
	cout<<"                                   你好!顾客                                 "<<endl;
	cout<<endl;
	cout<<"********************************************************************************"<<endl;
}
/*****************************************
*功能描述:用顺序查找的方式进行某一辆车的查找
*输入参数:无
*输出参数:无
*返回值:无
*其他声明:完成单独查找某一辆车的历史信息
*****************************************/

void CheckOneCar(CustList *clr,char *license)
{
	if(!license||!clr)
		return;
	CustList *p;
	p=clr->next ;
	cout<<endl;
	cout<<"\t\t--------停车历史信息--------"<<endl;
	cout<<endl;
	cout.setf(ios::left);
	cout.width(8);
	cout<<"车牌";
	cout.width(8);
	cout<<"楼层号";
	cout.width(8);
	cout<<"车位号";
	cout.width(10);
	cout<<"停车时间";
	cout.width(8);
	cout<<"消费"<<endl;
	while(p)
	{
		if(strcmp(p->license,license)==0)
		{
			cout<<endl;
			cout<<"----------------------------------------------------------------------"<<endl;
			cout<<"                                        进库时间:"<<p->date.day<<" "<<p->date.shike<<" "<<p->date.weekday<<endl;
			cout.setf(ios::left);
			cout.width(8);
			cout<<p->license;
			cout.width(8);
			cout<<p->floor;
			cout.width(8);
			cout<<p->pnumber;
			cout.width(10);
			cout<<p->ptimecount;
			cout.width(8);
			cout<<p->cost;
			cout<<endl;
			if(p->date.day ==p->dateleave.day &&p->date.shike ==p->dateleave.shike &&p->date.weekday ==p->dateleave.weekday )
				cout<<"                                        出库时间: 未知"<<endl;
			else
				cout<<"                                        出库时间:"<<p->dateleave.day<<" "<<p->dateleave.shike<<" "<<p->dateleave.weekday<<endl;
			cout<<endl;
		}
		p=p->next ;
	}
}
/*****************************************
*功能描述:所有的历史停车信息
*输入参数:无
*输出参数:无
*返回值:无
*其他声明:无
*****************************************/

void Message(CustList *clr)
{
	cout<<endl;
	cout<<"\t\t--------停车历史信息--------"<<endl;
	cout<<endl;
	Snode *p=clr->next;
	cout.setf(ios::left);
	cout.width(8);
	cout<<"车牌";
	cout.width(8);
	cout<<"楼层号";
	cout.width(8);
	cout<<"车位号";
	cout.width(10);
	cout<<"停车时间";
	cout.width(8);
	cout<<"消费"<<endl;
	while(p)
	{	cout<<"----------------------------------------------------------------------"<<endl;
		cout<<"                                        进库时间:"<<p->date.day<<" "<<p->date.shike<<" "<<p->date.weekday<<endl;
		cout.setf(ios::left);
		cout.width(8);
		cout<<p->license;
		cout.width(8);
		cout<<p->floor;
		cout.width(8);
		cout<<p->pnumber;
		cout.width(10);
		cout<<p->ptimecount;
		cout.width(8);
		cout<<p->cost;
		cout<<endl;
		if(p->date.day ==p->dateleave.day &&p->date.shike ==p->dateleave.shike &&p->date.weekday ==p->dateleave.weekday )
			cout<<"                                        出库时间: 未知"<<endl;
		else
		cout<<"                                        出库时间:"<<p->dateleave.day<<" "<<p->dateleave.shike<<" "<<p->dateleave.weekday<<endl;
		cout<<endl;
		p=p->next;
	}
	cout<<endl;
}
//加载历史文件
void LoadList(CustList *clr)
{
	DeleteAll(clr);
	FILE *fp=fopen("history.txt","rb");
	if (fp==NULL)
		return;
	int n;
	Snode p;
	while(!feof(fp))
	{
		n=fread(&p,sizeof(p),1,fp);
		if(n!=1)
			break;
		InsertToLst(clr,p.license,p.floor,p.pnumber,p.ptimecount,p.cost,p.date,p.dateleave );
	}
	fclose(fp);
}
//获得尾巴以便于使时间降序排列输出停车信息
Snode* GetTail(CustList *cl)
{
	Snode *p=cl;
	while(p->next)
		p=p->next;
	return p;
}
/*****************************************
*功能描述:从文件中读出时,尾插法,使得时间降序排列
*输入参数:无
*输出参数:无
*返回值:无
*其他声明:辅助查取历史信息功能的实现
*****************************************/


void InsertToLst(CustList *cl,char *license,int floor,int pnumber,int ptime,float cost,Date date,Date dateleave)
{

	Snode *s;
	s=new Snode;
	strcpy(s->license,license);
	s->floor=floor;
	s->pnumber=pnumber;
	s->ptimecount=ptime;
	s->cost=cost;
	s->date =date;
	s->dateleave =dateleave;
	s->next=NULL;
	Snode *q=GetTail(cl);
	q->next=s;
}
//删除链表
void DeleteAll(CustList *cl)
{
Snode *p=cl->next;
Snode *q=NULL;
while(p)
{
	q=p;
	p=p->next;
	delete q;
}
cl->next=p;
}
//将链表的信息保存到历史文件today.dat中
void SaveListTemp(CustList *cl)
{
	FILE* fp = fopen("today.txt","ab");
	if(fp==NULL)
	{
		FILE* fp = fopen("today.txt","wb");

	}
	Snode *p=cl->next;
	Snode q;
	while(p)
	{
		strcpy(q.license,p->license);
		q.cost=p->cost;
		q.floor=p->floor;
		q.pnumber=p->pnumber;
		q.date =p->date ;
		q.dateleave =p->dateleave ;
		q.ptimecount=p->ptimecount;
		fwrite(&q,sizeof(q),1,fp);
		p=p->next;
	}
	fclose(fp);
}
void SaveList(CustList *cl)//保存历史信息至文件
{
	FILE* fp = fopen("history.txt","ab");
	if(fp==NULL)
	{
		FILE* fp = fopen("history.txt","wb");
	}
	Snode *p=cl->next;
	Snode q;
	while(p)
	{
		strcpy(q.license,p->license);
		q.cost=p->cost;
		q.floor=p->floor;
		q.pnumber=p->pnumber;
		q.dateleave =p->dateleave;
		q.date =p->date ;
		q.ptimecount=p->ptimecount;
		fwrite(&q,sizeof(q),1,fp);
		p=p->next;

	}
	fclose(fp);

}
//初始化
void InitCustList(CustList *&cl)
{
	cl=new CustList;
	cl->next=NULL;
	cl->floor =0;
	cl->pnumber =0;
	cl->ptimecount =0;
	cl->cost =0;
}
/*****************************************
*功能描述:头插法,插入节点,以便于保存数据
*输入参数:无
*输出参数:无
*返回值:无
*其他声明:只是将之前的信息进行复制,转到链表的形式进行保存
*****************************************/


void InsertToFirst(CustList *cl,char *license,int floor,int pnumber,Date date)
{
	if(license==NULL)
		return;
	Snode *c=new Snode;
	strcpy(c->license,license);
	c->floor=floor;
	c->pnumber=pnumber;
	c->dateleave =date;
	strcpy(c->date.day,date.day);
	strcpy(c->date.shike,date.shike);
	strcpy(c->date.weekday,date.weekday);
	c->ptimecount =0;
	c->cost =0;
	c->next = cl->next;
	cl->next = c ;
}
void MessageIntoFile(char note[100],char license[8])//保存信息至文件
{
	FILE* fp = fopen("message.txt","ab");
	if(fp==NULL)
	{
		FILE* fp = fopen("message.txt","wb");

	}
	Date date1;
	GetDate(date1);
}
/*****************************************
*功能描述:存车
*输入参数:车牌号以及车位位置
*输出参数:存车成功
*返回值:1
*其他声明:无
*****************************************/

int Enterpark(Car cars[FLOOR][PNUMBER],char *license,int &floor,int &pnumber)
{
	cout<<endl;
	//输入车牌号,判断车牌号的有效性
	cout<<"请输入7标准位车牌号:";
	char licen[8];
	cin>>licen;
	cout<<endl;
	while((!licen)||(strlen(licen)!=7))
	{
		cout<<"输入有误! ";
		cout<<"请输入正确的7位车牌号:";
		cin>>licen;
	}
	//查看是否有重复
	while(1)
	{
		if(IsSame(cars,licen)==1)
		{
			cout<<"已经存在这辆车,请重新输入7标准位车牌号:"<<endl;
			cin>>licen;
		}
		else break;
	}
	int i,j;
	if(IsFull(cars)==1)
	{
		cout<<"已经没有空车位了,谢谢惠顾!正在跳转到顾客界面。。。"<<endl;
		return 0;
	}
	int sign=1;//sign 标志第几层有空位0表一,1表二
	cout<<"您可以选择的车位"<<endl;
	cout<<"----------------------------"<<endl;
	cout.setf(ios::left);
	cout.width(8);
	cout<<"楼层";
	cout.width(8);
	cout<<"车位号";
	cout<<endl;
	for(i=0;i<FLOOR;i++)
	{
		if(sign==0) break;
		for(j=0;j<PNUMBER;j++)
		{
			if((cars[i][j].empty==0)&&(i==0))
			{
				sign=0;
				cout.setf(ios::left);
				cout.width(8);
				cout<<i+1;
				cout.width(8);
				cout<<j+1<<endl;
				if(j==PNUMBER-1) {break;}
			}
			else if((cars[i][j].empty==0)&&(i==1))
			{
				cout.setf(ios::left);
				cout.width(8);
				cout<<i+1;
				cout.width(8);
				cout<<j+1<<endl;
			}
		}
	}
	cout<<"----------------------------"<<endl;
	int temf;
	cout<<"请输入车位号:";
	cin>>temf;
	while(1)
	{
		if((cars[sign][temf-1].empty==0)&&(temf>=1&&temf<=6))
		{
			//修改一个车位的信息
			cars[sign][temf-1].empty=1;
			floor=cars[sign][temf-1].floor=sign+1;
			pnumber=cars[sign][temf-1].pnumber=temf;
			strcpy(cars[sign][temf-1].license,licen);
			strcpy(license,licen);
			cars[sign][temf-1].ptime=0;
			//修改整个停车场的信息
			for(i=0;i<FLOOR;i++)
			{
				for(j=0;j<PNUMBER;j++)
				{
					if(cars[i][j].empty==1)
						cars[i][j].ptime+=5;
				}
			}
			break;
		}
		else {
			cout<<"该车位已经存入车辆!请您重新选择车位号:";
			cin>>temf;
		}
	}
	return 1;

}
/*****************************************
*功能描述:取车
*输入参数:要取车辆的车牌号
*输出参数:可随机选择是否输出数据
*返回值:无
*其他声明:无
*****************************************/

void Leavepark(Car cars[FLOOR][PNUMBER],char license[],int &floor,int &pnumber,int &ptime)
{
	//判断车位是否已空
	if(IsEmpty(cars)==1)
	{
		cout<<"停车场已没有车停放!请确定您是否停车。"<<endl;
		return;
	}
	//查找车位
	int sign=1;//标志位,车库有该车为1,没有赋值为零,初始值为0
	int i,j;
	while(sign)
	{
		for(i=0;i<FLOOR;i++)
		{
			for(j=0;j<PNUMBER;j++)
			{
				if(strcmp(cars[i][j].license,license)==0)
				{
					sign=0;
					floor=i;
					pnumber=j;
					ptime=cars[i][j].ptime;
				}
			}
		}
		if(sign)
		{
			cout<<"您刚才输入的车牌号不存在!"<<endl;
			cout<<"请重新输入:";
			cin>>license;
		}
	}
	if(sign==0)
	cout<<"车已找到,请稍等。。。"<<endl;
	cout<<endl;
	floor+=1;
	pnumber+=1;
	for(i=0;i<100000000;i++);
	cars[floor-1][pnumber-1].floor =0;
	cars[floor-1][pnumber-1].pnumber =0;
	cars[floor-1][pnumber-1].ptime=0;
	cars[floor-1][pnumber-1].empty=0;
	strcpy(cars[floor-1][pnumber-1].license," ");
}
//取车的菜单项
int CarOutMenu(char license[],int &floor,int &pnumber,int &ptime,float &cost,char note[100])
{
	cout<<"1 输出凭据"<<endl;
	cout<<"2 直接返回主页"<<endl;
		int p=0;//标志,若已经输出过凭据,则置为1

	int j=0;
	int i=0;
	//计算费用
	cost=ptime*float (0.2);
	while(1)
	{
		cout<<"请选择:";
		int i;
		cin>>i;
		if(i<1||i>3)
		{
			cout<<"您的操作非法!!!"<<endl;
			continue;
		}
		switch(i)
		{
		case 1:
			{
				p=1;
				cout<<endl;
				cout<<"\t\t--------本辆汽车停车信息--------"<<endl;
				cout<<endl;
				Print(license,floor,pnumber,ptime,cost);
				break;
			}
		}
		if(i==1) continue;
		else
		{
			j=1;
			break;
		}
	}
return j;
}
//得到当前时间
void GetDate(Date &date)
{
	time_t t = time( 0 );
	char str[31];
    strftime(str, sizeof(str), "%Y/%m/%d %X %A",localtime(&t) );
	int sign=1,j=0,k=0,l=0;
	for(int i=0;i<31;i++)
		if(sign==1)
		{
			if(str[i]==' ') {sign=2;continue;}
			else {
				date.day[j]=str[i];
				j++;
			}
		}
	else if(sign==2)
		{
			if(str[i]==' ') {sign=3;continue;}
			else {
				date.shike[k]=str[i];
				k++;
			}
		}
	else if(sign==3)
		{
			if(str[i]=='\0') break;
			else {
				date.weekday[l]=str[i];
				l++;
			}
		}
	date.day[j]='\0';
	date.shike[k]='\0';
	date.weekday[l]='\0';
}
//判断车场是否为空
bool IsEmpty(Car cars[FLOOR][PNUMBER])
{
int i,j;
for(i=0;i<FLOOR;i++)
	for(j=0;j<PNUMBER;j++)
		if(cars[i][j].empty==1) return false;
return true;
}
//判断车场是否为空
bool IsFull(Car cars[FLOOR][PNUMBER])
{
int i,j;
for(i=0;i<FLOOR;i++)
	for(j=0;j<PNUMBER;j++)
		if(cars[i][j].empty==0) return false;
return true;
}
//查看存的车牌号是否存在
bool IsSame(Car cars[FLOOR][PNUMBER],char *license)
{
int i,j;
for(i=0;i<FLOOR;i++)
	for(j=0;j<PNUMBER;j++)
		if(strcmp(cars[i][j].license,license)==0) return true;
return false;
}
//逐条添加记录到car.dat中
void Savecars(Car cars[FLOOR][PNUMBER])
{
	FILE* fp = fopen("car.txt","wb");
	if(fp==NULL)
	{
		cout<<"Can not open this file"<<endl;
		return;
	}
	Car car;
	int i=0;
	while(i<FLOOR)
	{
		int j=0;
		while(j<PNUMBER)
		{
			if(cars[i][j].empty ==1)
			{
				car.floor =cars[i][j].floor ;
				strcpy(car.license ,cars[i][j].license );
				car.pnumber =cars[i][j].pnumber ;
				car.ptime =cars[i][j].ptime ;
				car.empty=cars[i][j].empty ;
				fwrite(&car,sizeof(car),1,fp);
			}
			j++;
		}
		i++;
	}
	fclose(fp);
}

//加载初始化的四辆汽车
void Load(Car cars[FLOOR][PNUMBER])
{
	FILE* fp = fopen("car1.txt","rb");
	if(fp==NULL)
	{
		cout<<"不能自动加载 can not open car1.txt"<<endl;
		return;
	}
	Car car;
	int n;
	while(!feof(fp))
	{
		n = fread(&car,sizeof(car),1,fp);
		if(n!=1)
			break;
		Loadfile(cars,car.license ,car.floor,car.pnumber ,car.ptime ,car.empty );
	}
	fclose(fp);
}
//加载每一个停车位的状态
void Loadfile(Car cars[FLOOR][PNUMBER],char license[8],int floor,int pnumber,int ptime,int empty )
{
	if(!license)
		return;
	if(floor>FLOOR||pnumber>PNUMBER) return;
	strcpy(cars[floor-1][pnumber-1].license,license);
	cars[floor-1][pnumber-1].floor =floor;
	cars[floor-1][pnumber-1].pnumber =pnumber;
	cars[floor-1][pnumber-1].ptime =ptime;
	cars[floor-1][pnumber-1].empty =empty;
}
//输出	收费后 个人 凭据
void Print(char license[],int floor,int pnumber,int ptime,float &cost)
{
	cout.setf(ios::left);
	cout.width(8);
	cout<<"车牌";
	cout.width(8);
	cout<<"楼层";
	cout.width(8);
	cout<<"车位号";
	cout.width(8);
	cout<<"停车时间";
	cout.width(8);
	cout<<"消费"<<endl;
	cout.setf(ios::left);
	cout.width(10);
	cout<<license;
	cout.width(8);
	cout<<floor;
	cout.width(8);
	cout<<pnumber;
	cout.width(8);
	cout<<ptime;
	cout.width(8);
	cout<<cost<<endl;
}
void Showcars(Car cars[FLOOR][PNUMBER])//展示现有汽车停车信息
{
	cout<<endl;
	cout<<"\t\t--------现有汽车停车信息--------"<<endl;
	cout<<endl;
	int i,j;
	cout.setf(ios::left);
	cout.width(8);
	cout<<"车牌";
	cout.width(8);
	cout<<"楼层";
	cout.width(8);
	cout<<"车位号";
	cout.width(8);
	cout<<"停车时间"<<endl;
	for(i=0;i<FLOOR;i++)
	{
		for(j=0;j<PNUMBER;j++)
		{
			if(cars[i][j].empty==1)
			{
				cout.setf(ios::left);
				cout.width(8);
				cout<<cars[i][j].license;
				cout.width(8);
				cout<<cars[i][j].floor;
				cout.width(8);
				cout<<cars[i][j].pnumber;
				cout.width(8);
				cout<<cars[i][j].ptime<<endl;
			}
		}
}
}
/*****************************************
*功能描述:登陆界面或者注册用户
*输入参数:账户以及密码
*输出参数:进入管理系统
*返回值:0和1
*其他声明:无
*****************************************/
int UsertestAdd()
{
    //simple登陆验证和注册用户功能
	User UserArr[10]={"123456789","李浩","123456789"};//默认用户
    int count=0;//统计输入用户名和密码错误次数
    int i=0;//遍历变量或找到用户的ID
	int k=1;//表示已存在的用户数
	while(1)
	{
		int n=0;//标识是否匹配,若匹配,则退出外循环
		cout<<"请输入您的管理账号"<<endl;
		char id[10];
		cin>>id;
		cout<<"请输入密码"<<endl;
		char password[10];
		cin>>password;
		for(i=0;i<10;i++)
		{
			if(!strcmp(UserArr[i].id,id)&&!strcmp(UserArr[i].password,password))
			{
				n=1;
				break;
			}
		}
		if(n)
		{
			break;
		}
		i=0;
		count++;
		cout<<"密码或账号错误,";
		if(count==2||k==2)
		{
			cout<<"您今天已累计输错"<<count<<" 次-";
			cout<<"您是否要注册用户?(否则您将自动退出系统)"<<endl;
			cout<<endl;
			cout<<"输入数字1表示同意注册,其他则表示不同意条款"<<endl;
			int tip=0;
			cin>>tip;
			if(tip==1)
			{cout<<"输入注册密码(知道此密码,才有权注册管理员):";
			char str[6];
			cin>>str;
			if(strcmp(str,"666666")==0)
			{
				if(k==2)
				{
					cout<<"很遗憾,系统管理员用户总数达到上限,无法注册,若需注册,请联系管理员"<<endl;
					return 0;
				}
				else{
					cout<<"请输入要注册账号"<<endl;
					char id[10];
					cin>>id;
					strcpy(UserArr[k+1].id ,id);
					cout<<"请输入您的姓名"<<endl;
					char name[10];
					cin>>name;
					strcpy(UserArr[k+1].name ,name);
					cout<<"请输入您的密码"<<endl;
					char password[10];
					cin>>password;
					strcpy(UserArr[k+1].password ,password);
					system ("cls");
					cout<<"注册成功,系统正在为您跳转到登陆界面"<<endl;
					int j=0;
					while(j<1000000000){j++;}
					cout<<endl;
					++k;
						ShowStarA();
				}
			}else return 0;
			}
		}
	}
	cout<<endl;
	cout<<"*******************************************"<<endl;
	cout<<"欢迎进 "<<UserArr[i].name  <<" 入停车场后台管理系统"<<endl;
	cout<<"*******************************************"<<endl;
    cout<<endl;
	return 1;
}
//顾客界面
void Customer(Car cars[FLOOR][PNUMBER],CustList *cl)
{
	ShowStarC();
	int j;
	int sign;
	while(1)
	{
		cout<<"1 存车"<<endl;
		cout<<"2 取车"<<endl;
		cout<<"3 返回主页"<<endl;
		cout<<"请选择:";
		int i;

		char a;
		cin>>i;
		if(i<1||i>3)
		{
			cout<<"您的操作非法!!!"<<endl;
			continue;
		}
		if(i==1||i==2)
		{
			switch(i)
			{
			case 1:
				{
					system ("cls");
					ShowStarC();
					cout<<"	\t欢迎停车!"<<endl;
					char license[8];
					int floor,pnumber;
					sign=Enterpark(cars,license,floor,pnumber); //车辆入库
					Date date;
					GetDate(date);
					InsertToFirst(cl,license,floor,pnumber,date); //修改当天的链表
                 	Savecars(cars);//修改当前的当天的car.txt文件
					if(sign==1)
					{
						cout<<"退出?(Y:是,N:否)"<<endl;
						cout<<"请输入:";
						cin>>a;
					}
				}
			break;
			case 2:
				{
					system ("cls");
					ShowStarC();
					cout<<"\t欢迎取车!"<<endl;
					cout<<endl;
					int floor,pnumber;
					int ptime=0;
					float cost;
					cout<<"请输入您的车牌号:";
					char licen[8];
					cin>>licen;
					cout<<endl;
					Leavepark(cars,licen,floor,pnumber,ptime);
						char note[100]="0";
					j=CarOutMenu(licen,floor,pnumber,ptime,cost,note);
					SearchUpdate(cl,licen,cost,ptime,note);
					Savecars(cars);
					if(j==1) return;
					break;
				}

			}
		}
		else
		{
			system ("cls");
		break;
		}
		if(a=='Y')
		{
			system ("cls");
			break;
		}
		if(sign==0)
		{
			for(i=0;i<1000000000;i++);
			system ("cls");
			break;
		}
	}
}
//修改当前的当天的链表 cl
void SearchUpdate(CustList *&cl,char *license,float cost,int ptimecount,char note[])
{
	Snode *p;
	p=cl->next;
	while(p)
	{
		if(strcmp(p->license,license)==0)
		{
			p->cost=cost;
			p->ptimecount=ptimecount;
			if(strcmp(note,"0")!=0)
				MessageIntoFile(note,license);
			Date date1;
			GetDate(date1);
			cl->dateleave =date1;
			return;
		}
	p=p->next;
	}
}
//后台程序
void Manage(Car cars[FLOOR][PNUMBER],CustList *cl,CustList *clr)
{
	ShowStarA();
	int sign =UsertestAdd();
	if(sign==0)
		return;
	else
	{
	while(1)
	{
		cout<<endl;
		cout<<"1 显示当前的停车场的车辆信息"<<endl;
		cout<<"2 显示当前时刻所有历史停车信息"<<endl;
		cout<<"3 查找某一车辆的历史停车信息"<<endl;
		cout<<"0 退出管理返回主页面"<<endl;
		cout<<"请选择:";
		int i;
		char a;
		cin>>i;
		if(i<0||i>6)
		{
			cout<<"您的操作非法!!!"<<endl;
			continue;
		}
		if(i>=1&&i<7)
		{
			switch(i)
			{
				break;
			case 1:
				{
					system ("cls");
					ShowStarA();
					Showcars(cars);
					break;
				}
			case 2:
				{
					system ("cls");
					ShowStarA();
					 Message(clr);
					break;
				}
			case 3:
				{
					system ("cls");
					ShowStarA();
					cout<<"请您输入车牌号:";
					char license[8];
					cin>>license;
					CheckOneCar(clr,license);
					break;
				}
			}
			if(a=='Y'||a=='y')
			{
				system ("cls");
				break;
			}
		}
		else
		{
			SaveListTemp(cl);
			SaveList(cl);
			system ("cls");
			break;
		}
	}
	}
}
/*****************************************
*功能描述:建立头结点为保存文件做基础
*输入参数:无
*输出参数:无
*返回值:无
*其他声明:
*****************************************/

void InitCustList1(CustList *&cl,Car cars[FLOOR][PNUMBER])
{
	Date date1;

	//建立头结点
	cl=new CustList;
	cl->next=NULL;
	cl->floor =0;
	cl->pnumber =0;
	cl->ptimecount =0;
	cl->cost =0;
	int i,j;
	for(i=0;i<FLOOR;i++)
	{
		for(j=0;j<PNUMBER;j++)
		{
			if(cars[i][j].empty==1)
			{
				GetDate(date1);
				InsertToFirst(cl,cars[i][j].license ,cars[i][j].floor ,cars[i][j].pnumber,date1);
			}
		}
	}
}


 
 

运行图

数据结构课程设计~~立体停车场管理系统(改进版)_第1张图片数据结构课程设计~~立体停车场管理系统(改进版)_第2张图片数据结构课程设计~~立体停车场管理系统(改进版)_第3张图片数据结构课程设计~~立体停车场管理系统(改进版)_第4张图片数据结构课程设计~~立体停车场管理系统(改进版)_第5张图片数据结构课程设计~~立体停车场管理系统(改进版)_第6张图片数据结构课程设计~~立体停车场管理系统(改进版)_第7张图片数据结构课程设计~~立体停车场管理系统(改进版)_第8张图片数据结构课程设计~~立体停车场管理系统(改进版)_第9张图片

你可能感兴趣的:(数据结构课程设计~~立体停车场管理系统(改进版))