附件二【学生用】西北农林科技大学信息工程学院数据结构实习报告题目:停车场管理系统学号2011013200姓名阮屹专业班级电子商务111指导教师戴涛、杨会君实践日期2012-7-6至2012-7-15目录一、综合训练目的与要求 (1)二、综合训练任务 (1)三、总体设计 (1)四、详细设计说明 (1)五、调试与测试 (7)六、实习日志 (13)七、实习总结 (13)八、附录:核心代码清单 (14)一、综合训练目的与要求正文综合训练的目的本综合训练是计算机科学与技术、信息管理与信息系统、软件工程专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》、《数据结构》课程后进行的一次全面的综合练习。
本课综合训练的目的和任务:1. 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言、数据结构解决实际问题的能力综合训练要求1. 分析综合训练题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用4. 设计完成后提交课程设计报告二、综合训练任务通过此系统可以实现如下功能:若是车辆到达,则输入汽车在停车场内或便道上的停车位置以及进站时间,当车子出站时,则显示在停车场内停车时间,并;应当支付的金额要求:设计合理的存储结构,设计界面,设计程序完成功能;三、总体设计该程序是模拟了一个特殊车站,车站是一条直线,只有一个入口,车子要出站则他前边的车子都要为其让路,然后再回来并且覆盖出站车子原来的位置,这明显是一个要用到栈的环境。
而当车站满了之后,便在一旁的便道里排队等待,先排队的当然先进车站。
这是原题,我做了些许改动,设计了会员系统,会员享受9折优惠并且有会员专用便道,在车站满的情况下优先进入车站。
四、详细设计说明整体设计如上,那么现在详细分析程序。
这个程序每辆车实际在内存中保存了两次,一个是在主函数中的Car c的结构体数组中,一个在栈或队列中,而不是只用栈来储存,这样方便后来的车辆的查找和程序的管理,当然这样也相对好编写程序,思路相对清晰。
这也是我本身对数据结构不熟练的结果。
程序中用到的结构体:时间的结构体:ypedef struct{int hour;int min;}time;对于每辆车的结构体:typedef struct{int num;int position;time t;float money;}Car;车站,也就是栈的结构体typedef struct{Car elem[SIZE+1];int top;}Stack;便道,也就是队列的结构体typedef struct Node{Car data;struct Node *next;}CQueueNode;这个结构体包含队列的首尾指针typedef struct{CQueueNode *front;CQueueNode *rear;}LinkQueue;主函数的功能以及内容:主函数包括主要结构的内存的分配,子函数的调用,子函数分为两个部分,一个是对整个程序的初始化,包括密钥的设定,程序文字、背景颜色的设定。
然后就是整个大程序的循环中按选择进行不同子函数调用。
包括:菜单显示子函数,车子进站的子函数调用,车子出站的子函数调用,车辆搜索的子函数调用,整个车站车子显示的子函数调用,以及屏幕保护子函数的反复调用。
每一次主函数大循环子函数之间与主函数之间的联系如下图所示:判定输入的密钥是否和设定一致一致不一致主函数中再次大循环显示菜单,并进行选择1.车辆到达5.锁机并待机4.车辆搜索3.车辆显示2.车辆离开6.直接退出整个程序下面是一辆车进站和出站的完整过程流程图:车辆显示则是通过循环将栈和队列中的内容全部显示出来,由于便道还有普通和会员之分,所以一共建立了3个子函数来显示3个储存结构。
void print1(Stack *S) //显示站内车辆 {int mark,a=200;车辆到达 车站和便道已建立好车场未满,车进车场 车场已满,车进便道输入车子到达时间,车牌号会员便道是否是会员 否有车出站,优先进站是 普通便道会员便道为空,有车出站则进站车进入车场有车出站有车出站,会员便道空选择出站选项,并该车被选中输入离开车辆的离开时间,进行停车费用的计算 非会员会员原价*1原价*0.9车子离开 此车后面的车辆退出并进入临时栈Car x;printf("停车场停车情况:\n");if(EmptyorNot(S)){printf("当前停车场没有任何车辆!");}for(mark=S->top;S->top>0;S->top--)if(GetTop(S,&x)){printf("车牌号%d,所在位置%d,到达时间%d:%d\n",x.num,x.position,x.t.hour,x.t.min);Sleep(a);}S->top=mark;}void print2(LinkQueue *Q) //显示普通便道车辆{CQueueNode *p;int a=200;p=Q->front->next;for(;p!=NULL;p=p->next){printf("普通等待车牌号%d, 到达时间%d:%d",p->data.num,p->data.t.hour,p->data.t.min);Sleep(a);}}void print3(LinkQueue *Q) //显示会员便道车辆{CQueueNode *p;int a=200;p=Q->front->next;for(;p!=NULL;p=p->next){printf("会员等待车牌号%d, 到达时间%d:%d",p->data.num,p->data.t.hour,p->data.t.min);Sleep(a);}}车辆搜索则是用到了顺序查找,查找的关键字就是车牌号了,由于车牌号是乱的没有规律,所以只好采用这个查找方式了,下面是查找部分:case 4: //搜索车辆的位置printf("\n请输入车牌号:");scanf("%d",&n);for(j=0;j<10;j++)if(n==c[j].num)break;if(j==10){printf("未搜寻到该车辆,请核对后再进行搜索\n");}elseprintf("你的车子在%d号位!\n",j);printf("按任意键返回主菜单!\n");getch();system("cls");break;其实程序锁定很简单,就是设定一个标记变量,用条件判断并执行就完成了。
屏幕保护是我额外加的功能,反复执行这个子函数就可以了:void pingbao(){system("cls");int d=1;int a=rand()%18+1;int b=rand()%8+1;for(;d<a;d++)printf("\n");d=1;for(;d<b;d++)printf("\t");printf("欢");Sleep(120);printf("迎");Sleep(120);printf("使");Sleep(120);printf("用");Sleep(120);printf("停");Sleep(120);printf("车");Sleep(120);printf("场");printf("管");Sleep(120);printf("理");Sleep(120);printf("系");Sleep(120);printf("统");Sleep(120);printf("!");Sleep(120);printf("按");Sleep(120);printf("任");Sleep(120);printf("意");Sleep(120);printf("键");Sleep(120);printf("退");Sleep(120);printf("出");Sleep(120);printf("屏");Sleep(120);printf("保\n");Sleep(500);}看起来有点长,其实内容很简单的,这个是自动反复执行的那么我们怎么做到案件就中断呢?这样循环就可以了:while(!kbhit()){pingbao();Sleep(f);}Sleep是让程序暂停的效果,kbhit才是真正的作用!功能就是判断是否有按键,按键返回1。
!kbhit 就会返回0,就中断循环了。
五、调试与测试由于是测试程序,所以我定义车站只有3个位置,包括站内外所有车位不能多于10个。
下边就是程序进入时的密钥设定:主菜单界面:车辆进入选项:车站满,会员进入会员专用通道:车站内外停车情况:查看车子的位置:屏保界面(实际为动态的):屏保后解锁了:会员车子出站:加的对话框:程序结束了:六、实习日志第一天:拿到了自己的题目,停车场管理喜用,脑子就出现了指针数组之类的东西,一个x*y的矩阵?恩,结构体记录坐标和时间,最后算个价格就搞定。
仔细一看题就被雷到了!这种停车场还真是第一次见!好吧,没办法,有开始想这个题怎么做。
第二天:老师和我讨论了我的题,发现了需要改进的地方,新加入了一些内容,并且写了任务计划书。
第三天,做好了整个程序的框架,主函数的框架出来了。
以后的几天就有序进行了。
第四天:做了一个子函数,就是栈的子函数,这才几周没碰就这个样子了,看来以后还是要多编程才行啊!第五天:继续编写子函数,并且完善主函数不足的地方。
第六天:继续编写程序,试着开始执行整个程序。
没有语法错误,不代表BUG不多,好吧!太多的BUG,修改了好久!第七天:看了看同学们的程序,都做得挺漂亮的,我也不能落后,就开始寻思怎么把程序弄得漂亮点。