数据结构课程设计——一个简单的停车场管理系统

题目要求:

刚开始在Codeblocks下用C语言写的,但是用指针传递参数的时候总是出问题。后来就用C++,但是调用了C的输入输出和文件操作的头文件,所以代码都是C的

main.cpp

#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;
}

function.cpp

 

#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);
}

 

 

 

 

 

 

个人网站:https://jqh.zone

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值