数据结构工程实训 --停车场管理系统

 

文档和源码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define TRUE 1
#define PS "lzc"
#define MPS 3
#define MAX 2
float price;
float money;
typedef struct time//时间结构体 
{    
    int year;//年
    int mon;//月
    int day;//日
    int hour;//时
    int min;//分
    int sec;//秒
}Time;
typedef struct car//车辆信息 
{
    char user[20];//车主
    char num[20];//车牌号
    Time *reach;//到达时间
    Time *leave;//离开时间
}Car;
typedef struct park//停车场 (栈) 
{
    Car *stack[MAX];
    int top;
}Park;
typedef struct linkcar//便道上的车
{
    Car *CAR;
    struct linkcar *next;
}LinkCar;
typedef struct linkpark//便道
{
    LinkCar *head;
    LinkCar *rear;
}LinkPark;
void InitStack(Park *p)//初始化栈 
{
    p->top=-1;
}
int Empty(Park *p)//判断栈空 
{
    if(p->top<0)
    return (TRUE);
    else 
    return (NULL);
}

Park *Push(Park *p,Car *c)//进栈 
{
    if(p->top>=MAX)
    {
        printf("栈满!");
        return NULL;
    }
    else 
    {
        p->top++;
        p->stack[p->top]=c;
    }
    return p;
}
Car *Pop(Park *p)//出栈 
{    Car *q=NULL;
    if(Empty(p))
    {
        printf("栈空!\n");
        return q;
    }
    else 
    {    q=p->stack[p->top];
        p->top--;
        return (q);
    }
}

void InitLinkQueue(LinkPark *p)//链队的初始化
{
    p->head=(struct LinkPark *)malloc(sizeof(LinkPark));
    p->head->next=NULL;
    p->rear=p->head;
}

int LinkQueue_Empty(LinkPark *p)//判断链队是否为空
{
    if(p->head==p->rear)
    {
        return 1;
    }
    else 
        return 0;
}

void EnLinkQueue(LinkPark *p,Car *c)//进队(车辆进入便道)
{
    LinkCar *q;
    q=(struct LinkCar*)malloc(sizeof(LinkCar));
    q->next=NULL;
    q->CAR=c;
    p->rear->next=q;
    p->rear=q;
    printf("\t\t车辆已进入便道!进入时间为:%d年%d月%d日%d时%d分%d秒\n",q->CAR->reach->year+1900,q->CAR->reach->mon,q->CAR->reach->day,q->CAR->reach->hour,q->CAR->reach->min,q->CAR->reach->sec);
}

LinkCar *DeLinkQueue(LinkPark *p)//出队
{
    LinkCar *c;
    c=(struct LinkCar*)malloc(sizeof(LinkCar));
    if(LinkQueue_Empty(p))
    {
        printf("\t\t便道上没有车! \n");
        return 0;
    }    
    else
    {    
        c=p->head->next;
        p->head->next=c->next;
        //free(c);
        //printf("出队完成");
        return c;
    }
}

void CheckLink(LinkPark *p)
{    
    LinkPark *q;
    q=p->head;//q暂时保存p的头指针
    printf("\t\t\t\t****查看便道车辆****\n");
    printf("\n\t\t车主\t\t车牌号\t\t   进入便道时间\n");
    while(p->head->next!=NULL)
    {
    p->head=p->head->next;    
    printf("\t\t");        
    printf("%s",p->head->CAR->user);
    printf("\t\t");
    printf("%s",p->head->CAR->num);
    printf("\t\t");
    printf("%d/%d/%d %d:%d:%d",p->head->CAR->reach->year+1900,p->head->CAR->reach->mon,p->head->CAR->reach->day,p->head->CAR->reach->hour,p->head->CAR->reach->min,p->head->CAR->reach->sec);
    printf("\n");
    }
    p->head=q;//输出数据后把p的头指针指向原来的空间
}
Time *gettime ()
{
    Time *TIME;
    time_t t;
    struct tm * lt;
    TIME=(Time *)malloc(sizeof(Time));
    time (&t);//获取Unix时间戳。
    lt = localtime (&t);//转为时间结构。localtime把t分解为 tm 结构,并用本地时区表示
   // printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
    TIME->year=lt->tm_year;
    TIME->mon=lt->tm_mon;
    TIME->day=lt->tm_mday;
    TIME->hour=lt->tm_hour;
    TIME->min=lt->tm_min;
    TIME->sec=lt->tm_sec;
    return TIME;
}
void Arrival(Park *p,LinkPark *P)
{    
    char temp;
    Car *c;
    c=(Car *)malloc(sizeof(Car));
    printf("\t\t请登记车辆信息,车主以及车牌号\n");
    printf("\t\t车主:");
    temp=getchar();
    gets(c->user);
    printf("\t\t车牌号:");
    //temp=getchar();
    gets(c->num);
//    printf("输入完成");
    c->reach=gettime();
    if(p->top<(MAX-1))
    {
    Push(p,c);
    printf("\t车辆已进站,进站时间为%d年%d月%d日%d时%d分%d秒\n",c->reach->year+1900,c->reach->mon,c->reach->day,c->reach->hour,c->reach->min,c->reach->sec);
    }
    else
    {    printf("\t\t停车场已满,请进入便道等候!\n");

        EnLinkQueue(P,c);
    }

}
void Check(Park *p)
{    
    int i;
    i=p->top;
    printf("\t\t\t\t****查看停车场****\n");
    printf("\n\t\t车主\t\t车牌号\t\t   车辆到达时间\n");
    while(i>=0)
    {
        printf("\t\t");        
        printf("%s",p->stack[i]->user);
        printf("\t\t");
        printf("%s",p->stack[i]->num);
        printf("\t\t");
        printf("%d/%d/%d %d:%d:%d",p->stack[i]->reach->year+1900,p->stack[i]->reach->mon,p->stack[i]->reach->day,p->stack[i]->reach->hour,p->stack[i]->reach->min,p->stack[i]->reach->sec);
        printf("\n");
        i--;
    }
        
    
}
void Bill(Car *c)
{    
    float charge;
    float n;
    float i;
    float StandTime;
    StandTime=(float)(c->leave->day-c->reach->day)*24+(float)(c->leave->hour-c->reach->hour)+(float)((c->leave->min-c->reach->min))/60+(float)((c->leave->sec-c->reach->sec))/3600;
    money=StandTime*price;
    printf("\t\t车辆已离开,停车时长为%f小时\t\t\n",StandTime);
    printf("\t\t应收费用%f元:\n",money);
    printf("\t\t请结账:");
    scanf("%f",&charge);
    n=money-charge;
    while(n>0)
    {
        printf("\t\t还要付%f元,请结完账再走!\n",n);
        scanf("%f",&i);
        n=n-i;
    }
    printf("\t\t找零%f元",-n);

}
void Leave(Park *p,LinkPark *P)
{    
    //因为栈是后进先出,所以如果离开的车辆不是最后一辆,则需要把该辆车之后进入的车放入一个临时栈,待该车出栈后,再把临时栈中的车入栈到停车场(原来的栈)
    int i;
    Park q;
    Car *c;
    printf("\t\t请输入需要离开的车辆1--%d\n",p->top+1);
    scanf("%d",&i);
    InitStack(&q);
    while(p->top>i-1)
    {
    Push(&q,Pop(p));
    }
    p->stack[p->top]->leave=gettime();
    Bill(Pop(p));
    while(q.top>=0)
    {
    Push(p,Pop(&q));//将临时栈中的车放回停车场中(原栈)
    }
    c=DeLinkQueue(P)->CAR;
    c->reach=gettime();
    printf("\t\t便道中%s的车进入停车场,进入时间为%d年%d月%d日%d时%d分%d秒\n",c->user,c->reach->year+1900,c->reach->mon,c->reach->day,c->reach->hour,c->reach->min,c->reach->sec);
    Push(p,c);

}
void login()//密码验证
{    
        int n=1;
    char password[20];
    printf("\t\t请输入停车场管理系统登录密码:");
    while(n<=MPS)
    {    
    gets(password);
    if(strcmp(password,PS)==0)
    {    
        //system("cls");//清屏
        printf("\t\t登录成功!\n");
        printf("\t\t请输入停车场收费标准(元/小时):");
        scanf("%f",&price);
        break;
        }    
        else
        {    
            if(n==3)
            {
            printf("\t\t第%d次登录失败,账户已锁定!!\n",n);
            break;
            }
            printf("\t\t第%d次登录失败,请重新输入:",n);
            
        }
        n++;
    }

}
void menu()
{    int m=1;
    int i;
    Park p;
    LinkPark P;
    InitLinkQueue(&P);
    InitStack(&p);
    printf("\t\t请选择功能\n");
    printf("\t\t1.车辆进入登记\n");
    printf("\t\t2.车辆离开登记\n");
    printf("\t\t3.查看停车场\n");
    printf("\t\t4.查看便道\n");
    printf("\t\t0.退出系统\n");
    while(m)
    {
        scanf("%d",&i);
        switch(i)
    {
    case 1:
            Arrival(&p,&P);break;
    case 2:
            Leave(&p,&P);break;
    case 3:
             Check(&p);break;
    case 4:
            CheckLink(&P);break;

    case 0:
            m=0;printf("谢谢使用!\n");break;
    }
}
}
int main()
{    system("color 1f");//蓝底
    printf("\t\t欢迎使用停车场管理系统\n");
    login(); 
    menu();
    return 0;
}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验二 停车场管理 班级:A0712 学号:12 姓名:冷清淼 成绩:__________ 指导教师签名:__________ 一、问题描述 设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场 ,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若停车场已停满 n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开 入。当停车场某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该 辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时 间的长短交费(在便道上停留的时间不收费)。 设计要求: 1.模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。 2.从终端读入汽车到达或离去的数据,每组数据包括三项: (1)是"到达"还是"离开"; (2)汽车牌照; (3)"到达"或"离开"的时刻。 3.与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或 便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。 二、算法说明 1.数据结构说明 (1)用到两个堆栈:一个为车场栈;另一个为临时栈temp typedef struct NODE{ CarNode *stack[MAX+1]; int top; }SeqStackCar; /*模拟车场*/ 一个队列结构,存储便道车辆信息: typedef struct Node{ QueueNode *head; QueueNode *rear; }LinkQueueCar; /*模拟便道*/ 2.算法说明 (1) 功能模块说明:停车场管理系统含有三个模块,即:车辆到达、离开、列表显示 图1 (2)以模块为单位分析算法 1、"到达"模块:到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到 便道等待。如图2。 图2 2."离开"模块:离开时,当车库为空时,提示没有车,结束;否则车辆离开。如图3。 图3 3. "显示"模块:显示模块有两个显示选项,即:车场与便道。如图4。 图4 三、测试结果 (一)测试用例(说明:测试用例要合理并且足够,既要有正确用例,也要有错误用例 ,同时检验程序的正确性和强壮性) 1.第一组测试用例 (1)测试输入:停车场的车辆离开,如下表: "服务选择 "车牌号/车位 "到达/离开时间 " "1 "QH058 "15:25 " "1 "AB123 "18:45 " "1 "EA642 "23:15 " "2 "2 "0:30 " "2 "1 "0:65(错误) " (2)测试目的:测试离开方法时间格式控制以及费用计算是否正确。 (3)正确输出:第一次离开的是AB123,应交费3.45元。第二次时,当在输入65时, 应该提示输入错误,重输。 (4)实际输出: (5)错误原因:第一个错误是在计算时,一个数字错了;第二个是没有对时间格式 控制。 (6)当前状态:已改正 2.第二组测试用例 (1)测试输入:连续6辆车到达,如下表: " 服务选 " 车牌号 " 到达时间 " "择 " " " "1 "A8828 "7:56 " "1 "S2296 "8:25 " "1 "WW666 "8:45 " "1 "HK456 "15:50 " "1 "GH999 "12:30 " "1 "DD555 "13:40 " 测试目的:测试到达方法与列表显示方法能否正确完成。 (3)正确输出:先到达的五辆车先进入停车场,最后到达的一辆在便道等候。 (4)实际输出: (5)错误原因:没有作出时间先后的判断,而是先输入先进入。 (6)当前状态:待修改 3.第三组测试用例 (1)测试输入:接上一步输入离开信息,下表: "服务选择"离开车位"离开时间"便道车进入时 " " " " "间 " "2 "3 "13:30 "13:40 " (2)测试目的:测试离开方法功能是否成功以及便道进入车场是否正确。 (3)正确输出:输出3号车位的车辆离开信息清单,便道1号车进入停车场。 (4)实际输出: 错误原因:没有错误。 (6)当前状态:通过 (二)测试结果分析 此停车管理系统基本可能实现一个小的停车场的管理,其"到达"与"离开"方法都相对比 较完整,以及结算清单明了。尽管在时间先后上有出现混乱,但当其用到实际应用时, 那个时间先后就可以避免了。但在输入数据时,要按照严格的格式输入,否则有可能出 现死去或崩溃。若本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关 机等,而此系统的缺点却是没有保存功能,关闭之后就要重新建立了。会慢慢完善。 附录:源代码 ///系统说明:本系统适应于小型停车场,且停车时间在一天之的短期停放停车场。 //在此系统中,车库容量设置为5,便于测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值