资讯详情

写写电梯运行系统的模拟实现

#include <stdio.h>  const int mn = 100;  int now = 1,flag = 0,high = 10,to = -1;//now表示现在的楼层 high最高楼层,to移动目标楼层  //flag 表示当前的运行方向,1 向上,-1向下,0闲着   bool up[mn],down[mn],toward[mn];///外部诉求要上下几层,内部诉求要下几层    //void check(){ // if(nowweight > maxweight) printf("overweight\n"); //} 借助传感器实现,超重给警报   void outread(){//电梯外按电梯   printf("out:\n");  int num,order;///地板,你想去的方向   scanf("%d%d",&num,&order);  if(num != -1&& flag == 0){//电梯闲置,先按电梯,那我先向谁移动    to = num;   if(now == num) flag = order;   else if(now >= num) flag = -1;   else flag = 1;  }    while(num != -1){//-1作为输入结束标志    //相应楼层有诉求,order 1向上,-1向下    if(order == 1) up[num] = true;   if(order == -1) down[num] = true;    scanf("%d%d",&num,&order);  }   }  void inread(){//电梯内部按电梯只选择往几楼去,并没办法选择方向        printf("in:\n");   int num;    while(scanf("%d",&num)&&num != -1){   toward[num] = true;  }   }  int find(int nowto){///沿着当前方向找到最远的楼层     if(nowto == 1){   for(int i = high;i > now&&i > 0;i --){    if(toward[i] || up[i] ||down[i]){     return i;    }   }  }  else if(nowto == -1){   for(int i = 1;i < now && i <= high;i   ){    if(toward[i] || down[i]||up[i]){     return i;    }   }  }    return -1.//未找到返回-1,便于以后的判断  }  void move(int nowto,int cur){///本次移动的方向,起始楼层    if(flag == 1){///向上移动        for(int i = cur   1;i <= to;i   ){//从下一层开始,到目标楼层     if(find(1)== -1 &&find(-1) == -1) return ;     now = i;     printf("now will arrive  %d,moving up\n",i);///每层输出方向      if(up[i]){      printf("open the door at %d\n",i);///当前楼层有诉求,就开门       up[i] = false;      toward[i] = false;      inread(); ///每次去有诉求的楼层,都会有人上来在里面按电梯      }     else{      if(toward[i]){ //如果只有人想去这个电梯,那就下去,没人按电梯,不用inread        printf("open the door at %d\n",i);///如果当前楼层较低,也应开门        toward[i] = false;      }     }     to = find(flag);//因为过程中会有人去,可能要到达目前更远的楼层,所以to不断更新      if(to == -1){//例如,目前在一楼,8楼有人下来     //我必须先到到八楼,一定要上去,但是到了八楼,结果不再上去了,此时,我将及时改变方向       if(down[now]){       down[now] = false;       flag = -1;       printf("open the door at %d\n",now);       inread();       to = find(flag);       if(to == -1){//避免有人按错明明要下九楼,结果,门后,他按了10楼的电梯         flag = 1;        to = find(flag);       }      }     }    }      }      if(flag == -1){///对称,同上     for(int i = cur - 1;i >= to;i --){     if(find(1)== -1 &&find(-1) == -1) return ;      now = i;      printf("now will arrive %d,moving down\n",i);      if(down[i]){       printf("open the door at %d\n",i);       down[i] = false;       toward[i] = false;       inread();       }      else{       if(toward[i]){        printf("open the door at %d\n",i);        toward[i] = false;       }      }      to = find(flag);      if(to == -1){       if(up[now]){        up[now] = false;        flag = 1;        printf("open the door at %d\n",now);        inread();        to = find(flag);        if(to == -1){         flag = -1;         to = find(flag);        }       }      }     }    }   }  void solve(){//从电梯运行开始,到目前批次运行结束   to = -1;  if(flag == 0){   printf("now is unoccupied at %d\n",now);   outread();   if(to == now){//如果电梯当前楼层首先有诉求,直接开门     printf("open the door at %d\n",now);    inread();   }   while(flag)直到现在的批次结束     move(flag,now);        if(find(1) == -1 && find(-1) == -1){     flag = 0;//两个方向都找不到任务,这一轮直接结束      return;    }    //否则,必须有方向和任务         to = find(flag);     if(to == -1){      flag *= -1;      to = find(flag);      move(flag,now);     }     else{      move(flag,now);     }   }   }     }  int main(){  while(1){   solve();    }  return 0; } 

使用说明:

屏幕中出现 now is unoccupied at num 说明电梯现在在num层停着没人用

出现 out 根据电梯的指令,每个指令分为两个数字,num和order num表示几楼在按电梯,order 为1表示它要上去,order为-1表示它要下去 最后以 -1 -1 作为读入结束的标志

出现in说电梯开门后,有人在里面按电梯,读里面按电梯的指令,每个指令都有一个数字,说想去几楼 以-1 作为读入的标志

通过传感器读取指令,我们默认所有指令都是合法的 同时,通过传感器实现了检测质量,判断目前是否有屏障,是否可以关闭。我们同意不超重,可以正常关闭。我们只是模拟电梯的运行选择

标签: 电梯多传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台