磁道调度算法实现(C++)

来源:互联网 发布:qq音乐三巨头知乎 编辑:程序博客网 时间:2024/06/06 01:00
#include<stdio.h> #include<time.h>#include<stdlib.h>#define N  100   //设置需要扫描轨道个数的最大值 /*变量说明currentTrack    当前轨道scanTrackNum    一次扫描的轨道scanTrackAll    总共扫描的轨道averageTracks   平均每次扫描的轨道 */ //冒泡排序算法,从小到大排序 SCAN和CSCAN方法有用 void Sort(int *Array,int n)    {int i,j,scanTrackNum;for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(Array[j]>Array[j+1]){scanTrackNum=Array[j];Array[j]=Array[j+1];Array[j+1]=scanTrackNum;}}//输出函数 void Output(int *Track,int currentTrack,int n){int i;printf("请求的磁道序列为:");for(i=0;i<n;i++){printf(" %d ",Track[i]);}printf("\n");printf("当前所在磁道号是:%d\n",currentTrack);}/*********************先来先服务调度算法**************************/void  FCFS(int *Track,int currentTrack,int n){int i,scanTrackNum;int scanTrackAll=0;float averageTracks=0.0;printf("*********************先来先服务调度算法**************************\n\n");Output(Track,currentTrack,n);for(i=0;i<n;i++){if(currentTrack<Track[i])scanTrackNum=Track[i]-currentTrack;else  scanTrackNum=currentTrack-Track[i];currentTrack=Track[i];scanTrackAll+=scanTrackNum;}averageTracks=(float)scanTrackAll/n;printf("磁道访问的序列为:");for(i=0;i<n;i++)printf(" %d ",Track[i]);printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}/**********************最短寻道时间优先调度算法********************/void SSTF(int *Track,int currentTrack,int n){int i,j,Ttrack[N],Disk[N];int min,minj,Dcount=0;int scanTrackAll=0;float averageTracks=0.0;printf("**********************最短寻道时间优先调度算法********************\n\n");Output(Track,currentTrack,n);for(i=0;i<n;i++){Ttrack[i]=0;}for(j=0;j<n;j++){for(i=0;i<n;i++){if(Ttrack[i]==-1)continue;else{if(currentTrack<Track[i]) Ttrack[i]=Track[i]-currentTrack;else Ttrack[i]=currentTrack-Track[i];}}min=200;minj=0;for(i=0;i<n;i++){if(Ttrack[i]==-1) continue;else{if(Ttrack[i]<min){min=Ttrack[i];minj=i;}}}currentTrack=Track[minj];Disk[Dcount++]=currentTrack;    scanTrackAll=scanTrackAll+Ttrack[minj];Ttrack[minj]=-1;}averageTracks=(float)scanTrackAll/n;printf("磁道访问的序列为:");for(i=0;i<n;i++)printf(" %d ",Disk[i]); printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}/*****************************扫描调度算法*******************************/void SCAN(int *Track,int currentTrack,int n){int i,j,k=0,r=0,l=0,choose;int scanTrackNum[N];int scanTrackAll=0;float averageTracks=0.0;printf("*****************************扫描调度算法*******************************\n\n");Output(Track,currentTrack,n);for(i=0;i<N;i++)    scanTrackNum[i]=Track[i];    Sort(scanTrackNum,n);  //将访问序列从小到大排序    while(scanTrackNum[k]<currentTrack)    //找到currentTrack在访问序列所在的位置{         k++;}    l=k-1;     r=k;    printf("请输入移动臂移动方向 (1 表示比当前磁道号大的方向 ,0表示比当前磁道小的方向) : ");scanf("%d",&choose);    if(choose==0){printf("磁道访问的序列为:");        for(j=l;j>=0;j--){            printf(" %d ",scanTrackNum[j]);   }        for(j=r;j<n;j++){           printf(" %d ",scanTrackNum[j]);    }         scanTrackAll=currentTrack-2*scanTrackNum[0]+scanTrackNum[n-1]; }     else{   printf("磁道访问的序列为:");           for(j=r;j<n;j++)   {              printf(" %d ",scanTrackNum[j]);    }           for(j=l;j>=0;j--)      {              printf(" %d ",scanTrackNum[j]);   }           scanTrackAll=currentTrack-scanTrackNum[0]+2*scanTrackNum[n-1];   }    averageTracks=(float)scanTrackAll/n;printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}/************************循环扫描调度算法*****************************/void C_SCAN(int *Track,int currentTrack,int n){  int i,j,k=0,r=0,l=0;int scanTrackNum[N];int scanTrackAll=0;float averageTracks=0.0;printf("************************循环扫描调度算法*****************************\n\n");Output(Track,currentTrack,n);for(i=0;i<N;i++)    scanTrackNum[i]=Track[i];    Sort(scanTrackNum,n);       printf("磁道访问的序列为:");    while(scanTrackNum[k]<currentTrack){  k++;  }      l=k-1;    r=k;                                 for(j=r;j<n;j++){ printf(" %d ",scanTrackNum[j]);    }    for(j=0;j<r;j++){printf(" %d ",scanTrackNum[j]);}      scanTrackAll=2*scanTrackNum[n-1]+scanTrackNum[l]-currentTrack-2*scanTrackNum[0];   averageTracks=(float)(scanTrackAll)/(float)(n);printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}int main(){    int Input,i,currentTrack;int Track[1000];int n;printf("*************                磁盘调度算法               ***********\n");printf("*******************************************************************\n");printf("请输入需要扫描轨道个数(1-99):"); scanf("%d",&n);printf("\n"); srand((int)time(0)); for(i=0;i<n;i++) { Track[i]=1+(int)(200.0*rand()/(RAND_MAX+1.0));  }printf("\n");currentTrack=1+(int)(200.0*rand()/(RAND_MAX+1.0));    while(1){printf("*************             请选择要使用的算法            ***********\n");printf("**********                                                 ********\n");printf("*****                  1、先来先服务调度算法(FCFS)            *****\n");printf("*****                  2、最短寻道时间优先调度算法(SSTF)      *****\n");printf("*****                  3、扫描调度算法(SCAN)                  *****\n");printf("*****                  4、循环扫描调度算法(CSCAN)             *****\n");printf("*****                  5、调用五种算法,进行比较              *****\n");printf("*****                  6、退出                                *****\n");printf("**********                                                 ********\n");printf("*************                                           ***********\n");printf("*******************************************************************\n\n");printf("请选择算法:");scanf("%d",&Input);printf("\n");        switch(Input)  {         case 1:    //使用FCFS算法         FCFS(Track,currentTrack,n);         break;         case 2:    //使用SSTF算法 SSTF(Track,currentTrack,n);           break;         case 3:    //使用SCAN算法         SCAN(Track,currentTrack,n);         break;         case 4:    //使用CSCAN算法         C_SCAN(Track,currentTrack,n);         break; case 5: FCFS(Track,currentTrack,n); SSTF(Track,currentTrack,n); SCAN(Track,currentTrack,n); C_SCAN(Track,currentTrack,n); break; case 6: exit(0); break;  }   }   return 0;}

原创粉丝点击