⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tingchechang.rar.txt

📁 这是本人做客城设计用的
💻 TXT
📖 第 1 页 / 共 2 页
字号:
//停车场管理
/*实现功能:由用户输入车站的车位数,价钱,车牌号,进入离开车站的时间,车牌号不能重复,若重复,会要求重新输入。
进入车站的时间应该比离开车站的时间早,否则,会要求重新输入。*/

#include<stdio.h>
#include<malloc.h>
#include<process.h>
#include<conio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define ok 1
#define stack_size 100
//数据结构体的定义
//时间的结构体,分为小时和分钟。
typedef struct time
{
 int hour;
 int min;
}time;
//定义汽车的信息,分别是车牌,汽车进站出站的时间,还有进入离开走道的时间
typedef struct carnode
{
 char carnumber[17];//车牌号
 time carreach;//进入车库的时间
 time carleave;//离开车库的时间
 time reach;//进入走道的时间
 time leave;//离开走道的时间
}carnode;
//定义栈
typedef struct
{
 carnode *base;//栈顶指针
 carnode *top;//栈底指针
 int stacksize;//存储空间
}carsqstack;
//定义队列
typedef struct Qnode
{
 carnode data;//汽车数据
 struct Qnode *next;
}Qnode,*Queuecar;
typedef struct 
{
 Queuecar front;//队头指针
 Queuecar rear;//队尾指针
}linkqueuecar;
//栈的初始化
int Initstack(carsqstack &s)
{
s.base=(carnode*)malloc(stack_size*sizeof(carnode));
s.top=s.base;//初始栈为空
s.stacksize=stack_size;
return ok;
}
//队列的初始化
int Initqueue(linkqueuecar &q)
{
q.front=q.rear=(Queuecar)malloc(sizeof(Qnode));
q.front->next=NULL;//初始队列为空
return ok;
}
//入栈
int push(carnode &e,carsqstack &s)
{
 *s.top++=e;//把值给s.top,再执行s.top++
 return ok;
}
//出栈
int pop(carsqstack &s,carnode &e)
{
 e=*--s.top;//把值给e
 return ok;
}
//入队
int Enqueue(linkqueuecar &q,carnode &e)
{
    Queuecar p;
 p=(Queuecar)malloc(sizeof(Qnode));
 p->data=e;//p指向要插入的数据
 p->next=NULL;
 q.rear->next=p;//q的队尾指针指向p
 q.rear=p;//把q尾指针放在p
 return ok;
}
//出队
int Dequeue(linkqueuecar &q,carnode &e)
{
 Queuecar p;
 p=q.front->next;//把的p指针移到q的队头指针的后面
 e=p->data;//把队头的数据附值给e
 q.front->next=p->next;//把p删除
 if(q.rear==p)
  q.rear=q.front;
 free(p);//释放p
 return ok;
}

//判断输入的数据是否是整形变量
void pdok(int &w5,int &w1)
{
 int i,w,e,w3,w4,k;
 char x[50];
 while(1)
 {
      scanf("%s",&x);
   i=strlen(x);//求字符串长度
   if(i>10)
    printf("\n\t数据太长,请输入有效数字:");
   else
   {
    w1=0;
       w5=0;
    k=5;
       for(w=0,w4=i-1;w<i;w++)
    { 
     e=x[w]-48;//把字符的ASSII码减48
              if(e>=0&&e<=9)//判断是不是0到9之间的数字
     {
      w3=pow(10,w4);//执行10的W4次方
         w5+=e*w3;
     }
        else
              w1++;
        w4--;
    }
       if(k==5)break;//跳出循环

   }
 }
}

//判断输入的数据是否是有效
void money(float &zp)
{
 int xp1,xp2,xp3,xp4,xp5,w;
 char xp[50];
 while(1)
 {
   scanf("%s",&xp);
   xp1=strlen(xp);//求字符串长度
   if(xp1>4)//字符串太长,直接提示
   printf("\n\t数据太长,请输入有效数字:");
   else
   {
         for(xp2=0,xp4=0,xp5=0;xp2<xp1;xp2++)
   {
     xp3=xp[xp2]-48;
           if(xp3>=0&&xp3<=9)//判断是不是0到9之间
     xp4++;
     if(xp3==-2)//判断是不是.
           xp5++;//xp5代表.的个数
   }
   if(xp4+xp5==xp1&&(xp5==0||xp5==1))//如果字符串有数字和小数点组成的
         {
   zp=atof(xp);//把它转变为浮点型
   w=5;
   }
  if(w==5)break;
  else
   printf("\n\t请重新输入数据,数据必须要大于O的数字:");
   }
 }
}

