停车场模拟管理系统

来源:互联网 发布:dwg文件编辑软件 编辑:程序博客网 时间:2024/04/29 09:24

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>

#define ERROR 0
#define OK 1
#define park_size 5
#define lan_size 2
#define size park_size+lan_size

typedef struct carlane        //停车场进出栈
{
    char carnum[6];
 int car_locat;
}clane;

typedef struct ca_in
{
 clane date;
 int sum;
 int top;
 int base;
}cinfo;//停车场的栈结构

cinfo c_pk[park_size+1];

typedef struct car_in
{
 clane date;
 int sum;
 int rear;
 int front;
}c_info;//便道的队列结构

c_info c_la[lan_size+1];

void choseing();                                                                               //主选择界面
int inseting(cinfo p0[park_size+1],c_info p1[lan_size+1]);                                     //初始化停车场和便道
void  inst();                                                                                  //打印前段说明
int  display(cinfo p3[park_size+1],c_info p4[lan_size+1]);                                     //打印车辆信息
int checking(cinfo p0[park_size+1]);                                                           //计算停车场中已用车位数
void addinfo(cinfo p0[park_size+1],c_info p1[lan_size+1]);                                     //添加车辆信息
void outparking(cinfo p0[park_size+1],c_info p1[lan_size+1],int site);                         //汽车出停车场
int sumzhan(c_info p1[lan_size+1]);                                                            //求便道队列的长度

/***************************************************************/

int checking(cinfo p0[park_size+1])    //检查停车场可用空间  m 为已用空间
{
 int m=0;
 if(p0[0].top==p0[0].base)//栈空停车场空
 {
  m=0;
  return m;
 }
 for(int i=1;i<=p0[0].top;i++)
 {
  if(p0[i].date.car_locat==0)
   continue;
  else
  {
   m++;
  }
 }
 return m;
}

void addinfo(cinfo p0[park_size+1],c_info p1[lan_size+1])       //汽车进站操作
{
    if(checking(p0)<park_size)
 {
  cinfo p2[park_size+1];
        p2[0].top=p2[0].base=0;
     cinfo p4;
     printf("请输入进站车的车牌号:/n");
     scanf("%s",p4.date.carnum);
     p0[0].top++;
        p0[p0[0].top].date.car_locat=p0[0].top;
  strcpy(p0[p0[0].top].date.carnum,p4.date.carnum);
  printf("车牌号为%s的车已进站。/n",p4.date.carnum);
  p0[0].sum++;
 }
 else
  if(sumzhan(p1)<lan_size)                       //便道上还有位置可用                                         
  {
   cinfo p4;
         printf("该停车场已满,请在便道等候。请输入车牌号:/n");
         scanf("%s",p4.date.carnum);
   strcpy(p1[p1[0].rear].date.carnum,p4.date.carnum);
   p1[0].rear++;
   p1[0].rear=p1[0].rear%(lan_size+1);
      printf("车牌号为%s的车已进入便道。/n",p4.date.carnum);
   p1[0].sum++;
  }
  else
  {
       printf("此停车场已无位置可用。/n");
      printf("请另寻其他停车场。再见!!!");
  }
}

void outparking(cinfo p0[park_size+1],c_info p1[lan_size+1],int site)
{
 cinfo p2[park_size+1];
 p2[0].base=p2[0].top=0;
 for(;p0[0].top>site;p0[0].top--)//从栈顶向下一次出栈到site位置并复制到p2中
 {
  if(p0[p0[0].top].date.car_locat!=0)//当车位不空是表现出让路将其移到p2中
  {
   ++p2[0].top;
   strcpy(p2[p2[0].top].date.carnum,p0[p0[0].top].date.carnum);
   printf("车牌号为%s的车出站让路。/n",p0[p0[0].top].date.carnum);
  }
 }
 printf("车牌号为%s的车出站。/n  其余车辆进站。/n",p0[site].date.carnum);
 for(;p2[0].top!=p2[0].base;p2[0].top--)
    {
  p0[p0[0].top].date.car_locat=p0[0].top;
  strcpy(p0[p0[0].top].date.carnum,p2[p2[0].top].date.carnum);
  printf("车牌号为%s的车进站。/n",p0[p0[0].top].date.carnum);
  p0[0].top++;
 }
 while(p0[0].top<=park_size&&(p1[0].rear!=p1[0].front))
 {
     p0[p0[0].top].date.car_locat=p0[0].top;
     strcpy(p0[p0[0].top].date.carnum,p1[p1[0].front].date.carnum);
     printf("车牌号为%s的车进站。/n",p1[p1[0].front].date.carnum);
        p1[0].front++;
     p1[0].front=p1[0].front%(lan_size+1);
  p0[0].top++;
  p1[0].sum--;
 }
 p0[0].top--;
}

void  inst()                              //打印前段说明
{
    printf("    This is system for searching and controlling a parkint lot./n");
    printf("    This parking lot has six place./n ");
    printf("    Every site has its car ./n");
    printf("    If the parking lot is full,others shuold be wait out of the parking lot/n");
    printf("    When a car in the parking lot want go out,the car on the lane shuold/n");
    printf("    give its place to the outing car./n");
 printf("    /n本停车场共有%d个可用车位,其中停车场内车位%d个 场外便道车位%d个。/n",size,park_size,lan_size);
 printf("/n");
}// inst

