并要进行相应的出队列和进栈操作。
5测试分析
5.1测试用例
说明:
测试用例要合理并且足够,既要有正确用例,也要有错误用例,同时检验程序的正确性和强壮性。
5.1.1第一组测试用例
(1)测试输入:
停车场的车辆离开,如表1所示:
表1:
车辆离开测试
服务选择
车牌号/车位
到达/离开时间
1
京A1212
12:
12
1
津S1212
12:
13
1
鲁D1212
12:
14
2
1
14:
12
2
1
25:
65(错误)
(2)测试目的:
测试离开方法时间格式控制以及费用计算是否正确。
(3)正确输出:
第一次离开的是京A1212,应交费2.4元。
第二次时,当在输入65时,应该提示输入错误,重输。
(4)实际输出:
图2测试离开方式时间格式及费用计算图
图3测试车辆离开错误图
(5)错误原因:
第一个正确,第二个错误,原因是没有对时间格式控制。
(6)当前状态:
已改正
5.1.2第二组测试用例
(1)测试输入:
连续5辆车到达,如表2所示:
表2:
连续5辆车到达测试
服务选择
车牌号/车位
到达时间
1
京A1212
12:
12
1
津S1212
12:
13
1
鲁D1212
12:
14
1
豫F1212
12:
15
1
沪G1212
12:
16
2
1
14:
12
(2)测试目的:
测试到达方法与列表显示方法能否正确完成。
(3)正确输出:
先到达的三辆车先进入停车场,最后到达的两辆在便道等候。
(4)实际输出:
表4车辆到达方式测试
图5车辆进入提示图
(5)错误原因:
没有错误。
(6)当前状态:
通过。
5.1.3第三组测试用例
(1)测试输入:
接上一步输入离开信息,如表3所示:
表3:
接上一步离开信息测试
服务选择
离开车位
离开时间
便道车进入时间
2
1
14:
12
14:
13
(2)测试目的:
测试离开方法功能是否成功以及便道进入车场是否正确。
(3)正确输出:
输出1号车位的车辆离开信息清单,便道1号车进入停车场。
(4)实际输出:
图6测试离开方法功能是否成功图
(5)错误原因:
没有错误。
(6)当前状态:
通过
5.2测试结果分析
经过我们小组一天的调试,我们终于把各模块整合起来了。
在这过程中,我们遇到了很多问题,像数据不匹配、括号不配对、赋值重复等。
因为C语言的语法限制不太严格,对变量的类型约束不严格,对数组下标越界不做检查等原因,所以,我们的修改工作难度加大。
但经过我们这小组共同的努力。
此停车管理系统可以基本实现一个小的停车场的管理,其“到达”与“离开”方法都相对比较完整,费用结算清单直观。
在输入数据时,要按照严格的格式输入,否则有可能出现死去或崩溃。
若本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关机等,而此系统的缺点却是没有保存功能,关闭之后数据丢失。
现受限于各种条件,又因为要求中并未提及,所以本程序暂时没有加入保存功能。
6使用说明
(1)运行程序,首先出现主界面。
主界面包括四个选项:
选项1:
车辆到达登记,选择该项可进行车辆到达停车场情况登记;选项2:
车辆离开登记,选择该项可进行车辆离开停车场情况登记;选项3:
车辆列表显示,选择该项可查看车辆列表显示的所有信息,包括停车场列表和便道列表的全部信息;选项4:
退出系统,选择该项将退出程序。
图7程序初始界面图
(2)车辆列表显示界面包括3个选项:
选项1:
停车场列表,选择该项可以查看停车场列表的所有车辆的全部信息;选项2:
便道列表,选择该项可以查看便道列表显示的全部信息;选项3:
返回主菜单,可返回主界面。
图8车辆列表显示界面图
7总结
总体来说,这次的课程设计比去年的c语言的课程设计稍难。
我这次的课程设计题目:
停车场问题。
相比其他课题来说,这个题目还是比较简单的,主要是运用了数据结构中栈和队列的知识和操作。
程序能够实现基本的车辆到达、离开、收费、遍历显示等主要功能。
但我觉得这个程序还有很多小的地方是可以完善的,比如:
在计算收费时如果离开时间是到了第二天,这样就会导致收费是负的或减少很多。
也就是说,该程序限制于只能规定当天停,当天开走。
至于加算天数的功能我改了几次改不好,又鉴于程序要求中也没有提及并且时间紧张,所以也就没再去研究实现。
只要能实现主要的功能就好了。
当然,这次的课程设计、编程实践还是收获颇丰的。
通过实习我的收获如下:
(1)我知道了怎样去简化程序,减少他的时间复杂度和空间复杂度。
还知道了怎样去完善程序,使其更具健壮性。
(2)巩固和加深了对数据结构相关知识的理解,提高综合运用本课程所学知识的能力。
(3)培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考、深入研究、分析问题、解决问题的能力。
(4)通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法。
(5)通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
根据我在实习中遇到的问题,我将在以后的学习过程中注意以下几点:
(1)认真上好专业实验课,多在实践中锻炼自己。
更让我懂得实践是检验和掌握真理的最好办法。
(2)写程序的过程中要考虑周到、严密。
需求分析需要反复思考修正。
(3)在做课程设计的时候要有信心、有耐心,切勿浮躁。
(4)认真学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
(5)在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。
总之,本次课程设计不仅加深了我们对栈和队列等数据结构的理解和掌握,同时一定程度上提高了我们程序设计和阅读程序的能力。
本次课程设计提高了我们的专业知识,使自己所学的内容运用到实际中来,也增强了实际操作能力,为以后的工作学习提供了一个良好的铺垫。
参考文献
[1]严蔚敏,吴伟民.数据结构[M].北京:
清华大学出版社,2004.
[2]李春葆.数据结构解析[M].北京:
清华大学出版社,2001.
[3]谭浩强.C语言程序设计[M].北京:
清华大学出版社,2005.
[4]朱战立,张选平.数据结构学习指导与典型题解[M].西安:
西安交通大学出版社,2002.
[5]张玲,席德春,刘晓杰.C语言上机实践指导教程[M].北京:
机械工业出版社,2004.
[6]罗文劼,王苗,石强.数据结构习题解答与实验指导[M].北京:
中国铁道出版社,2004.
[7]殷人昆,陶永雷,谢若阳等.数据结构[M].北京:
清华大学出版社,2005.
附录
//系统说明:
本系统适应于小型停车场,且停车时间在一天之内的短期停放停车场。
//在此系统中,车库容量设置为3,便于测试。
在实际使用中可以对容量大小按实际情况设置。
#include
#include
#include
#defineMAX3//停车场最大容量为3辆,便于观察
#defineprice0.02
//定义时间结构体
typedefstructtime
{
inthour;
intmin;
}Time;
//定义车辆信息结构体
typedefstructnode
{
charnum[10];
Timereach;
Timeleave;
}CarNode;
typedefstructNODE
{
CarNode*stack[MAX+1];
inttop;
}SeqStackCar;//模拟停车场
typedefstructcar
{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode
{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;//模拟便道
//方法声明
voidInitStack(SeqStackCar*);//初始化栈
intInitQueue(LinkQueueCar*);//初始化便道
intArrival(SeqStackCar*,LinkQueueCar*);//车辆到达
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);//车辆离开
voidPRINT(CarNode*p,introom);//车辆收费
voidList1(SeqStackCar*S);//显示车场里的车辆情况
voidList2(LinkQueueCar*W);//显示便道上的车辆情况
voidList(SeqStackCar,LinkQueueCar);//显示信息
//voidsavecar(CarNode*);//保存车辆信息
//自定义函数
/*voidsavecar(CarNode*p1)//保存车辆信息
{
FILE*fp1;
if((fp1=fopen("car1.txt","w"))==NULL)
{
printf("\n\t◆不能保存车辆信息◆\n");
return;
}
while(p1)
{
fwrite(p1,sizeof(structnode),1,fp1);
p1=p1->next;
}
}*/
//栈的初始化
voidInitStack(SeqStackCar*s)
{
inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
//队列的初始化
intInitQueue(LinkQueueCar*Q)
{
Q->head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->head!
=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return
(1);
}
else
return(-1);
}
//车辆收费
voidPRINT(CarNode*p,introom)
{
intA1,A2,B1,B2;
printf("\n■请输入车辆离开的时间:
(小时:
分钟)");
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min));
while(p->leave.hour<0||p->leave.hour>23)
{
printf("◆您的输入有误!
");
printf("■请重新输入离开时间的'时'(0-23):
");
scanf("%d",&(p->leave.hour));
}
if(p->leave.min<0||p->leave.min>59)
{
printf("◆您的输入有误!
");
printf("■请重新输入离开时间的'分'(0-59):
");
scanf("%d",&(p->leave.min));
}
printf("\n●离开车辆的车牌号为:
");
puts(p->num);
printf("\n●该车到达时间为:
%d:
%d",p->reach.hour,p->reach.min);
printf("\n●该车离开时间为:
%d:
%d",p->leave.hour,p->leave.min);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
printf("\n●应交费用为:
%2.1f元!
",((B1-A1)*60+(B2-A2))*price);
free(p);
}
//车辆的到达登记
intArrival(SeqStackCar*Enter,LinkQueueCar*W)
{
//charnum[10];
//inta;
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
flushall();//清空缓存输入的作用
printf("\n■请输入车牌号(例:
豫B1234):
");
gets(p->num);
/*a=Enter->top;
loop:
scanf("%s",&num);
if(a==0)
{
strcpy(p->num,num);
a++;
}
while(a)
{
if(strcmp(num,Enter->stack[a]->num)==0)
{
printf("您输入的车牌号重复,请重新输入!
");
gotoloop;
}
}*/
if(Enter->top{
Enter->top++;
printf("\n●车辆在车场第%d位置.",Enter->top);
printf("\n●车辆到达时间:
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
while(p->reach.hour<0||p->reach.hour>23)//控制时间格式正确
{
printf("◆您的输入有误!
");
printf("■请重新输入到达时间的'时'(0-23):
");
scanf("%d",&(p->reach.hour));
}
while(p->reach.min<0||p->reach.min>59)//控制分钟输入正确
{
printf("◆您的输入有误!
");
printf("■请重新输入到达时间的'分'(0-59):
");
scanf("%d",&(p->reach.min));
}
Enter->stack[Enter->top]=p;
printf("\n●恭喜您登记成功!
");
//savecar(?
?
);
printf("\n");
return
(1);
}
else//车场已满,车进便道
{
printf("\n◆您好,停车场车位已满,请该车在便道上等待!
有空余车位时才能进入停车场!
/n");
t=(QueueNode*)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return
(1);
}
}
//车辆的离开
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
{
int