//判断车牌号码有没有相同的
void pdcp(carsqstack &s,linkqueuecar &q,carsqstack &p,linkqueuecar &u,carnode &r,int &s0,int qq)
{
 int i;
 carnode w;
 s0=0;
  for(i=s.top-s.base;i>0;i--)
  {
  pop(s,w);//出栈
  if(!strcmp(r.carnumber,w.carnumber))//比较字符串是否相同
  s0++;//字符串相同就记数
  push(w,p);//再把它压到新栈
  }
  //把从新栈的元素压回原来的栈里面
 for(i=p.top-p.base;i>0;i--)
 { 
  pop(p,w);
  push(w,s);
 }
 for(i=0;i<qq;i++)
 {
    Dequeue(q,w);
          if(!strcmp(r.carnumber,w.carnumber))//比较字符串是否相同
    s0++;//字符串相同就记数
          Enqueue(u,w);
 }
 //把新队列的元素压回原来的队列里面
     for(i=0;i<qq;i++)
  {
  Dequeue(u,w);
        Enqueue(q,w);
  }
}
//输入营业时间
void sj0(time &m)
{
     int w5,w1;
        printf("\n\t\t小时:");
        while(1)//实现小时必须大于等于0小于24
  {
          pdok(w5,w1);
    m.hour=w5;
          if(w1==0&&m.hour>=0&&m.hour<24)
            break;
          else
         printf("\n\t小时在0到24之间,请输入1到23");
        }
  printf("\n\t\t分钟:");
        while(1)//实现分钟在0与60之间
  {
        pdok(w5,w1);
  m.min=w5;
        if(w1==0&&m.min>=0&&m.min<60)
            break;
        else
         printf("\n\t分钟是在0到60之间,请输入0到59");
        }

}

//下面四个sj都是输入时间的函数
void sj1(carnode &r)
{
     int w5,w1;
        printf("\n\t请输入进入车库的的小时:");
        while(1)//实现小时必须大于等于0小于24
  {
        pdok(w5,w1);
  r.carreach.hour=w5;
        if(w1==0&&r.carreach.hour>=0&&r.carreach.hour<24)
            break;
        else
         printf("\n\t小时在0到24之间,请输入1到23");
        }
  printf("\n请输入进入车库的分钟:");
        while(1)//实现分钟在0与60之间
  {
        pdok(w5,w1);
  r.carreach.min=w5;
        if(w1==0&&r.carreach.min>=0&&r.carreach.min<60)
            break;
        else
         printf("\n\t分钟是在0到60之间,请输入0到59");
        }

}


void sj2(carnode &r)
{
     int w5,w1;
        printf("\n\t请输入进入走道的小时:");
        while(1)//实现小时必须大于等于0小于24
  {
        pdok(w5,w1);
  r.reach.hour=w5;
        if(w1==0&&r.reach.hour>=0&&r.reach.hour<24)
            break;
        else
         printf("\n\t小时在0到24之间,请输入1到23");
        }
  printf("\n\t请输入进入走走道的分钟:");
        while(1)//实现分钟在0与60之间
  {
        pdok(w5,w1);
  r.reach.min=w5;
        if(w1==0&&r.reach.min>=0&&r.reach.min<60)
        break;
        else
         printf("\n\t分钟是在0到60之间,请输入0到59");
        }

}
void sj3(carnode &r)
{
     int w5,w1;
        printf("\n请输入离开车库的小时:");
        while(1)//实现小时必须大于等于0小于24
  {
        pdok(w5,w1);
  r.carleave.hour=w5;
        if(w1==0&&r.carleave.hour>=0&&r.carleave.hour<24)
            break;
        else
         printf("\n\t小时在0到24之间,请输入1到23");
        }
  printf("\n\t请输入离开车库的分钟:");
        while(1)//实现分钟在0与60之间
  {
        pdok(w5,w1);
  r.carleave.min=w5;
        if(w1==0&&r.carleave.min>=0&&r.carleave.min<60)
            break;
        else
         printf("\n\t分钟是在0到60之间,请输入0到59");
        }

}

void sj4(carnode &r)
{       
     int w5,w1;
        printf("\n请输入离开走道的小时:");
        while(1)//实现小时必须大于等于0小于24
  {
        pdok(w5,w1);
  r.leave.hour=w5;
        if(w1==0&&r.leave.hour>=0&&r.leave.hour<24)
            break;
        else
         printf("\n\t小时在0到24之间,请输入1到23");
        }
  printf("\n请输入离开走道的分钟:");
        while(1)//实现分钟在0与60之间
  {
        pdok(w5,w1);
  r.leave.min=w5;
        if(w1==0&&r.leave.min>=0&&r.leave.min<60)
            break;
        else
         printf("\n\t分钟是在0到60之间,请输入0到59");
        }

} 

