资源描述
《数据构造》课程设计
停
车
场
管
理
系
统
班级:********* 指引教师:***
学号:*********** 姓名:***
小构成员:***** ****** ******
完毕日期: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,在实际使用中,可以变化限度开头宏定义以增长停车场容量。
总之,在这周课程设计中,我以及咱们这组收获还是挺大,不但对于专业课有了更好结识,并且在合伙过程中更加理解了团队精神重要性。
展开阅读全文