printf("请输入到达时间(* * :
* * ):
");
scanf("%d :
%d", &p.reach.hour, &p.reach.min);
Push(Enter, p); // 进入停车场
}
else{
printf("该车需在便道等待!
\n");
EnQueue(W, p); //进入便道
}
}
车辆离开模块:
void Print(ElemType p){
int A1, A2, B1, B2;
printf("请输入离开的时间(* * :
* * ):
");
scanf("%d:
%d", &p.leave.hour, &p.leave.min);
printf("离开车辆的车牌号为:
");
puts(p.num);
printf("其到达时间为:
%d :
%d\n", p.reach.hour, p.reach.min);
printf("其离开时间为:
%d :
%d\n", p.leave.hour, p.leave.min);
A1=p.reach.hour;
A2=p.reach.min;
B1=p.leave.hour;
B2=p.leave.min;
printf("应交费用为:
%2.1f 元. \n", ((B1 - A1) * 60 + (B2 - A2)) * price);
}
车辆显示模块:
void List1(SqStack S)
{//列表显示停车场信息
int i;
if(S.top>0){//判断停车场是否有车
printf("停车场\n");
printf("位置到达 时间 车牌号\n");
for(i=1;i<=S.top;i++){
printf("%-8d",i);
printf("%-2d:
%-9d",S.data[i].reach.hour,S.data[i].reach.min);
puts(S.data[i].num);
}}
else
printf("停车场内没车!
\n");}
停车场的管理流程如下:
①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。
②当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。
之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。
③列表1显示停车场信息,判断停车场是否有车,如果有车,就显示车辆到达的位置,到达时间及其车牌号。
如果停车场内没有车,就会显示停车场没有车。
列表2显示便道的信息,判断便道是否有车,如果有车,就显示车辆的号牌,否则显示便道没车。
三、主要算法流程描述及部分核心算法
算法流程图描述
流程图按块来分析,共分成整体系统,汽车到达系统,汽车离去系统,汽车显示系统。
如图1。
(1)、汽车整体系统
图1
(2)以模块为单位分析算法
1、“到达”模块:
到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。
如图2。
图2
2.“离开”模块:
离开时,当车库为空时,提示没有车,结束;否则车辆离开。
如图3。
图3
3.“显示”模块:
显示模块有两个显示选项,即:
车场与便道。
如图4。
图4
核心算法:
时间节点
typedefstructtime{
inthour;
intmin;
}Time;
车辆信息节点
typedefstructnode{
charnum[10];
Timereach;
Timeleave;
}ElemType;////顺序栈的定义与基本操作
typedefstruct{
ElemTypedata[MAXSIZE];
inttop;
}SqStack;
便道队列节点:
typedefstructQNode{
ElemTypedata;
structQNode*next;
}Qnode,*QueuePtr;
便道队列:
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
顺序栈的初始化
voidInitStack(SqStack&s){
s.top=0;
}
入堆栈出堆栈
voidPush(SqStack&s,ElemTypee){
s.top++;
s.data[s.top]=e;
}
voidPop(SqStack&s,ElemType&e){
e=s.data[s.top];
s.top--;
}
队列初始化:
voidInitQueue(LinkQueue&Q){
Q.front=Q.rear=newQnode;
Q.front->next=NULL;
}
入队操作:
voidEnQueue(LinkQueue&Q,ElemTypee){
Qnode*p;
p=newQnode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
出队操作:
voidDeQueue(LinkQueue&Q,ElemType&e){
Qnode*p;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
deletep;}
四、系统使用说明
进入主界面:
车辆到达:
停车场满时车在便道上排队:
列表显示:
车辆离开:
当输入不合法时:
五、问题及解决办法
1、在开始输入车牌号的字符串时总是出错,便不能再执行。
解决途径:
通过上网查资料知道,输入字符时习惯性的会加Enter键然后再输下一个,这样相当于Enter也作为一个字符读入,在输入前加上fflush(stdin)函数,用于清除输入的所有缓冲区即可。
2、在输入停车信息时,若输入不合法,程序便会中断结束,无法继续运行下去。
后来利用whihe
(1)永真循环结构,但输入不合法时,重复输入循环。
只有当输入合法时,才会跳出循环,执行下一步操作。
3、刚开始时,程序比较混乱,函数顺序都不是很正确,不能一眼看出来某一个定义是干嘛用
六、课程实践总结
虽然说这次数据结构课程设计是以小组形式进行,但还是有压力的。
在课堂上和课余时间我们互相帮助,互相学习。
这次课程设计通过参考c语言程序设计,c++课程设计与程序设计,数据结构及网上资料完成。
看到自己把所出现的错误一个个地改出来,心里真的是很欣慰。
我们体会到了自己完成一次作业的成就感,更重要的是我体会到了认真对待一件事并好好完成的愉悦,这将对我以后产生很大帮助,理论离不开实践,只有多动手,多动脑,勤动手才能取得成功,活的充实。
通过这一次课程设计,我们学到的东西比以前上课学到的还要多,这让我们明白,理论永远是理论,要是没有实践,理论永远是一纸空文。
我们要从实践中才能学到更多的东西。
而实践又要以理论为基础,要是数据结构知识不扎实,做出的程序也是漏洞百出。
所以,我们要将理论和实践结合起来,把我们在课堂上学到的东西运用在实际中,这样才能提高我们自身的能力。
在接到任务时,其实心里有点恐惧,感觉自己没有能力做出来,就想着反正可以上网去搜,也就不怎么着急。
后来想到如果总是依赖互联网,而不去努力,自己永远不可能有提高,于是开始自己试着写。
当序终于可以运行时,那一刻感觉好自豪,感觉自己所有的努力都没有白费。
更让我重新理解了那就名言“当你
只有一个目标时,整个世界都会给你让路”。
在学习c语言程序设计与c++课程设计与程序设计的时候,老师就一直强调,学习需要细心和耐心,特别是设计较长的程序时,而在真正设计的时候还是会粗心。
程序设计的过程中,还有很多是由于粗心而导致的错误,也有很多是对以前的知识遗忘了,这就告诫自己以后做什么事都要认真仔细,不要大大咧咧。
即使再有能力,不认真,不付出努力,所谓的能力也终究只能是空有一身本领。
在实践中发现自我,挑战自我,最终完善自我。
在此我非常要感谢的是我们的指导老师刘国英老师,感谢老师的细心认真的辅导,让我对数据结构这门课程掌握得更好,懂得更多,他教我怎么分析问题,应该要注意些什么,最后还指出我存在的问题。