《停車(chē)場(chǎng)問(wèn)題 含 完整C程序代碼》由會(huì)員分享,可在線閱讀,更多相關(guān)《停車(chē)場(chǎng)問(wèn)題 含 完整C程序代碼(7頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、停車(chē)場(chǎng)問(wèn)題完整C程序代碼
1) 內(nèi)容: 設(shè)停車(chē)場(chǎng)是一個(gè)可停放 n 輛汽車(chē)的狹長(zhǎng)通道,且只有一個(gè)大門(mén)可供汽車(chē)進(jìn)出。 汽車(chē)在停車(chē)場(chǎng)內(nèi)按車(chē)輛到達(dá)時(shí)間的先后順序,依次由北向南排列(大門(mén)在最南端,最先到達(dá) 的在最北端),若停車(chē)場(chǎng)內(nèi)已經(jīng)停滿(mǎn)n輛車(chē),那么后來(lái)的車(chē)只能在場(chǎng)外等候,一旦有車(chē)開(kāi)走, 則等候在第一位的車(chē)即可開(kāi)入(這是一個(gè)隊(duì)列設(shè)長(zhǎng)度為m);當(dāng)停車(chē)場(chǎng)內(nèi)某輛車(chē)需要開(kāi)出, 則在它之后的車(chē)輛必須給它讓道,當(dāng)這輛車(chē)駛出停車(chē)場(chǎng)后,其他車(chē)輛按序入棧。每輛車(chē)按時(shí) 間收費(fèi)。
2) 要求: 以棧模擬停車(chē)場(chǎng),以隊(duì)列模擬車(chē)場(chǎng)外的便道,按照從終端讀入數(shù)據(jù)的序列進(jìn)行 模擬管理。每一組輸入數(shù)據(jù)包括三個(gè)數(shù)據(jù):汽車(chē)的“到達(dá)”('A
2、'表示)或"離去”('D'表示) 信息,汽車(chē)標(biāo)識(shí)(牌照號(hào))以及到達(dá)或離去的時(shí)刻。對(duì)每一組輸入數(shù)據(jù)進(jìn)行 操作后的輸出信息為:若是車(chē)輛到達(dá),則輸出汽車(chē)在停車(chē)場(chǎng)內(nèi)或者便道上的停 車(chē)位置;若是車(chē)輛離去,則輸出汽車(chē)在停車(chē)場(chǎng)停留的時(shí)間和應(yīng)繳納的費(fèi)用(便 道上不收費(fèi))。棧以順序結(jié)構(gòu)實(shí)現(xiàn),隊(duì)列以鏈表結(jié)構(gòu)實(shí)現(xiàn)。
#include #include
#define pmax 3 #define price 2
static int flag=0; struct parkcar {
long num;
int time; struct parkcar*next;
}
3、*head,*rear;
struct parkcar pc[pmax]; struct parkcar tc[pmax]; 結(jié)構(gòu)體數(shù)組
struct parkcar *inqueue(long carnum,int atime); 候車(chē)區(qū)
void arrive(void);
void leave(void); void display_P(void);
數(shù)
//定義停車(chē)場(chǎng)的最大容車(chē)量為3
//停車(chē)單價(jià)為 2
//全局變量,用來(lái)記錄停車(chē)場(chǎng)車(chē)的數(shù)量
//定義車(chē)輛的結(jié)構(gòu)體
//創(chuàng)建停車(chē)場(chǎng)的結(jié)構(gòu)體數(shù)組
//創(chuàng)建用來(lái)緩存停車(chē)場(chǎng)出來(lái)的車(chē)輛的
//聲明入隊(duì)列函數(shù),讓車(chē)輛進(jìn)入
/
4、/聲明到達(dá)函數(shù)
//聲明離開(kāi)函數(shù)
//聲明顯示停車(chē)場(chǎng)車(chē)輛信息的函
void display_W(void); //聲明顯示侯車(chē)區(qū)車(chē)輛信息的
函數(shù)
int main()
{
head=NULL; //初始化隊(duì)列頭指
針和尾指針
rear=NULL;
int state=0;
printf("\t=====
=Parkcar Menu======\n");
printf("\t
price:2\n");
printf("\tinput
state\n");
后執(zhí)行相應(yīng)函數(shù)
printf("\t A
arrive\n");
printf("\t D
5、leave\n");
printf("\t P
display park_car\n");
printf("\t W
display wait_car\n");
printf("\t E
quit\n");
do
//輸出停車(chē)菜單
//通過(guò)先輸入狀態(tài)(如 A)
//通過(guò)先輸入狀
//如果停車(chē)場(chǎng)為空則
//當(dāng)輸入E
//如果停
{ printf("input:\n"); scanf("%c",&state); fflush(stdin); switch(state) 態(tài)(如A),后執(zhí)行相應(yīng)函數(shù) { cas
6、e 'A':arrive();break; case 'D':if(pc[flag-1].num==NULL) 輸出為空
printf("Park is empty!\n"); else
leave();break;
case 'P':display_P();break;
case 'W':display_W();break; case 'E':break;
default:printf("error message,input again!\n"); }
}while(state!='E');
則退出
return 0;
}
void arrive(void)
{ lo
7、ng carnum;
int atime;
printf("please input carnumber and arrive time!\n"); scanf("%ld %d",&carnum,&atime);fflush(stdin); if(flag!=pmax) 車(chē)場(chǎng)未滿(mǎn),則入停車(chē)場(chǎng)
{ pc[flag].num=carnum; pc[flag].time=atime;
++flag;
else
{
inqueue(carnum,atime); 進(jìn)候車(chē)區(qū)
}
}
struct parkcar *inqueue(long carnum,int atime) 立候車(chē)區(qū)的
8、隊(duì)列鏈表
{
struct parkcar*p;
p=(struct parkcar*)malloc(sizeof(struct parkcar)); p->num=carnum;
p->time=atime; if(head==NULL)head=p; else rear->next=p;
//否則
//以尾插法建
rear=p;
rear->next =NULL; return head;
}
void leave(void)
{
long carnum;
int ltime,dtime;
//離開(kāi)時(shí)間,停車(chē)時(shí)間
int save=0;
int i=1,fl
9、ag0; flag0=flag;
時(shí) flag 的值
struct parkcar*p;
printf("please input carnumber and leave time!\n"); scanf("%ld %d",&carnum,<ime);fflush(stdin); while(pc[flag-1].num !=carnum)
輛車(chē)
//flag0 用來(lái)存儲(chǔ)剛調(diào)用 離開(kāi)函數(shù)
//從棧頂往下找要離開(kāi)的那
{ tc[save].num=pc[flag-1].num;
tc[save].time =pc[flag-1].time ;
tc[save].next =
10、pc[flag-1].next ;
if(flag==1&&pc[0].num !=carnum) // 如果找到棧底都沒(méi)
有這輛車(chē),則返回,并將存儲(chǔ)著剛調(diào)用離開(kāi)函數(shù)時(shí)flag的值,即flagO重新
{ //賦值給flag,避
免在沒(méi)有車(chē)輛離開(kāi)的情況下對(duì)全局變量flag進(jìn)行修改而導(dǎo)致錯(cuò)誤
printf("This car is not founded!\n");
flag=flagO;
return;
11、
//如果候車(chē)
//顯示從候車(chē)區(qū)進(jìn)
//從棧
//用
flag--;save++;
}
dtime=ltime-pc[flag-1].time ; //停車(chē)時(shí)間的計(jì)算 if(dtime<0)
//如果輸入的離開(kāi)時(shí)間小于到達(dá)時(shí)間則重新輸入離開(kāi)時(shí)間
{
printf("The leave time is illegal,please input the leave time again\n"); scanf("%d",<ime);fflush(stdin);
dtime=ltime-pc[flag-1].time ;
}
12、printf("\tpark time:%d\n",dtime);
printf("\tcost: %d\n",dtime*price); //輸出停車(chē)時(shí)間和費(fèi)用
//當(dāng)車(chē)輛離開(kāi)后,
while(save!=0)
將緩存棧里的車(chē)回到停車(chē)場(chǎng)
{
if(i--)flag--; //因?yàn)閳?zhí)行完上一個(gè) while 循環(huán)后 flag 少執(zhí)行了
一次減一操作,通過(guò)控制 i 來(lái)讓 flag 在這個(gè)循環(huán)里只減一次。但 flag-
save--; 〃放在while (save!=O)外面,這樣對(duì)某些輸
入會(huì)有bug。也就是只有當(dāng)緩存棧里有車(chē)時(shí)才需要flag做一次減一操作
pc[flag].
13、num =tc[save].num ;
pc[flag].time =tc[save].time ;
flag++;
}
if(head!=NULL) 區(qū)不空,則將隊(duì)首第一輛車(chē)進(jìn)入停車(chē)場(chǎng)
{
p=head;
pc[flag].num =p->num;
pc[flag].time =ltime;
pc[flag].next =p->next ;
flag++;
printf("\t'%ld'car in park,arrive time:%d\n",p->num ,ltime); 停車(chē)場(chǎng)的車(chē)輛車(chē)牌號(hào)和進(jìn)入時(shí)間
head=head->next;
free (p);
}
14、
}
void display_P(void) 頂往棧底顯示停車(chē)場(chǎng)的車(chē)輛信息 {
int flag1;
flag1=flag;
flagl記錄此時(shí)的flag,避免對(duì)全局變量進(jìn)行操作
printf("\tpark_carnum arrive_time\n");fflush(stdin); while((flag1)!=0)
{
printf("\t%ld %d\n",pc[flag1-1].num,pc[flag1-1].time); flag1--;
}
}
//從隊(duì)首
void display_W(void) 往隊(duì)尾顯示候車(chē)區(qū)的車(chē)輛信息 {
struct parkcar*w;
w=head;
printf("\twait_carnum arrive_time\n");
while(w!=NULL)
{
printf("\t%ld %d\n",w->num,w->time); w=w->next;
}
free(w);
}
/*
可參考的測(cè)試數(shù)據(jù),含一定健壯性,復(fù)制粘貼可用
101 5
A
102 10
D
103 15
D
101 15
P 103 20
A
104 25
A
105 30
P
W
D
102 35
P
W
D
104 20
40
P
W
E
*/