《数据结构课程设计》 停车场管理系统.doc
课 程 设 计 报 告课程名称 数据结构课程设计 课题名称 停车场管理系统 专 业 信息管理与信息系统 班 级 信管0901 学 号 200903110122 姓 名 指导教师 2011 年 1 月 09 日湖南工程学院课 程 设 计 任 务 书课程名称 数据结构 课 题 停车场管理管理系统 专业班级 信 管0901 学生姓名 学 号 200903110202 指导老师 审 批 任务书下达日期 2010 年 1月09 日任务完成日期 2011 年 1 月 20 日一、设计内容与设计要求1设计内容:问题描述设停车场只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出,汽车在停车场内按车辆的先后顺序依次排列,若车站内已停满汽车,则后来的汽车只能在门外的通道上等停,一旦停车场内有车开走,则排在通道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车站为它让路,待该车辆开出大门,为它让路的车辆再按原来次序进入车场。在这里假设汽车不能从便道上开走,试设计这样一个停车场模拟管理程序。基本功能(1) 车辆成批入站。当一个停车场刚开始投入运行的时候,会有很多车进来,因此,要设计一个函数来实现车辆批量进站。并要检测车辆的数目是否超过规定的最大容量,给出相关提示信息。(2)单个车辆入站。当系统正常投入运行后,会有零散的车辆进进出出,因此,设计一个函数实现单个车辆入站。(3)车站内信息实时显示。车站内信息包括两个部分:停车场内停放的车辆以及在外面通道上等停的车辆。(4)车辆出站。当停车场内车辆出站后,检查通道上是否有车等停,如果有,则要把排在最前面的车调入停车场内。2设计要求:1)设计正确,方案合理。2)界面友好,使用方便。3)程序精炼,结构清晰。4)设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。5)实际操作过程中遇到的问题及解决方法:设计总结及心得体会。6)上机演示。 二、进度安排第 19 周 星期一 8时:00分11时:30分 星期二 8时:00分11时:30分 星期三 14时:00分17时:30分 星期四 14时:00分17时:30分 星期五 8时:00分11时:30分第 20 周 星期一 8时:00分11时:30分 附:课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现课块划画块图实(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的源代码,要求对程序写出必要的注释)。正文总字数要求在5000字以上(不含程序源代码)。 目 录1、绪论61.1课程设计的目的和意义62、需求分析62.1、课程设计的目的62.2、课程设计的任务62.4、系统总体设计图73、详细信息73.1基本信息74、详细设计74.1问题定义84.2、流程图及系统测试84.2.1、进停车场84.2.2车辆离开84.3、程序运行图94.3.1、菜单栏94.3.2、输入信息栏10 4.3.3、出车栏104.3.4、显示栏115、心得感受116、附录126.1、源程序126.2、参考文献217、评分表221、绪论1.1课程设计的目的和意义当代大学生是一个特殊的团体,他们具有较高知识修养和较强综合素质,但是他们中的大部分却不具有与他们能力相符的动手能力与就业竞争能力。大学毕业生是新兴劳动力的组成部分,提高大学毕业生就业工作发展水平,事关我国经济社会可持续发展的进程 ,高校作为培养大学生的摇篮,必须责无旁贷地承担起提高大学生就业能力的重任。提高大学生的就业能力,不仅需要教师付出辛勤的劳动,还需要一套科学完善的制度作为保障,而高校毕业生基本情况数据库管理系统无疑是一个很好的尝试。本文设计的这套数据库管理系统,是综合日常管理、实践考核、科目成绩统计、就业管理等等的综合性数据库系统。设计学生管理这样一个系统,可以涉及到大多数MFC与C语言数据库的重要数据库对象、重要功能和特性,例如:视图、触发器和存储过程等。由此,通过这个课程设计可以加深学生对这些MFC与C语言数据结构知识的学习、理解,积累在实际工程应用中运用各种数据库对象的经验,使学生掌握使用应用软件开发工具开发数据库管理系统的基本方法。在实用性方面,学生管理系统是很普遍的一种应用,选择该系统作为课程设计也可以为学生以后可能遇到的实际开发提供借鉴。2、需求分析2.1、课程设计的目的运用数据结构编写一个C语言程序,实现对停车场的管理。只要包括:车辆到达时得信息登记,车辆离开时得信息记录及便道的车辆信息的显示功能。2.2、课程设计的任务该系统实现以下几个功能:2.21、车辆到达信息登记:包括车牌号,在停车场停放的位置等;2.22、车辆离开信息记录;2.23、信息显示:显示停车场内和便道内的汽车到达及位置等信息;2.3、软件运行和开发工具1、windows2000以上操作系统2、VisualC+6.0开发环境2.4、系统总体设计图 停车场管理系统车辆离去车辆到达 退出信息便道信息3、详细信息3.1基本信息 车的车牌号,到达时信息及离开时信息。4、详细设计使用Visual C+平台设计学生成绩管理系统的主框架。4.1问题定义该程序主要是为了实现对车库的管理,为实现该功能先定义了一个系统菜单:(1)添加信息 (4)查找停车信息 (5)显示全部信息 (7)显示统计数据4.2、流程图及系统测试4.2.1、进停车场车辆进停车场是否有车进入停车场记录信息回主菜单进入便道记录信息YN 图4.41 进停车场流程4.2.2车辆离开车辆进停车场是否有车进入停车场记录信息回主菜单进入便道记录信息YN 图4.42 车辆离开4.3、程序运行图4.3.1、菜单栏 图4.31 菜单栏运行图4.3.2、输入信息栏 图4.32 输入信息栏运行图4.3.3、出车栏 图4.33 出车栏运行图4.3.4、显示栏 图4.35 显示栏运行图5、心得感受 开始时候的课程设计完全没有思路,感觉很迷茫,不知道从何做起。幸好在课设之前赵老师给我们做了很详细的指点,记得在大一的时候老师就提到过她,当时就给我们留下了深刻的印象。是一位很负责任的,很有耐心的好老师,我们很爱戴赵老师。 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握管理项目的开发技术是十分重要的。 回顾起此次图书馆借书系统课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整一星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。在以后会有更多的课程设计,我们现在的努力是为了将来打好基础,赵老师很认真的对待我们的答辩,这是一种很负责任的表现,这是要让我们真正的自己动手,了解和掌握一些基本知识,在以后的工作中做到游刃有余。 这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在赵老师的辛勤指导下,终于游逆而解。同时,在赵锦元老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!6、附录6.1、源程序#include <iostream>#include <malloc.h>#include <string>#include <windows.h>/常量定义#define MAX_STOP 5 /定义停车场最大停车数#define MAX_PLATE 10 /定义车牌号最大长度using namespace std; /使用std命名空间/定义存储汽车信息的结构体typedef struct char license_plateMAX_PLATE; /汽车牌照号码,定义为一个字符指针类型 char state; /汽车当前状态,字符p表示停放在停车位上,字符s表示停放在便道上,每辆车的初始状态用字符i来进行表示CAR;/定义模拟停车场的栈结构typedef struct CAR STOPMAX_STOP; /汽车信息的存储空间 int top; /用来指示栈顶位置的静态指针SeqStack;/定义模拟便道的队列结构typedef struct node CAR WAIT; /汽车信息的存储空间 struct node *next; /用来指示队列位置的动态指针QNode; /链队列节点的类型/定义链队列的收尾指针typedef struct QNode *front,*rear;LQueue; /将头尾指针封装在一起的链队/函数声明 int Empty_LQueue(LQueue *q); /判队空int LeaveCheck(SeqStack parking , char *license_plate); /检查离开的车是否在停车场中int QueueLength(LQueue *q); /判队长度int Out_LQueue(LQueue *&sidewalk , char *license_plate); /出队操作int StackEmpty(SeqStack parking); /判断栈是否为空int StackFull(SeqStack parking); /判断栈是否为满int StackPop(SeqStack &parking); /出栈操作int StackTop(SeqStack parking , char *license_plate); /取栈顶元素void Car_come(SeqStack &parking , LQueue *&sidewalk); /有车到来时的操作void Car_leave(SeqStack &parking , LQueue *&sidewalk); /有车离开的操作void Display(SeqStack parking); /显示停车场内的所有信息 调试时用void InitStack(SeqStack &parking); /初始化栈void InitList(LQueue *&sidewalk); /初始化队列void In_LQueue(LQueue *&sidewalk , char *license_plate); /进队操作void Input_Check(char *license_plate); /检验输入的车牌是否合法void StackPush(SeqStack &parking , char *license_plate);/进栈操作void main() /定义变量 SeqStack parking; LQueue *sidewalk = NULL; char *choice = new char; int flag = 1; /定义一个变量 判断是否退出 InitStack(parking); /初始化一个为空的停车场 InitList(sidewalk); /初始化一个为空的便道 while(flag) /运行界面及功能选择 cout<<"t*nn" cout<<"t*欢迎来到王凌锋的停车场*nn" cout<<"t| 停车场模拟管理系统 |nn" cout<<"t|-|nn" cout<<"t| |nn" cout<<"t| 有车到来时请按C键。 |nn" cout<<"t| 有车要走时请按l键。 |nn" cout<<"t| 查看停车场请按D键。 |nn" cout<<"t| 要退出系统请按Q键。 |nn" cout<<"t|-|nn" cout<<"t|*nn" cout<<"请选择操作:" gets(choice); if(1 != strlen(choice) cout<<"请正确输入选项!" continue; else switch(*choice) case 'c': case 'C': Car_come(parking,sidewalk);break; case 'l': case 'L': Car_leave(parking,sidewalk);break; case 'q': case 'Q': flag=0;break; case 'd': case 'D': Display(parking);break; default: cout<<"选择不正确!请重新选择!n" /有车到来时的操作 void Car_come(SeqStack &parking , LQueue *&sidewalk) char license_plateMAX_PLATE; /定义变量 cout<<"请输入车辆的车牌号码:" Input_Check(license_plate); if(StackFull(parking) /判断停车场是否已满,满则进入便道,不满进入停车场 In_LQueue(sidewalk , license_plate); /进入便道 cout<<"停车场已满请在便道等候,您的位置为"<<QueueLength(sidewalk) <<endl; else StackPush(parking , license_plate); /进入停车场 cout<<"请进入停车场中的"<<parking.top+1<<"号停车位n" / Display(parking);void Car_leave(SeqStack &parking , LQueue *&sidewalk) /有车离开时的操作 SeqStack tmpparking; /定义临时停车场 char leave_license_plateMAX_PLATE; /要离开的车牌号 char license_plateMAX_PLATE; /存放从停车场中读出来的车牌信息 InitStack(tmpparking); /初始化临时停车场 if(StackEmpty(parking) /判断停车场中是否有车 cout<<"当前停车场中没有车n" return; /退出子函数 cout<<"请输入要离开的车牌照:" Input_Check(leave_license_plate); cout<<"当前停车场中有"<<parking.top+1<<"辆车n" if(LeaveCheck(parking , leave_license_plate) /判断车是否在停车场中 cout<<"您的车在"<<LeaveCheck(parking , leave_license_plate)<<"号车位上n" /车在停车场中 while(StackTop(parking , license_plate)&& (strcmp(parking.STOPparking.top.license_plate, leave_license_plate ) != 0) strcpy(parking.STOPparking.top.license_plate , license_plate); cout<<"牌照为"<<license_plate<<"的车暂时退出停车场"<<parking.top+1<<"号位n" StackPush(tmpparking , license_plate); /停车场中的车暂时退出 进入临时停车场 StackPop(parking); /出栈 cout<<"牌照为"<<license_plate<<"的车离开停车场"<<parking.top+1<<"号位n" StackPop(parking); /出栈 /将临时停车场中的车停回停车场 while(StackEmpty(tmpparking) != 1) StackTop(tmpparking , license_plate); StackPush(parking , license_plate ); cout<<"牌照为"<<license_plate<<"的车进入停车场"<<parking.top+1<<"号位n" license_plate0 = '0' StackPop(tmpparking); if(parking.top+1 = MAX_STOP-1) /判断车离开前停车场是否停满 if(QueueLength(sidewalk) /如果停满则判断便道上是否有车 /便道中有车 则从便道中停入停车场 Out_LQueue(sidewalk , license_plate); /出队 StackPush(parking , license_plate); /入栈 cout<<"在便道中牌照为"<<license_plate<<"的车进入停车场"<<parking.top+1<<"号位n" else /车不在停车场中 cout<<"您的车不在停车场中!n"/初始化顺序栈void InitStack(SeqStack &parking) parking.top = -1;/判栈空int StackEmpty(SeqStack parking) if(parking.top = -1) return 1; else return 0;/判栈满int StackFull(SeqStack parking) if(parking.top = MAX_STOP-1) return 1; else return 0;/入栈void StackPush(SeqStack &parking , char *license_plate) parking.top+; strcpy(parking.STOPparking.top.license_plate , license_plate); parking.STOPparking.top.state = 'p'/出栈 返回栈顶指针int StackPop(SeqStack &parking) if(StackEmpty(parking) return 0; else return parking.top-;/取栈顶元素int StackTop(SeqStack parking , char *license_plate ) if(StackEmpty(parking) return 0; else strcpy(license_plate , parking.STOPparking.top.license_plate); return 1; /显示所有void Display(SeqStack parking) if(parking.top = -1) printf("停车场为空n"); else while(parking.top != -1) cout<<"车牌号为:"<<parking.STOPparking.top.license_plate; cout<<",停在"<<parking.top + 1 <<"号车位上" parking.top-; /初始化队列void InitList(LQueue *&sidewalk) sidewalk = (LQueue *)malloc(sizeof(LQueue); sidewalk->front=sidewalk->rear = NULL;/入队void In_LQueue(LQueue *&sidewalk,char *license_plate) QNode *car_on_sidewalk; car_on_sidewalk = (QNode *)malloc(sizeof(QNode); /为新节点开辟新空间 strcpy(car_on_sidewalk->WAIT.license_plate , license_plate); /将数据写入节点 car_on_sidewalk->WAIT.state = 's' /写入停车信息 car_on_sidewalk->next = NULL; if(Empty_LQueue(sidewalk) /队空则创建第一个节点 sidewalk->front = sidewalk->rear = car_on_sidewalk; else /队非空插入队尾 sidewalk->rear->next = car_on_sidewalk; sidewalk->rear = car_on_sidewalk; /判队空int Empty_LQueue(LQueue *q) if(q->front = NULL) return 1; else return 0;/判队长度 返回队长int QueueLength(LQueue *q) QNode *p=q->front; int i=0; while(p != NULL) i+; p=p->next; return i; /出队 成功返回1 队空返回0int Out_LQueue(LQueue *&sidewalk,char *license_plate) QNode *car_on_sidewalk; if(Empty_LQueue(sidewalk) /如果队空返回0 return 0; car_on_sidewalk = sidewalk->front; strcpy(license_plate , car_on_sidewalk->WAIT.license_plate); /取出队头元素 if(sidewalk->front = sidewalk->rear) /队中只有一个元素 sidewalk->front = sidewalk->rear=NULL; /删除元素 else sidewalk->front = sidewalk->front->next; /队头指针后移 free(car_on_sidewalk); /释放指针 return 1; /检查离开的车是否在停车场中 返回车在停车场中位置 不在则返回0int LeaveCheck(SeqStack parking,char *license_plate) int flag = parking.top+1; /定义变量记录当前车在停车场中位置 if(StackEmpty(parking) return 0; else /查找离开车所在位置 while(parking.top != -1 && strcmp(parking.STOPparking.top.license_plate , license_plate) != 0) flag-; parking.top-; return flag; /检验输入的车牌是否合法void Input_Check(char *license_plate) int flag = 1; int i; string tmpstr; while(flag) cin>>tmpstr; getchar(); if(tmpstr.length()<MAX_PLATE) for(i=0;i<10;i+) license_platei = tmpstr.c_str()i; flag = 0; else cout<<"输入有误,请重新输入:" 7、评分表计算机与通信学院课程设计评分表课程名称: 数据结构 项 目评 价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩 教师签名: 日 期: