停车场系统

题目要求:

#include <iostream>  
#include <cstdio>  
#include <cstdlib>  
#include <windows.h>  
#include <ctime>  
#include <cstring>  
#include <conio.h>  
#define N 100  
using namespace std;  
typedef struct  
{  
    char num[8];//车牌号  
    long int time_in;  
    int pos;//车辆的状态,0表示停在便道中,1表示停在停车场  
} vehicle; //定义车辆类型  
typedef struct  
{  
    vehicle veh[N];  
    int top;  
} SqStack; //用栈表示停车场  
typedef struct LNode  
{  
    vehicle veh;  
    struct LNode *next;  
} LinkList; //用单链表表示便道  
void Load(FILE *,SqStack *,LinkList *);  
void ShowMenu(int );  
int MakeChoice(int ,int );  
void Parking(SqStack *,LinkList *);  
void Back(SqStack *);  
void EnterPkl(SqStack *,LinkList *);  
void LeavePath(LinkList *);  
void View(SqStack *,LinkList *);  
void Write_and_Quit(FILE *,SqStack *,LinkList *);  
int main()  
{  
    SqStack *pkl;  
    LinkList *path;  
    FILE *fp;  
    pkl=(SqStack *)malloc(sizeof(SqStack));  
    path=(LinkList *)malloc(sizeof(LinkList));  
    fp=fopen("Parking_lot.txt","r+");  
    if(fp==NULL)  
    {  
        printf("数据加载失败!按任意键退出程序");  
        getch();  
        return 0;  
    }  
    Load(fp,pkl,path);  
    while(1)  
    {  
        system("cls");  
        ShowMenu(pkl->top);  
        switch(MakeChoice(1,6))  
        {  
        case 1:  
            system("cls");  
            Parking(pkl,path);  
            break;  
        case 2:  
            system("cls");  
            Back(pkl);  
            break;  
        case 3:  
            system("cls");  
            EnterPkl(pkl,path);  
            break;  
        case 4:  
            system("cls");  
            LeavePath(path);  
            break;  
        case 5:  
            system("cls");  
            View(pkl,path);  
            break;  
        default:  
            system("cls");  
            Write_and_Quit(fp,pkl,path);  
            return 0;  
        }  
    }  
    return 0;  
}  

#include <iostream>  
#include <cstdio>  
#include <cstdlib>  
#include <windows.h>  
#include <ctime>  
#include <cstring>  
#include <conio.h>  
#define N 100  
using namespace std;  
typedef struct  
{  
    char num[8];//车牌号  
    long int time_in;  
    int pos;//车辆的状态,0表示停在便道中,1表示停在停车场  
} vehicle; //定义车辆类型  
typedef struct  
{  
    vehicle veh[N];  
    int top;  
} SqStack; //用栈表示停车场  
typedef struct LNode  
{  
    vehicle veh;  
    struct LNode *next;  
} LinkList; //用单链表表示便道  
void Load(FILE * fp,SqStack * pkl,LinkList * path)  
{  
    pkl->top=-1;  
    path->next=NULL;  
    LinkList *p;  
    char num[8];  
    long int time_in;  
    int pos;  
    while(fscanf(fp,"%s %ld %d\n",num,&time_in,&pos)!=EOF)  
    {  
        if(pos==0)//该车辆在便道中  
        {  
            //尾插法建立单链表  
            p=(LinkList *)malloc(sizeof(LinkList));  
            strcpy(p->veh.num,num);  
            p->veh.time_in=time_in;  
            p->veh.pos=pos;  
            path->next=p;  
            path=p;  
        }  
        else//该车辆在停车场中  
        {  
            ++pkl->top;  
            strcpy(pkl->veh[pkl->top].num,num);  
            pkl->veh[pkl->top].time_in=time_in;  
            pkl->veh[pkl->top].pos=pos;  
        }  
    }  
    path->next=NULL;  
}  
void ShowMenu(int n)  
{  
    printf("********一个简单的停车场管理系统********\n");  
    if(n+1==N)  
        printf("***************停车场已满***************\n");  
    else  
        printf("**********当前停车场共有%03d辆车**********\n",n+1);  
    printf("********说明:停车场每小时收费5元********\n");  
    printf("****************1.停车******************\n");  
    printf("****************2.取车******************\n");  
    printf("*********3.便道车辆进入停车场***********\n");  
    printf("**************4.离开便道****************\n");  
    printf("**************5.查看车辆****************\n");  
    printf("****************6.退出******************\n");  
}  
int MakeChoice(int m,int n)  
{  
    int judge;  
    printf("请输入%d~%d\n",m,n);  
    scanf("%d",&judge);  
    while(judge<m||judge>n)//确保输入的是1~n  
    {  
        printf("输入不合法,请输入%d~%d\n",m,n);  
        fflush(stdin);//如果不加这句,输入一些字母会导致函数无限循环  
        scanf("%d",&judge);  
    }  
    return judge;  
}  
void Parking(SqStack *pkl,LinkList *path)  
{  
    LinkList *r;  
    printf("请输入车牌号:");  
    if(pkl->top<N-1)  
    {  
        fflush(stdin);  
        scanf("%8s",pkl->veh[++pkl->top].num);  
        time(&(pkl->veh[pkl->top].time_in));  
        pkl->veh[pkl->top].pos=1;  
        printf("您的车辆已停至%2d号车位\n",pkl->top);  
    }  
    else  
    {  
        fflush(stdin);  
        r=(LinkList *)malloc(sizeof(LinkList));  
        scanf("%8s",r->veh.num);  
        printf("停车场已满,您要暂时停放在便道中吗?\n");  
        printf("1.确定 2.取消\n");  
        if(MakeChoice(1,2)==1)  
        {  
            while(path->next!=NULL)  
                path=path->next;  
            r->veh.time_in=0;  
            r->veh.pos=0;  
            path->next=r;  
            r->next=NULL;  
            printf("您的车辆已停放到便道中\n");  
        }  
        else  
            free(r);  
    }  
    printf("按任意键返回主菜单");  
    getch();  
    return;  
}  
void Back(SqStack *pkl)  
{  
    int n,i=0;  
    long int time_out;  
    double hours;  
    vehicle t_pkl[N];  
    printf("请输入您的车辆所在的车位(目前还有个小问题,前面的车走了之后当前车位会-1):");  
    n=MakeChoice(0,pkl->top);  
    printf("%2d上的车辆车牌号为%s,您确定要取走该车辆吗?\n",n,pkl->veh[n].num);  
    printf("1.确定 2.取消\n");  
    if(MakeChoice(1,2)==1)  
    {  
        time(&time_out);  
        hours=(time_out-pkl->veh[n].time_in)/3600.0;  
        printf("本次停车共计%lf小时,收费%lf元,请按任意键确认支付\n",hours,hours*5);  
        getch();  
        for(i=0; pkl->top>=n; --pkl->top,++i) //把第n辆到第pkl->top辆车移到t_pkl  
            t_pkl[i]=pkl->veh[pkl->top];  
        //此时pkl->top指向第n-1辆车  
        for(i-=2; i>=0; --i) //把第n+1辆到第pkl->top辆车移回pkl  
            pkl->veh[++pkl->top]=t_pkl[i];  
        printf("支付成功!\n");  
        printf("取车成功,按任意键返回主菜单");  
        getch();  
        return;  
    }  
    else  
    {  
        printf("按任意键返回主菜单");  
        getch();  
        return;  
    }  
}  
void EnterPkl(SqStack *pkl,LinkList *path)  
{  
    if(pkl->top==N-1)  
        printf("停车场已满!");  
    else  
    {  
        printf("您确定将便道中第一辆车(车牌号:%8s)停入停车场吗?\n",path->next->veh.num);  
        printf("1.确定 2.取消\n");  
        if(MakeChoice(1,2)==1)  
        {  
            pkl->veh[++pkl->top]=path->next->veh;  
            time(&pkl->veh[pkl->top].time_in);  
            path->next=path->next->next;  
            printf("已停入停车场\n");  
        }  
    }  
    printf("按任意键返回主菜单");  
    getch();  
    return;  
}  
void LeavePath(LinkList *path)  
{  
    int i=0,n;  
    LinkList *q;  
    printf("请输入要离开便道的车辆的位序:");  
    scanf("%d",&n);  
    while(i<n&&path!=NULL)  
    {  
        ++i;  
        q=path;//保存当前节点的前一个节点,如果找到的位置在链表最后,需要将前一个节点的指针域置为NULL  
        path=path->next;  
    }  
    if(path!=NULL)  
    {  
        printf("您确定便道中第%03d辆车(车牌号:%8s)离开便道吗?\n",n,path->veh.num);  
        printf("1.确定 2.取消\n");  
        if(MakeChoice(1,2)==1)  
        {  
            if(path->next!=NULL)//确定离开并且不是便道中最后一辆车  
            {  
                q=path->next;  
                path->next=q->next;  
                free(q);  
                printf("第%03d辆车已离开便道\n",n);  
            }  
            else//确定离开并且是便道中最后一辆车  
            {  
                printf("第%03d辆车已离开便道\n",n);  
                q->next=NULL;  
                free(path);  
            }  
        }  
    }  
    else  
        printf("没有找到第%03d辆车\n",n);  
    printf("按任意键返回主菜单");  
    getch();  
    return;  
}  
void View(SqStack *pkl,LinkList *path)  
{  
    int i;  
    long int time_out;  
    double hours;  
    time(&time_out);  
    printf("停车场共有%03d辆车:\n",pkl->top+1);  
    for(i=0; i<=pkl->top; ++i)  
    {  
        hours=(time_out-pkl->veh[i].time_in)/3600.0;  
        printf("车位:%2d 车牌号:%8s 停车时长:%lf 应缴费用:%lf\n",i,pkl->veh[i].num,hours,hours*5);  
    }  
    printf("便道车辆:\n");  
    if(path->next==NULL)  
        printf("无\n");  
    while(path->next!=NULL)  
    {  
        path=path->next;  
        printf("车牌号:%s\n",path->veh.num);  
    }  
    printf("按任意键返回主菜单");  
    getch();  
    return;  
}  
void Write_and_Quit(FILE *fp,SqStack *pkl,LinkList *path)  
{  
    rewind(fp);  
    LinkList *pre=path,*p=path->next;  
    for(; pkl->top>-1; --pkl->top)  
        fprintf(fp,"%s %ld %d\n",pkl->veh[pkl->top].num,pkl->veh[pkl->top].time_in,pkl->veh[pkl->top].pos);  
    while(p!=NULL)  
    {  
        free(pre);  
        fprintf(fp,"%s %ld %d\n",p->veh.num,p->veh.time_in,p->veh.pos);  
        pre=p;  
        p=pre->next;  
    }  
    free(pre);  
    free(pkl);  
    fclose(fp);  
}  


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值