停车场2.1

在2.0的基础上增加了停车可自由选择空位的功能,其他不变
定义一个全局数组 BOOL car_state[SIZE] = {FALSE}; //FALSE为空位,TRUE为有车
没有这个数组一样可以用display函数找出空位,但是显示与判断的过程运行效率较低,而且会暴露其他车辆的停车号,不符合实际。

新的parkin函数

void Parkin(Park *pa)
{if(NULL == pa)return;static int temp_number = 1000;	//初始停车号BOOL jud = FALSE;			//用来判断是否有空位,有空位TRUE,无空位FALSEData data;					//要停的车data.number = temp_number+1;	//分配停车号temp_number++;system("clear");int i;for(i = 0; i < SIZE; i++)		//先遍历一遍看有无空位{if(car_state[i] == FALSE){jud = TRUE;				//如果有空位,jud置TRUE}}if(jud == TRUE){while(1){printf("\t可选择的车位有:\n");for(i = 0; i < SIZE; i++){if(car_state[i] == FALSE){printf("\t%-4d\n", i+1);}}int newid;printf("\t请输入要停的车位号:");scanf("%d", &newid);if(car_state[newid-1] == TRUE){printf("\t该车位已有车,请重新选择\n");}else{while(SeqGetTop(pa->seqs).id != newid){LinkPush(pa->links, SeqGetTop(pa->seqs));SeqPop(pa->seqs);}data.id = SeqGetTop(pa->seqs).id;	//此时停车栈栈顶为空位,获取栈顶元素的车位号time_t now;time(&now);data.time = *localtime(&now);	//获取停入时间data.state = TRUE;				//状态改为已停SeqPop(pa->seqs);				//栈顶空位出栈SeqPush(pa->seqs, data);		//data压入栈顶printf("\t已为您自动分配停车号:%d\n", data.number);printf("\t停车成功\n");car_state[newid-1] = TRUE;break;}}		//while(1)}else		//if(jud == FALSE){QueuePush(pa->q, data);			//无空位则压入等候队列printf("\t已为您自动分配停车号:%d\n", data.number);printf("\t车位已满,进入等候队列,当前还有%d辆车在您前面排队,请耐心等待\n", data.number - QueueGetTop(pa->q).number);}while(!LinkEmpty(pa->links))	//将让车栈元素循环压回停车栈{SeqPush(pa->seqs, LinkGetTop(pa->links));LinkPop(pa->links);}}

新的leave函数,实际上只增加了一行car_state[tempid-1] = FALSE;

void Leave(Park *pa)
{if(NULL == pa){return ;}int num;	//要离开的停车号system("clear");Display(pa);		//离开前先打印所有车printf("\n");printf("\t请输入要离开的停车号:");scanf("%d", &num);while(1){if(SeqEmpty(pa->seqs))	//停车栈的车出完仍未匹配到num{printf("\t未找到该停车号\n");break;}//不停将栈顶车号与num匹配,同时出停车栈进入让车栈if(SeqGetTop(pa->seqs).number != num)	//如果当前停车栈顶不匹配{LinkPush(pa->links, SeqGetTop(pa->seqs));	//停车栈栈顶元素压入让车栈SeqPop(pa->seqs);							//停车栈栈顶出栈}else	//匹配到出去的车{time_t now;time(&now);struct tm outime = *localtime(&now);	//离开时间int hour = (outime.tm_hour)-(SeqGetTop(pa->seqs).time.tm_hour);int min = (outime.tm_min)-(SeqGetTop(pa->seqs).time.tm_min);int sec = (outime.tm_sec)-(SeqGetTop(pa->seqs).time.tm_sec);int money = hour*3600 + min*60 + sec*1;	//计费if(sec < 0){sec += 60;min--;}if(min < 0){min += 60;hour--;}printf("\t停车总时长为:%d小时%d分钟%d秒\n", hour, min, sec);printf("\t收您停车费共%d元\n", money);printf("\t停车号%d离开成功\n", num);int tempid = SeqGetTop(pa->seqs).id; //记录出车的车位号if(!QueueEmpty(pa->q))			//如果等候队列不为空{Data temp;						//停入等候队列头部车辆temptemp.number = QueueGetTop(pa->q).number; //队列首位车辆的停车号赋值给temptemp.id = SeqGetTop(pa->seqs).id;	//车位号赋值time_t now;time(&now);temp.time = *localtime(&now);	//获取停入时间temp.state = TRUE;				//状态为已停SeqPop(pa->seqs);				//停车栈栈顶出栈,并退出循环SeqPush(pa->seqs, temp);		//temp压入停车栈QueuePop(pa->q);				//等候队列队头出队列printf("\t等候队列中的首辆车已进入腾出的空位\n");}else		//等候队列为空,压入空位{Data empty = Espace(tempid);	//创建一个空车位SeqPop(pa->seqs);				//栈顶出栈SeqPush(pa->seqs, empty);		//当前位置压入空车位}car_state[tempid-1] = FALSE;		/*****新增*****/break;}}while(!LinkEmpty(pa->links))	//让车栈栈顶循环压回停车栈{SeqPush(pa->seqs, LinkGetTop(pa->links));LinkPop(pa->links);}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部