程序设计完整版_第1页
程序设计完整版_第2页
程序设计完整版_第3页
程序设计完整版_第4页
程序设计完整版_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2012年 1月11 32 33 34 44.1需求分析 .44.2总体设计.44.3详细设计.74.4测试与分析.14 5 21 设计时间是第 20 周,即 2012 年 1 月 2 日-2012 年 1 月 6 日2 本次课程设的题目是设计停车场管理的模拟程序,其目的是在于加深对数据结构课程理论与 c 语言课程理论实践方面的理解。通过编写一定规模和难度的程序,进行一次全面的数据结构与 c 基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅

2、速找出程序代码中的错误并且修改。初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。培养根据选题需要选择学习书籍,查阅文献资料的自学能力。3 本次课程设计的任务是停车车管理模拟程序,其中停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依停满 n 辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外

3、,其他车辆再按原次序进入停车场,每辆停放在车场的车在3它离开停车场时必须按它停留的时间长短缴纳费用。4 4.1 需求分析以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据序列进行模拟管理,且栈以顺序结构实现,队列以链表结构实现。每一组输入数据包括三个数据项:汽车“到达”或者“离开”信息、汽车牌照号码以及汽车到达或离开的时刻,这个用顺序栈和链表队列实现。车库里的车辆信息用顺序栈存放汽车到达时间,离开时间,车牌号码信息;便道的车信息用链表队列存放汽车到达时间,停放位置,车牌号码。对每一组输入数据进行操作后的输出信息为:1、若是车辆到达,则输出汽车在停车场内或便道上的停车位置。停车场

