#include<stdio.h>
#include<stdlib.h>
#define M 2
#define N 6
#define PRICE 0.2
typedef struct
{
int car_id;//车牌号
int floor_num;//层号
int park_num;//车位号
int park_time;//停车时间
}carnode;
carnode Park[M][N];//定义一个两层的停车场
void save(carnode (*park)[6])//将停车信息写到文件中
{
FILE *fp;
int i,j;
if((fp=fopen("d:\\car.dat","w"))==NULL)
{printf("cannot open file\n");
return ;
}
for(i=0;i<2;i++)
for(j=0;j<6;j++)
fprintf(fp,"%d %d %d %d\n",park[i][j].car_id,park[i][j].floor_num,park[i][j].park_num,park[i][j].park_time);
fclose(fp);
}
void InitParking(carnode (*park)[N])
{
int i,j;
printf("请输入初始停车信息:\n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(i<1&&j<4)
{
printf("请输入车牌号:\n");
scanf("%d",&park[i][j].car_id);
park[i][j].floor_num=i+1;
park[i][j].park_num=j+1;
printf("请输入停车时间:\n");
scanf("%d",&park[i][j].park_time);
}
else
{
park[i][j].car_id=0;
park[i][j].floor_num=i+1;
park[i][j].park_num=j+1;
park[i][j].park_time=0;
}
}
save(park);//将停车场初始化后的信息写入文件中
}
void printParkInfo(carnode (*park)[N])
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
if(park[i][j].car_id!=0)
{
printf("%-6d",park[i][j].car_id);
printf("%-6d",park[i][j].floor_num);
printf("%-6d",park[i][j].park_num);
printf("%-6d",park[i][j].park_time);
printf("\n");
}
}
}
save(park);//将停车场初始化后的信息写入文件中
}
void ParkCar(carnode (*park)[N])//停车操作
{
int i,j,x;
int count;//定义计数器,判断停车场是否满
int flag=0;
count=0;
printf("\n\n请输入车牌号:\n\n");
scanf("%d",&x);/*输入要停车的车牌号*/
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
if(park[i][j].car_id==0)
{
flag=1;
park[i][j].car_id=x;
printf("请您的车停在%d楼%d号车位!\n",i+1,j+1);
break;
}
count++;
}
if(flag==1)
{
break;
}
}
if(count>=12)
printf("停车场已满,请稍等!\n");
else
{
for(i=0;i<2;i++)
for(j=0;j<6;j++)
{
if(park[i][j].car_id!=0)
park[i][j].park_time+=5;
}
save(park);
}
}
void GetCar(carnode (*park)[N])//依据车牌号取车,并计费
{
FILE * carinfo;
int car_id;
double price;
int flag=0;//设置标记flag判断车辆是否在停车场中
char ch;//接收是否打印停车费用的变量
int count=0;//取车时记录用户输入的车牌号次数,超过三次时停止取车
printf("请输入您的车牌号:\n");
scanf("%d",&car_id);
while(flag==0&&count<2)
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
if(park[i][j].car_id==car_id)
{
price=PRICE*park[i][j].park_time;//计算停车费用
printf("是否打印停车费用:选择y打印,n不打印:");
getchar();
scanf("%c",&ch);
switch(ch)
{
case 'y':
{
printf("您的停车时间为%d分钟,停车费用为%.1lf元\n",park[i][j].park_time,price);
//清除该车在停车场对应信息
park[i][j].car_id=0;//停车场中车位对应的车牌号清零
park[i][j].park_time=0;
flag=1;
break;
}
case 'n':
flag=1;
break;
}
}
}
if(flag==1)
break;
}
if(flag==0)
{
count++;//当用户车牌号和停车场中车牌号不匹配时,记录次数加1
printf("请核对车牌号后重新输入:\n");
scanf("%d",&car_id);
}
}
if(flag==0)
{
printf("您连续三次输入车牌号错误,不可以取车!\n");
}
if(flag==1)//当用户取车成功时才将停车信息写入文件
{
if((carinfo=fopen("d:\\car.dat","w"))==NULL)//取车成功时,更新停车场信息
{
printf("文件不存在!\n");
exit(0);
}
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
fprintf(carinfo,"%d %d %d %d\n",park[i][j].car_id,park[i][j].floor_num,park[i][j].park_num,park[i][j].park_time);
}
}
fclose(carinfo);//关闭文件
}
}
void PrintInfo()//从文件中输出全部停车车辆信息
{
FILE * carinfo;
int car_id,floor_num,park_num,park_time;
if((carinfo=fopen("d:\\car.dat","r"))==NULL)
{
printf("文件不存在!\n");
exit(0);
}
printf("|车牌号 |层号 |车位号 |停车时间|\n");
while(fscanf(carinfo,"%d %d %d %d",&car_id,&floor_num,&park_num,&park_time)!=EOF)//从文件缓冲区中读数据到变量中
printf("%-8d%-8d%-8d%-8d\n",car_id,floor_num,park_num,park_time);
fclose(carinfo);
}
void GetAllCars(carnode (*park)[N])//清空停车场
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
park[i][j].car_id=0;
park[i][j].floor_num=i+1;
park[i][j].park_num=j+1;
park[i][j].park_time=0;
}
}
save(park);//将停车场初始化后的信息写入文件中
}
void main()
{
int operator_type;
printf("********************************停车场管理菜单*********************************\n\n");
printf(" 1.初始化停车场 \n");
printf(" 2.停 车 操 作 \n");
printf(" 3.取 车 操 作 \n");
printf(" 4.输出停车场车辆信息 \n");
printf(" 5.清空停车场 \n");
printf(" 6.退 出 系 统\n\n");
printf("*******************************************************************************\n\n");
printf("请输入您要选择的操作:");
scanf("%d",&operator_type);
while(operator_type!=6)
{
switch(operator_type)
{
case 1:
InitParking(Park);
break;
case 2:
ParkCar(Park);
break;
case 3:
GetCar(Park);
break;
case 4:
PrintInfo();
break;
case 5:
GetAllCars(Park);
break;
case 6:
exit(0);
default:
printf("操作选择错误,请重新选择!\n");
break;
}
printf("********************************停车场管理菜单*********************************\n\n");
printf(" 1.初始化停车场 \n");
printf(" 2.停 车 操 作 \n");
printf(" 3.取 车 操 作 \n");
printf(" 4.输出停车场车辆信息 \n");
printf(" 5.清空停车场 \n");
printf(" 6.退 出 系 统\n\n");
printf("*******************************************************************************\n\n");
//getchar();
printf("请输入您要选择的操作:\n");
scanf("%d",&operator_type);
}
}