停车场信息管理系统设计.docx
《停车场信息管理系统设计.docx》由会员分享,可在线阅读,更多相关《停车场信息管理系统设计.docx(17页珍藏版)》请在冰豆网上搜索。
停车场信息管理系统设计
停车场信息管理系统设计
(2010-06-1109:
28:
37)
转载▼
标签:
教育
一、 问题描述:
设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。
在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。
若车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。
当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。
每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。
基本要求:
(1)要求以顺序栈模拟停车场,以链队列模拟便道。
(2)从终端读入汽车到达或离去的数据,每组数据包括三项:
1、是“到达”还是“离去”;2、汽车牌照号码;3、“到达”或“离去”的时刻。
与每组输入信息相应的输出信息为:
如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用
二、 设计目的:
1、 了解停车场的管理系统与数据结构之间的关系;
2、 学会用C语言模拟停车场的管理
三、 设计要求:
1、 要求以顺序栈模拟停车场,以链队列模拟便道。
2、 能够读入汽车的牌照和它离开或到达的时刻。
3、 能够读出汽车在停车场中的位置。
4、 能输出汽车在停车场中停留的时间和应交的费用。
四、 设计分析:
一个典型的停车场管理信息系统需要包括车辆进出管理及收费功能、停车场车位信息查询功能。
管理系统模块如下:
开始
停车场使用情况
便道使用情况
到达车辆信息
离开车辆信息
车辆计费信息
到达车辆信息
离开车辆信息
车位信息查询
图1、停车场管理模块
由于汽车按先后到达顺序由北向南排列,很容易让我们想到数据结构中的堆栈模型
当停车场满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。
由管理系统的模块我们可分部设计,详细设计如下:
同样我们首先定义车辆的各种信息函数(车牌号,到达时间,开始计费时间,离开时间)
1、 先确定停车场容量
voidInitStack(LPTCARSTACK&lpCarStack,intnSize)
将其容量设置为nSize,初始化栈lpCarStack
2、 对停车场的车辆信息设计
voidPush(LPTCARSTACK&lpCarStack,TCARINFORMATIONcarinfo){车辆信息carinfo入栈lpCarStack}
voidPop(LPTCARSTACK&lpCarStack,TCARINFORMATION&carinfo){
若栈lpCarstack空,返回TRUE;否则,返回FALSE}
BOOLIsStackFull(LPTCARSTACKlpCarStack)
{
若栈lpStackFull满,返回TRUE;否则,返回FALSE}
voidDestroyStack(LPTCARSTACK&lpCarStack)
{
销毁栈lpCarStack,将指针lpCarStack置为NULL}
3、 对便道上车辆信息设计
便道的入队设计方法同2类似。
4、对停车场中车辆计费
doubleCalculateExpense(intnContinuanceMinutes)
{由车辆在停车场中停留时间(nContinuanceMinutes)计算费用}
5、 汽车的车位查询信息
根据本次用户输入的车辆信息进行查找,用户输入的前半部分,即命令类型、用户输入的后半部分,即车辆信息判断汽车的位置,然后puts("[车位]\t[车牌号]\t[到达时间]\t[进入(开始计费)时间]\n");
由以上各信息功能模块结合我们所学的C语言编程技巧即可设计一种简单的具有车辆查询、计费功能的小型停车场管理系统。
#include
#include
#include
#include
#include
//清空当前屏幕
#defineClearScreen() system("cls")
//显示字符串szPrompt并等待用户按下任意键
#definePause(szPrompt)printf("%s",szPrompt),getch()
typedefstructcarinformation //车辆信息
{
charszRegistrationMark[64]; //车牌号
charszArrivalTime[16]; //到达时间
charszEntranceTime[16]; //进入停车场(开始计费)时间
charszDepartureTime[16]; //离开时间
}TCARINFORMATION,*LPTCARINFORMATION;
typedefstructcarstack
{
LPTCARINFORMATIONlpCarInformation; //车辆信息
intnTop; //栈顶元素下标
intnStackSize; //栈容量
}TCARSTACK,*LPTCARSTACK;
//初始化栈lpCarStack,将其容量设置为nSize
voidInitStack(LPTCARSTACK&lpCarStack,intnSize)
{
lpCarStack=(LPTCARSTACK)malloc(sizeof(TCARSTACK));
lpCarStack->lpCarInformation=(LPTCARINFORMATION)malloc(
nSize*sizeof(TCARINFORMATION)
);
lpCarStack->nTop=-1;
lpCarStack->nStackSize=nSize;
}
//车辆信息carinfo入栈lpCarStack
voidPush(LPTCARSTACK&lpCarStack,TCARINFORMATIONcarinfo)
{
lpCarStack->nTop++;
lpCarStack->lpCarInformation[lpCarStack->nTop]=carinfo;
}
//车辆信息从栈lpCarStack中弹出并存入carinfo
voidPop(LPTCARSTACK&lpCarStack,TCARINFORMATION&carinfo)
{
carinfo=lpCarStack->lpCarInformation[lpCarStack->nTop];
lpCarStack->nTop--;
}
//若栈lpCarstack空,返回TRUE;否则,返回FALSE
BOOLIsStackEmpty(LPTCARSTACKlpCarStack)
{
returnlpCarStack->nTop==-1;
}
//若栈lpStackFull满,返回TRUE;否则,返回FALSE
BOOLIsStackFull(LPTCARSTACKlpCarStack)
{
returnlpCarStack->nTop==(lpCarStack->nStackSize-1);
}
//销毁栈lpCarStack,将指针lpCarStack置为NULL
voidDestroyStack(LPTCARSTACK&lpCarStack)
{
free(lpCarStack->lpCarInformation);
free(lpCarStack);
lpCarStack=NULL;
}
typedefstructcarnode //链队结点信息
{
TCARINFORMATIONcarinfo; //车辆信息
structcarnode*lpNext; //指向下一个元素的指针
}TCARNODE,*LPTCARNODE;
typedefstructcarqueue //链队
{
LPTCARNODElpHead; //头结点
LPTCARNODElpRear; //指向当前队尾的指针
intnEffectiveSize; //当前队中元素个数
}TCARQUEUE,*LPTCARQUEUE;
//初始化链队lpCarQueue
voidInitQueue(LPTCARQUEUE&lpCarQueue)
{
lpCarQueue=(LPTCARQUEUE)malloc(sizeof(TCARQUEUE));
lpCarQueue->lpHead=(LPTCARNODE)malloc(sizeof(TCARNODE));
lpCarQueue->lpHead->lpNext=NULL;
lpCarQueue->lpRear=lpCarQueue->lpHead;
lpCarQueue->nEffectiveSize=0;
}
//车辆信息carinfo入队lpCarQueue
voidEnQueue(LPTCARQUEUE&lpCarQueue,TCARINFORMATIONcarinfo)
{
LPTCARNODElpCarNode=(LPTCARNODE)malloc(sizeof(carnode));
lpCarNode->carinfo=carinfo;
lpCarNode->lpNext=NULL;
lpCarQueue->lpRear->lpNext=lpCarNode;
lpCarQueue->lpRear=lpCarQueue->lpRear->lpNext;
lpCarQueue->nEffectiveSize++;
}
//队头元素从链队lpCarQueue中出队并存入carinfo
voidDeQueue(LPTCARQUEUE&lpCarQueue,TCARINFORMATION&carinfo)
{
LPTCARNODElpTemp=lpCarQueue->lpHead->lpNext;
carinfo=lpTemp->carinfo;
lpCarQueue->lpHead->lpNext=lpTemp->lpNext;
free(lpTemp);
lpCarQueue->nEffectiveSize--;
}
//若链队lpCarQueue为空,返回TRUE;否则,返回FALSE
BOOLIsQueueEmpty(LPTCARQUEUElpCarQueue)
{
returnlpCarQueue->nEffectiveSize==0;
}
//销毁链队lpCarQueue
voidDestroyQueue(LPTCARQUEUE&lpCarQueue)
{
LPTCARNODElpNextCarNode=NULL;
for(LPTCARNODElpCarNode=lpCarQueue->lpHead;lpCarNode!
=NULL;lpCarNode=lpNextCarNode)
{
lpNextCarNode=lpCarNode->lpNext;
free(lpCarNode);
}
free(lpCarQueue);
lpCarQueue=NULL;
}
//将字符串时间格式转换为数字(分钟)格式,例如12:
36将被转换为756(12*60+36)
intConvertTimeFormat(char*lpTime)
{
intnHour=0;
intnMinute=0;
sscanf(lpTime,"%d:
%d",&nHour,&nMinute);
returnnHour*60+nMinute;
}
//根据在停车场内的停留时间nContinuanceMinutes(分钟)计算费用
doubleCalculateExpense(intnContinuanceMinutes)
{
returnnContinuanceMinutes*(5.0/60);
}
intmain(void)
{
intnParkCapability=0; //停车场容量
putchar('\n');
printf("\t\t===========欢迎你进入停车场管理系统===========\n");
printf("\t\t 徐沙利 20074470149\n");
printf("请输入停车场容量:
");
scanf("%d",&nParkCapability);
LPTCARSTACKlpCarStack=NULL; //停车场,用栈模拟
InitStack(lpCarStack,nParkCapability);
LPTCARQUEUElpCarQueue=NULL; //便道,用链队模拟
InitQueue(lpCarQueue);
charcCommandType=NULL; //命令类型
charszUserInput[128]={NULL}; //用户输入
do
{
ClearScreen();
putchar('\n');
puts("--------------------");
puts("[命令类型]");
puts("A-车辆到达");
puts("D-车辆离开");
puts("E-停止输入");
puts("O-显示当前停车场和便道使用情况");
putchar('\n');
puts("例:
");
puts("A,冀A1234,14:
26");
puts("D,冀A1234,16:
51");
puts("E");
puts("O");
putchar('\n');
printf("请输入命令:
");
scanf("%s",szUserInput);
puts("--------------------");
charszCarInformation[128]={NULL};
sscanf(szUserInput, //将命令类型与车辆信息分开存放
"%c,%s",
&cCommandType, //用户输入的前半部分,即命令类型
szCarInformation //用户输入的后半部分,即车辆信息
);
char*lpCommaLocation=NULL; //车辆信息字符串中的逗号位置
for(lpCommaLocation=szCarInformation;*lpCommaLocation!
='\0';lpCommaLocation++)
{
if(*lpCommaLocation==',')
{
break;
}
}
*lpCommaLocation='\0';
TCARINFORMATIONcarinfo={NULL};//存储本次用户输入的车辆信息
strcpy(carinfo.szRegistrationMark,szCarInformation);
if(cCommandType=='A')
{
strcpy(carinfo.szArrivalTime,lpCommaLocation+1);
if(FALSE==IsStackFull(lpCarStack))
{
strcpy(carinfo.szEntranceTime,carinfo.szArrivalTime);
Push(lpCarStack,carinfo);
printf("已进入停车场第%d个车位\n",
lpCarStack->nTop+1
);
printf("车牌号:
\t\t%s\n",carinfo.szRegistrationMark);
printf("进入时间:
\t%s\n",carinfo.szEntranceTime);
puts("是否收费:
\t是");
}
else
{
EnQueue(lpCarQueue,carinfo);
printf("停车场已满,已停放在便道的第%d个车位\n",
lpCarQueue->nEffectiveSize
);
printf("车牌号:
\t\t%s\n",carinfo.szRegistrationMark);
printf("停放时间:
\t%s\n",carinfo.szArrivalTime);
puts("是否收费:
\t否");
}
}
elseif(cCommandType=='D')
{
strcpy(carinfo.szDepartureTime,lpCommaLocation+1);
LPTCARSTACKlpTempCarStack=NULL;
InitStack(lpTempCarStack,nParkCapability);
TCARINFORMATIONcarinfoOut={NULL};
BOOLbIsCarFound=FALSE;
while(FALSE==IsStackEmpty(lpCarStack))
{
Pop(lpCarStack,carinfoOut);
if(0!
=strcmp(carinfoOut.szRegistrationMark,carinfo.szRegistrationMark))
{
Push(lpTempCarStack,carinfoOut);
}
else
{
bIsCarFound=TRUE;
break;
}
}
while(FALSE==IsStackEmpty(lpTempCarStack))
{
TCARINFORMATIONtempcarinfo={NULL};
Pop(lpTempCarStack,tempcarinfo);
Push(lpCarStack,tempcarinfo);
}
if(FALSE==bIsCarFound)
{
printf("车牌号为%s的车未进入停车场.\n",carinfo.szRegistrationMark);
Pause("--------------------\n按任意键输入下一条信息...\n");
continue;
}
strcpy(carinfoOut.szDepartureTime,carinfo.szDepartureTime);
intnEntranceTime=ConvertTimeFormat(carinfoOut.szEntranceTime);
intnDepartureTime=ConvertTimeFormat(carinfoOut.szDepartureTime);
intnContinuanceMinutes=nDepartureTime-nEntranceTime;
printf("计费时段:
\t%s-%s(共%d分钟)\n",
carinfoOut.szEntranceTime,
carinfoOut.szDepartureTime,
nContinuanceMinutes
);
doublerExpense=CalculateExpense(nContinuanceMinutes);
printf("应交纳的费用:
\t%.1lf元\n",rExpense);
if(FALSE==IsQueueEmpty(lpCarQueue))
{
TCARINFORMATIONtempcarinfo={NULL};
DeQueue(lpCarQueue,tempcarinfo);
strcpy(tempcarinfo.szEntranceTime,carinfoOut.szDepartureTime);
Push(lpCarStack,tempcarinfo);
puts("--------------------");
printf("停放在便道的第1个车位,车牌号为%s的车已进入停车场\n",
tempcarinfo.szRegistrationMark
);
}
}
elseif(cCommandType=='E')
{
puts("********************");