| B04931042 | 201340450114 |
询{必建鼻垄魏
HUBEIPOLTTZCEEIIC UNIVEJISITY
课程设计
教学院 | 计算机 |
课程名称 | 数据结构与算法 | |
题 | 目 | 用栈实现停车场管理 |
专 | 业 | 软件工程 |
班 | 级 | 13级(1)班 |
姓 | 名 | 高敏 |
同组人员 | 严子璐李佳恒童静赵超冯辉 | |
指导教师 | 程细才 | |
2014 | 年 6月29日 | |
(完成时间)
一.概述......................................................2
二•总体方案设计..............................................2
三.详细设计..................................................3
四.程序的调试与运行结果说明..................................7
五.课程设计总结.............................................20
参考文献.....................................................21
1•课程设计的目的
对学生数据结构知识的全面综合训练,把书上学到的知识用于解决实际问题、培养今后软件开发工作所需的动手实践能力,包括问题分析、总体结构设计,用户界面的设计、程序设计时的基本技能和技巧,以及一整套软件工作规范的训练和团体协作精神的培养。
2•课程设计的要求
(1)了解并掌握数据结构与算法的设计方法,具备初步的分析和设计 能力;
(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基 本方法和技能;
(3) 提高综合运用所学的理论知识和方法分析和解决问题的能力; (4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作 者所应具备的科学的工作方法和作风
二总体方案设计
一、问题描述
设停车场是一个可停放n辆车的狭长通道,冃只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,曲北向南依次排列(假设大门在最南端)。若停车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开吋,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。
设计要求:
1.模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。
2.从终端读入汽车到达或离去的数据,每组数据包括三项: (1) 是“到达”还是“离开”;
(2) 汽车牌照号码;
(3) “到达”或“离开”的时刻。
3.与每组输入信息相应的输岀信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输岀其在停车场中停留的吋间和应交的费用。
4.遇到的难题,当进入4辆车,假如需要出车的序列为2,就必须按照栈出栈序列出车,先出4,3,2然后3,4又入桟,这里的程序相对比较麻烦,通过和组员交流终于做出来了。
二•各自分工
我负责的是编写部分代码,如车辆的进入函数,运用了栈的知识
三详细设计
算法说明
1.数据结构说明
(1) 用到两个堆栈:一个为车场栈;另一个为临时栈temp
typedefstruct NODE{
CarNode*stack|MAX+l ];
inttop;
JSeqStackCar;/*模拟车场*/
(2) —个队列结构,存储便道车辆信息:
typedefstruct Node{
QueueNode*head;
QueueNode*rear;
JLinkQueueCar;/*模拟便道*/
2•算法说明
(1) 功能模块说明:停车场管理系统含冇三个模块,W:车辆到达、离开、
列表显示
| |||
1 : | |||
1 J 2
| |||
|
图1
(2) 以模块为单位分析算法
1、“到达”模块:到达时冇两种情况,即车场是否满,未满则直接进入停
车场;满时,到便道等待。
如图2。
2. “离开”模块:离开时,当车库为空时,提示没冇车,结束;否则车辆离开。
图3
“显示”模块:显示模块有两个显示选项,B|J:车场与便道。如图4。
四•程序的调试与运行结果说明
(一)测试用例(说明:测试用例要合理并口足够,既要有正确用例,也要有错误用例,同时检验程序的正确性和强壮性)
1.第一组测试用例
(1)测试输入:停车场的车辆离开,如下表:
服务选择 | 车牌号/车位 | 到达/离开时间 |
1 | QH058 | 15: 25 |
1 | AB123 | 18: 45 |
1 | EA2 | 23: 15 |
2 | 2 | 0: 30 |
2 | 1 | 0: 65 (错误) |
(2)测试目的:测试离开方法时间格式控制以及费用计算是否正确。 (3)正确输岀:第一次离开的是AB123,应交费3.45元。第二次时,当在输入65时,应该提示输入错误,重输。
(4)实际输出:
| | |||
|离开车辆的车牌号为: | | |||
QH058 | | |||
(5) 错误原因:第一个错误是在计算时,一个 数字错了;第二个是没有对 | |
时间格式控制。
(6)当前状态:已改正
2.第二组测试用例
(1)测试输入:连续6辆车到达,如下表:
服务选 | 车牌号 | 到达吋间 |
择 | | |
1 | A8828 | 7: 56 |
1 | S2296 | 8: 25 |
1 | WW666 | 8: 45 |
1 | HK456 | 15: 50 |
1 | GH999 | 12: 30 |
1 | DD555 | 13: 40 |
(2)测试目的:测试到达方法与列表显示方法能否止确完成。
(3)正确输岀:先到达的五辆车先进入停车场,最后到达的一辆在便道等
候。
(4)实际输出:
(5)错误原I大I:没有作出时间先后的判断,而是先输入先进入。
(6)当而状态:待修改
3.第三组测试用例
(1)测试输入:接上一步输入离开信息,下表:
服务选择 | 离开车位 | 离开时 间 | 便道车进入时 间 |
2 | 3 | 13: 30 | 13: 40 |
(2)测试冃的:测试离开方法功能是否成功以及便道进入车场是否正确。(3)止确输出:输出3号车位的车辆离开信息清单,便道1号车进入停车
场。
(4)实际输出:
CA初八课程学习集'程序设计实习\停车场问题、代码夹\单代码夹\Debug\... |
I离开车辆的车牌号为: |
WW666 |
|負列込时间为:8:45 |
.用为:2・85元? |
「―勺DD555号车进入丰场第5位置? |
幘输入现在的时间如〈小时:分钟>: |
13 40 | 探※※※(?欢迎使用本停车管理系统@※※※海 | |||||||
|
|
|
|
|
|
|
| |
| 二 | ※ | 探 | ■ | 车 | 到 | 达 | 探 |
※ | ||||||||
■ | 车 | 离 | 开 | ※ | ||||
※ | ||||||||
■ | 列 | 显 | 示 | |||||
※ | ||||||||
二 | ■ | 退 | 系 | 统 | ||||
※ | ||||||||
?说明:请辻意正确输入时 |
间, I请选棒所需要的服务? |
请选择您舉显示信息? <1-3>:恢一1 •车坊-- 隊一 2 •輕一※ 恢--3 •逍回--※ |
1 |
在输入“时”后, 按“ENTER ”或者“仝格 |
位置到达时间 | ||
1 | ?:56 | A8828 |
2 | 8:25 | S2296 |
3 | HK456 | |
15:50 | ||
GH999 | ||
4 | 12:30 | |
DD555 | ||
13^40 _ | ||
您—显示信息? <1-3>: | ||
(5)错误原I大I:没有错误。
(6)当而状态:通过
(二)测试结果分析
此停车管理系统基本可能实现一个小的停车场的管理,其“到达”与“离 开”方法都相对比较完整,以及结算清单明了。尽管在时间先后上有出现混乱, 但当其用到实际应用时,那个时间先后就可以避免了。但在输入数据时,耍按 照严格的格式输入,否则有可能出现死去或崩溃。若本系统能加上保存功能就 更好了,因为一个系统在使用过程中总会关机等,而此系统的缺点却是没有保 存功能,关闭Z后就要重新建立了。会慢慢完善。
附录:源代码
///系统说明:本系统适应于小型停车场,11停车时间在一天之内的短期停放停 车
场。
〃在此系统中,车库容量设置为5,便于测试。在实际使用中可以对容量大小按实
际情况设置。
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineMAX 5 /*车库容量,可以根据实际情况改变*/#defineprice 0.01 /*一辆车每分钟费用,口J变*/
typedefstruct time
{
inthour;
intmin;
}Time;/*吋间结点*/
typedefstruct node
{
charnum| 10];
Timereach;
Timeleave;
JCarNode;/*车辆信息结点*/
typedefstruct NODE
{
CarNode*stack[MAX+l ];
inttop;
JSeqStackCar;/*模拟停车场*/
typedefstruct car
{
CarNode*data;
structcar *next;
JQueueNode;
typedefstruct Node
QueueNode*head;
QueueNode*rear;
JLinkQueueCar;/*模拟便道*/
/*方法声明*/
voidInitStack(SeqStackCar *); /*初始化栈*/
intInitQueue(LinkQueueCar *); /*初始化便道*/
intArrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/
voidLeave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*午辆离开*/voidList(SeqStackCar,LinkQueueCar); /*显示信息*/
voidPRlNT(CarNode *p,int room); /*输出离开车辆的信息清单*/
voidmain()
{
system(HcolorF2H);/*设置系统颜色,本系统为口底绿字f2*/ SeqStackCarEnter,Temp;
LinkQueueCarWait;
intch;
InitStack(&Enter);/*初始化车站*/
InitStack(&Temp);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化通道*/
while(l)
{
cout«n | 探※※※ | @欢迎使用本停车管理系统@※※※海 |
"«endl;
cout«'■********************************************************"
<endl;
cout«" | 探 | 一※ 1.车辆到达探 - |
u«endl;
cout«" | 探 | —※ | 2.车辆离开探 — |
u«endl;
cout«" | 探 | —※ | 3.列表显示※ ― |
"«endl;
cout«" | 探一※ 4.退出系统※ | -探 |
n«endl;
cout«<T> <T> <T> <T> <T> <T> <T> <T> <T> ^f> ^f> <f% ^T% f I | <T^ <T^ <T^ <T^ <T^ <T^ <T^ <T^ <T^ <T^ <T^ <T^ <T^ <T^ | .(> .(> .(> .(> .(> .(> .(> .(> .(> .(> .(> .(> 11 | «en |
dl;
cout«n!说明:请注意正确输入时间,在输入时后,按ENTER或者空格,
再输入分。不耍为非数字!n«endl;
cout«"请选择所需要的服务!(l-4)."«endl;
while(l)
{
cin»ch;
if(ch>=1 &&ch<=4)break;
elsecout«H输入错误!请选择:(l-4)."«endl;
}
switch(ch)
{
casel:Arrival(&Enter,&Wait);break; /*车辆到达*/
case2:Leave(&Enter,&Temp,&Wait);break; /*车辆离开*/
case3:List(Enter,Wait);break; /*列表显示信息*/case4:exit(0); /*退出主程
序*/
default:break;
voidInitStack(SeqStackCar *s) /*初始化栈*/{
inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->topJ=NULL;
intInitQueue(LinkQueueCar *Q) /*初始化便道*/
Q->head=(QueueNode*)malloc(sizeof(QueueNode)); if(Q->head!=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return(l);
}
elsereturn(-l);
}
intArrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();
cout«"请输入车牌号(例:A1234):"«endl;
gets(p
if(Enter->top<MAX)/*车场未满,车进车场*/
{
Enter->top++;
cout«"车辆在车场第"«Enter->topvv”位置!"«endl;cout«"请输入到达时间
:(小时:分钟)"«endl;
cin»p・>reach.hour;
while(p->reach.hour<0llp->reach.hour>23)//®制时间格式正确{
cout«"输入错误!"«endl;
cout«H请重输入到达时间的时(0-23)!H«endl;
cin»p・>reach.hour;
}
cin»p->reach.min;
while(p->reach.min<0llp->reach.min>59)// 控制分钟输入正确
cout«"输入错误!"vvendl;
cout«H请重输入到达时间的分(0-59)!H«endl;cin»p->reach.min;
Enter->stack[Enter->top]=p;
return(l);
}
else/*车场已满,车进便道*/
{
cout«"车场己满,请在便道等待!H«endl;
t=(QueueNode*)malloc(sizeof(QueueNode)); t->data=p; t->next=NULL;
W->rear->next=t;
W->rear=t;
return(l);
}
}
voidLeave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /汽午辆离
开*/
{
introom;
CarNode*p;
QueueNode*q;
/*判断车场内是否有车*/
if(Enter->top>0)/* 有车*/
{
while(l)/*输入离开车辆的信息*/
{cout«"请输入车在车场的位置1—"«Enter->top«":";
cin»room;
if(room>=1 &&room<=Enter->top) break;
}
while(Enter->top>room)/*车辆离开*/
Temp->top卄;/*临时通道栈顶指针*/
Temp->stack[Temp->top]=Enter->stack[Enter->top]; Enter->stack[Enter->top]=NULL;
Enter->top~;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top~;
while(Temp->top>=l)/*判断临时通道上是否有车*/
{
Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top~;}
PRINT(p,room);
if((W->head!=W->rear)&&Enter->top<MAX)/* 车站是未满*/
{ /*便道的车辆进入车场*/
q=W->head->next;
p=q->data;/*p指向链队头*/
Enter->top++;
cout«"便道的"«p->num«"号车进入车场第u«Enter->top«"位置
!"«endl;
cout«"请输入现在的时间如(小时:分钟):"«endl;
cin»p->reach.hour;
if(p->reach.hour<0llp->reach.hour>23)
{
cout«"输入错误!"vvendl;
cout«M请重输入到达时间的时(0-23)!H«endl;
cin»p・>reach.hour;
}
cin»p・>reach.min;
if(p->reach.min<0llp->reach.min>59)
{
cout«H输入错误!"«endl;
cout«H请重输入到达时间的分(0・59)!H«endl;
cin»p・>reach.min;
Enter->stack[Enter->top]=p;
W->head->next=q->next;if(q==W->rear) W->rear=W->head;
free(q);/*释放q地址*/
}
}
elsecout«H便道里没有车!n«endl; /*便道没车*/
else cout«H车场里没有车!n«endl; /*车场没车*/
}
void PRINT(CarNode *p,int room) /*输出离开车辆的信息清单*/
{
int A1,A2,B1,B2;
cout«"请输入离开的时间:(小时:分钟)"«endl;
cin»p ・>leave.hour;
while(p->leave.hour<Ollp ・> leave.hour>23)
{
cout«"输入错误! "«endl;
cout«"请重输入离开的时间的时(0-23)"«endl;
cin»p ・> leave.hour;
Bl=p->leave.hour;
}
cin»p->leave.min;
if(p->leave.min<0llp->leave.min>59)
{
cout«"输入错误!"«endl;
cout«"请重输入到达时间的分(0・59)! "«endl;
cin»p ・> leave.min;
cout«endl«"离开车辆的车牌号为:'*«endl;
puts(p ・>n um);
cout«"其到达时间为:H«p->reach.hour«":n«p->reach.min«endl; cout«"离开时间为:"«p->leave.hour«',:"«p->leave.min<<endl; A1 =p・> reach.hour;
A2=p・>reach.min;
Bl=p->leave.hour;
B2=p->leave.min;
cout«n应交费用为:H«(((B1 - A 1 )*60+(B2-A2))+1440)% 1440*price«" 元!u«endl;
free(p);
}
voidList 1 (SeqStackCar *S) /*列表显示车场信息*/
{
cout«n您选择的是午场停车情况!"«endl;
inti;
if(S->top>0)/*判断车站内是否有车*/
{
cout«n位置到达时间 车牌号H«endl;
for(i=l;i<=S->top;i++)
{
cout«M ,«i«n
u«S->stack[i]->reach.hour«":n«S・>stack[ij->reach.min«n
"«S->stack[i]->num«endl;
}
}
elsecout«H车场里没有车!n«endl;
}
voidList2(LinkQueueCar *W) /*列表显示便道信息*/
{
cout«H您选择的是便道停车情况!"«endl;
intj=l;
QueueNode*p;
p=W->head->next;
if(W->head!=W->rear)/*判断通道上是否有车*/
{
cout«M等待车辆的车牌号码为:"«endl;
while(p!=NULL)
{
//cout«j;
//puts(p->data->num);
cout«j«nH«p->data->num«endl;p=p->next;
j卄;
}〃开始时显示不止确,没有按照止常输出
}
elsecout«H便道里没有车!”;
}
voidList(SeqStackCar S,LinkQueueCar W) /*列表界徂|*/
{
intflag,tag;
flag=l;
while(flag)/*列表显示循环控制*/
{
cout«"请选择您要显示信息!(1-3):H«endl;
cout«"※一1.车场一※"«endl;
cout«"※-2.便道-※"«endl;
cout«"※一3.返冋一※"«endl;
while(l)
{
cin»tag;
if(tag>=llltag<=3)break;
elsecout«"输入错误!请选择(l-3):"«endl;
}
switch(tag)
{
case l:Listl(&S);break;
case 2:List2(&W);break;
default: break;
/*列表显示车场信息*/
/*列表显示便道信息*/case3:flag=0;break;
五课程设计总结
刚开始因为对栈的知识理解不深透,做起实验非常困难,不知从何下手,通过两周杳阅资料搜集相关知识,终于完成了用栈实现停车场系统,这次的实验,我真的受益匪浅,希望以后还会有更多的课程设计、
通过实习我的收获如下
1我知道了怎样去简化程序,减少他的时间复朵度和空间复朵度。还知道了怎样去完善程序,使其更具健壮性。
2巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
3培养了我选用参考书,查阅手册及文献资料的能力。培养思考,深入研究,分析问题、解决问题的能力。
4通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法。
5通过课程设计,培养了我严肃认真的工作作风,逐步建立止确的生产观念、经济观念和全局观念
参考文献
教材:
[1]严蔚敏,吴伟民.数据结构(C语言版)[M].(第一版)北京:清华人学岀版社.1997参考书:
[2]Sartaj Sahni. Data Structure, Algorithms, and Application in C++. TheMcGraw-Hill Company Inc. 1998[M](第一版)(数据结构、算法与应用C++语言描述.北京:机械工业出版社.1999
⑶徐孝凯•数据结构实用教程(C/C++描述)[Ml,(第一版)北京:清华大学出版社.1999 [4]陈慧南.数据结构(使用C卄语言描述)[M].(第一版)南京:东南大学出版社.2001
数据结构—课程设计成绩评定表
姓 名 |
| |||
专业班级 | 软件工程(1)班 | |||
课程设计题目: | ||||
课程设计答辩或质疑记录: 答:主要运用了有关栈的知识,如先进后出,栈元素的插入与删除。 (2) 对程序记忆最深刻的地方是? 答:在编写车的离开函数吋,车辆出来的吋候,必须要按照栈的出栈顺序出车辆,过程也 比较复杂,通过查找资料,组员们交流后得以解决。 (3) 木次课程设计的体会是? 答:做一个程序需要细心和耐心恒心,特别需要团队合作梢神,做完程序后,我对和关的 数据结构知识了解也有所加强,总Z希望以后会有更多的课程设计。 | ||||
成绩评定依据: | ||||
最终评定成绩(以优、良、屮、及格、不及格评定) | ||||
指导教师签字:________________
年刀 日
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务