}
i=0;//遍历完再从第一个元素开始遍历 while(i MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; ++i; ++k; } } else{//若向磁道号减小方向访问 for(i=0;i if(TrackOrder[i+1]>100){//找到最后一个小于磁道号的元素 temp=i; VisitOrder[0]=i; MoveDistance[0]=TrackOrder[i]-100; break; } } --i;//向前遍历 while(i>-1){ VisitOrder[k]=i; MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; --i; ++k; } i=n-1;//遍历完后从最后一个元素向前遍历 while(i>temp){ VisitOrder[k]=i; MoveDistance[k]=TrackOrder[VisitOrder[k-1]]-TrackOrder[i]; --i; ++k; } } } void output(){ int sum=0;//求磁道数总和 for(int i=0;i 被 访 问 的 下 一 个 磁 道 号 \移动距离(磁道数)\ sum=sum+abs(MoveDistance[i]); } cout<<\平均寻道长度:\输出平均寻道长度 } void main(){ init(); int a; cout<<\选择算法,1-FCFS,2-SSTF,3-SCAN,4-循环SCAN\ cin>>a; switch(a){ case(1): fcfs();break; case(2): sstf();break; case(3): scan();break; case(4): cscan();break; }//根据用户选择的算法进行磁盘调度算法 output(); } 调试分析 1、 执行算法前,要先申请变量。 2、 执行后面三种算法时,要注意先将磁道序列从小到大排序。 3、 执行SSTF算法时,先找到小于开始磁道号的最后一个元素, 以此元素为分割点,向前和向后遍历序列,每次移动一个,比较出离前一个访问的磁道号近的访问。 4、 执行SCAN和CSCAN算法时,要先判断用户输入的是向磁道 号增加的方向执行还是向磁道号减少的方向执行。 5、 时间的复杂度是O(n). 用户使用说明 按提示输入磁道个数,不得大于MaxNum;依次输入磁盘访问序列;按提示输入开始磁道号,磁头移动方向(1为磁道号增加方向,0为磁道号减少方向);根据提示输入要进行的算法类型,1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。 测试结果 输入数据分别为:9 55 58 39 18 90 160 150 38 184 100 1 输入:1 输出:被访问的下一个磁道号55 移动距离(磁道数)45 被访问的下一个磁道号58 移动距离(磁道数)3 被访问的下一个磁道号39 移动距离(磁道数)19 被访问的下一个磁道号18 移动距离(磁道数)21 被访问的下一个磁道号90 移动距离(磁道数)72 被访问的下一个磁道号160 移动距离(磁道数)70 被访问的下一个磁道号150 移动距离(磁道数)10 被访问的下一个磁道号38 移动距离(磁道数)112 被访问的下一个磁道号184 移动距离(磁道数)146 平均寻道长度:55.3333