一、设计目的:
加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>vi;
int magneticHead=0,dis=0,N=0;
void input()
{
int position;
cout<<"Where's the magnetic head?"<<endl;
cin>>magneticHead;
cout<<"Now,input the sequence which will be read(Input \"-1\" to finish)"<<endl;
while(1)
{
cin>>position;
if(position==-1)
break;
vi.push_back(position);
}
N=vi.size();
sort(vi.begin(),vi.end());
}
void SSTF()//Shortest Seek Time First
{
int i,j;
if(magneticHead>=vi[vi.size()-1])
{
dis+=(magneticHead-vi[vi.size()-1]);
j=vi.size()-1;
}
else if(magneticHead<=vi[0])
{
dis+=(vi[0]-magneticHead);
j=0;
}
else
{
for(i=0;i<vi.size()-1;i++)
{
if(magneticHead>=vi[i]&&magneticHead<vi[i+1])
{
dis+=(magneticHead-vi[i]);
j=i;
break;
}
}
}
while(1)
{
if(j==vi.size()-1)
{
while(!j)
{
dis=dis+(vi[j]-vi[j-1]);
vi.erase(vi.begin()+j);
j--;
}
break;
}
else if(j==0)
{
while(vi.size()>1)
{
dis+=(vi[1]-vi[0]);
vi.erase(vi.begin());
}
break;
}
else
{
if(vi[j]-vi[j-1]<vi[j+1]-vi[j])
{
dis+=(vi[j]-vi[j-1]);
vi.erase(vi.begin()+j);
j--;
}
else
{
dis+=(vi[j+1]-vi[j]);
vi.erase(vi.begin()+j);
}
}
}
cout<<"Total Seek length:"<<dis<<endl;
cout<<"Average Seek length:"<<1.0*dis/N<<endl;
}
void SCAN()
{
int i,j;
for(i=0;i<vi.size();i++)
if(magneticHead<vi[i])
break;
dis+=(vi[i]-magneticHead);
for(j=i;j<vi.size()-1;j++)
dis+=(vi[j+1]-vi[j]);
dis+=(vi[vi.size()-1]-vi[i-1]);
for(j=i-1;j>0;j--)
dis+=vi[j]-vi[j-1];
cout<<"Total Seek length:"<<dis<<endl;
cout<<"Average Seek length:"<<1.0*dis/vi.size()<<endl;
}
int main()
{
int n;
input();
system("cls");
cout<<endl<<endl<<endl<<endl<<"\t\t*************************************************"<<endl;
cout<<"\t\t* There's two ways to be choice. *"<<endl;
cout<<"\t\t* 1.SSTF(Shortest Seek Time First) *"<<endl;
cout<<"\t\t* 2.SCAN *"<<endl;
cout<<"\t\t*************************************************"<<endl;
cout<<"Now,which algorithm you want to select?"<<endl;
cin>>n;
switch(n)
{
case 1:SSTF();break;
case 2:SCAN();break;
default:cout<<"Wrong input"<<endl;break;
}
return 0;
}