?? 停車場管理系統.cpp
字號:
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
///計時,補上
#include<time.h>
///
#define stack_init_size 10
#define stackincrement 10
#define OK 1
#define ERROR 0
#define chewei 5 //停車場車位個數/
typedef int status;
typedef long selemtype;
typedef long qelemtype;
//棧。
typedef struct{
selemtype stack_size;
long *base;
long*top;
}sqstack;
status initstack(sqstack &s){//新新建空棧
s.base=(long *)malloc(stack_init_size * sizeof(long));
if(!s.base)return 0;
s.top=s.base;
s.stack_size=stack_init_size;
return OK;
}
status push(sqstack &s,selemtype e){//在棧中插入元素。
if((s.top-s.base)>=s.stack_size){//棧滿。追加空間
s.base=(selemtype *)realloc(s.base,(s.stack_size+stackincrement) * sizeof(selemtype));
if(!s.base)return 0;
s.top=s.base+s.stack_size;
}
*s.top++ =e;
return OK;
}
status pop(sqstack &s,selemtype &e){//出棧
if(s.top ==s.base)return ERROR;
e= * --s.top;
return OK;
}
int length(sqstack s){//棧長度
return s.top-s.base;
}
int chazhao(sqstack s,selemtype id){//查找元素在棧中的位置
long *bb;bb=s.base;int bbb=0;
int eqe;eqe=length(s);
for(int ii=1;ii<=eqe;ii++){
if(*bb==id){bbb=1;break;}
bb++;
}
if(bbb=0)return 0;
else if(ii>eqe)return 0;
else return ii;
}
void xianshi(sqstack s){//顯示棧內所有元素
long *rr;rr=s.base;
if(s.top ==s.base)cout<<"停車場內沒有車輛\n";
for(int iii=1;iii<=s.top-s.base;iii++){
cout<<*rr<<" ";
rr++;
}
cout<<"\n";
return;
}
//隊列
#define null 0
typedef struct Qnode{
qelemtype data;
struct Qnode *next;
}Qnode, *QueuePtr;
typedef struct{
QueuePtr front; //隊頭指針
QueuePtr rear; //隊尾指針
}linkqueue;
status initqueue(linkqueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode));
if(!Q.front)return ERROR;
Q.front->next=null;
return OK;
}
status enqueue(linkqueue &Q,qelemtype c){//插入元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(Qnode));
if(!p)return ERROR;
p->data=c;p->next = null;
Q.rear->next=p;
Q.rear=p;
if(Q.front->next==null)Q.front->next=p;
return OK;
}
status dequeue(linkqueue &Q,qelemtype &ee){//刪除元素
if(Q.front==Q.rear)return ERROR;
QueuePtr p;
p=Q.front->next;
ee=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return OK;
}
status changdu(linkqueue Q){//取得隊列的長度
if(Q.front->next==null)return 0;
else if(Q.front==Q.rear)return 1;
else{
QueuePtr h;h=Q.front->next;
for(int n=1;n<100;n++){
if(h->next==null)break;
h=h->next;}
return n;}
}
status find(linkqueue Q,qelemtype t){//查找,返回車在隊列中的位置。
QueuePtr k;qelemtype l;int x=0;
if(Q.front==Q.rear)return 0;
k=Q.front->next;
l=k->data;
if(l==t)return 1;
for(int wz=2;wz<=100;wz++){if(k->next==null)break;
k=k->next;l=k->data;
if(l==t){x=1;break;}
}
if(x=0)return 0;
else if(wz>changdu(Q))return 0;
else return wz;
}
void xianshi2(linkqueue Q){//顯示隊列中所有元素
QueuePtr k1;
if(Q.front->next==null)return;
else{k1=Q.front->next;
for(int n1=1;;n1++){
cout<<k1->data<<" ";
if(k1->next==null)break;
k1=k1->next;
}
}
cout<<"\n";
return;
}
//計費用結構體.后來補上
struct jifei{
long idche;//車牌號
time_t jinruahijian;//此車的進入時間
int full; //判斷結構體變量是否寫入停車進入時間信息
}caitime[chewei];
//輸入轉化把字符轉換為數字
long convert(char cid1[6]){
long result=0;
for (int cl=0;cl<=6;cl++)
{
if (cid1[cl]=='\0') break;
if (cid1[cl]<'0' || cid1[cl]>'9') {return -1;}
result=result*10+(cid1[cl])-48;
}//把字符串轉化為數值,這樣的好處是當輸入字符串等非正常信息時不會死循環
return result;
}
int buzhijielikai(long carid,linkqueue &Q,sqstack &s,long &e,long &ee){
long linshichedao[chewei];int pl;int lth;
lth=length(s);
pl=chazhao(s,carid);
int n2;
for(n2=0;n2<lth-pl;n2++){pop(s,e);linshichedao[n2]=e;}//出棧lth-pl次,把指定車輛后面的車都出棧賦給數組
pop(s,e);//指定車輛出棧
for(;n2>0;n2--){push(s,linshichedao[n2-1]);}//數組數據再進棧
if(changdu(Q)!=0){dequeue(Q,ee);push(s,ee);
cout<<endl<<"便道里的車"<<ee<<"已經進入車道,開始計費";
//------------------------進棧計時,補上
int h=0;
for(h=0;h<=(chewei-1);h++){if(caitime[h].full==0)break;}
caitime[h].idche=ee;
caitime[h].jinruahijian=time(NULL);
caitime[h].full=1;
//----------------以上為增加的計費模塊
}
return 1;
}
int zhijielikai(linkqueue &Q,sqstack &s,long &e,long &ee){
pop(s,e);
if(changdu(Q)!=0){dequeue(Q,ee);push(s,ee);
cout<<endl<<"便道里的車"<<ee<<"已經進入車道,開始計費"<<endl;
//------------------------計時,補上
int h=0;
for(h=0;h<=(chewei-1);h++){if(caitime[h].full==0)break;}
caitime[h].idche=ee;
caitime[h].jinruahijian=time(NULL);
caitime[h].full=1;
}
//----------------以上為增加的計費模塊}
return 1;
}
void menu(){
cout<<"\n";
cout<<"\n-------------------------停車場管理系統--------------------------\n";
cout<<" disigned by 黃春亮\n";
cout<<"1.進入停車場停車\n";
cout<<"2.離開停車場\n";
cout<<"3.停車場信息\n";
cout<<"4.退出系統\n";
cout<<"請選擇1-4: ";
return;
}
void choose1(sqstack &s,linkqueue &Q){
char cid[6];
long cheid;
loop: cout<<"請輸入你的車牌號,不大于7位: ";
cin>>cid;
cheid=convert(cid);
if(cheid==-1){cout<<"輸入錯誤,車牌號必須是數字,請重新輸入\n";goto loop;}
if((chazhao(s,cheid)!=0)||(find(Q,cheid)!=0)){cout<<"車輛已存在,請重新輸入\n";goto loop;}
if(length(s)<chewei){
push(s,cheid);
//------------------------計時,補上
int h=0;
for(h=0;h<=(chewei-1);h++){if(caitime[h].full==0)break;}
caitime[h].idche=cheid;
caitime[h].jinruahijian=time(NULL);
caitime[h].full=1;
//----------------以上為增加的計費模塊
int nn;nn=chazhao(s,cheid);
if(nn)cout<<"請把車停在停車場第"<<nn<<"車位,現在開始計費,謝謝合作!";
else cout<<"系統錯誤";
}
else {
cout<<"停車場滿,";
enqueue(Q,cheid);
int wiiz;
wiiz=find(Q,cheid);
if(wiiz<=0)cout<<"系統錯誤";
cout<<"請停入便道"<<wiiz<<"車位,謝謝合作~!\n";
}
}
void choose2(sqstack &s,linkqueue &Q,long &e,long &ee){
char qwe[6];time_t likaishijain;int sb;
long qaz;
loop1: cout<<"請輸入要離開的車牌號碼: ";
cin>>qwe;
qaz=convert(qwe);
if(qaz==-1){cout<<"輸入錯誤,車牌號必須是數字,請重新輸入\n";goto loop1;}
int poi;poi=chazhao(s,qaz);
if(poi==0){
poi=find(Q,qaz);
if(poi==0){cout<<"你的車未在本停車場";return;}
else {cout<<"你的車停在本停車場便道里,此刻無法離開";return;}
}
else {
cout<<"你的車在停車場第"<<poi<<"停車位里";
if(poi==length(s)){cout<<",可以直接開走\n";
///////計時,補上
likaishijain=time(NULL);
for(sb=0;sb<=(chewei-1);sb++){if(caitime[sb].idche==qaz)break;}
cout<<"你的停車時間為(便道里不計時)"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"秒";
cout<<",每秒收費1元,請交"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"元";
caitime[sb].full=0;
cout<<endl<<"車輛已經離開\n\n";
////////
zhijielikai(Q,s,e,ee);return;}
else {
cout<<",待后面的車移入臨時車道后可開走\n";
///////計時,補上
likaishijain=time(NULL);
for(sb=0;sb<=(chewei-1);sb++){if(caitime[sb].idche==qaz)break;}
cout<<"你的停車時間為(便道里不計時)"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"秒";
cout<<",每秒收費1元,請交"<<difftime(likaishijain,caitime[sb].jinruahijian)<<"元";
caitime[sb].full=0;
cout<<endl<<"車輛已經離開\n\n";
////////
buzhijielikai(qaz,Q,s,e,ee);return;
}
}
}
void choose3(sqstack &s,linkqueue &Q){
cout<<"\n----------------------歡迎光臨本停車場----------------------\n";
if(length(s)<chewei)cout<<"本停車場現在還有"<<chewei-length(s)<<"個車位";
else cout<<"本停車場車位已滿,您可以把車停在便道";
cout<<"\n";
if(length(s)!=0){cout<<"停車場停車位共"<<length(s)<<"輛車\n";
cout<<"停車位里的車輛:\n";
xianshi(s);}
else cout<<"停車位是空的\n";
if(changdu(Q)!=0){
cout<<"便道里共"<<changdu(Q)<<"輛車\n";
cout<<"便道里的車輛:\n";
xianshi2(Q);}
else cout<<"便道里沒有車\n";
return;
}
void main(){
long e;long ee;int quit=1;//e ee位出棧時要用到的返回值
sqstack s;linkqueue Q;char back[1];
initstack(s);
initqueue(Q);
while(quit){
menu();
char choosea[1];
cin>>choosea;
switch(choosea[0]){
case '1':choose1(s,Q);break;
case '2':choose2(s,Q,e,ee);cout<<"\n"<<"輸入任何數返回\n";cin>>back;break;
case '3':choose3(s,Q);cout<<"\n"<<"輸入任何數返回\n";cin>>back;break;
case '4':cout<<"謝謝使用,再見";quit=0;break;
default:cout<<"選擇錯誤";cout<<"\n"<<"輸入任何數返回\n";cin>>back;break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -