停车场信息管理系统设计.docx

上传人:b****2 文档编号:1758351 上传时间:2023-05-01 格式:DOCX 页数:17 大小:20.80KB
下载 相关 举报
停车场信息管理系统设计.docx_第1页
第1页 / 共17页
停车场信息管理系统设计.docx_第2页
第2页 / 共17页
停车场信息管理系统设计.docx_第3页
第3页 / 共17页
停车场信息管理系统设计.docx_第4页
第4页 / 共17页
停车场信息管理系统设计.docx_第5页
第5页 / 共17页
停车场信息管理系统设计.docx_第6页
第6页 / 共17页
停车场信息管理系统设计.docx_第7页
第7页 / 共17页
停车场信息管理系统设计.docx_第8页
第8页 / 共17页
停车场信息管理系统设计.docx_第9页
第9页 / 共17页
停车场信息管理系统设计.docx_第10页
第10页 / 共17页
停车场信息管理系统设计.docx_第11页
第11页 / 共17页
停车场信息管理系统设计.docx_第12页
第12页 / 共17页
停车场信息管理系统设计.docx_第13页
第13页 / 共17页
停车场信息管理系统设计.docx_第14页
第14页 / 共17页
停车场信息管理系统设计.docx_第15页
第15页 / 共17页
停车场信息管理系统设计.docx_第16页
第16页 / 共17页
停车场信息管理系统设计.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

停车场信息管理系统设计.docx

《停车场信息管理系统设计.docx》由会员分享,可在线阅读,更多相关《停车场信息管理系统设计.docx(17页珍藏版)》请在冰点文库上搜索。

停车场信息管理系统设计.docx

停车场信息管理系统设计

停车场信息管理系统设计

 (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("********************");

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2