停车场管理系统实习题〈数据结构〉

设有一个可以停放n(n>=5)辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车 未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制模拟该停车场的管理的程序。

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAXSIZE 2    //定义停车场的最大容量
#define MAX 10 //定义便道的最大容量 
#define OK 1
#define ERROR 0 
//建立车辆停留时间结点
float parktime;//车辆停留的总时间,全局变量
char panduan[10];//用于判断条件 
struct shijian
{
    int hour;
    int minute;
};
//建立车辆信息的结点结构
typedef struct node
{
    char num[10];//牌照信息
    int panduan; //如果是1,表示到达,0表示离去 
    struct shijian arrivetime;
    struct shijian leavetime;
}cardata;
//建立存放停车场车辆的栈
//临时栈和实际停车场站可建立一个栈数组 
typedef struct
{
    cardata elem[MAXSIZE];
    int top; 
}carstack;
void initstack(carstack* s)
{
    s->top = -1;
}
int isempty(carstack* s)//判断空 
{
    return(s->top == -1 ? OK : ERROR);
}
int isfull(carstack* s)
{
    return(s->top == MAXSIZE - 1 ? OK : ERROR);
}
int push(carstack* s, cardata x)
{
    if (!isfull(s)) //站满不执行 
    {
        s->top++;
        s->elem[s->top] = x;
        return OK;
    }
    else
        return ERROR;
}
int pop(carstack* s, cardata* x)
{
    if (!isempty(s))
    {
        *x = s->elem[s->top];
        s->top--;
        return OK;
    }
    else
        return ERROR;
}
//构建计算停车场收费函数 
float charge(cardata* x)//传入需要计算停车费的车辆信息,返回停车的总费用
{
    int first;//停车起始费用
    int h;//从第二个小时开始,每小时收取的费用
    float last;//总费用 
    float t;//用于计算时间差,单位为hour
    printf("请输入起始费用:\n");
    scanf("%d", &first);
    printf("请输入每小时收取的费用:\n");
    scanf("%d", &h);
    t = abs(x->leavetime.hour - x->arrivetime.hour) + abs(x->leavetime.minute - x->arrivetime.minute) / 60.0;
    parktime=t;
    if (t <= 1)
    {
        return first;
    }
    else
    {
        last = first + h * (t - 1.0);
        return last;
    }
}
//利用队列建立便道
typedef struct
{
cardata queue[MAX];
int front,rear;    
}carqueue;
void initqueue(carqueue* sq)//队列的初始化 
{
    sq->front=sq->rear=0;
}
int queueempty(carqueue* sq)//判断队列是否为空 
{
 return(sq->front==sq->rear?OK:ERROR);    
}
int queuefull(carqueue* sq)
{
return ((sq->rear+1)%MAX==sq->front? OK:ERROR);
}
//入队
int enterqueue(carqueue* sq,cardata x)
{
    if(!queuefull(sq))
    {   
        sq->rear++;
        sq->queue[sq->rear]=x;
        return OK;
    }
    else
    {
        printf("队列已满,无法入队\n");
        return ERROR; 
    }
}
//出队
int  deletequeue(carqueue* sq,cardata* x)
{
     if(!queueempty(sq))
    {
    *x=sq->queue[sq->front];
    sq->front++;
    return OK;    
    }
    else
    { 
    return ERROR;    
    }    
}
                      
int main()
{   
    cardata mycar;//创建一个输入车的变量 
    carstack park;//建立一个停车场
    carstack tempark;//建立一个临时停车场
    carqueue way; //建立一个通道 
    int f;//便道的第几个位置 
    initstack(&park);
    initstack(&tempark);
    initqueue(&way);
    printf("亲爱的顾客:\n"); 
    printf("\t\t欢迎使用停车场管理系统\t\t\n");
do

    printf("请输入您是到达还是离去:(到达按1,离去按0)\n");
    scanf("%d",&mycar.panduan);
    if(mycar.panduan==1)//表示到达 
      {
          printf("请输入您的车牌号(例如苏A12345)\n");
        scanf("%s",&mycar.num); 
        printf("请输入您到达的时间(小时+分钟):\n");
        scanf("%d %d",&mycar.arrivetime.hour,&mycar.arrivetime.minute);
        if(!isfull(&park)) //如果停车场不满 
        {
            push(&park,mycar);//将车开入
            printf("您的车目前停在%d车位(一共%d个车位)\n",park.top+1,MAXSIZE); 
        } 
        else //如果停车场已满,则将车存入便道 
        {
            if(!queuefull(&way))//如果便道不满
            {
            enterqueue(&way,mycar);
            f++; 
            printf("您的车目前停在便道的第%d个位置(便道一共有%d个位置)\n",f,MAX); 
            }
            else
            printf("此停车场已经超载,无法继续停车,请稍后再来\n");
        }
       }
    else//表示离开 
    {   
        int i,j,k;  
        if(!isempty(&park)) //停车场有车的情况下 
       {
        printf("请输入您的车停在停车场的第几号位:\n");
        scanf("%d",&i);
        printf("请输入现在的时间(小时+分钟)\n");
        scanf("%d %d",&park.elem[i-1].leavetime.hour,&park.elem[i-1].leavetime.minute); 
        printf("您的车辆所需要支付的费用为:%0.2f元\n",charge(&park.elem[i-1]));
        printf("您在停车场内停留的时间为%0.2f小时",parktime);
        j=park.top;
        cardata t;//中间变量
        cardata s; 
        for(j;j>i-1;j--)//出的车辆后面的车辆出栈,表示让路 
        {
            pop(&park,&t);//让路的车出栈 
            push(&tempark,t);//放入临时停放栈 
        }
        pop(&park,&s);//自己的车出栈,即删除
        while(!isempty(&tempark)) //将临时栈的车出栈进入停车场 
        {
            pop(&tempark,&t);
            push(&park,t);
        }
        if(!queueempty(&way))
        { 
        deletequeue(&way,&t);//将便道的第一辆车出队
        f--;
        push(&park,t);//进入停车场
        }
       }
       else//停车场无车 
       {
       printf("您的操作有误!停车场内无车...\n"); 
       } 
    }
   printf("以上进程执行完毕,是否重新执行,请键入y或n以回车键结束:\n");
   scanf("%s",panduan);    
}while(!strcmp(panduan,"y"));
    return 0;
}

运行结果:

2184f79180854ac6aaea940948d39bb0.jpg

c190030b087b4ee9a29fb416aa936e79.jpg 

2310d44ce0d4478798d330c1848459dd.jpg 

 创作不易,感谢支持

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值