数据结构停车场停车管理系统.doc_第1页
数据结构停车场停车管理系统.doc_第2页
数据结构停车场停车管理系统.doc_第3页
数据结构停车场停车管理系统.doc_第4页
数据结构停车场停车管理系统.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

安阳师范学院 数据结构课外实践 数据结构课外实践报告项 目 名 称:停车场停车管理系统 所 在 班 级:10级信管1班 小 组 成 员:杨剑楠 孙迎 张可可 吴亮 指 导 教 师:王希杰 起 止 时 间:12月4日12月22日 项目基本信息项目名称停车场停车管理系统项目简介本项目是对停车场停车管理系统的简单模拟,以完成停车场的停车、出车、收费及查询停车场或便道信息等的功能。小组成员杨剑楠 孙迎 张可可 吴亮任务分工张可可 100903045:InitStack();Pop();Push();InitQueue();EnQueue();DeQueue();getpas();login();杨剑楠 100903043:reachtime();leavetime();Arrival();孙迎 100903038: Leave();Bill();吴亮 100903012: List();List1();List2();main();课外实践评定成绩记录指导教师意见系统完成情况:优 良 中 差报告完成情况:优 良 中 差答辩评定成绩团队整体成绩:成员成绩综 合 成 绩一、 问题描述及分析1、问题描述: 停车场停车管理系统:设一个可以停放n辆汽车停车场,只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序停放,若车场内已停满n辆车,那么后来的车只能在门外的便道上等候;一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先依次退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。2、需求分析:(1)题目中要根据车辆停留时间收费,故在定义结构体时还需要一个时间的结构体用来保存车辆到达和离开的时间。(2) 由于停车场的进出符合栈的“后进先出,先进后出”的操作特点,因此,需要设一个栈来模拟停车场。(3)根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,需要用一个队列来模拟便道。(4) 而中间车辆提出离开停车场,后到达的车辆都须先离开停车场为它让路,然后这些车辆再依原来次序进入停车场,而这个同样符合“后进先出,先进后出”的特点,因此还需一个栈来作为临时保存车辆的地方。二、 功能模块及数据结构描述1、 功能模块:主要功能:(1) 车辆到达(2) 车辆离开(3) 信息查询功能模块图:停车场停车管理系统车辆到达车辆离开信息查询进入停车场若满,进便道停车场信息查询便道信息查询车辆出停车场打印账单便道车进停车场管理员密码验证图1.功能模块图2、 数据结构描述:(1) 车辆信息的表示车辆可以看成是一个节点,设计成一个结构题,车辆信息包括:车牌号,车辆到达时间,车辆离开时间,定义如下:typedef struct node char num10; /车牌号 Time reach; /保存车辆到达的时间 Time leave; /保存车辆离开的时间CarNode;(2) 时间、栈和队列的定义时间有小时、分钟和秒表示,即设计三个变量分别表示如下:typedef struct time int hour; int min; int sec;Time;停车场内用栈表示:typedef struct NODE CarNode *stackMax+1; /栈用顺序表示 int top;SqStackCar;便道上的车辆表示:typedef struct car CarNode *data; /便道上的车用链表表示 struct car *next;QueueNode;typedef struct Node QueueNode *head; /设置头指针、尾指针 QueueNode *rear;LinkQueueCar;三、 主要算法流程描述及部分核心算法(1)主函数的算法流程描述:图2.主函数流程图(2) 核心算法流程描述:车辆到达:Arrival函数 主要通过if(Enter-toptop0)来保证栈不空,进而执行以下操作,然后用while(1)来确保输入要离开车辆位置的合法性,在由while(Enter-topposition)来判断离开车辆位置是否在最后,若在最后可直接离开,并打印账单;若不是最后,则用临时栈执行操作。车辆离开函数的算法流程如下图:图4.车辆离开流程图四、 使用说明程序名为停车场停车管理系统.exe,运行环境为Visual C+6.0。测试数据: 最大容量Max定义为3,收费标准为0.05元/秒 默认密码为:abc 依次选择1并录入的车牌号信息为:aaa,bbb,ccc,ddd,eee,fff。 选择2并输入车辆离开位置为2。程序执行后显示:图5.身份验证界面 输入密码正确后进入如下界面:图6.登陆后界面输入收费标准(任意数字)后,进入主界面:图7.主菜单界面SELECT:在select后输入数字选择执行不同的功能。选择1:之后输入车牌号,打印出车辆到达信息。然后返回主界面。图8.车辆到达界面选择2:之后输入要离开车辆的位置,打印出车辆的离开信息及账单,并显示便道车辆进入停车场的信息。然后返回主界面。图9.车辆离开界面选择3:进入信息查询菜单,分为停车场信息、便道信息和返回主菜单选项。图10.查询停车场信息界面图11.查询便道信息界面五、 问题及解决办法 这次设计,总的来说,题目是比较简单的,主要运用了栈和队列的一些知识,但在执行是还是遇到了一些问题。1、 怎样来获取车辆到达和离开的时间信息?解决途径:通过查询相关书籍,调用time.h和conio.h的头文件及相关函数,可以获取系统当前的时间。2、 在开始输入车牌号的字符串时总是出错,便不能再执行。解决途径:通过上网查资料知道,输入字符时习惯性的会加Enter键然后再输下一个,这样相当于Enter也作为一个字符读入,在输入前加上flushall()函数,用于清除输入的所有缓冲区即可。3、 车辆离开时的输出信息中位置和车牌号不相符,导致信息查询中的信息也不正确。解决途径:经分析知道,开始出栈入栈的具体过程还没有分析透彻,中间车辆离开时,在其后的车辆进临时栈后要再调用Pop函数,其才能出栈成功,否则,相当于没有离开停车场,打印信息便会出错。但是这个程序目前还是有缺点尚未解决,如:1、 可以记录车辆停留多天的记录而不是当天。2、 如果便道的车离开,可以实现其离开且不收费。3、 若输入车牌号信息重复,则显示输入错误。六、 课外实践总结通过这次对于停车场停车管理系统的设计,我们的收获如下:1、 我们更深一步地体会到算法的应用,它的灵活性决定了它的广泛用途。2、 并且通过这个课程设计,我们加强了对数据结构知识的理解和掌握,尤其是栈和队列的应用。3、 培养了我们严肃认真的做事作风,如果想要完成一项完美的设计,是需要正视的态度,绝对的耐心和缜密的思维的。4、 这个设计培养了我们发现并解决问题的能力,学会查找相关资料来寻找解决方案,并扩展了知识面。5、 最重要的是,通过我们共同完成这个设计,我们体会到团队之间协调与合作的重要性,如果没有团队的共同努力,一个完美的程序是很难实现的。 总之,现在我们的知识面还是很窄,需要学习的东西还很多,在之后的学习中,我们更加要多看相关的资料,多实践,只有在实践中才能真正的进步。源程序(附录) #include#include#include#include#include #include #define Max 10 /*停车场容量*/#define PS abc /*默认密码*/#define MPS 3 /*失败重试次数*/*定义全局变量*/float price; time_t start,end;/*定义时间的结构体,hour为时,min为分,sec为秒*/typedef struct time int hour; int min; int sec;Time;/*定义车的结构体*/typedef struct node char num10; /车牌号 Time reach; /保存车辆到达的时间 Time leave; /保存车辆离开的时间CarNode;/*定义栈结构*/typedef struct NODE CarNode *stackMax+1; int top;SqStackCar;/*定义队列中的结点*/typedef struct car CarNode *data; struct car *next;QueueNode;/*定义队列结构*/typedef struct Node QueueNode *head; QueueNode *rear;LinkQueueCar;/*-用到的所有函数(及函数声明部分)-*/void InitStack(SqStackCar *); /初始化栈/int Pop(SqStackCar *,CarNode *);/int Push(SqStackCar *,CarNode *);int InitQueue(LinkQueueCar *); /初始化队列/int EnQueue(LinkQueueCar *,QueueNode *,CarNode *);/int DeQueue(LinkQueueCar *,QueueNode,CarNode *);/char *getpas(char *,int ); /关于密码验证的函数/int login();/void reachtime(CarNode *); /获取到达的系统时间/void leavetime(CarNode *); /获取离开的系统时间void Arrival(SqStackCar *,LinkQueueCar *,QueueNode *,CarNode *); /车辆到达的函数void Leave(SqStackCar *,SqStackCar *,LinkQueueCar *,CarNode *); /车辆离开的函数void Bill(CarNode *); /打印账单的函数void List(SqStackCar,LinkQueueCar); /查询的函数/void List1(SqStackCar *);/void List2(LinkQueueCar *);/*-关于管理员进入的密码验证部分-*/*输入密码,并返回输入的值*/char *getpas(char *s,int n) char c; int i; memset(s,0,n); for (i = 0; in-1; i+) c=getch(); if (isprint(c) si=c=r?0:c; putchar(*); if (c=r) break; putchar(n); return s;/*密码验证函数,如果通过验证则返回1,否则返回0*/int login() char ap80; int fg=1; do if (strcmp(getpas(ap,80),PS)&fg=MPS) printf(n); printf(tt-n); printf(tt-输入有误,还有%d次机会!-n,MPS-fg); printf(tt-n); printf(tt 密码:); fg+; else system(cls); printf(nnnnn); printf(tt-n); printf(tt-密码正确!-n); printf(tt-n); return 1; while (fg=MPS); return 0;/*-主函数入口-*/void main()printf(nnnnnn); printf(t n); printf(t n); printf(t安师停车场 n); printf(t n); printf(tn); printf(t n); start=time(NULL); end=time(NULL);while(end-start2) /延时2秒执行以下程序 end=time(NULL);system(cls); printf(nnnnn); printf(tt*n);printf(tt 身份验证 n);printf(tt*n); printf(tt 请输入密码(默认abc):); if (login() printf(tttttLoading); start=time(NULL); end=time(NULL); while(end-start2) /延时2秒执行以下程序 end=time(NULL); system(cls);SqStackCar Enter,Temp; LinkQueueCar Wait; QueueNode q; CarNode e; int ch; InitStack(&Enter); InitStack(&Temp); InitQueue(&Wait); printf( ._. n); printf( | _ | n);printf( | I I | n);printf( | I I | n);printf( | I I | n);printf( | I I | n);printf( | I_I | n);printf( !_! n);printf( ._. n);printf( ._|_|_. n);printf( |: _ | n);printf( | CD-ROM | n);printf( !_! nn);printf( 单日停车场管理系统操作室n ); printf( 请输入收费标准(以秒为单位):); scanf(%f,&price); while(1) system(cls); printf(nn); printf(ttt*停车场最大容量:%d*n,Max); printf(ttt*停车场收费标准:%2.2f元/秒*n,price); printf(nnnn); printf(ttt*n); printf(ttt * 1-到达登记 *n); printf(ttt * 2-离开登记 *n); printf(ttt * 3-信息查询 *n); printf(ttt * 0-退出 *n); printf(ttt *n); printf(tttt请选择(1|2|3|0):); scanf(%d,&ch); if(ch3) printf(nttt您输入的选项不存在,请重新选择!n); else system(cls); switch(ch) case 1: Arrival(&Enter,&Wait,&q,&e); break; case 2: Leave(&Enter,&Temp,&Wait,&e); break; case 3: List(Enter,Wait); break; case 0: printf(nnnnn); printf(t*谢谢使用!*nt); exit(0); default: break; else system(cls); printf(nnnnn); printf(tt*n); printf(tt 无此权限 n); printf(tt*n); start=time(NULL); end=time(NULL);while(end-starttop=0; for(i=0;istacki=NULL;/*入栈*/int Push(SqStackCar *S,CarNode *e) if(S-toptop+; S-stackS-top=e; return 1;else return 0;/*出栈*/int Pop(SqStackCar *S,CarNode *e) if(S-top!=0)e=S-stackS-top;S-top-; return 1;else return 0;/*初始化队列*/int InitQueue(LinkQueueCar *Q) Q-head=(QueueNode *)malloc(sizeof(QueueNode); if(Q-head!=NULL) Q-head-next=NULL; Q-rear=Q-head; return 1; else return 0;/*入队列*/int EnQueue(LinkQueueCar *Q,QueueNode *t,CarNode *e) t=(QueueNode *)malloc(sizeof(QueueNode); t-data=e; t-next=NULL; if(Q-head=NULL) Q-rear = Q-head = t; return 0; elseQ-rear-next = t;Q-rear = t;printf(nttt%s车进入便道等候!,e-num); return 1;/*出队列*/int DeQueue(LinkQueueCar *Q,QueueNode *q,CarNode *e) if(Q-head!=Q-rear) q=Q-head; Q-head=q-next;e=q-data; if(q=Q-rear) Q-rear=Q-head; / free(q); return 1; elsereturn 0;/*-获取进出的系统时间函数部分-*/*获取进入停车场的时间*/void reachtime(CarNode *c) struct tm *date; time_t curr; curr =time(NULL); date =localtime(&curr); printf(%d/%d/%d %d:%d:%dn,date-tm_year+1900,date-tm_mon+1,date-tm_mday,date-tm_hour,date-tm_min,date-tm_sec); c-reach.hour=date-tm_hour; c-reach.min=date-tm_min; c-reach.sec=date-tm_sec;/*获取离开停车场的时间*/void leavetime(CarNode *c) struct tm *date; time_t curr; curr =time(NULL); date =localtime(&curr); printf( %d:%d:%dn,date-tm_hour,date-tm_min,date-tm_sec); c-leave.hour=date-tm_hour; c-leave.min=date-tm_min; c-leave.sec=date-tm_sec;/*-关于收费,打印账单部分-*/void Bill(SqStackCar *Enter,CarNode *c) float s,m; printf(nn); printf(ttt*n); printf(ttt%s车到达的时间是: %d:%d:%dn,c-num ,c-reach.hour,c-reach.min, c-reach.sec); printf(ttt离开时间是:); leavetime(c); /获取其离开的时间 printf(ttt*n); printf(ttt*收费标准:%2.2f元/秒*n,price); printf(ttt*n); s=(c-leave.hour-c-reach.hour)*3600+(c-leave.min-c-reach.min)*60+(c-leave.sec-c-reach.sec)*price; /计算其收费printf(ttt共计:%2.2f元n,s);printf(ttt收取现金(元):);scanf(%f,&m);printf(nttt找零:%2.2f元,m-s);/*-关于到达离开停车场部分-*/*到达停车场的处理函数*/void Arrival(SqStackCar *Enter,LinkQueueCar *W,QueueNode *q, CarNode *p) p=(CarNode *)malloc(sizeof(CarNode); printf(nnnnn); printf(tt*n); flushall(); /用于清除输入的所有缓冲区 printf(ttt请输入车牌号(例:豫E10101):); gets(p-num); q-data=p; if(Enter-topnum,Enter-top); printf(ttt到达时间是:); reachtime(p); /获取其进入停车场的时间 printf(nnn);printf(ttt请按Enter返回:); getchar(); else printf(tt*n); printf(ttt停车场已满,请进入便道等候); EnQueue(W,q,p); printf(nnn); printf(ttt请按Enter返回:); getchar(); /*离开停车场的处理函数*/void Leave(SqStackCar *Enter,SqStackCar *Temp,LinkQueueCar *W,CarNode *p) int position; if(Enter-top0) printf(nn); printf(nttt请输入车在车场的位置/1-%d/:,Enter-top); scanf(%d,&position); if(position=1&positiontop) while(Enter-topposition) /若输入的车位置不是最后一个,则先让之后的车进入临时栈。 p=Enter-stackEnter-top; Pop(Enter,p); Push(Temp,p); printf(nttt%d号位置的车%s离开停车场!n,Enter-top,Enter-stackEnter-top-num); Bill(Enter,Enter-stackEnter-top); /打印要离开车辆的信息及收费账单 Pop(Enter,Enter-stackEnter-top); /车辆离开 while(Temp-top=1) /临时栈中的车按原顺序进入停车场 p=Temp-stackTemp-top; Pop(Temp,p); Push(Enter,p); if(W-head!=W-rear) /若便道上有车,则让第一个停在便道上的车进入停车场 DeQueue(W,W-head,W-head-data); Push(Enter,W-head-data); printf(nnn); printf(ttt*n); printf(ttt便道车牌号为%s的车进入车场第%d号位置.,W-head-data-num,Enter-top); printf(nttt到达时间是:); reachtime(W-head-data); getchar(); else printf(nnn);printf(ttt便道里没有车!); getchar(); printf(nnttt请按Enter返回:); getchar(); else printf(nnn); printf(ttt输入错误!请重新输入n); getchar(); printf(nnttt请按Enter返回:); getchar(); else printf(nnnnn); printf

温馨提示

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

评论

0/150

提交评论