#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
void FCFS(int array[],int m)// 先来先服务算法
{ int j,i,now;
float sum = 0,avg;
cout<<"输入当前的磁道号:";//输入当前磁道号
cin>>now;
sum=abs(now-array[0]);
cout<<"先来先服务算法(FCFS)调度后的序列为"<<array[0]<<" ";//输出磁盘调度序列
for(i=0,j=1;j<m;i++,j++)
{
sum=sum+abs(array[j]-array[i]);
cout<<array[j]<<" "; //输出磁盘调度序列
}
avg=sum/(m);
cout<<endl<<"平均寻道长度:"<<avg<<endl;//输出平均寻道长度
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SSTF(int array[],int m)// 最短寻道时间优先算法
{ int temp;
int k=1;
int now,l,r;
int i,j;
float sum=0,avg=0;
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
{
if(array[i]>array[j]) //将磁道号从小到大排序
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
cout<<"请输入当前的磁道号:"; //输入当前磁道号
cin>>now;
cout<<"最短寻道时间优先算法(SSTF)调度后的序列为";//输出磁盘调度序列
if(array[m-1]<=now) //若被访问的下一最大的磁道号不大于当前的磁道号
{
for(i=m-1;i>=0;i--)
{ cout<<array[i]<<" ";//输出磁盘调度序列
sum=now-array[i];
now=array[i];
}
}
else
{
if(array[0]>=now) //若被访问的下一最小的磁道号不小于当前的磁道号
{
for(i=0;i<m;i++)
{ cout<<array[i]<<" ";//输出磁盘调度序列
sum=array[i]-now;
now=array[i];
}
}
else //当前的磁道号的值在若所有被访问的下的磁道号之间
{
while(array[k]<now) //确定当前磁道在已排的序列中的位置
{ k++; }
l=k-1;
r=k;
if((now-array[l])<=(array[r]-now))
{
while(l>=0) //先向磁道号减小方向访问
{
cout<<array[l]<<" "; //输出磁盘调度序列
sum=sum+now-array[l];
now=array[l];
l=l-1;
}
now=array[0];
for(j=r;j<m;j++) //再向磁道号增加方向访问
{ cout<<array[j]<<" "; //输出磁盘调度序列
sum+=array[j]-now;
now=array[j];
}
}
else //先向磁道号增加方向访问
{
while(r<m)
{
cout<<array[r]<<" ";//输出磁盘调度序列
sum+=array[r]-now;
now=array[r];
r=r+1;
}
now=array[m-1];
for(j=l;j>=0;j--) //再向磁道号减小方向访问
{ cout<<array[j]<<" "; //输出磁盘调度序列
sum+=now-array[j];
now=array[j];
}
}
}
}
avg=sum/(m);
cout<<endl<<"平均寻道长度:"<<avg<<endl;//输出平均寻道长度
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SCAN(int array[],int m) //扫描算法
{ int temp;
int k=1;
int now,d,l,r;
int i,j;
float sum=0,avg=0;
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
{
if(array[i]>array[j]) //将磁道号从小到大排序
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
cout<<"请输入当前的磁道号:";//输入当前磁道号
cin>>now;
cout<<"请输入当前移动臂的移动的方向(1 表示向磁道号增加方向,0 表示向磁道号减小方向): ";
cin>>d; //先要给出当前磁道号和移动臂的移动方向
cout<<"扫描算法(SCAN)调度后的序列为";
if(array[m-1]<=now) //若被访问的下一最大的磁道号不大于当前的磁道号
{
for(i=m-1;i>=0;i--)
{ cout<<array[i]<<" "; //输出磁盘调度序列
sum=now-array[i];
now=array[i];
}
}
else
{
if(array[0]>=now) //若被访问的下一最小的磁道号不小于当前的磁道号
{
for(i=0;i<m;i++)
{ cout<<array[i]<<" "; //输出磁盘调度序列
sum=array[i]-now;
now=array[i];
}
}
else //当前的磁道号的值在若所有被访问的下的磁道号之间
{
while(array[k]<now) //确定当前磁道在已排的序列中的位置
{ k++; }
l=k-1;
r=k;
switch(d)
{
case 0: //先向磁道号减小方向访问
{
while(l>=0)
{
cout<<array[l]<<" "; //输出磁盘调度序列
sum=sum+now-array[l];
now=array[l];
l=l-1;
}
now=array[0];
for(j=r;j<m;j++)
{ cout<<array[j]<<" "; //输出磁盘调度序列
sum+=array[j]-now;
now=array[j];
} break;
}
case 1: //先向磁道号增加方向访问
{
while(r<m)
{
cout<<array[r]<<" ";//输出磁盘调度序列
sum+=array[r]-now;
now=array[r];
r=r+1;
}
now=array[m-1];
for(j=l;j>=0;j--)
{ cout<<array[j]<<" "; //输出磁盘调度序列
sum+=now-array[j];
now=array[j];
}break;
}
default: cout<<"输入有误"<<endl;
}
}
}
avg=sum/(m);
cout<<endl<<"平均寻道长度:"<<avg<<endl;//输出平均寻道长度
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
int i,m,n,flag=1,array[100];
cout<<"输入磁盘调度序列的个数:";
cin>>m;
cout<<"分别输入磁盘调度序列:";
for(i=0;i<m;i++)
{ cin>>array[i]; }
do
{
cout<<"0 终止"<<endl;
cout<<"1 先来先服务算法(FCFS)"<<endl;
cout<<"2 最短寻道时间优先算法(SSTF)"<<endl;
cout<<"3 最短寻道时间优先算法(SCAN)"<<endl;
cout<<"选择以上的算法:";
cin>>n;
switch(n)
{
case 0: { flag=0; break; } //终止程序
case 1:
{ FCFS(array,m); break; } //先来先服务算法(FCFS)
case 2:
{ SSTF(array,m); break; }//最短寻道时间优先算法(SSTF)
case 3:
{ SCAN(array,m); break; }//最短寻道时间优先算法(SCAN)
default: cout<<"输入有误,请重新输入:"<<endl;
}
}while(flag!=0);
}