电梯调度算法模拟

#include<iostream.h>
#define Max 10
//定义请求的磁盘位子
struct request
     {
 
     int ZM;
      int CD;
 
     int BID;
 
     int status;    //标识是否被访问
 
     int total;    //标识磁盘的相对位子大小
     };
void requestSort(struct request a[],struct request b[],struct request cur,int n,int flag);

void main(){
 struct request a[Max];
 struct request b[Max];
 struct request cur;
 int n,flag,i,totalmove;
 cout<<"input you request num(less 10):";
 cin>>n;
 cout<<"input you request direction(0->down,1->up):";
 cin>>flag;
 cout<<"input the current position,ZM:";
 cin>>cur.ZM;
 cout<<"input the current position,CD:";
 cin>>cur.CD;
 cout<<"input the current position,BID:";
 cin>>cur.BID;
 cur.total=cur.ZM*100+cur.CD*10+cur.BID;
 for(i=0;i<n;i++){
  cout<<"input a["<<i<<"]'s ZM(0~~9):";
  cin>>a[i].ZM;
  cout<<"input a["<<i<<"]'s CD(0~~9):";
  cin>>a[i].CD;
  cout<<"input a["<<i<<"]'s BID(0~~9):";
  cin>>a[i].BID;
  a[i].total=a[i].ZM*100+a[i].CD*10+a[i].BID;
  a[i].status=0;
 }
 requestSort(a,b,cur,n,flag);
 cout<<endl<<"执行顺序是: "<<endl;
 for(i=0;i<n;i++){
  cout<<"ZM:"<<b[i].ZM<<"->CD:"<<b[i].CD<<"->BID:"<<b[i].BID<<endl;  
  if(i==0){
   if(flag==1){
    totalmove=b[i].total-cur.total;
   }else{
    totalmove=cur.total-b[i].total;
   }
  }else{
   if(b[i].total<b[i-1].total){
    totalmove=totalmove+b[i-1].total-b[i].total;
   }else{
    totalmove=totalmove+b[i].total-b[i-1].total;
   }
  }
  
  
 }
 cout<<"总共移动了:"<<totalmove<<endl;
}
//将输入的请求按电梯的方式进行排序
void requestSort(struct request a[],struct request b[],struct request cur,int n,int flag){
 int i,j=0,k,flag1,min;
 while(j<n){
  //position is up
  min=6000;
  if(flag==1){
   flag1=0;
   for(i=0;i<n;i++){     //遍历数组,将与当前位子的距离最小的请求依次放入数组B中
    if(cur.total<=a[i].total && a[i].status==0){
     if(min>=(a[i].total-cur.total)){
      flag1=1;
      min=a[i].total-cur.total;
      k=i;
     }

    }
   }
   if(flag1==0){
    flag=0;
    j--;
   }else{
    a[k].status=1;
    b[j].ZM=a[k].ZM;
    b[j].CD=a[k].CD;
    b[j].BID=a[k].BID;
    b[j].total=b[j].ZM*100+b[j].CD*10+b[j].BID;
   }
  }else{     //position is down
   flag1=0;
   for(i=0;i<n;i++){     //遍历数组,将与当前位子的距离最小的请求依次放入数组B中
    if(cur.total>a[i].total && a[i].status==0){
     if(min>=(cur.total-a[i].total)){
      flag1=1;
      min=cur.total-a[i].total;      
      k=i;
      
     }
    }
   }
   if(flag1==0){
    flag=1;
    j--;
   }else{
    a[k].status=1;
    b[j].ZM=a[k].ZM;
    b[j].CD=a[k].CD;
    b[j].BID=a[k].BID;
    b[j].total=b[j].ZM*100+b[j].CD*10+b[j].BID;
   }
  }
  j++;
 }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值