资源描述
资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。
《数据结构》课程设计
停
车
场
管
理
系
统
班级: ********* 指导教师: ***
学号: *********** 姓名: ***
小组成员: ***** ****** ******
完成日期: 3月6日
成绩:________________
目 录
(一) 设计目的………………………………… 3
(二) 设计内容………………………………… 3
(三) 概要设计…………………………………4-5
(四) 调试分析…………………………………6-8
(五) 用户手册………………………………… 9
(六) 附 录…………………………………9-17
《数据结构》课程设计
停车场管理系统
一、 课程设计目的
1、 经过课程设计, 加深对《数据结构》这一课程所学内容的进一步理解与巩固。
2、 经过课程设计, 加深对结构化设计思想的理解, 能对系统功能进行分析, 并设计合理的模块化结构。
3、 经过课程设计, 提高程序开发功能, 能运用合理的控制流程编写清晰高效的程序。
4、 经过课程设计, 训练C程序调试能力, 能将一个中小型各级组织系统联调经过。
5、 经过课程设计, 开发一个中小型系统, 掌握系统研发全过程。
6、 通话课程设计, 培养分析问题、 解决实际问题的能力。
二、 课程设计内容
① 问题描述:
设有一个能够停放n辆汽车的狭长停车场, 它只有一个大门能够供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放( 最先到达的第一辆车放在停车场的最里面) 。如果停车场已放满n辆车, 则后来的车辆只能在停车场大门外的便道上等待, 一旦停车场内有车开走, 则排以便道上的第一辆车就进入停车场。停车场内如有某辆车要开走, 在它之后进入停车场的车都必须先退出停车场为它让路, 待其开出停车场后, 这些辆再依原来的次序进场。每辆车在离开停车场时, 都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场时, 允许其离去, 不收停车费, 而且依然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。
② 基本要求:
要求程序输出每辆车到达后的停车位置( 停车场或便道上) , 以及某辆车离开停车场应交纳的费用和它在停车场内停留的时间。
③ 实现提示:
汽车的模拟输入信息格式能够是: ( 到达/离去, 汽车牌照号码, 到达/离去的时刻) 。例如, ( ‘A’, 1, 5) 表示1号牌照车在5这个时刻到达, 而( ‘D’, 5, 20) 表示5号牌照车在20这个时刻离去。整个程序能够在输入信息为( ‘E’, 0, 0) 时结束。本题可用栈和队列来实现。
三、 概要设计
1、 设计思想
此停车场管理系统是在一个狭长的通道上的, 而且只有一个大门能够供车辆进出, 而且要实现停车场内某辆车要离开时, 在它之后进入停车场的车都必须先退出停车场为它让路, 待其开出停车场后, 这些辆再依原来的次序进场的功能, 就能够设计两个堆栈, 其中一个堆栈用来模拟停车场, 另一个堆栈用来模拟临时停车场, 该临时停车场用来存放当有车辆离开时, 原来停车场内为其让路的车辆。至于当停车场已满时, 需要停放车辆的通道能够用一个链队列来实现。当停车场内开走一辆车时, 通道上便有一辆车进入停车场, 此时只需要改变通道上车辆结点的连接方式就能够了, 使通道上第一辆车进入停车场这个堆栈, 而且使通道上原来的第二辆车成为通道上的第一辆车, 此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就能够了。
2、 实现方法
对于此停车场管理系统的实现, 就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。至于通道上车辆的停放则用一个链队列来实现, 此时, 通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。对于要对停车场内的车辆根据其停放时间收取相应的停车费用, 能够记录下车辆进入以及离开停车场的时间, 再用时间差乘以相应的单价而且打印出最后的费用就能够实现了。
3、 主要模块
①此停车场管理系统, 主要分为以下若干模块:
首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量, 然后编写主函数, 在此主函数中实现对其它各个模块的调用。在主函数中首先调用option()函数, 出现欢迎用户使用的主界面, 然后提示用户进入此停车场管理系统后, 再出现一个供用户选择的界面, 在用户的选择过程中, 程序又分别调用车辆的到达、 车辆的离开、 停车场内停放车辆的信息以及退出程序这四个函数模块。其中, 在车辆的离开那个模块函数中又调用了打印离开车辆信息的函数, 在停车场内停放车辆信息的那个模块函数中, 又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。最后, 从调鼐的这四个函数中回到主函数结束整个程序的运行。
②在以上各个模块中, 出现的调用的函数为:
void InitStack(SeqStackCar *s);
int InitQueue(LinkQueueCar *Q);
option();
int Arrival(SeqStackCar *Enter,LinkQueueCar *W);
void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W);
void PRINT(CarNode *p);
void List(SeqStackCar S,LinkQueueCar W);
void List1(SeqStackCar *S);
void List2(LinkQueueCar *W);
4、 模块间关系
四、 调试分析
( 1) 调试过程中的主要问题
由于此停车场管理系统是分模块设计的, 而且在程序的实现过程中又使用了清屏函数, 因此, 运行时用户选择任务而且执行完任务后, 又会回到供用户选择功能的主界面, 因此整个程序从整体上来讲结构清晰, 使用方便。本程序的调试运行, 总体上情况良好, 但中间也出现了一些小问题。其中比较有代表性的主要问题有:
当停车场已经达到最大容量, 但仍有车辆进入停车场的时候, 运行界面上没有出现或者说出现了但又跳掉了”停车场已满, 该车辆需在便道上等待! ”的提示信息。我们小组成员经过重复商量讨论, 而且在查阅了多种资料后, 在那一个printf语句后加了一个getch(), 此时, 程序运行结果就符合要求了。
对于在WIN—TC下不能显示中文的问题, 我们经过在第一个printf语句前加了一句 system("graftabl 936"); 就很好地解决了这个问题, 使得整个程序的运行都出现了中文提示, 而且是在中文的环境下操作, 设计更加合理, 更加人性化, 更加方面用户使用, 同时也提高了用户的操作效率。
( 2) 测试结果的分析与讨论
①欢迎界面
②车辆到达
③车辆离开
④车辆信息( 车场)
⑤车辆信息( 便道)
五、 用户手册
这个程序用来实现对停车场内车辆的管理, 整个操作界面为中文, 更加符合人性化的标准, 使得用户使用方便, 而且每一个操作都有提示, 使得初次接触该程序的用户也能很快适应程序的操作。
这个程序操作简单, 对于车牌号, 只需输入车牌号上的数字就行, 而且对于进出停车场的时间, 也简化了操作, 只需输入当时的时刻就行, 没有具体到小时和分钟, 但可能这也是该程序不足之处所在。而且该程序也给用户提供了选择的机会, 当点击运行该程序后, 如果想退出程序, 能够输入n或N退出该运行程序。
至于使用过程中的更具体的问题, 能够参照该报告书中调试分析那一项的屏幕截图, 整个程序的运行界面大致就如上述屏幕截图的内容。
六、 附录
1、 源程序代码
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
int MAX; /*定义一个全局变量用来存储车库最大容量*/
float price;/*每车每小时的费用*/
typedef struct time
{
int hour;
int min;
}Time; /*时间结点*/
typedef struct node
{
char num[10];
Time reach;
Time leave;
}Car; /*车辆信息结点*/
typedef struct NODE
{
Car *stack[100];
int top;
}SqStack; /*停车站*/
typedef struct car
{
Car *data;
struct car *next;
}QNode;
typedef struct Node
{
QNode *head;
QNode *rear;
}LinkQueue; /*通道*/
void InitStack(SqStack *); /*初始化栈*/
int InitQueue(LinkQueue *); /*初始化便道*/
int arrive(SqStack *,LinkQueue *); /*车辆到达*/
void leave(SqStack *,SqStack *,LinkQueue *); /*车辆离开*/
void info(SqStack,LinkQueue); /*显示停车场信息*/
void PRINT(Car *p,int room);
void InitStack(SqStack *s) /*初始化栈*/
{
int i;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
int InitQueue(LinkQueue *Q) /*初始化便道*/
{
Q->head=(QNode *)malloc(sizeof(QNode));
if(Q->head!=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return(1);
}
else return(-1);
}
void main()
{
SqStack In,Out;
LinkQueue Wait;
int ch;
InitStack(&In); /*初始化停车站*/
InitStack(&Out); /*初始化让路的临时栈*/
InitQueue(&Wait); /*初始化通道*/
while(1)
{
printf("--------------------欢迎使用停车场管理系统--------------------\n");
printf("\t本系统由5011工作室开发, 作者:邓春国、 段庆龙、 梁伟明、 丁磊。\n\n");
printf("请输入停车场的容量:");
scanf("%d",&MAX);
printf("请输入停车场的收费标准(元/小时):");
scanf("%f",&price);
printf("您输入的停车场容量为%d位, 费用为%2.1f元/小时。\n",MAX,price);
printf("\n(1)车辆到达\n(2)车辆离开\n(3)停车场信息\n(4)退出系统\n请选择\n");
while(1)
{
ch=getch();
switch(ch)
{
case 49:arrive(&In,&Wait);break; /*车辆到达*/
case 50:leave(&In,&Out,&Wait);break; /*车辆离开*/
case 51:info(In,Wait);break; /*输出车站信息*/
case 52:{printf("谢谢使用! ");exit(0);} /*退出主程序*/
default:printf("\n按键无效, 请重新按键选择! ");
}/*49-52分别表示”1”-”4”这四个按键的键值*/
system("CLS");
printf("--------------------欢迎使用停车场管理系统--------------------\n");
printf("\t本系统由CG工作室开发, 作者:邓春国、 段庆龙、 梁伟明、 丁磊。\n\n\n");
printf("您输入的停车场容量为%d位, 费用为%2.1f元/小时。\n",MAX,price);
printf("\n(1)车辆到达\n(2)车辆离开\n(3)停车场信息\n(4)退出系统\n请选择\n");
}
}
}
int arrive(SqStack *In,LinkQueue *W) /*车辆到达*/
{
Car *p;
QNode *t;
p=(Car *)malloc(sizeof(Car));
flushall();
printf("\n停车场还有%d停车位(若停车位为0, 车可先进入便道等待)",MAX-In->top);
printf("\n请输入车牌号码(例:湘D0734):");
gets(p->num);
if(In->top<MAX) /*停车场未满, 车进车场*/
{
In->top++;
printf("\n停车的位置:%d号停车位。",In->top);
printf("\n请输入车到达的时间(格式”**:**”):");
scanf("%d:%d",&(p->reach.hour),&(p->reach.min));
In->stack[In->top]=p;
printf("请按任意键返回");
getch();
return(1);
}
else /*停车场已满, 车进便道*/
{
printf("\n停车位已满, 该车须在便道等待! ");
t=(QNode *)malloc(sizeof(QNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
printf("请按任意键返回");
getch();
return(1);
}
}
void leave(SqStack *In,SqStack *Out,LinkQueue *W)
{ /*车辆离开*/
int room;
Car *p,*t;
QNode *q;
/*判断车场内是否有车*/
if(In->top>0) /*有车*/
{
while(1) /*输入离开车辆的信息*/
{
printf("\n请输入车在停车场的位置(1-%d): ",In->top);
scanf("%d",&room);
if(room>=1&&room<=In->top) break;
}
while(In->top>room) /*车辆离开*/
{
Out->top++;
Out->stack[Out->top]=In->stack[In->top];
In->stack[In->top]=NULL;
In->top--;
}
p=In->stack[In->top];
In->stack[In->top]=NULL;
In->top--;
while(Out->top>=1)
{
In->top++;
In->stack[In->top]=Out->stack[Out->top];
Out->stack[Out->top]=NULL;
Out->top--;
}
PRINT(p,room);
/*判断通道上是否有车及车站是否已满*/
if((W->head!=W->rear)&&In->top<MAX) /*便道的车辆进入停车场*/
{
q=W->head->next;
t=q->data;
In->top++;
printf("\n便道的%s号车进入车场第%d号停车位。",t->num,In->top);
printf("\n请输入现在的时间(格式”**:**”):");
scanf("%d:%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==W->rear) W->rear=W->head;
In->stack[In->top]=t;
free(q);
}
}
else printf("\n停车场里没有车\n"); /*没车*/
printf("请按任意键返回");
getch();
}
void info1(SqStack *S) /*列表输出车场信息*/
{
int i;
if(S->top>0) /*判断停车场内是否有车*/
{
printf("\n车场:");
printf("\n 位置 到达时间 车牌号\n");
for(i=1;i<=S->top;i++)
{
printf(" %d\t",i);
printf("%d:%d ",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
}
}
else printf("\n停车场里没有车");
}
void info2(LinkQueue *W) /*显示便道信息*/
{
QNode *p;
p=W->head->next;
if(W->head!=W->rear) /*判断通道上是否有车*/
{
printf("\n便道中车辆的号码为:\n");
while(p!=NULL)
{
puts(p->data->num);
p=p->next;
}
}
else printf("\n便道里没有车\n");
printf("请按任意键返回");
getch();
}
void info(SqStack S,LinkQueue W)
{
info1(&S); /*显示停车场信息*/
info2(&W); /*显示停便道信息*/
}
void PRINT(Car *p,int room) /*输出停车站车的信息*/
{
int A1,A2,B1,B2;
printf("\n请输入车离开的时间(格式”**:**”):");
scanf("%d:%d",&(p->leave.hour),&(p->leave.min));
printf("\n车牌号码:");
puts(p->num);
printf("\n车到达的时间是: %d:%d",p->reach.hour,p->reach.min);
printf("车离开的时间是: %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)+(B2-A2)/60.0)*price);
free(p);
}
2、 设计体会
经过这一周的课程设计, 加深了我对《数据结构》这门课程所学内容的进一步的理解与掌握; 同时, 经过对停车场管理系统的开发, 使得我将计算机课程所学知识与实际问题很好地相联接在了一起。在这次课程设计中, 不但培养了我开发一个中小型程序的能力, 而且也培养了我的团队合作能力。在这次对停车场管理系统的开发过程中, 我们小组成员互相合作, 互相帮助, 其中有程序功能成功实现时的欣喜, 也有遇到问题、 解决问题时的执着以及迷茫。在这次课程设计中, 使得我很好地了解了在开发程序过程中合作的重要性。
在这周课程设计中, 我们小组所开发的停车场管理系统, 基本上能够完成每一项功能。汽车进入停车场的信息、 离开停车场的信息以及通道上的信息都能够在程序上一一实现。可是, 该程序也有不足的地方。主要表现在车辆的车牌号上, 现实中的车牌号是一串字符, 可是, 在这个程序中, 为了简便起见, 我们就车牌号定义为了整型, 这个与现实是有些不符的。还有一个能够改进的地方就是记录车辆进入停车场以及离开停车场的时间, 应该精确到小时以及分钟的, 可是在程序中, 为了简便起见, 我们只是设置成了一个时刻, 因此, 在这方面还是有待改进的。改进的程序中, 还应该增加时间的判断功能, 即停车场内有可能有车辆停放的时间超过一天。
还有一个很重要的问题, 对于停车场内能够停放的最多车辆数, 为了测试数据的方便, 我在程序中, 定为了2, 在实际使用中, 能够改变程度开头的宏定义以增加停车场的容量。
总之, 在这周的课程设计中, 我以及我们这组的收获还是挺大的, 不但对于专业课有了更好的认识, 而且在合作的过程中更加了解了团队精神的重要性。
展开阅读全文