/*
* Copyright (c)2016,烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:lalala
* 作 者:臧新晓
* 完成日期:2016年12月30日
* 版 本 号:v1.0
* 问题描述:立体车库管理系统
* 输入描述:无
* 程序输出:测试数据
*/
//dingyi.h
#include
#include
#include
#include //standard library标准库文件
#include //得到当前时间的头文件
#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 ShowStarB();//展示界面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[],Date date);//修改当前的当天的链表 cl
void SaveListTemp(CustList *cl);//将链表的信息保存到历史文件today.dat中
void SaveList(CustList *cl);//保存历史信息至文件
void DeleteAll(CustList *cl);//删除链表
void LoadList(CustList *clr);//加载历史文件
//main.cpp
#include "dingyi.h"
int main()
{
system("color 71");
Welcome();
//初始化还没有出库的车
Car cars[FLOOR][PNUMBER];
int i,j;
for(i=0;i>i;
if(i<1||i>3)
{
cout<<"您的操作非法!!!"<
//jiemian.cpp
#include"dingyi.h"
void Welcome()
{
int i;
char choice;
for(i=1;i<=160;i++)
cout<<"\004";
cout<>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<<"请做出正确的选择!"<>choice;
}
}
}
void ShowStarA()
{
cout<<"********************************************************************************"<next;
cout<license,license)==0)
{
cout<date.day<<" "<date.shike<<" "<date.weekday<license;
cout.width(8);
cout<floor;
cout.width(8);
cout<pnumber;
cout.width(10);
cout<ptimecount;
cout.width(8);
cout<cost;
cout<date.day,p->dateleave.day)==0&&strcmp(p->date.shike,p->dateleave.shike)==0 &&strcmp(p->date.weekday,p->dateleave.weekday)==0 )
cout<<" 出库时间: 未知"<dateleave.day<<" "<dateleave.shike<<" "<dateleave.weekday<next ;
}
}
/*****************************************
*功能描述:所有的历史停车信息
*输入参数:无
*输出参数:无
*返回值:无
*其他声明:无
*****************************************/
void Message(CustList *clr)
{
cout<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<<"消费"<date.day<<" "<date.shike<<" "<date.weekday<license;
cout.width(8);
cout<floor;
cout.width(8);
cout<pnumber;
cout.width(10);
cout<ptimecount;
cout.width(8);
cout<cost;
cout<date.day,p->dateleave.day)==0&&strcmp(p->date.shike,p->dateleave.shike)==0 &&strcmp(p->date.weekday,p->dateleave.weekday)==0 )
cout<<" 出库时间: 未知"<dateleave.day<<" "<dateleave.shike<<" "<dateleave.weekday<next;
}
cout<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<>licen;
cout<>licen;
}
//查看是否有重复
while(1)
{
if(IsSame(cars,licen)==1)
{
cout<<"已经存在这辆车,请重新输入7标准位车牌号:"<>licen;
}
else break;
}
int i,j;
if(IsFull(cars)==1)
{
cout<<"已经没有空车位了,谢谢惠顾!正在跳转到顾客界面。。。"<>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>temf;
}
}
return 1;
}
/*****************************************
*功能描述:取车
*输入参数:要取车辆的车牌号
*输出参数:可随机选择是否输出数据
*返回值:无
*其他声明:无
*****************************************/
void Leavepark(Car cars[FLOOR][PNUMBER],char license[],int &floor,int &pnumber,int &ptime)
{
//判断车位是否已空
if(IsEmpty(cars)==1)
{
cout<<"停车场已没有车停放!请确定您是否停车。"<>license;
}
}
if(sign==0)
cout<<"车已找到,请稍等。。。"<>i;
if(i<1||i>3)
{
cout<<"没有此项操作!!!"<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<<"消费"<>id;
cout<<"请输入密码"<>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<<"您今天已累计输错"<>tip;
if(tip==1)
{cout<<"输入注册密码(知道此密码,才有权注册管理员):";
char str[6];
cin>>str;
if(strcmp(str,"666666")==0)
{
if(k==2)
{
cout<<"很遗憾,系统管理员用户总数达到上限,无法注册,若需注册,请联系管理员"<>id;
strcpy(UserArr[k+1].id ,id);
cout<<"请输入您的姓名"<>name;
strcpy(UserArr[k+1].name ,name);
cout<<"请输入您的密码"<>password;
strcpy(UserArr[k+1].password ,password);
system ("cls");
cout<<"注册成功,系统正在为您跳转到登陆界面"<>i;
if(i<1||i>3)
{
cout<<"您的操作非法!!!"<>a;
}
}
break;
case 2:
{
system ("cls");
ShowStarC();
cout<<"\t欢迎取车!"<>licen;
cout<next;
while(p)
{
if(strcmp(p->license,license)==0)
{
p->cost=cost;
p->ptimecount=ptimecount;
if(strcmp(note,"0")!=0)
MessageIntoFile(note,license);
p->dateleave=date;
strcpy(p->dateleave.day,date.day);
strcpy(p->dateleave.shike,date.shike);
strcpy(p->dateleave.weekday,date.weekday);
cout<dateleave.day;
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<>i;
if(i<0||i>6)
{
cout<<"您的操作非法!!!"<=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
运行结果: