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