1、 (1)车辆信息的表示车辆可看成是一个节点,设计成一个结构体,车辆信息包括:车牌号码,车辆的进站时间和离开停车场的时间,定义如下:typedef struct node char num10; /车牌号码 Time reach; /到站时间 Time leave; /离开时间CarNode; (2)时间、栈和队列的定义时间是由小时和分钟表示的,有两部分数据,设计两个变量分别存储小时和分钟,定义如下:typedef struct timeint hour; int min;Time;停车场内用栈表示:typedef struct NODE CarNode *stackMAX+1; /栈用顺序表示
2、 int top;SeqStackCar; SeqStackCar Enter,Temp; InitStack(&Temp)在车辆离开时,应用temp临时栈把将要离开的车辆后续车辆压入,等车辆离开后压回原栈stack。便道上的车辆表示:typedef struct car CarNode *data; / 便道上的车用链表表示 struct car *next;QueueNode;typedef struct Node QueueNode *head;/设置头指针、尾指针 QueueNode *rear;LinkQueueCar;4.2 算法的设计思想及流程图 4.2.1 主要函数的功能说明(
3、1)void InitStack(SeqStackCar *);/车辆节点进栈。即当栈未满时,就把到达的车辆进栈。(2)int InitQueue(LinkQueueCar *);/车辆节点进队列。即当栈已满时,车辆就进入便道上的队列中(3)int Arrival(SeqStackCar *,LinkQueueCar *);/车辆到达登记。即车辆到达时,先登记车辆车牌号码。然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。(4)void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);/车辆离开处理。即通过输入离开车辆的
4、位置处理,然后调用PRINT(CarNode *p,int room);函数进行收费。然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。(5)void List(SeqStackCar,LinkQueueCar);/显示车场内和便道上的车辆情况。利用switch();函数选择显示车场内或是便道上的车辆情况,包括对下面两个子函数的调用: void List1(SeqStackCar *S);void List2(LinkQueueCar *W);/分别用来显示车场和便道上的车辆情况(6)void PRINT(CarNode *p,int room);/车辆离开时的收费。即这个函数由车辆
5、离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。即只能当天停,当天开走。4.2.2 停车场管理系统流程图 经过对车辆的进出分析以及对该系统的详细设计,绘制停车场管理系统流程图如图1.图1 停车场管理系统流程图4.2.3 主要模块算法描述 本程序最主要的算法就是车辆到达登记的和车辆离开时的登记。 (1)车辆到达:int Arrival(SeqStackCar *Enter,LinkQueueCar *W)/首先定义一个栈和队列的结构体指针为:*p , *t 。然后申请一个车辆信息的内存空间,并把它赋给栈指针。车辆到达时就输入车牌号,并通过if(Ent
6、er-toptop0) 确保栈不空,然后用个 while(1) 确保输入的车辆离开位置的合法性。如果不合法,显示输入有误,要重新输入。通过while(Enter-room) 判断离开车辆的位置,如果是中间位置,就要再用一个临时栈放置前面临时开出来的车,等要开出的车开出后,再把临时栈内的车开进停车场内,并调用PRINT(p,room);这个函数计算显示费用。然后还要用 if(W-head!=W-rear)&Enter-MAX)语句判断便道上有没有车,如果有车就要显示进停车场的车的车牌号,并登记进入时间。并要进行相应的出队列和进栈操作。5 测试分析5.1 测试用例说明:测试用例要合理并且足够,既要
7、有正确用例,也要有错误用例,同时检验程序的正确性和强壮性。5.1.1 第一组测试用例(1)测试输入:停车场的车辆离开,如表1所示: 表1:车辆离开测试服务选择车牌号/车位到达/离开时间1京A121212:12津S121213鲁D121214214:25:65(错误)(2)测试目的:测试离开方法时间格式控制以及费用计算是否正确。(3)正确输出:第一次离开的是京A1212,应交费2.4元。第二次时,当在输入65时,应该提示输入错误,重输。(4)实际输出:图2 测试离开方式时间格式及费用计算图图3 测试车辆离开错误图(5)错误原因:第一个正确,第二个错误,原因是没有对时间格式控制。(6)当前状态:已
8、改正5.1.2 第二组测试用例连续5辆车到达,如表2所示: 表2:连续5辆车到达测试到达时间京A1212 豫F121215沪G121216测试到达方法与列表显示方法能否正确完成。先到达的三辆车先进入停车场,最后到达的两辆在便道等候。表4 车辆到达方式测试图5 车辆进入提示图没有错误。通过。5.1.3 第三组测试用例接上一步输入离开信息,如表3所示: 表3:接上一步离开信息测试离开车位离开时间便道车进入时间测试离开方法功能是否成功以及便道进入车场是否正确。输出1号车位的车辆离开信息清单,便道1号车进入停车场。图6 测试离开方法功能是否成功图通过5.2 测试结果分析 经过我们小组一天的调试,我们终
9、于把各模块整合起来了。在这过程中,我们遇到了很多问题,像数据不匹配、括号不配对、赋值重复等。因为C语言的语法限制不太严格,对变量的类型约束不严格,对数组下标越界不做检查等原因,所以,我们的修改工作难度加大。但经过我们这小组共同的努力。此停车管理系统可以基本实现一个小的停车场的管理,其“到达”与“离开”方法都相对比较完整,费用结算清单直观。在输入数据时,要按照严格的格式输入,否则有可能出现死去或崩溃。若本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关机等,而此系统的缺点却是没有保存功能,关闭之后数据丢失。现受限于各种条件,又因为要求中并未提及,所以本程序暂时没有加入保存功能。6 使用
10、说明(1)运行程序,首先出现主界面。主界面包括四个选项:选项1:车辆到达登记,选择该项可进行车辆到达停车场情况登记;选项2:车辆离开登记,选择该项可进行车辆离开停车场情况登记;选项3:车辆列表显示,选择该项可查看车辆列表显示的所有信息,包括停车场列表和便道列表的全部信息;选项4:退出系统,选择该项将退出程序。图7 程序初始界面图(2)车辆列表显示界面包括3个选项:停车场列表,选择该项可以查看停车场列表的所有车辆的全部信息;便道列表,选择该项可以查看便道列表显示的全部信息;返回主菜单,可返回主界面。图8 车辆列表显示界面图7 总结 总体来说,这次的课程设计比去年的c语言的课程设计稍难。我这次的课
11、程设计题目:停车场问题。相比其他课题来说,这个题目还是比较简单的,主要是运用了数据结构中栈和队列的知识和操作。程序能够实现基本的车辆到达、离开、收费、遍历显示等主要功能。 但我觉得这个程序还有很多小的地方是可以完善的,比如:在计算收费时如果离开时间是到了第二天,这样就会导致收费是负的或减少很多。也就是说,该程序限制于只能规定当天停,当天开走。至于加算天数的功能我改了几次改不好,又鉴于程序要求中也没有提及并且时间紧张,所以也就没再去研究实现。只要能实现主要的功能就好了。 当然,这次的课程设计、编程实践还是收获颇丰的。通过实习我的收获如下:(1)我知道了怎样去简化程序,减少他的时间复杂度和空间复杂
12、度。还知道了怎样去完善程序,使其更具健壮性。(2)巩固和加深了对数据结构相关知识的理解,提高综合运用本课程所学知识的能力。(3)培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考、深入研究、分析问题、解决问题的能力。(4)通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法。(5)通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。根据我在实习中遇到的问题,我将在以后的学习过程中注意以下几点:(1)认真上好专业实验课,多在实践中锻炼自己。更让我懂得实践是检验和掌握真理的最好办法。(2)写程序的过程中要考虑周到、严密。需求分析需要反复思考修正。(
13、3)在做课程设计的时候要有信心、有耐心,切勿浮躁。(4)认真学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。(5)在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。总之,本次课程设计不仅加深了我们对栈和队列等数据结构的理解和掌握,同时一定程度上提高了我们程序设计和阅读程序的能力。本次课程设计提高了我们的专业知识,使自己所学的内容运用到实际中来,也增强了实际操作能力,为以后的工作学习提供了一个良好的铺垫。参考文献1 严蔚敏,吴伟民.数据结构M.北京:清华大学出版社,2004.2 李春葆.数据结构解析M.北京:清华大学出版社,2001.3 谭浩
14、强.C语言程序设计M.北京:清华大学出版社,2005.4 朱战立,张选平.数据结构学习指导与典型题解M.西安:西安交通大学出版社,2002.5 张玲,席德春,刘晓杰.C语言上机实践指导教程M.北京:机械工业出版社,2004.6 罗文劼,王苗,石强.数据结构习题解答与实验指导M.北京:中国铁道出版社, 2004.7 殷人昆,陶永雷,谢若阳等.数据结构M.北京:附录/系统说明:本系统适应于小型停车场,且停车时间在一天之内的短期停放停车场。/在此系统中,车库容量设置为3,便于测试。在实际使用中可以对容量大小按实际情况设置。#includestdlib.hstring.h#define MAX 3 /
15、停车场最大容量为3辆,便于观察#define price 0.02/定义时间结构体typedef struct time int hour;/定义车辆信息结构体typedef struct node char num10; Time reach; Time leave;typedef struct NODE CarNode *stackMAX+1; int top;/模拟停车场typedef struct car CarNode *data;typedef struct Node QueueNode *head; QueueNode *rear;/模拟便道/方法声明void InitStack
16、(SeqStackCar *);/初始化栈 int InitQueue(LinkQueueCar *);/初始化便道int Arrival(SeqStackCar *,LinkQueueCar *); /车辆到达 void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);/车辆离开void PRINT(CarNode *p,int room);/车辆收费void List1(SeqStackCar *S);/显示车场里的车辆情况 /显示便道上的车辆情况void List(SeqStackCar,LinkQueueCar);/显示信息/void
17、 savecar(CarNode *);/保存车辆信息/自定义函数/*void savecar(CarNode *p1)/保存车辆信息 FILE *fp1; if(fp1=fopen(car1.txt,w)=NULL) printf(nt不能保存车辆信息n); return; while(p1) fwrite(p1,sizeof(struct node),1,fp1); p1=p1-next; */栈的初始化void InitStack(SeqStackCar *s) int i; s-top=0; for(i=0;istacks-top=NULL;/队列的初始化int InitQueue(L
18、inkQueueCar *Q) Q-head=(QueueNode *)malloc(sizeof(QueueNode); if(Q-=NULL) Q-head-next=NULL;rear=Q-head; return(1); else return(-1);void PRINT(CarNode *p,int room) int A1,A2,B1,B2; printf(n请输入车辆离开的时间:(小时:分钟) scanf(%d:%d,&(p-leave.hour),&leave.min); while(p-leave.hourleave.hour23)您的输入有误!请重新输入离开时间的时(0-
19、23):leave.hour); if(p-leave.min59)分(0-59): scanf(n离开车辆的车牌号为: puts(p-num);n该车到达时间为: %d:,p-reach.hour,p-reach.min);n该车离开时间为:leave.hour,p-leave.min); A1=p-reach.hour; A2=p-reach.min; B1=p-leave.hour; B2=p-leave.min;n应交费用为: %2.1f元!,(B1-A1)*60+(B2-A2)*price); free(p);/车辆的到达登记int Arrival(SeqStackCar *Ente
20、r,LinkQueueCar *W) /char num10; /int a; CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall();/清空缓存输入的作用n请输入车牌号(例:豫B1234): gets(p- /*a=Enter-top; loop:scanf(%s if(a=0) strcpy(p-num,num); a+; while(a) if(strcmp(num,Enter-stacka-num)=0) printf(您输入的车牌号重复,请重新输入! goto loop; */ if(Ente
21、r-MAX)/车辆未满,车进车场 Enter-top+;n车辆在车场第%d位置.,Enter-top);n车辆到达时间:reach.hour),&reach.min); while(p-reach.hour23) /控制时间格式正确请重新输入到达时间的reach.hour); reach.min59) /控制分钟输入正确 Enter-stackEnter-top=p;n恭喜您登记成功! /savecar(?n else/车场已满,车进便道 n您好,停车场车位已满,请该车在便道上等待!有空余车位时才能进入停车场!/n t=(QueueNode *)malloc(sizeof(QueueNode); t-data=p; W-rear-next=t;rear=t; return(1);/车辆的离开void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) int
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1