主题:停车场管理问题
宝马第九代
[专家分:0] 发布于 2007-07-05 10:46:00
哪位高手帮帮忙了……解决一下……不胜感激
题目:停车场管理问题
【问题描述】:
设有一个可以停放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个回复)
沙发
稀饭和馒头 [专家分:170] 发布于 2007-07-05 21:05:00
作业????
板凳
宝马第九代 [专家分:0] 发布于 2007-07-06 13:20:00
是啊……课程设计……
3 楼
宝马第九代 [专家分:0] 发布于 2007-07-10 18:31:00
^
4 楼
lalar [专家分:150] 发布于 2007-07-11 14:58:00
很多年以前写的一个,和你要求的不大一样就是了。。
/*作者: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 楼
huzhyi21 [专家分:210] 发布于 2007-07-12 13:02:00
哇,你是那个学校的啊,我估计认识你啊,
你这个题和我们做的一摸一样啊,一字不差!!!
6 楼
huzhyi21 [专家分:210] 发布于 2007-07-12 13:04:00
Manage Informion System
呵呵,还是先自己做做吧,
我来回复