int inseting(cinfo p0[park_size+1],c_info p1[lan_size+1])
{
 printf("本停车场有%d个场内车位,%d个便道车位。/n如果选择自己初始化添加请输入 1 /t快速添加输入 2/n",park_size,lan_size);
    int choice1=0;
 scanf("%d",&choice1);
 switch(choice1)
 {
 case 1:
  {
     p0[0].base=0;
  p0[0].top=0;
     p1[0].front=p1[0].rear=0;
     p0[0].sum=0;
     p1[0].sum=0;
     printf("现在对停车场进行初始化。如果结束,输入: 0  /n");
  while(p0[0].top<park_size)
  {
   char num[6];
   printf("请输入停在停车场的车牌号码:/n");
   scanf("%s",num);
   if(!strcmp(num,"0"))
   {
    printf("已初始化完毕。/n");
    return OK;
   }
   p0[0].top++;
      p0[p0[0].top].date.car_locat=p0[0].top;
   strcpy(p0[p0[0].top].date.carnum,num);

  }
     printf("现在对便道进行初始化。如果结束,输入车牌号 0  /n");
  int n=0;
     while((p1[0].rear+1)%(lan_size+1)!=p1[0].front)
  {
      printf("请输入便道车牌号:/n");
   char num[6];
      scanf("%s",&num);
   if(!strcmp(num,"0"))
   {
    printf("已初始化完毕。/n");
    return OK;
   }
   strcpy(p1[p1[0].rear].date.carnum,num);
   p1[p1[0].rear].date.car_locat=++n;
   p1[0].rear=(++p1[0].rear)%(lan_size+1);
      p1[0].sum++;
  }
  printf("已初始化完毕。/n");
     return OK;
  }
 case 2:
  {
   strcpy(p0[1].date.carnum,"CF001");
   p0[1].date.car_locat=1;

   strcpy(p0[2].date.carnum,"CF002");
   p0[2].date.car_locat=2;

   strcpy(p0[3].date.carnum,"CF003");
   p0[3].date.car_locat=3;

   strcpy(p0[4].date.carnum,"CF004");
   p0[4].date.car_locat=4;

   strcpy(p0[5].date.carnum,"CF005");
   p0[5].date.car_locat=5;

   strcpy(p1[0].date.carnum,"CF006");
   p1[0].date.car_locat=1;

   strcpy(p1[1].date.carnum,"CF007");
   p1[1].date.car_locat=2;

      p0[0].top=park_size;
   p0[0].base=0;
   p1[0].rear=lan_size;
   p1[0].front=0;
   p0[0].sum=park_size;
   p1[0].sum=lan_size;
   printf("已初始化完毕。/n");
   return OK;
  }
 default:return ERROR;
 }
}


void choseing()                           // 打印主菜单
{
 printf("/n");
 printf("***********************************************/n");
 printf("*********         main menu             *******/n");
 printf("***********************************************/n");
 printf("*         1:   汽车进停车场                   */n");
 printf("*                                             */n");
 printf("*         2:   汽车出停车场                   */n");
 printf("*                                             */n");
 printf("*         3:    初始化栈                      */n");
 printf("*                                             */n");
 printf("*         4:   查询位置信息                   */n");
 printf("*                                             */n");
 printf("*         0:   退出系统                       */n");
 printf("***********************************************/n");
}//choseing

int sumzhan(c_info p1[lan_size+1])//求队列的长度
{
 int m=0;
 int i=p1[0].front;
 while(i!=p1[0].rear)
 {
  i++;
  i=i%(lan_size+1);
  m++;
 }
 return m;
}

int  display(cinfo p3[park_size+1],c_info p4[lan_size+1])                                     //打印车辆信息
{
 if(checking(p3)==0)
 {
  printf("该停车场处于空闲状态。/n");
 }
 else
 {
  printf("该停车场现有%d个可用车位。/n",park_size-checking(p3));
 }
 if((p4[0].rear+1)%(lan_size+1)==p4[0].front)
 {
  printf("便道处于已停满状态。/n");
 }
 else
 {
  printf("该便道现有%d个可用车位。/n",lan_size-sumzhan(p4));
 }
 if(p3[0].top!=p3[0].base)
 {
  printf("停车场内的车位信息为:/n");
  for(int i=1;i<=p3[0].top;i++)
  {
   printf("车牌号为 %s,车位号位 %d。/n",p3[i].date.carnum,p3[i].date.car_locat);
  }
 }
 else;
 int i=p4[0].front;
 if(i==p4[0].rear)
 {
  return OK;
 }
 int m=1;
 printf("便道处的车位信息为:/n");
 while(i!=p4[0].rear)
 //for(int i=p4[0].front;i<p4[0].rear;i++)
 {
  printf("车牌号为 %s,车位号位 %d。/n",p4[i].date.carnum,m);
  p4[i].date.car_locat=m;
  m++;
  i++;
  i=i%(lan_size+1);
 }

    return OK;
}//display


void main()
{
 inst();
 printf("/n首次操作请务必先初始化。/n");
 while(1)
 {
  choseing();
  int chosen=0;
  printf("请输入你选的功能项序号:/n");
  fflush(stdin);
  scanf("%d",&chosen);
  switch(chosen)
  {
  case 1:
   {
       addinfo(c_pk,c_la);
    break;
   }
  case 2:
   {
    printf("请输入要开走的车的车位号:/n");
    int num;
    scanf("%d",&num);
    if(checking(c_pk)<num)
    {
     printf("你输入的车位号没有车。");
     break;
    }
    outparking(c_pk,c_la,num);
    break;
   }
  case 3:
   {
    inseting(c_pk,c_la);
    break;
   }
  case 4:
   {
    display(c_pk,c_la);
    break;
   }
  case 0:
   {
    return ;
   }
  default:
   {
    printf("您输入错误,请重新输入。/n");
    break;
   }
  }
 }
}