#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <ctime>
#include <cstring>
#include <conio.h>
#define N 100
using namespace std;
typedef struct
{
char num[8];//車牌號
long int time_in;
int pos;//車輛的狀態,0表示停在便道中,1表示停在停車場
} vehicle; //定義車輛類型
typedef struct
{
vehicle veh[N];
int top;
} SqStack; //用棧表示停車場
typedef struct LNode
{
vehicle veh;
struct LNode *next;
} LinkList; //用單鏈表表示便道
void Load(FILE *,SqStack *,LinkList *);
void ShowMenu(int );
int MakeChoice(int ,int );
void Parking(SqStack *,LinkList *);
void Back(SqStack *);
void EnterPkl(SqStack *,LinkList *);
void LeavePath(LinkList *);
void View(SqStack *,LinkList *);
void Write_and_Quit(FILE *,SqStack *,LinkList *);
int main()
{
SqStack *pkl;
LinkList *path;
FILE *fp;
pkl=(SqStack *)malloc(sizeof(SqStack));
path=(LinkList *)malloc(sizeof(LinkList));
fp=fopen("Parking_lot.txt","r+");
if(fp==NULL)
{
printf("數據加載失敗!按任意鍵退出程序");
getch();
return 0;
}
Load(fp,pkl,path);
while(1)
{
system("cls");
ShowMenu(pkl->top);
switch(MakeChoice(1,6))
{
case 1:
system("cls");
Parking(pkl,path);
break;
case 2:
system("cls");
Back(pkl);
break;
case 3:
system("cls");
EnterPkl(pkl,path);
break;
case 4:
system("cls");
LeavePath(path);
break;
case 5:
system("cls");
View(pkl,path);
break;
default:
system("cls");
Write_and_Quit(fp,pkl,path);
return 0;
}
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <ctime>
#include <cstring>
#include <conio.h>
#define N 100
using namespace std;
typedef struct
{
char num[8];//車牌號
long int time_in;
int pos;//車輛的狀態,0表示停在便道中,1表示停在停車場
} vehicle; //定義車輛類型
typedef struct
{
vehicle veh[N];
int top;
} SqStack; //用棧表示停車場
typedef struct LNode
{
vehicle veh;
struct LNode *next;
} LinkList; //用單鏈表表示便道
void Load(FILE * fp,SqStack * pkl,LinkList * path)
{
pkl->top=-1;
path->next=NULL;
LinkList *p;
char num[8];
long int time_in;
int pos;
while(fscanf(fp,"%s %ld %d\n",num,&time_in,&pos)!=EOF)
{
if(pos==0)//該車輛在便道中
{
//尾插法建立單鏈表
p=(LinkList *)malloc(sizeof(LinkList));
strcpy(p->veh.num,num);
p->veh.time_in=time_in;
p->veh.pos=pos;
path->next=p;
path=p;
}
else//該車輛在停車場中
{
++pkl->top;
strcpy(pkl->veh[pkl->top].num,num);
pkl->veh[pkl->top].time_in=time_in;
pkl->veh[pkl->top].pos=pos;
}
}
path->next=NULL;
}
void ShowMenu(int n)
{
printf("********一個簡單的停車場管理系統********\n");
if(n+1==N)
printf("***************停車場已滿***************\n");
else
printf("**********當前停車場共有%03d輛車**********\n",n+1);
printf("********說明:停車場每小時收費5元********\n");
printf("****************1.停車******************\n");
printf("****************2.取車******************\n");
printf("*********3.便道車輛進入停車場***********\n");
printf("**************4.離開便道****************\n");
printf("**************5.查看車輛****************\n");
printf("****************6.退出******************\n");
}
int MakeChoice(int m,int n)
{
int judge;
printf("請輸入%d~%d\n",m,n);
scanf("%d",&judge);
while(judge<m||judge>n)//確保輸入的是1~n
{
printf("輸入不合法,請輸入%d~%d\n",m,n);
fflush(stdin);//如果不加這句,輸入一些字母會導致函數無限循環
scanf("%d",&judge);
}
return judge;
}
void Parking(SqStack *pkl,LinkList *path)
{
LinkList *r;
printf("請輸入車牌號:");
if(pkl->top<N-1)
{
fflush(stdin);
scanf("%8s",pkl->veh[++pkl->top].num);
time(&(pkl->veh[pkl->top].time_in));
pkl->veh[pkl->top].pos=1;
printf("您的車輛已停至%2d號車位\n",pkl->top);
}
else
{
fflush(stdin);
r=(LinkList *)malloc(sizeof(LinkList));
scanf("%8s",r->veh.num);
printf("停車場已滿,您要暫時停放在便道中嗎?\n");
printf("1.確定 2.取消\n");
if(MakeChoice(1,2)==1)
{
while(path->next!=NULL)
path=path->next;
r->veh.time_in=0;
r->veh.pos=0;
path->next=r;
r->next=NULL;
printf("您的車輛已停放到便道中\n");
}
else
free(r);
}
printf("按任意鍵返回主菜單");
getch();
return;
}
void Back(SqStack *pkl)
{
int n,i=0;
long int time_out;
double hours;
vehicle t_pkl[N];
printf("請輸入您的車輛所在的車位(目前還有個小問題,前面的車走了之後當前車位會-1):");
n=MakeChoice(0,pkl->top);
printf("%2d上的車輛車牌號爲%s,您確定要取走該車輛嗎?\n",n,pkl->veh[n].num);
printf("1.確定 2.取消\n");
if(MakeChoice(1,2)==1)
{
time(&time_out);
hours=(time_out-pkl->veh[n].time_in)/3600.0;
printf("本次停車共計%lf小時,收費%lf元,請按任意鍵確認支付\n",hours,hours*5);
getch();
for(i=0; pkl->top>=n; --pkl->top,++i) //把第n輛到第pkl->top輛車移到t_pkl
t_pkl[i]=pkl->veh[pkl->top];
//此時pkl->top指向第n-1輛車
for(i-=2; i>=0; --i) //把第n+1輛到第pkl->top輛車移回pkl
pkl->veh[++pkl->top]=t_pkl[i];
printf("支付成功!\n");
printf("取車成功,按任意鍵返回主菜單");
getch();
return;
}
else
{
printf("按任意鍵返回主菜單");
getch();
return;
}
}
void EnterPkl(SqStack *pkl,LinkList *path)
{
if(pkl->top==N-1)
printf("停車場已滿!");
else
{
printf("您確定將便道中第一輛車(車牌號:%8s)停入停車場嗎?\n",path->next->veh.num);
printf("1.確定 2.取消\n");
if(MakeChoice(1,2)==1)
{
pkl->veh[++pkl->top]=path->next->veh;
time(&pkl->veh[pkl->top].time_in);
path->next=path->next->next;
printf("已停入停車場\n");
}
}
printf("按任意鍵返回主菜單");
getch();
return;
}
void LeavePath(LinkList *path)
{
int i=0,n;
LinkList *q;
printf("請輸入要離開便道的車輛的位序:");
scanf("%d",&n);
while(i<n&&path!=NULL)
{
++i;
q=path;//保存當前節點的前一個節點,如果找到的位置在鏈表最後,需要將前一個節點的指針域置爲NULL
path=path->next;
}
if(path!=NULL)
{
printf("您確定便道中第%03d輛車(車牌號:%8s)離開便道嗎?\n",n,path->veh.num);
printf("1.確定 2.取消\n");
if(MakeChoice(1,2)==1)
{
if(path->next!=NULL)//確定離開並且不是便道中最後一輛車
{
q=path->next;
path->next=q->next;
free(q);
printf("第%03d輛車已離開便道\n",n);
}
else//確定離開並且是便道中最後一輛車
{
printf("第%03d輛車已離開便道\n",n);
q->next=NULL;
free(path);
}
}
}
else
printf("沒有找到第%03d輛車\n",n);
printf("按任意鍵返回主菜單");
getch();
return;
}
void View(SqStack *pkl,LinkList *path)
{
int i;
long int time_out;
double hours;
time(&time_out);
printf("停車場共有%03d輛車:\n",pkl->top+1);
for(i=0; i<=pkl->top; ++i)
{
hours=(time_out-pkl->veh[i].time_in)/3600.0;
printf("車位:%2d 車牌號:%8s 停車時長:%lf 應繳費用:%lf\n",i,pkl->veh[i].num,hours,hours*5);
}
printf("便道車輛:\n");
if(path->next==NULL)
printf("無\n");
while(path->next!=NULL)
{
path=path->next;
printf("車牌號:%s\n",path->veh.num);
}
printf("按任意鍵返回主菜單");
getch();
return;
}
void Write_and_Quit(FILE *fp,SqStack *pkl,LinkList *path)
{
rewind(fp);
LinkList *pre=path,*p=path->next;
for(; pkl->top>-1; --pkl->top)
fprintf(fp,"%s %ld %d\n",pkl->veh[pkl->top].num,pkl->veh[pkl->top].time_in,pkl->veh[pkl->top].pos);
while(p!=NULL)
{
free(pre);
fprintf(fp,"%s %ld %d\n",p->veh.num,p->veh.time_in,p->veh.pos);
pre=p;
p=pre->next;
}
free(pre);
free(pkl);
fclose(fp);
}