4、中的车辆则需要用顺序栈依次存放停车的位置,从栈底到栈顶依次存放;超过车库存放量的车辆放在便道中,便道的车辆则需要用链表结构队列从队头到队尾依次存放停车位置。2、若是车辆离开,则输出汽车在停车场内停留的时间和应缴的费用(在便道上停留的理,包括停留时间应缴费用。若是便道的车辆,用队列实现,用对头对离开车辆的信息进行处理,用队尾对开进车辆的信息进行处理。栈队0 4.2 总体设计1)功能分析说明图:4和。是否 对否是否是2)各软件模块之间的调用方式5主函数:void main() SeqStackCar Enter,Temp;LinkQueueCar Wait;int ch;InitStack(&En

5、ter);InitStack(&Temp);InitQueue(&Wait);while(1) printf(nt 欢迎使用停车场系统. tnn);printf(nt 1. 车辆到达登记. tn);printf(nt 2. 车辆离开登记tn);printf(nt 3. 车辆列表显示. tn);printf(nt 4. 退出系统. tnn);while(1)printf( 请选择: );scanf(%d,&ch);if(ch=1&chtop=0;for(i=0;istacks-top=NULL;4、当栈满了时,车辆就进入便道上的队列中函数int InitQueue(LinkQueueCar *Q

6、)/ 队列的初始化Q-head=(QueueNode *)malloc(sizeof(QueueNode);if(Q-head!=NULL) Q-head-next=NULL;Q-rear=Q-head;return(1);else return(-1);5、这个函数由车辆离开的函数调用,以分钟计时算费,函数void PRINT(CarNode *p,int room)int A1,A2,B1,B2;/ 车辆收费printf(n车辆离开的时间:);scanf(%d:%d,&(p-leave.hour),&(p-leave.min);printf(n离开车辆的车牌号为:);puts(p-num)

7、;printf(n其到达时间为: %d:%d,p-reach.hour,p-reach.min);8printf(n离开时间为: %d:%d,p-leave.hour,p-leave.min);A1=p-reach.hour;A2=p-reach.min;B1=p-leave.hour;B2=p-leave.min;printf(n应交费用为: %2.1f元,(B1-A1)*60+(B2-A2)*price);free(p);6、车辆的到达登记函数int Arrival(SeqStackCar *Enter,LinkQueueCar *W)CarNode *p;QueueNode *t;p=(

8、CarNode *)malloc(sizeof(CarNode);flushall();printf(n请输入车牌号例:豫 B1234):);gets(p-num);if(Enter-toptop+;printf(n车辆在车场第%d 位置.,Enter-top);printf(n车辆到达时间:);scanf(%d:%d,&(p-reach.hour),&(p-reach.min);Enter-stackEnter-top=p;return(1);else printf(n该车须在便道等待有车位时进入车场);t=(QueueNode *)malloc(sizeof(QueueNode);t-da

9、ta=p;t-next=NULL;W-rear-next=t;W-rear=t;9return(1);7、车辆离开函数定义一个整型变量 room 记录要离开车辆的位置,定义两个栈指针和一个队列指针,用个 if(Enter-top0) while(1) 确保输入的车辆离开位置的合法性。如果不和法,显示输入有误,要重新输入。通过 while(Enter-toproom) 判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进 车场内,并要调用PRINT(p,room); 这个函数计算显示费用。然后还要用 if(W-head!=W-rear)&E

10、nter-toptop0) while(1)/ 判断车场是否为空printf(n请输入车在车场的位置/1-%d/:,Enter-top);scanf(%d,&room);if(room=1&roomtop) break;else printf(n 输入有误,请重输: );while(Enter-toproom) / 把要删除的车辆的前面的车开出来,进临时栈。 Temp-top+;Temp-stackTemp-top=Enter-stackEnter-top;Enter-stackEnter-top=NULL;Enter-top-;10p=Enter-stackEnter-top; 把要删除的车

11、辆节点赋给p。Enter-stackEnter-top=NULL;Enter-top-;while(Temp-top=1)/ 再把临时栈里的车辆进停车场Enter-top+;Enter-stackEnter-top=Temp-stackTemp-top;Temp-stackTemp-top=NULL;Temp-top-;PRINT(p,room);/ if(W-head!=W-rear)&Enter-tophead-next;t=q-data;Enter-top+;printf(n 便道的%s号车进入车场第%d位置.,t-num,Enter-top);printf(n 请输入%s号车进入车场的

12、时间:,t-num);scanf(%d:%d,&(t-reach.hour),&(t-reach.min);W-head-next=q-next;if(q=W-rear) W-rear=W-head;Enter-stackEnter-top=t;free(q);else printf(n便道里没有车.n);else printf(n车场里没有车.);8、显示车场内和便道上的车辆情况函数用个 switch();函数选择显示车场内或是便道上的车辆情况。包括对下面两个子函数的调用:11void List1(SeqStackCar *S);void List2(LinkQueueCar *W);/分别

13、为显示车场和便道上的车辆情况void List1(SeqStackCar *S) /显示车场里的车辆情况 int i;if(S-top0) printf(n车场:);printf(n 位置 到达时间for(i=1;itop;i+) printf( %d ,i);printf( %d:%d车牌号 车类型n);,S-stacki-reach.hour,S-stacki-reach.min);puts(S-stacki-num);else printf(n车场里没有车);void List2(LinkQueueCar *W) QueueNode *p;int i;/显示便道上的车辆情况p=W-hea

14、d-next;if(W-head!=W-rear) printf(n等待车辆的号码为:);for(i=1; (p!=NULL); i+)printf(n第 %d 车辆.,i);puts(p-data-num);p=p-next ;else printf(n便道里没有车.);printf(n);void List(SeqStackCar S,LinkQueueCar W) /显示,遍历12 int flag,tag;flag=1;while(flag) printf( 查看车辆列表显示: );printf(n 车场列表n 便道列表n 3.返回主菜单n);printf(n请选择 13:);whil

15、e(1) scanf(%d,&tag);if(tag=1 & tag=1&ch=4)break;else printf(n 输入有误,请重新选择: 14: );switch(ch)case 1:Arrival(&Enter,&Wait); break;case 2:Leave(&Enter,&Temp,&Wait);break;case 3:List(Enter,Wait);break;case 4:exit(0);default: break; 4.4.1 测试停车场停放车辆/辆 2停车每分钟/元 0.25输入车辆数依次是 1 2 4 5测试结果如下1415174.4.2分析调试的过程中,对

16、程序做了几点改进,增加了程序的容错能力,不论用户输入什么内容,程序都能安全检查。从本实习题的编制过程中容易看出,线性表的应用广泛,线性表可以直接作为一种数据结构使用,也可以作为栈域队列的存储结构,构成链栈或链队列使用。本次课程设计中算法的时间复杂度和空间复杂度与输入车辆的数量有关。在输入登记车辆到达时间的时候,没有相关的小时、分钟数字的限制范围(小时023,分钟 060第二天了,这样就可能会导致收费时负的或减少很多。就是说,还应该算天数,要不就要规定只能当天停,当天开走。我改了几次改不好,又鉴于程序要求中也没有提及,所以我也就没去找了。4.5 附录#include#include#includ

17、e#define MAX 2#define price 0.5typedef struct timeint hour;int min;Time;typedef struct nodechar num10;Time reach;18Time leave;char kind;CarNode;typedef struct NODECarNode *stackMAX+1;int top;SeqStackCar;typedef struct carCarNode *data;struct car *next;QueueNode;typedef struct NodeQueueNode *head;Que

18、ueNode *rear;LinkQueueCar;void InitStack(SeqStackCar *);int InitQueue(LinkQueueCar *);int Arrival(SeqStackCar *,LinkQueueCar *);void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);void List(SeqStackCar,LinkQueueCar);void main()SeqStackCar Enter,Temp;LinkQueueCar Wait;int ch;InitStack(&Enter);19In

19、itStack(&Temp);InitQueue(&Wait);while(1)printf(nt 欢迎使用停车场系统. tnn);printf(n1. 车辆到达登记);printf( 2. 车辆离开登记);printf( 3. 车辆列表显示);printf( 4. 退出系统n);while(1)scanf(%d,&ch);if(ch=1&chtop=0;for(i=0;istacks-top=NULL;int InitQueue(LinkQueueCar *Q)Q-head=(QueueNode *)malloc(sizeof(QueueNode);if(Q-head!=NULL)Q-hea

20、d-next=NULL;Q-rear=Q-head;return(1);else return(-1);void PRINT(CarNode *p,int room)int A1,A2,B1,B2;double M;printf(n车辆离开的类型:);puts(&(p-kind);printf(n车辆离开的时间:);scanf(%d:%d,&(p-leave.hour),&(p-leave.min);printf(n离开车辆的车牌号为:);puts(p-num);printf(n其到达时间为: %d:%d,p-reach.hour,p-reach.min);printf(n离开时间为: %d:

21、%d,p-leave.hour,p-leave.min);A1=p-reach.hour;A2=p-reach.min;B1=p-leave.hour;B2=p-leave.min;M=(B1-A1)*60+(B2-A2)*price;printf(n应交费用为: %2.1f元,M);free(p);21int Arrival(SeqStackCar *Enter,LinkQueueCar *W)CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode);flushall();printf(n请输入车类型:);gets(&(p-kin

22、d);printf(n请输入车牌号例:豫B1234):);gets(p-num);if(Enter-toptop+;printf(n车辆在车场第位置.,Enter-top);printf(n车辆到达时间:);scanf(%d:%d,&(p-reach.hour),&(p-reach.min);Enter-stackEnter-top=p;return(1);elseprintf(n该车须在便道等待有车位时进入车场);t=(QueueNode *)malloc(sizeof(QueueNode);t-data=p;t-next=NULL;W-rear-next=t;W-rear=t;return

23、(1);22void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)int room;CarNode *p,*t;QueueNode *q;if(Enter-top0)while(1)printf(n请输入车在车场的位置/1-%d/:,Enter-top);scanf(%d,&room);if(room=1&roomtop) break;while(Enter-toproom)Temp-top+;Temp-stackTemp-top=Enter-stackEnter-top;Enter-stackEnter-top=NUL

24、L;Enter-top-;p=Enter-stackEnter-top;Enter-stackEnter-top=NULL;Enter-top-;while(Temp-top=1)Enter-top+;Enter-stackEnter-top=Temp-stackTemp-top;Temp-stackTemp-top=NULL;Temp-top-;23PRINT(p,room);if(W-head!=W-rear)&Enter-tophead-next;t=q-data;Enter-top+;printf(n便道的%s号车进入车场第%d位置.,t-num,Enter-top);printf(n

25、请输入%s号车进入车场的时间:);scanf(%d:%d,&(t-reach.hour),&(t-reach.min);W-head-next=q-next;if(q=W-rear) W-rear=W-head;Enter-stackEnter-top=t;free(q);else printf(n便道里没有车.n);else printf(n车场里没有车.);void List1(SeqStackCar *S)int i;if(S-top0)printf(n车场:);printf(n 位置到达时间 车牌号 车类型n);for(i=1;itop;i+)printf( %d ,i);printf

26、( %d:%d,S-stacki-reach.hour,S-stacki-reach.min);puts(S-stacki-num);24puts(&(S-stacki-kind);else printf(n车场里没有车);void List2(LinkQueueCar *W)QueueNode *p;p=W-head-next;if(W-head!=W-rear)printf(n等待车辆的号码为:);while(p!=NULL)puts(p-data-num);p=p-next;else printf(n便道里没有车.);void List(SeqStackCar S,LinkQueueCar W)int flag,tag;flag=1;while(flag)printf(n请选择 1|2|3:);printf(n1.车场列表n2.便道列表返回主菜单n);while(1)25scanf(%d,&tag);if(tag=1|tag=3) break;else printf(n请选择 13:);switch(tag)case 1:List1(&S);break;case 2:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论