一、问题描述:
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排以便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场时,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。
二、设计要求:
1、以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 2、每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。3、 对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费,功能可自己添加)。
三、概要设计:
3.1 逻辑结构设计
停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。同时采用一个临时栈,存放暂时从停车场中开出的车辆。
3.2 存储结构设计
栈用顺序结构实现,原因是栈的大小固定,且操作简单。
队列用链式结构实现,原因是队列的大小不固定,需要动态增加。
3.3 实现方法
①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。
②当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。当车辆出栈完毕后,检查等候队列(便道)中是否有车,有车则从队列头取出一辆车压入栈中。
3.4 主要模块
1 车辆到达信息的处理
2 车辆离开信息的处理
3 输出在停车场和便道的停车情况
3.5 主要函数
(1) 栈的相关操作
status InitStack(SqStackCar &s);
status PushCar(SqStackCar &s,CarNode &e);
status PopCar(SqStackCar &s,CarNode &e);
status StackEmpty(SqStackCar s);
(2) 队列的相关操作
status InitQueue(LinkQueueCar &q)
status EnQueue(LinkQueueCar &q,CarNode &e)
status DeQueue(LinkQueueCar &q,CarNode &e)
status QueueEmpty(LinkQueueCar q)
3)处理车辆的操作
status Arrive(SqStackCar &stack,
LinkQueueCar &llist)
status Departure(SqStackCar &stack,
LinkQueueCar &llist,SqStackCar &temp)
status List(SqStackCar &stack,
LinkQueueCar &llist,SqStackCar &temp)
四、详细设计:
1、各种结构体类型的定义
typedef struct time{
int hour;
int min;
}Time; /*时间结点*/
typedef struct {
char carnum[10];
Time reach;
Time leave;
}CarNode; /*车辆信息结点*/
typedef struct {
CarNode *base;
CarNode *top;
int num;
int stacksize;
}SqStackCar; /*模拟车站*/
2、栈的相关操作
status InitStack(SqStackCar &s) //栈的初始化
{
s.base=(CarNode *)malloc(MAXSTACKSIZE*sizeof(CarNode));
if(!s.base) exit(0);/*分配失败*/
s.top=s.base;
s.num=0;
s.stacksize=MAXSTACKSIZE;
return 1;
}
status PushCar(SqStackCar &s,CarNode &e){ if(s.top-s.base>=s.stacksize) return 0;
else *s.top++=e;
s.num++;
return 1;
}
status PopCar(SqStackCar &s,CarNode &e) { //车辆的入栈操作
//车辆的出栈操作
if(s.top==s.base) return 0;
e=*--s.top;
s.num--;
// printf(\"车辆%s退出车站\\n\
return 1;
}
status StackEmpty(SqStackCar s){ //判断栈是否为空
if(s.base==s.top) return 1;
else return 0;
}
3、队列的相关操作status InitQueue(LinkQueueCar &q){ q.front=(LinkCarNode*)malloc(sizeof(LinkCarNode));
if(!q.front) exit(0);
//队列的初始化
q.rear=q.front;
q.front->next=NULL;
q.num=0;
return 1;
}
status EnQueue(LinkQueueCar &q,CarNode &e){ LinkCarNode *p;
p=(LinkCarNode *)malloc(sizeof(LinkCarNode));
if(!p) exit(0);
p->data=e;
p->next=NULL;
q.rear->next=p;
q.rear=p;
//车辆进入队列
q.num++;
return 1;
}
status DeQueue(LinkQueueCar &q,CarNode &e) {
LinkCarNode *p;
if(q.front==q.rear) return 0;
p=q.front->next;
e=p->data;
q.front->next=p->next;
q.num--;
if(q.rear==p) q.front=q.rear;
free(p);
//车辆离开队列
return 1;
}
status QueueEmpty(LinkQueueCar q) { 判断队列是否为空
if(q.front==q.rear)
return 1;
else
return 0;
}
3、arrive函数的实现(陈国强3872008016)
status Arrive(SqStackCar &stack,LinkQueueCar &llist)
{
CarNode *car;
LinkCarNode *lcar;
car=(CarNode*)malloc(sizeof(CarNode));
lcar=(LinkCarNode*)malloc(sizeof(LinkCarNode));
printf(\" 请输入车牌号码\\n\");
printf(\" \");
flushall();
gets(car->carnum);
printf(\" 请输入车辆到达的时间,格式xx:xx\\n\");
printf(\" \");
flushall();
scanf(\"%2d:%2d\
if(stack.num PushCar(stack,*car); printf(\" 车辆进入停车场\\n\"); printf(\" 车辆停在停车场的第%d个位置\\n\ } else //停车场已满 { lcar=(LinkCarNode*)malloc(sizeof(LinkCarNode)); lcar->data=*car; lcar->next=NULL; EnQueue(llist,*car); printf(\" 车辆进入便道\\n\"); printf(\" 车辆停在便道的第%d个位置\\n\ } return 1; } 4、departure函数的设计(钟超3872008039、周伟伟3872008034) status Departure(SqStackCar &stack,LinkQueueCar &llist,SqStackCar &temp) { int flag=0,a1,a2,b1,b2,money; CarNode e,w; CarNode *leavecar; leavecar=(CarNode*)malloc(sizeof(CarNode)); printf(\" 请输入离去车辆的号码\\n\"); printf(\" \"); flushall(); gets(leavecar->carnum); while(!StackEmpty(stack)) { PopCar(stack,e); if(strcmp(leavecar->carnum,e.carnum)==0) { printf(\" 请输入车辆离去的时间\\n\"); printf(\" \"); flushall(); scanf(\"%ld:%ld\ printf(\" 第\"); printf(\"%s号车\ printf(\"离开了停车场\\n\"); e.leave.hour=leavecar->leave.hour; e.leave.min=leavecar->leave.min; a1=e.leave.hour; a2=e.reach.hour; b1=e.leave.min; b2=e.reach.min; money=((a1-a2+24)%24*60+(b1-b2))*PRICE; printf(\"\\n 车辆来到停车场的时间为: %2ld:%2ld\ printf(\"\\n 车辆离开停车场的时间为: %2ld:%2ld\ printf(\"\\n 需要%d元\\n\ flag=1; break; } else { PushCar(temp,e); } } if(!flag) { printf(\" 没有这辆车\\n\"); } while(!StackEmpty(temp)) { PopCar(temp,e); PushCar(stack,e); } if(flag&&!QueueEmpty(llist)) { DeQueue(llist,w); PushCar(stack,w); w.reach.hour=leavecar->leave.hour; w.reach.min=leavecar->leave.min; flushall(); printf(\" 车辆%s\ printf(\"进入停车场\\n\"); printf(\"时间为\"); printf(\"%d:%d\\n\ } return 1; } 5、显示停车情况 status List(SqStackCar &stack,LinkQueueCar &llist,SqStackCar &temp) { int cmd,count; CarNode e; LinkCarNode *q; q=(LinkCarNode*)malloc(sizeof(LinkCarNode)); do { printf(\" 请输入要进行的操作\\n\"); printf(\" 1为显示在车站的车 2为显示在便道上的车 3为退出\\n\"); printf(\" \"); flushall(); scanf(\"%d\ switch(cmd) { case 1: printf(\" 显示在停车场的车\\n\"); count=1; while(!StackEmpty(stack)) { PopCar(stack,e); PushCar(temp,e); } while(!StackEmpty(temp)) { PopCar(temp,e); printf(\" 第\"); printf(\"%d\ count++; printf(\"辆车是\"); printf(\"%s\\n\ PushCar(stack,e); } break; case 2: printf(\" count=1; q=llist.front->next; 显示在便道上的车\\n\"); if(llist.front!=llist.rear) { while(q!=NULL) { e=q->data; printf(\" 第\"); printf(\"%d\ printf(\"辆车是\"); printf(\"%s\\n\ q=q->next; count++; } } else {printf(\" 在便道上没有车\\n\");} break; case 3: break; default: printf(\" break; } }while(cmd!=3); return 1; } 6、 主函数的设计 输入错误\\n\"); void main() { WelCome(); char cmd; SqStackCar part,temp; LinkQueueCar road; InitStack(part); InitStack(temp); InitQueue(road); do { printf(\" printf(\" a为车辆到来 d为车辆离开出系统\\n\"); 请输入命令操作\\n\"); l为显示停车情况 c为清除屏幕 e为退 printf(\" \"); flushall(); cmd=ReadCommand(); switch(cmd) { case 'a': case 'A': Arrive(part,road); break; case 'c': case 'C': system(\"cls\"); break; case 'd': case 'D': Departure(part,road,temp); break; case 'l': case 'L': List(part,road,temp); break; case 'e': case 'E': flushall(); break; default:printf(\"错误的命令\\n\"); break; } }while(cmd!='e'&&cmd!='E'); } 五、总结: 通过本次大作业的学习和研究,我们有以下收获。 1、 我们培养了团队精神,初步了解了一个大的工程从分析到计划,再从分工到合作,从修改到提交的整个过程。 2、我们加深了对数据结构中栈和队列的理解,并产生了对计算机的强烈兴趣。总的来讲,这次大作业的完成情况是比较令人满意的。 2010-11-24 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- fupindai.com 版权所有 赣ICP备2024042792号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务