//车库里面是否有车,如果有车辆的话,要比较前一辆车的时间
void zk(carsqstack &s,carnode &r,float &price,time &money1,time &money2,carnode &w)
{
 carnode x;
 if(s.top-s.base==0)//车库没有车辆
 {
  printf("车库停车每分钟%2.2f元钱,请在汽车出来后付钱\n",price);
        //没有进入停车场走道的车,把进入离开走道的时间付为0
  r.reach.hour=0;
  r.reach.min=0;
  r.leave.hour=0;
  r.leave.min=0;
          while(1)
    {
            sj1(r);
      if(r.carreach.hour<money2.hour||(r.carreach.hour==money2.hour&&r.carreach.min<=money2.min))
         if(r.carreach.hour>money1.hour||(r.carreach.hour==money1.hour&&r.carreach.min>=money1.min))
                    if(r.carreach.hour>w.carleave.hour||(r.carreach.hour==w.carleave.hour&&r.carreach.min>=w.carleave.min))
      {
        push(r,s);
        break;
      }
     else
      printf("进入车站的时间要比上一辆离开车库的时间要晚");
          else
                printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
       else
                printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
    }
 }
     else//车库有车辆
  {
    //没有进入停车场走道的车,把进入离开走道的时间付为0
    r.reach.hour=0;
    r.reach.min=0;
    r.leave.hour=0;
    r.leave.min=0;
    while(1)
    {
   sj1(r);
   pop(s,x);
   push(x,s);
   //判断后面进站的车辆比前面进入车站的要晚
    if(r.carreach.hour<money2.hour||(r.carreach.hour==money2.hour&&r.carreach.min<=money2.min))
       if(r.carreach.hour>x.carreach.hour||(r.carreach.hour==x.carreach.hour&&r.carreach.min>=x.carreach.min))
       if(r.carreach.hour>w.carleave.hour||(r.carreach.hour==w.carleave.hour&&r.carreach.min>=w.carleave.min))
       {
            push(r,s);
            break;
       }
     else
      printf("进入车站的时间要比上一辆离开车库的时间要晚");
        else
          printf("这辆车辆不能比上一辆车进入车站时间早,请重新输入\n");
              else
                printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
    }
  }
}

//进入走道的函数
void cjzd(linkqueuecar &q,carnode &r,float &price1,int &qq,carsqstack &s,linkqueuecar &u,time &money1,time &money2,carnode &h,carnode &w)
{
 carnode x,y;
 int sp;
 if(qq==0)//如果队列为空,进入走道的车辆,必须和车库最后一辆车进行比较
 {
     printf("车库已满,请在走道上等候\n");
        printf("走道上停车每分钟%2.2f元,请在汽车出来后付钱\n",price1);
  while(1)
  {
  sj2(r);
  pop(s,x);
        push(x,s); 
  if(r.reach.hour<money2.hour||(r.reach.hour==money2.hour&&r.reach.min<=money2.min))
      if(r.reach.hour>x.carreach.hour||(r.reach.hour==x.carreach.hour&&r.reach.min>=x.carreach.min))
      if(r.reach.hour>w.carleave.hour||(r.reach.hour==w.carleave.hour&&r.reach.min>=w.carleave.min))
                 if(r.reach.hour>h.leave.hour||(r.reach.hour==h.leave.hour&&r.reach.min>=h.leave.min))
   {
    Enqueue(q,r);
       break;
   }
                 else
                    printf("\n进走道的时间应该比上一辆离开车库时间要晚");
              else
     printf("\n进走道的时间比上一辆离开走道时间要晚");
   else
     printf("这辆车辆不能比上一辆车进入车站时间早,请重新输入\n");
           else
               printf("%d:%d将开始营业,%d:%d将停止营业",money1.hour,money1.min,money2.hour,money2.min);
  }
 }
  else//队列不为空的时候,和队列的最后的一辆车进行比较
  {
     printf("车库已满,请在走道上等候\n");
     printf("走道上停车每分钟%2.2f元,请在汽车出来后付钱\n请输入进入车库走道的时间(例如**:**):",price1);
     while(1)
  {
     sj2(r);
     for(sp=1;sp<qq;sp++)//把队列最后一个数据之前的数据全部出队,再入新队列
  {
     Dequeue(q,x);
           Enqueue(u,x);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -