#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define N 4
#define M 5
#define money_min 0.1 //该停车场每分钟停车费用
void taxi();
void buy();
void search();
void menu();
void put();
void manage();
int check1(int cnum,char key[]);
int check2(int cnum);
int count=0; //count为已停车位
int insert_num=0; //管理员每次要存入信息的人数
int insert_sum=0; //存入信息总人数
int car[N][M]={0}; //车位停车情况,1为已停车,0为未停车
//停车人信息,carnum为车牌号,ts,te,to分别为开始停车时间,结束停车时间,停车时间
struct stud
{
char carnum[35];
int ts,te,to;
}cus[N][M];
//停车卡信息,num卡号,password密码,money余额,最多存储100个车卡信息
struct stub
{
int num;
char password[35];
double money;
}inf[100];
//管理员信息,name姓名,num卡号,password为密码
struct stup
{
char name[25];
int num;
char password[35];
}manager;
int main()
{
strcpy(manager.name,”hehe”);
manager.num=10000;
strcpy(manager.password,”without”);
while(1)
{
menu();
printf(“请输入您的选择,同时按回车键确认:”);
while(1)
{
int sel;
scanf(“%d”,&sel);
fflush(stdin);
switch(sel)
{
case 1:search();break; //停车状态查询
case 2:taxi();break; //停车
case 3:buy();break; //取车
case 4:put();break; //自助充值
case 5:manage();break; //管理员管理系统
case 0:system(“pause”);system(“cls”);break;
default :printf(” 输入错误,请重新输入\n”);
}
if(sel>=0 && sel<=5) break;
}
}
return 0;
}
//充值函数
void put()
{
int num,i;
printf(“充值系统已开启:\n”);
printf(“注意您每次的充值仅限为100RMB!\n”);
printf(“请输入您的卡号:”);
scanf(“%d”,&num);
fflush(stdin);
if(num==0)
{
system(“cls”);
return ;
}
printf(“请放好您的人民币\n”);
system(“pause”);
//充值操作
for(i=0;i<insert_sum;i++)
if(num==inf[i].num)
{
inf[i].money+=100;
FILE *ft;
ft=fopen(“pass.txt”,”a”);
time_t t=time(NULL);
char *time=ctime(&t);
fprintf(ft,”id=%d,password=%s,money=%.1lf,time=%s”,inf[i].num,inf[i].password,inf[i].money,time);
fclose(ft);
break;
}
printf(“充值成功,您的停车卡余额:%.1lf\n”,inf[i].money);
system(“pause”);
system(“cls”);
return ;
}
//管理员管理函数
void manage()
{
char name[25];
int num;
char password[35];
while(1)
{
printf(“请输入姓名:”);
scanf(“%s”,name);
fflush(stdin);
if(strcmp(name,”0″)==0)
{
system(“cls”);
return ;
}
printf(“请输入卡号:”);
scanf(“%d”,&num);
fflush(stdin);
if(num==0)
{
system(“cls”);
return ;
}
printf(“请输入密码:”);
scanf(“%s”,password);
fflush(stdin);
if(strcmp(password,”0″)==0)
{
system(“cls”);
return ;
}
if( !(strcmp(name,manager.name)==0 && (num==manager.num) &&
strcmp(password,manager.password)==0) )
{
printf(“输入错误,请重新输入!\n”);
system(“pause”);
system(“cls”);
continue;
}
else break;
}
printf(“输入正确!\n”);
int p_num,i;
FILE *fp;
printf(“请输入您要添加信息的人数:”);
scanf(“%d”,&p_num);
//取当前系统时间
time_t t=time(NULL); //调用时间函数
insert_num=p_num;
system(“pause”);
for(i=0;i<=p_num;i++)
{
system(“cls”);
if(i==p_num) //该次添加人数已满
{
printf(“本次添加人数已满,将返回菜单模式!\n”);
system(“pause”);
system(“cls”);
continue;
}
printf(“已添加信息的人数:%d,剩余添加信息的人数:%d\n”,i,insert_num);
fp=fopen(“pass.txt”,”a”);
char *time=ctime(&t); //记录此处的时间
int _num,flag; //_num为停车卡所属者的卡号,flag为判断卡号是否有重复
while(1)
{
printf(“卡号:”);
scanf(“%d”,&_num);
fflush(stdin);
if(_num==0)
{
system(“cls”);
return ;
}
flag=check2(_num);
if(flag==1)
{
printf(“信息已存在,请重新输入!\n”);
continue;
}
else break;
}
inf[insert_sum].num=_num;
printf(“密码:”);
scanf(“%s”,inf[insert_sum].password);
fflush(stdin);
printf(“金额:”);
scanf(“%lf”,&inf[insert_sum].money);
fflush(stdin);
fprintf(fp,”id=%d,password=%s,money=%.1lf,time=%s”,inf[insert_sum].num,
inf[insert_sum].password,inf[insert_sum].money,time); //讲信息读入文件保存以供管理员查询
fclose(fp);
printf(“添加信息成功!\n”);
insert_num–;
insert_sum++;
system(“pause”);
system(“cls”);
}
}
//查询重复号
int check2(int _num)
{
int flag=0; //flag=1表示该号已存在,0表示不存在
int i;
for(i=0;i<insert_sum;i++)
if(_num==inf[i].num)
{
flag=1;break;
}
return flag;
}
//查询功能,cnum为卡号,key数组为持卡人输入的密码
int check1(int cnum,char key[])
{
int flag=-1,i;
for(i=0;i<insert_sum;i++) //
if(inf[i].num==cnum)
{
if(strcmp(inf[i].password,key)==0)
{
flag=i;break;
}
}
return flag;
}
//取车系统
void buy()
{
char carnum[35];
int num;
while(1)
{
printf(“请输入您的停车号:”); //停车号为num,则在密码数组中的号码为num-1;
scanf(“%d”,&num);
fflush(stdin);
if(num==0)
{
system(“cls”);
return ; //返回主菜单
}
if( !(num>0 && num<=N*M)) //停车号不大于最大停车数量
{
printf(“输入错误,请重新输入!\n”);
continue;
}
else ;
while(1)
{
printf(“请输入您的车牌号:”); //车牌号为15个字符内
scanf(“%s”,carnum);
fflush(stdin);
if(strlen(carnum)>=15)
{
printf(“输入错误,请重新输入!\n”);
continue;
}
else break;
}
if(strcmp(carnum,cus[num/N][num%N-1].carnum)!=0) //当前用户所停车位的车牌号,与先前输入的车牌号不相同
{
printf(“输入错误,请重新输入!\n”);
continue;
}
else break;
}
int cnum,flag;
char key[35];
while(1)
{
printf(“刷卡消费,请输入您的卡号:”);
scanf(“%d”,&cnum);
fflush(stdin);
printf(“请输入您的密码:”);
gets(key);
fflush(stdin);
flag=check1(cnum,key); //检查卡号和密码是否匹配
if(flag==-1)
{
printf(“输入错误,请重新输入,必要时与管理员联系!\n”); //注意flag变量的作用
continue;
}
else break;
}
printf(“输入正确\n”);
system(“pause”);
system(“cls”);
//计录结束停车时间,并计算该车的停车时间
cus[num/N][num%N-1].te=time(NULL); //结束该车的停车时间
cus[num/N][num%N-1].to=cus[num/N][num%N-1].te-cus[num/N][num%N-1].ts;
int time_min=cus[num/N][num%N-1].to/60;
time_min= (cus[num/N][num%N-1].to-time_min*60)!=0 ? time_min+1 : time_min; //不足一分钟按一分钟计算
printf(“您的本次停车费用:%.1lfRMB\n”,time_min*money_min);
while(inf[flag].money<time_min*money_min) //当余额不足时,调用充值系统
{
printf(“您的余额为%.1lf,不足,请充值\n”,inf[flag].money);
put(); //调用充值系统
}
//扣除费用
inf[flag].money-=time_min*money_min;
printf(“您的停车时间:%dmin\n”,time_min);
printf(“每分钟停车费用:%.1lfRMB\n”,money_min);
printf(“缴费后您的余额为:%.1lfRMB\n”,inf[flag].money);
printf(“缴费成功!\n”);
count–;//该车离开,所停总车位-1
int _num;
srand((unsigned)time(NULL)); //调用随机函数,为该车分配出口离开
_num=rand()%2;
printf(“请选择%d号出口,欢迎下次光临\n”,flag+1);
//清除某车离开后该车在在停车场某车位原有的信息
car[num/N][num%N-1]=0;
strcpy(cus[num/N][num%N-1].carnum,”\0″);
cus[num/N][num%N-1].ts=0;
cus[num/N][num%N-1].te=0;
cus[num/N][num%N-1].to=0;
system(“pause”);
system(“cls”);
}
//停车系统
void taxi()
{
char carnum[35];
int i,j,flag=0;
//添加停车提示,为完成
while(1)
{
printf(“请输入您的车牌号:”); //车牌号含有汉字,字母和数字,用字符
scanf(“%s”,carnum);
fflush(stdin);
if(strcmp(carnum,”0″)==0)
{
system(“cls”);
return ; //返回主菜单
}
if(strlen(carnum)>=35)
{
printf(“输入错误,请重新输入!\n”);
continue;
}
else break;
}
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(car[i][j]==0) //寻找空余可停车位
{
printf(“分配给您的车位:”);
printf(“%d\n”,i*N+j+1); //i*N+j+1 为所停车位号
car[i][j]=1;
strcpy(cus[i][j].carnum,carnum); //count 为已停车位的数目
flag=1;
break;
}
}
if(flag==1) break;
}
if(flag==0)
{
printf(“尊敬的用户,您好,该停车场已满,请找其他停车场\n”);
system(“pause”);
system(“cls”);
}
else
{
count++;
system(“pause”);
cus[i][j].ts=time(NULL); //计时开始
system(“cls”);
}
return ;
}
//查询系统
void search()
{
printf(“\t\t\t *******欢迎使用智能停车场系统*******\n”);
printf(“\t\t\t ******************\n”);
int i,j;
for(i=0; i<N; i++)
{
printf(“\t\t\t “);
for(j=0;j<M;j++)
{
printf(” ┃”);
if(car[i][j]==1)
{
printf(” ■ “);
}
else
{
printf(” □ “);
}
}
printf(” ┃\n”);
printf(“\t\t\t “);
for(j=i*M+0;j<=i*M+N;j++)
{
printf(” ┃”);
printf(” %2d”,j+1);
}
printf(” ┃\n”);
if(i<N-1)
printf(“\t\t\t******************\n”);
}
printf(“\t\t\t******************\n”);
if(count==N*M)
{
printf(“尊贵的用户,您好,该停车场已满,请找其他停车场!\n”);
}
else
{
printf(“尊贵的用户,您好,已停车位:%d,可停车位%d,您可以停车!\n”,count,N*M-count);
}
system(“pause”);
system(“cls”);
return ;
}
//菜单
void menu() //菜单中添加显示当前时间
{
time_t t=time(NULL);
char *time=ctime(&t);
printf(“\t\t\t******************\n”);
printf(“\t\t\t 欢迎使用智能停车场系统 \n”);
printf(“\t\t\t \n”);
printf(“\t\t\t 1-停放状态查询 \n”);
printf(“\t\t\t 2-停车 \n”);
printf(“\t\t\t 3-取车 \n”);
printf(“\t\t\t 4-自助充值 \n”);
printf(“\t\t\t 5-管理员管理系统 \n”);
printf(“\t\t\t 0-返回主菜单 \n”);
printf(“\t\t\t 请按相关输入对应数字 \n”);
printf(“\t\t\t 注:□ -空位,■ -已停 \n”);
printf(“\t\t\t******************\n”);
printf(“\t\t\t 当前时间:%s”,time);
}