回 帖 发 新 帖 刷新版面

主题:停车场管理问题

哪位高手帮帮忙了……解决一下……不胜感激


题目:停车场管理问题
【问题描述】:  
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制程序模拟该停车场的管理。
  
【实现要求】: 
要求程序针对每组输入数据进行处理后的输出信息为:每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时它在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
汽车的每一组模拟输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。例如,(‘A’,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,5,20)表示5号牌照车在20这个时刻离去。整个程序在输入信息为(‘E’,0,0)时结束。其中:‘A’表示到达(Arrival); ‘D’
表示离去(Departure); ‘E’表示输入结束(End)。

【实现提示】:  
本题可用以顺序栈模拟停车场,以链式队列模拟该停车场大门外的便道。需另设一个顺序栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。输入的数据按到达或离去的时刻有序。栈中的每个元素表示一辆汽车,包括两个数据项:汽车的牌照号码和进入停车场的时刻。
【测试数据】:
    设n=2,输入数据为:(‘A’,1,5), (‘A’,1,20), (‘D’,1,15), (‘A’,3,20), (‘A’,4,25), (‘A’,5,30), (‘D’,2,35), (‘D’,4,40), (‘E’,0,0)。

回复列表 (共6个回复)

沙发


作业????

板凳


是啊……课程设计……

3 楼

^

4 楼

很多年以前写的一个,和你要求的不大一样就是了。。

/*作者:benb88*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_PARKING_SIZE 20//停车场最大停车数量
#define PRIZE 1.19//停留每小时单价
#define true 1
#define false 0

 

typedef struct stack
{
 long pos[MAX_PARKING_SIZE];//存储车牌号码
 int time[MAX_PARKING_SIZE];//存储进入车站的时间
 int point;//最后一辆车的位置指针
}Stack;//定义顺序栈-模拟停车场

typedef struct queue
{
 int num;//存储车牌号
 struct queue *next;//指向下一辆车
}Queue;//定义链队列-模拟停车场外

/*------------------------------------------------------------*/
void InitStack(Stack *s){s->point=-1;}//初始化栈

Queue *InitQueue()//初始化队列
{
 Queue *q;
 q=(Queue *)malloc(sizeof(Queue));
 q->next=NULL;
 return q;
}

int StackPop(Stack *s,long *i,int *j)//退栈函数
{
 if(s->point==-1)return false;
 else
 {
  *i=s->pos[s->point];
  *j=s->time[s->point];
  s->point--;
  return true;
 }
}

int StackPush(Stack *s,long i,int j)//压栈函数
{
 if(s->point==MAX_PARKING_SIZE-1)return false;
 else
 {
  s->point++;
  s->pos[s->point]=i;
  s->time[s->point]=j;
  return true;
 }
}

int QueuePop(Queue **qH,long *i)//退队函数
{
 Queue *temp;
 if((*qH)->next==NULL)return false;
 else
 {
  temp=(*qH)->next;
  (*qH)->next=temp->next;
  *i=temp->num;
  free(temp);
  return true;
 }
}

int QueuePush(Queue **q,long i)//入队函数
{
 Queue *temp;
 if((temp=(Queue *)malloc(sizeof(Queue)))==NULL)return false;
 else
 {
  (*q)->next=temp;
  temp->num=i;
  temp->next=NULL;
  *q=temp;
  return true;
 }
}
/*----------------------------------------------------------------------*/
main()
{
 int time,i,j,inStack,inQueue;
 long num;
 char state;
 Stack park;
 Queue *H,*p,*temp,*temp2;
 H=InitQueue();
 p=H;
 InitStack(&park);//初始化队列和栈
 printf("这里是停车场管理程序,欢迎使用。\n支持国产,支持免费,支持正版。CopyRight 2005 by 曾经

喜欢清清的草草\n");
 printf("\n停车场最大能停车%d辆,现在停车的单价为每小时%.2f美元\n",MAX_PARKING_SIZE,PRIZE);
 while(1)
 {
  inStack=inQueue=0;temp=H;
  printf("\n--------------------停车场管理系统---------------------------\n");
  printf("请选择\n\n\t\t(A或a)汽车到达和已到汽车查询\n\t\t(L或l)汽车离开\n\t\t(Q或q)

程序退出\n");
  printf("\n-------------------------------------------------------------\n您的选择是

:");
  state=getche();
  if(state=='a'||state=='A'||state=='l'||state=='L')
  {
   printf("\n输入车牌号(数字):");
   scanf("%ld",&num);
   printf("\n输入到达或离开的的时间(24小时制,单位:小时):");
   scanf("%d",&time);
  }
  if(state=='a'||state=='A')
  {
   for(i=0;i<=park.point;i++)
    if(park.pos[i]==num)
    {
     inStack=1;
     break;
    }//在车站中查找
   for(j=1;temp->next!=NULL;j++)
   {
    temp2=temp;
    temp=temp2->next;
    if(temp->num==num)
    {
     inQueue=1;
     break;
    }
   }//在车站外查找
   if(inStack)
    printf("\n查询结果:输入的汽车已经在车站中第%d个位置停留了%d个小时!

\n",i+1,time-park.time[i]);
   else if(inQueue)
    printf("\n查询结果:输入的汽车已经在车站外第%d个位置等候\n",j);
   else
   {
    if(StackPush(&park,num,time)==false)
    {
     QueuePush(&p,num);
     printf("\n车站已满,车辆停在场外。\n");
    }
    else printf("\n车辆成功进站!\n");
   }//如果车辆到达,当车站已满,停在车站外,否则,进入车站
  }
  else if(state=='l'||state=='L')//如果是离开
  {
   for(i=0;i<=park.point;i++)
    if(park.pos[i]==num)
    {
     inStack=1;
     break;
    }//在车站中查找
   if(inStack)//如果在车站中
   {
    printf("\正要离开的汽车在车站中第%d个位置停留了%d个小时,应付%.2f美

元\n",i+1,time-park.time[i],(time-park.time[i])*PRIZE);
    while(i<park.point)
    {
     park.pos[i]=park.pos[i+1];
     park.time[i]=park.time[i+1];
     i++;
    }
    park.point--;//把离开的车辆从车站中删除
    if(H->next!=NULL)
    {
     QueuePop(&H,&num);
     if(H->next==NULL)p=H;
     StackPush(&park,num,time);
     printf("\n停车场空出一位置。场外等候的%d号汽车入站了!

\n",num);
    }//如果车站外有车,入站
   }
   else//不在车站中
   {
    for(i=1;temp->next!=NULL;i++)
    {
     temp2=temp;temp=temp2->next;
     if(temp->num==num)
     {
      inQueue=1;
      break;
     }
    }//查找是否在车站外
    if(inQueue)
    {
     printf("\n汽车在停车场外,不收费\n",i);
     temp2->next=temp->next;
     if(temp==p)p=temp2;
     free(temp);
    }//在车站外
    else printf("\n错误!你输入了不存在的车牌号!\n");//如果不在车站外,

说明输入车辆不存在
   }
  }
  else if(state=='q'||state=='Q')
  {
   printf("\n");
   break;
  }
  else printf("\n输入错误!\n");
 }//end while
}
/*************************************************************/

5 楼

哇,你是那个学校的啊,我估计认识你啊,
你这个题和我们做的一摸一样啊,一字不差!!!

6 楼

Manage Informion System
呵呵,还是先自己做做吧,

我来回复

您尚未登录,请登录后再回复。点此登录或注册