当前位置 主页 > 网站技术 > 代码类 >

    C语言源码实现停车场管理系统

    栏目:代码类 时间:2019-12-27 21:09

    本文实例为大家分享了C语言停车场管理系统的具体代码,供大家参考,具体内容如下

    题目要求:

    刚开始在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);
    }