数据结构--停车管理系统

版权声明:本文为博主原创文章,未经博主允许不得转载。可联系邮箱[email protected] https://blog.csdn.net/Justin_bibo/article/details/79606083

停车管理系统

问题描述

停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。

基本要求

(1) 输入的形式和输入值的范围;
七位字符车牌号 空格 时间(12:30)
如:A123456 12:30
(2) 输出的形式;
车牌号 时间
如:A123456 12:30
(3) 程序所能达到的功能。
模拟车子排队和进出车库的情况,并且根据时间计费,随时显示当前车库车辆情况。

概要设计

(1) 数据结构
每个汽车的基本元素:
struct car
{
char id[8];
int h;//
int m;//
struct car *next;
};
栈的基本元素:
struct sqstack
{
struct car *base;
struct car *top;
int stacksize;
};
(2)程序模块
void intstack(struct sqstack &S)/构造栈/
void push_stack(struct sqstack &S,struct car *e)
/e入栈/
void pop_stack(struct sqstack &S,struct car *e)
/出栈顶元素到e/
void creat_q()/创建队列/
void push_q(struct car p)/车辆入队*/
struct car * pop_q()/车辆出队/
void come_in()/车辆离开/
void go_out()/车辆进入/
void interface()/主菜单/

演示

主界面如下:
这里写图片描述
车库中假设最多停三辆车,加入进入四辆车abcd,则d需要在便道排队:
这里写图片描述
此时若b车开走,显示费用信息,则在便道的d车进入车库:
这里写图片描述
这里写图片描述
若此时有车进入,则继续在便道排队:
这里写图片描述

用户使用手册

输入1,表示车辆进入
输入七位车牌号和进入时间,如:
A123789 12:30
输入2,表示车辆离开
输入离开车牌号和时间
输入3,表示显示车库信息
输入0,结束程序
谢谢使用!

代码:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define MAX 3  /*宏定义车库最大车辆*/
struct car
{
    char id[8];
    int h;/*时*/
    int m;/*分*/
    struct car *next;
};

int n=0;/*当前车库内的车辆数*/
int m=0;/*当前便道的车辆数*/
struct car *p1;
struct sqstack
{
    struct car *base;
    struct car *top;
    int stacksize;
};
struct sqstack S1,S2;


void intstack(struct sqstack &S)
{
    S.base=(struct car *)malloc(MAX*sizeof(struct car));
    S.top=S.base;
    S.stacksize=MAX;
}
void push_stack(struct sqstack &S,struct car *e)

{
     strcpy(S.top->id,e->id);
     S.top->h=e->h;
     S.top->m=e->m;
     S.top++;

}
void pop_stack(struct sqstack &S,struct car *e)
{


     S.top--;

    strcpy(e->id,S.top->id);
     e->h=S.top->h;
     e->m=S.top->m;


}
void creat_q()
{

    p1=(struct car *)malloc(sizeof(struct car));
    p1->next=NULL;

}
void push_q(struct car *p)
{
    struct car *p2;
    p2=p1;
     while(p2->next!=NULL)
     {
         p2=p2->next;
     }
     p2->next=p;
     p->next=NULL;

}
struct car * pop_q()
{
    struct car *p;
    p=p1->next;
    p1->next=p1->next->next;
    return p;
}
void come_in()
{

    void interface();
    printf("请输入7位车辆车牌号和进入时间\n例如:\nA123456 12:30\n");
    if(n==MAX)
    {
        struct car *p;
        p=(struct car*)malloc(sizeof(struct car));
        scanf("%s",p->id);
        scanf("%d:%d",&p->h,&p->m);
        push_q(p);
        m++;
    }
    else
    {
        struct car *p;
        p=(struct car*)malloc(sizeof(struct car));
        scanf("%s",p->id);
        scanf("%d:%d",&p->h,&p->m);
        push_stack(S1,p);
        n++;
    }

    interface();
}
void go_out()
{
    struct car* pop_q();
    void interface();

    printf("请输入7位车牌号和离开时间\n");
    char b[8];

    int h1;
    int m1;
    scanf("%s",b);
    scanf("%d:%d",&h1,&m1);
    int i;
    int biaozhi=0;
    for(i=0;i<n;i++)
    {
        if(strcmp(b,(S1.base+i)->id)==0)
        {
            printf("%s 已离开\n计费信息:\n进入时间%d:%d,离开时间%d%d,(每分钟1元)\n",b,(S1.base+i)->h,(S1.base+i)->m,h1,m1);
            printf("费用为:%d元\n",(60*(h1-(S1.base+i)->h)+m1-(S1.base+i)->m)*1);


            int j;
            for(j=0;j<n-i;j++)
                {
                       struct car *p2;
                    p2=(struct car *)malloc(sizeof(struct car));

                       pop_stack(S1,p2);

                       push_stack(S2,p2);

                }
                 struct car *pp;
                 pop_stack(S2,pp);

                for(j=1;j<n-i;j++)
                {

                    pop_stack(S2,pp);
                   push_stack(S1,pp);
                   printf("222\n");
                }
                n--;
                biaozhi=1;
                if(p1->next!=NULL)  /*若便道有车,则便道的车进入车库*/
                {
                struct car *ppp;
               ppp=pop_q();
               push_stack(S1,ppp);
               n++;
                }
            break;
        }
    }
    if(biaozhi==0)
    {
        struct car *p,*pp;
        pp=p1;
        while(pp->next!=NULL)
        {
            p=pp;
            pp=pp->next;
            if(strcmp(b,pp->id)==0)
            {
                printf("%s 已离开\n",b);
                printf("%s 已离开\n计费信息:\n进入时间%d:%d,离开时间%d%d,(每分钟1元)\n",b,pp->h,pp->m,h1,m1);
            printf("费用为:%d元\n",(60*(h1-pp->h)+m1-pp->m)*1);

                p->next=pp->next;
                m--;
                biaozhi=1;
                break;
            }
        }
    }
    if(biaozhi==0)
        printf("找不到%s\n",b);
    interface();
}
void print()
{
    void push_stack(struct sqstack S,struct car *e);
    void pop_stack(struct sqstack S,struct car *e);
    void interface();
    if(n==0)
        printf("没有车辆\n");
    else
    {
    printf("**车库现有车辆信息:\n");
    int i;
    for(i=0;i<n;i++)
        printf("       %s %d:%d\n",(S1.base+i)->id,(S1.base+i)->h,(S1.base+i)->m);

    struct car *p;
    p=p1;

    if(p->next==NULL)
        printf("**便道无车辆\n");
    else
    {
        printf("**便道现有车辆信息:\n");
    while(p->next!=NULL)
    {
        p=p->next;
        printf("      %s %d:%d\n",p->id,p->h,p->m);

    }
    }
    }
    interface();
}
void interface()
{
    int i;
    printf("  请输入操作指令\n\n  1:汽车开入\n  2:车辆离开\n  3:显示当前车辆信息\n  0:结束程序\n*******************\n");
    scanf("%d",&i);
    switch(i)
    {
        case 0:return ;break;
        case 1:come_in();break;
        case 2:go_out();break;
        case 3:print();break;

    };
}
int main()
{

     system("color a0"); //可以写成 red 调出颜色组

     system("title 车库管理系统"); //设置cmd窗口标题

     printf("      ****************欢迎使用停车管理系统*********************\n\n");
     system("date /T");
     system("TIME /T");
     creat_q();

     intstack(S1);
     intstack(S2);
     interface();
     return 0;

}

关于作者

鉏飞祥,就读于安徽大学,邮箱[email protected]

猜你喜欢

转载自blog.csdn.net/Justin_bibo/article/details/79606083