数据结构课程设计(c++版)--停车场管理系统.doc
《数据结构课程设计(c++版)--停车场管理系统.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计(c++版)--停车场管理系统.doc(15页珍藏版)》请在咨信网上搜索。
~ 《数据结构》 课程设计 班 级 网络营销 指导老师 吕向阳 学 号 姓 名 魏华 二012 年 1 月 7 日 一. 课程设计题目 某停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆汽车停放在最北端),若停车场内已经停满n辆车,则后来的汽车只能在门外的便道即候车场上等候,一旦有车开走,则排在便道上的第一辆车即可开入。 当停车场内某辆车要离开时。在它之后进入的车辆必须先退出车场为它让路,该车辆开出大门外,其它车辆再按原次序进入停车场, 每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为该停车场编制按上述要求进行管理的模拟程序。 二. 流程及图示 停车 显示信息 离开 收费 系统 查询 显示信息 退出 a 1 a 2 a 3 ……… a n 停车场(栈1) 栈2 通道(队列) 三、程序运行及截图 1.开始界面 首先是登陆界面,只要用户名跟密码一样就可以登陆,输入正确后,有一个延迟程序,让使用者感觉更真实 如果输入错误了,就是直接退出了 2.主界面 登录成功后,则是如下的功能界面: 3 . 停车场管理系统 你可以选择停车,离开,或者查看,当操作完了,可以直接选择退出。 当你输入 1 后,会提示你输入停车的车号: 在这里输入你想要停车的车号,然后会提示你停车的时间: 输入停车时间后,则会显示你刚停车的详细的信息: 4.离开 输入 2,则会提示你要离开的车号: 然后输入离开的车号后,会提示你输入该车离开的时间,输入离开的时间,则 会出现如下界面: 5 停车场管理系统 系统则会把你刚离开的车俩的详细信息给你打印出来:拉开的车号,所用时间 以及应收的费用。这个时间管理员,可以对照表收费了。 6.查看 当你要查看停车场所停车的信息时,你可以选择 3。同样,选择 3 确定后会提 示你要查看的车号,然后则会把信息打印在界面上: 系统会告诉你这俩停在停车场里面的那个位置上。 7.退出 当你一切操作完了后,就可以选择退出了,输入 4 停车场管理系统 随便按个键就退出该系统了。 四、程序代码 #include<iostream> #include<conio.h> #include<iomanip> #include<fstream> #include<string> #include <stdlib.h> #include <windows.h> using namespace std; #define Max_Size 2//停车的最大容量 #define HourFare 2 //每小时的停车费用 int CountForStack=0; //栈里现有的车数 int CountForQueue=0; //排队等候的车数 typedef struct { char Condition;//到达或者离开的状态 int Arrivetime;//到达时间,默认为-1,表示没有到达 int Leavetime;//离开时间,默认为-1,表示没有离开 int License;//车牌号 } CarNode;//保存每辆车的信息 typedef struct//栈的定义 { CarNode *base;//栈底指针 CarNode *top;//栈顶指针 int Stacksize;//栈的最大容量 } CarStack; typedef struct QNode { char Condition;//到达或者离开的状态 int Arrivetime;//到达时间,默认为-1,表示没有到达 int Leavetime;//离开时间,默认为-1,表示没有离开 int License;//车牌号 QNode *next; } QNode; typedef struct//队列的定义 { QNode *front;//对头指针 QNode * rear;//队尾指针 } Queue; bool InitStack(CarStack &S1)//初始化栈 S1 { S1.base=(CarNode*)malloc(Max_Size*sizeof(CarNode)); if(!S1.base) { cout<<"栈 S1 内存分配失败"<<endl; return false; } S1.top=S1.base; S1.Stacksize=Max_Size; return true; } bool InitQueue(Queue &Q) { Q.front=(QNode*)malloc(sizeof(QNode)); if(!Q.front) { cout<<"队列 Q 内存分配失败!"<<endl; return false; } Q.rear=Q.front; Q.front->next=NULL; return true; } bool EnQueue(Queue &Q,QNode &e)//插入元素 e 为 Q 的新的队尾元素 { QNode *p=(QNode *)malloc(sizeof(QNode)); if(!p) { cout<<"p 内存分配失败"<<endl; return false; } p->Arrivetime=e.Arrivetime; p->Leavetime=e.Leavetime; p->Condition=e.Condition; p->License=e.License;//将 e 赋给 P p->next=NULL; Q.rear->next=p; Q.rear=p; return true; } bool DeQueue(Queue &Q,QNode &t)//出队列函数 { if(Q.front==Q.rear) { cout<<"队列为空!"<<endl; return false; } QNode *p=Q.front->next; t.Arrivetime=p->Arrivetime; t.Condition=p->Condition; t.Leavetime=p->Leavetime; t.License=p->License; Q.front->next=p->next; if(Q.rear==p) { Q.rear=Q.front; } free(p); return true; } void InitCarNode(CarNode &C,char condition,int arrivetime,int leavetime,int license) { C.Arrivetime=arrivetime; C.Condition=condition; C.Leavetime=leavetime; C.License=license; } bool Push(CarStack &S1,CarNode &car)//插入新的元素 car 为的栈顶元素 { if(S1.top-S1.base>=S1.Stacksize) { cout<<"此栈已满,不能压入新的信息"<<endl; return false; } (*S1.top).Arrivetime=car.Arrivetime; (*S1.top).Condition=car.Condition; (*S1.top).Leavetime=car.Leavetime; (*S1.top).License=car.License; ++S1.top;//栈顶指针上移 return true; } bool Pop(CarStack &S1,CarNode &t)//出栈操作 { if(S1.top==S1.base) { cout<<"栈 S1 为空,不能执行出栈操作"<<endl; return false; } --S1.top;//栈顶指针下移 t.Arrivetime=(*S1.top).Arrivetime; t.Condition=(*S1.top).Condition; t.Leavetime=(*S1.top).Leavetime; t.License=(*S1.top).License; return true; } bool IsStackFull(CarStack &S1)//判断 S1 栈是否已满 { if(S1.top-S1.base>=S1.Stacksize) return true; else return false; } bool IsStackEmpty(CarStack &S1)//判断 S1 栈是否已空 { if(S1.top==S1.base) return true; else return false; } bool IsQueueEmpty(Queue &Q)//判断队列是否为空 { if(Q.front==Q.rear) return true; else return false; } bool SearchInStack(CarStack &S1,int a)//a 表示要查找的车牌号,如果在停车场里 面,就返回 true { bool tag=false; if(!IsStackEmpty(S1))//如果栈 S1 非空 { CarNode *p=S1.top-1; while(p!=S1.base) { if((*p).License==a) tag=true; --p; } if((*p).License==a) tag=true; } return tag; } bool SearchInQueue(Queue &Q,int a)//a 表示要查找的车牌号,如果在通道里面,就 返回 true { bool tag=false; if(!IsQueueEmpty(Q))//如果队列非空 { QNode *p=Q.front->next; while(p!=Q.rear) { if((*p).License ==a) tag=true; p=p->next; }//退出此 while 循环时 p 指向最后一个元素 if((*p).License ==a) tag=true; } return tag; } void InCar(CarStack &S1,Queue &Q,int a1,int a2)//表示进入车辆,a1 表示到达时 间,a2 表示车牌号码 { if(SearchInStack(S1,a2)) { cout<<"车号"<<a2<<"已经存在于停车场内,输入有误"<<endl; return; } if(SearchInQueue(Q,a2)) { cout<<"车号"<<a2<<"已经存在于通道内,输入有误"<<endl; return; } if(IsStackFull(S1))//如果堆栈已满,说明停车场已满,需要停车在通道里面 { QNode qnode; qnode.Arrivetime=-1;//在通道里面不收费,所以不计时 qnode.Condition='A'; qnode.Leavetime=-1;//定义为-1,说明还没有开始离开 qnode.License=a2; EnQueue(Q,qnode);//停在通道上 ++CountForQueue; cout<<"车号:"<<qnode.License<<"停在通道的第"<<CountForQueue<<"号 位置"<<endl; } else { CarNode carnode; carnode.Arrivetime=a1; carnode.Condition='A'; carnode.Leavetime=-1; carnode.License=a2; Push(S1,carnode); ++CountForStack; cout<<"车号: "<<carnode.License<<", 到达时间:"<<carnode.Arrivetime<<" 点,停在停车场的第"<<CountForStack<<"号位置"<<endl; } } void Sreach(CarStack &S1,Queue &Q,int a) { if(SearchInStack(S1,a)) { cout<<"车号:"<<a<<"已存在停车场里面的第"<<CountForStack<<"号位 置"<<endl; return; } if(SearchInQueue(Q,a)) { cout<<"停车场已满,车号"<<a<<"存在于通道里面的第 "<<CountForQueue<<"号位置,在次等候"<<endl; return; } else { cout<<"对不起!你查找的车号不在停车场里面"<<endl; return; } } void OutCar(CarStack &S1,Queue &Q,int a1,int a2)//出车函数,a1 表示离开时间, a2 表示车牌号码 { if(SearchInQueue(Q,a2)) { cout<<"车号"<<a2<<"存在于通道里面,还没有进入停车场,不能离开 "<<endl; return; } if(!SearchInStack(S1,a2)) { cout<<"车号"<<a2<<"该车不在停车场内"<<endl; return; } CarStack tempstack; InitStack(tempstack);//新建一个栈,存放让路的汽车 bool tag1=false;//标志这个停车场出车以前是否已满,默认为没有满 tag1=IsStackFull(S1); bool tag2=true;//标志通道是否有汽车在等待,默认为通道为空 tag2=IsQueueEmpty(Q); CarNode temp;//用来保存暂时取出的汽车 bool tag3=false; while(1) { Pop(S1,temp); if(temp.License==a2) { if(a1<temp.Arrivetime) { cout<<"离开失败!"<<endl; tag3=true; Push(tempstack,temp); } else { cout<<"车号:"<<a2<<"现在离开停车场,所用时间为: "<<a1-temp.Arrivetime<<"小时,应收 RMB 为: "<<(a1-temp.Arrivetime)*HourFare<<"元"<<endl; } break; } else Push(tempstack,temp);//进入暂存栈 } 则把前面倒出的车再次放 while(!IsStackEmpty(tempstack))//如果临时栈不空, 入停车场 { Pop(tempstack,temp); Push(S1,temp); } QNode tempqnode;//用来暂时保存从通道出来的汽车 if(tag1==true&&tag2==false&&tag3==false)//如果出车前停车场已满,并且通 道不为空,并且离开没有失败 { DeQueue(Q,tempqnode); --CountForQueue; temp.Arrivetime=a1; temp.Condition=tempqnode.Condition; temp.Leavetime=tempqnode.Leavetime; temp.License=tempqnode.License; Push(S1,temp); } if(tag3==false)//如果停车通道是空的,停车场没有满,并且离开成功 { --CountForStack; } } } void showmenu(CarStack &S1,Queue &Q) { cout<<"******************************选择菜单 *******************************"<<endl; cout<<" 1: 停车"<<endl; cout<<" 2: 离开停车场"<<endl; cout<<" 3: 查看车辆信息"<<endl; cout<<" 4: 退出系统"<<endl; cout<<"*****************************请按键选择******************************"<<endl; int tag; cin>>tag; while(tag!=1&&tag!=2&&tag!=3&&tag!=4) cin>>tag; int a1; unsigned int a2; switch(tag) { case 1: cout<<"请输入到达的车号:"<<endl; cin>>a1; cout<<"请输入到达的时间:"<<endl; cin>>a2; InCar(S1,Q,a2,a1); Sreach(S1,Q,a1); break; case 2: cout<<"请输入离开的车号:"<<endl; cin>>a1; cout<<"请输入离开的时间:"<<endl; cin>>a2; OutCar(S1,Q,a2,a1); break; case 3: cout<<"请输入你要查看的车号:"<<endl; cin>>a1; Sreach(S1,Q,a1); break; case 4: return; break; } showmenu(S1,Q); } void loging(CarStack &S1,Queue &Q) { char Administrator[15],password[15]; int a; printf("\t*****************************************************\n"); printf("\t*****************************************************\n"); printf("\t** **\n"); printf("\t** 欢迎使用停车场管理系统 **\n"); printf("\t** **\n"); printf("\t** **\n"); printf("\t*****************************************************\n"); printf("\t*****************************************************\n"); printf("\n\t(提示:账号跟密码一样就行)"); printf("\n\n\n\n\t 请输入管理员帐号:"); fflush(stdin); gets(Administrator); printf("\t\t\t\t\t\t\t\t\t\t\t 请输入密码:"); fflush(stdin); gets(password); //比较用户名和密码 if(strcmp(Administrator,Administrator) == 0 && strcmp(password,Administrator) == 0) { printf("\n\n\t\t\t 您已成功登陆,请稍侯!\n\n\t\t\t"); // 延迟 for(a = 0;a<20;a++) { printf(">"); Sleep(150); } //进入页面时清屏 system("cls"); showmenu(S1,Q); } else printf("\n\n\t\t\t 您输入的帐号或者密码错误!\n\n\t\t\t"); return; } void main() { CarStack carstack; InitStack(carstack);//建立并且初始化用于停车场的堆栈 Queue carQueue; InitQueue(carQueue);//建立并且初始化用于通道的队列 loging(carstack,carQueue); } 五、心的体会 在生活与工作中许多领域都用到数据结构,但关键是如何将问题模型转换,变换成我们熟知的知识应用,即抽象具体化。首先是要把所学的知识重新好 好巩固下,其次,每次课程设计总会有些东西不懂的,这时我们就要上网去查资 料,这样会让我们养成一个好的自主学习的习惯。这次的课程设计,我开始是分 析了这个系统需要做些什么,然后分析要用到哪些代码,哪些结构,哪些算法开 实现这些功能。它让我明白了栈和队列实 际会用在哪些方面,同时我有些不懂的,我会看书,或是在网上找,慢慢的也增 加了自己的知识量。 这次的停车场系统做的很简单,和真正的停车场系统来比,根本就不算什么 了。真正的停车场是不会那么退出停车场的,每次离开都要人家后面的让道,还不被人骂么?不过这次只是一次小小的试手,更难得还在后面,因此我们也需不断学习充实自己。 六、参考资料 Visual c++程序设计 数据结构(c++版) 还认真开展了6次全国统一行动,遏制了因"三超一疲劳"而引发的交通事故;在三、四、五月份,我队还按照州政府、州安委会、州支队要求,开展了道路交通集中整治专项行动、治理酒后驾驶、摩托车、电动车专项治理行动,均取得了一定的成效。- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 c+ 停车场 管理 系统
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文