收藏 分销(赏)

停车场问题---含-完整C程序代码.docx

上传人:仙人****88 文档编号:9313075 上传时间:2025-03-21 格式:DOCX 页数:6 大小:16.99KB 下载积分:10 金币
下载 相关 举报
停车场问题---含-完整C程序代码.docx_第1页
第1页 / 共6页
停车场问题---含-完整C程序代码.docx_第2页
第2页 / 共6页


点击查看更多>>
资源描述
停车场问题 完整C程序代码 1)内容: 设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的在最北端),若停车场内已经停满 n辆车,那么后来的车只能在场外等候,一旦有车开走,则等候在第一位的车即可开入(这是一个队列设长度为m);当停车场内某辆车需要开出,则在它之后的车辆必须给它让道,当这辆车驶出停车场后,其他车辆按序入栈。每辆车按时间收费。 2)要求: 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。每一组输入数据包括三个数据:汽车的“到达”(’A’表示)或“离去”(’D’表示)信息,汽车标识(牌照号)以及到达或离去的时刻。对每一组输入数据进行 操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。栈以顺序结构实现,队列以链表结构实现。 #include<stdio.h> #include<stdlib.h> #define pmax 3 //定义停车场的最大容车量为3 #define price 2 //停车单价为2 static int flag=0; //全局变量,用来记录停车场车的数量 struct parkcar //定义车辆的结构体 { long num; int time; struct parkcar*next; }*head,*rear; struct parkcar pc[pmax]; //创建停车场的结构体数组 struct parkcar tc[pmax]; //创建用来缓存停车场出来的车辆的结构体数组 struct parkcar *inqueue(long carnum,int atime); //声明入队列函数,让车辆进入候车区 void arrive(void); //声明到达函数 void leave(void); //声明离开函数 void display_P(void); //声明显示停车场车辆信息的函数 void display_W(void); //声明显示侯车区车辆信息的函数 int main() { head=NULL; //初始化队列头指针和尾指针 rear=NULL; int state=0; printf("\t======Parkcar Menu======\n"); //输出停车菜单 printf("\t price:2\n"); printf("\tinput state\n"); //通过先输入状态(如A),后执行相应函数 printf("\t A arrive\n"); printf("\t D leave\n"); printf("\t P display park_car\n"); printf("\t W display wait_car\n"); printf("\t E quit\n"); do { printf("input:\n"); scanf("%c",&state); fflush(stdin); switch(state) //通过先输入状态(如A),后执行相应函数 { case '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'); //当输入E则退出 return 0; } void arrive(void) { long carnum; int atime; printf("please input carnumber and arrive time!\n"); scanf("%ld %d",&carnum,&atime);fflush(stdin); if(flag!=pmax) //如果停车场未满,则入停车场 { pc[flag].num=carnum; pc[flag].time=atime; ++flag; } else { inqueue(carnum,atime); //否则进候车区 } } struct parkcar *inqueue(long carnum,int atime) //以尾插法建立候车区的队列链表 { 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; //离开时间,停车时间 int save=0; int i=1,flag0; flag0=flag; //flag0用来存储刚调用 离开函数 时flag的值 struct parkcar*p; printf("please input carnumber and leave time!\n"); scanf("%ld %d",&carnum,&ltime);fflush(stdin); while(pc[flag-1].num !=carnum) //从栈顶往下找要离开的那辆车 { tc[save].num=pc[flag-1].num; tc[save].time =pc[flag-1].time ; tc[save].next =pc[flag-1].next ; if(flag==1&&pc[0].num !=carnum) //如果找到栈底都没有这辆车,则返回,并将存储着刚调用离开函数时flag的值,即flag0重新 { //赋值给flag,避免在没有车辆离开的情况下对全局变量flag进行修改而导致错误 printf("This car is not founded!\n"); flag=flag0; return; } flag--;save++; } dtime=ltime-pc[flag-1].time ; //停车时间的计算 if(dtime<0) //如果输入的离开时间小于到达时间则重新输入离开时间 { printf("The leave time is illegal,please input the leave time again\n"); scanf("%d",&ltime);fflush(stdin); dtime=ltime-pc[flag-1].time ; } printf("\tpark time:%d\n",dtime); printf("\tcost: %d\n",dtime*price); //输出停车时间和费用 while(save!=0) //当车辆离开后,将缓存栈里的车回到停车场 { if(i--)flag--; //因为执行完上一个while循环后 flag少执行了一次减一操作,通过控制i来让flag在这个循环里只减一次。但flag-- save--; //放在while(save!=0)外面,这样对某些输入会有bug。也就是只有当缓存栈里有车时才需要flag做一次减一操作 pc[flag].num =tc[save].num ; pc[flag].time =tc[save].time ; flag++; } if(head!=NULL) //如果候车区不空,则将队首第一辆车进入停车场 { 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); //显示从候车区进停车场的车辆车牌号和进入时间 head=head->next; free (p); } } void display_P(void) //从栈顶往栈底显示停车场的车辆信息 { int flag1; flag1=flag; //用flag1记录此时的flag,避免对全局变量进行操作 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--; } } void display_W(void) //从队首往队尾显示候车区的车辆信息 { 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); } /* 可参考的测试数据,含一定健壮性,复制粘贴可用 D A 101 5 A 102 10 P D 103 15 D 101 15 P A 103 20 A 104 25 A 105 30 P W D 102 35 P W D 104 20 40 P W E */
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服