// 磁盘调度算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
#include<cmath>
const int MaxNumber=100;
int TrackOrder[MaxNumber];//磁道访问序列
int MoveDistance[MaxNumber];//移动的磁道数
double AverageDistance;//平均寻道长度
bool direction;//移动方向;若为1时是想磁道号增加的方向访问,否者,反方向访问。
int visit[MaxNumber];
int n;//磁道个数
int m;//开始磁道号
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 初始化 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void initial(){
//cout<<"输入磁道个数"<<endl;
cin>>n;
//cout<<"输入开始磁道序号"<<endl;
cin>>m;
//cout<<"初始化磁道访问序列"<<endl;
for(int i=0;i<n;cin>>TrackOrder[i++]);
for(int i=0;i<n;cout<<TrackOrder[i++]<<" ");
cout<<endl;
}
void display(){
int i=0;
for(int i=0;i<n;cout<<"被访问的磁道号: "<<TrackOrder[i]<<" "<<"移动距离(磁道数): "<<MoveDistance[i]<<endl,i++);
cout<<"平均寻道长度: "<<AverageDistance<<endl;
}
void average_dis(){
int sum=0;
for(int i=0;i<n;i++)sum+=MoveDistance[i];
AverageDistance=(sum*1.0)/n;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ FCFS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void FCFS(){
int i=0;
int now=m;
for(i=0;i<n;i++)
{MoveDistance[i]=(int)fabs(double(now-TrackOrder[i]));now=TrackOrder[i];}
average_dis();
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SSTF @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void SSTF(){
int now=m;//当前磁道序号
memset(visit,0,MaxNumber*sizeof(int));
int loop_time=n;
int index=0;
int distance=now-TrackOrder[index];
int i=0;
while(loop_time--)
{
for(i=0;i<n;i++)
if(!visit[i])
{index=i;distance=(int)fabs(double(now-TrackOrder[i]));break;}
for(i=0;i<n;i++)
if(!visit[i])
if((int)fabs(double(now-TrackOrder[i]))<distance)
{index=i;distance=(int)fabs(double(now-TrackOrder[i]));}
MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
now=TrackOrder[index];
visit[index]=true;
}
average_dis();
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SCAN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void SCAN(){
int now=m;//当前磁道序号
memset(visit,0,MaxNumber*sizeof(int));
int index=0;int distance=0;
int i=0,j=0;
bool jmp=false;
//先由里向外;
while(1)
{
jmp=true;
for(j=0;j<n;j++)
{
if(!visit[j] && TrackOrder[j]>m )
{
jmp=false;
index=j;
distance=TrackOrder[index];
for(i=0;i<n;i++)
if(!visit[i] && TrackOrder[i]>m)
if(TrackOrder[i]<distance)
{index=i;distance=TrackOrder[i];}
MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
now=TrackOrder[index];
visit[index]=true;
}
}
if(jmp)break;
}
//再由外到里;
while(1)
{
jmp=true;
for(j=0;j<n;j++)
{
if(!visit[j] && TrackOrder[j]<m )
{
jmp=false;
index=j;
distance=TrackOrder[index];
for(i=0;i<n;i++)
if(!visit[i] && TrackOrder[i]<m)
if(TrackOrder[i]>distance)
{index=i;distance=TrackOrder[i];}
MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
now=TrackOrder[index];
visit[index]=true;
}
}
if(jmp)break;
}
average_dis();
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 循环SCAN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void loop_SCAN(){
fclose(stdin);
freopen("CON","r",stdin);
cout<<"请手动输入磁道访问方向(1表示增加方向;否者为减少方向)"<<endl;
direction=1;
cin>>direction;
int now=m;//当前磁道序号
memset(visit,0,MaxNumber*sizeof(int));
int index=0;int distance=0;
int i=0,j=0;
bool jmp=false;
if(direction==1){
//始终想增加方向
while(1)
{
jmp=true;
for(j=0;j<n;j++)
{
if(!visit[j] && TrackOrder[j]>m )
{
jmp=false;
index=j;
distance=TrackOrder[index];
for(i=0;i<n;i++)
if(!visit[i] && TrackOrder[i]>m)
if(TrackOrder[i]<distance)
{index=i;distance=TrackOrder[i];}
MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
now=TrackOrder[index];
visit[index]=true;
}
}
if(jmp)break;
}
//再由外到里;
while(1)
{
jmp=true;
for(j=0;j<n;j++)
{
if(!visit[j] && TrackOrder[j]<m )
{
jmp=false;
index=j;
distance=TrackOrder[index];
for(i=0;i<n;i++)
if(!visit[i] && TrackOrder[i]<m)
if(TrackOrder[i]<distance)
{index=i;distance=TrackOrder[i];}
MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
now=TrackOrder[index];
visit[index]=true;
}
}
if(jmp)break;
}
}
else
{
while(1)
{
jmp=true;
for(j=0;j<n;j++)
{
if(!visit[j] && TrackOrder[j]>m )
{
jmp=false;
index=j;
distance=TrackOrder[index];
for(i=0;i<n;i++)
if(!visit[i] && TrackOrder[i]>m)
if(TrackOrder[i]>distance)
{index=i;distance=TrackOrder[i];}
MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
now=TrackOrder[index];
visit[index]=true;
}
}
if(jmp)break;
}
//再由外到里;
while(1)
{
jmp=true;
for(j=0;j<n;j++)
{
if(!visit[j] && TrackOrder[j]<m )
{
jmp=false;
index=j;
distance=TrackOrder[index];
for(i=0;i<n;i++)
if(!visit[i] && TrackOrder[i]<m)
if( TrackOrder[i]>distance)
{index=i;distance=TrackOrder[i];}
MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
now=TrackOrder[index];
visit[index]=true;
}
}
if(jmp)break;
}
}
average_dis();
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 主函数 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
int _tmain(int argc, _TCHAR* argv[])
{
freopen("text.txt","rt",stdin);
int choice=0;
initial();
display();
cout<<"******"<<endl;
while(cin>>choice)
{
if(choice==1){cout<<"FCFS算法"<<endl;FCFS();display();}
else if(choice==2){cout<<"SSTF算法"<<endl;SSTF();display();}
else if(choice==3){cout<<"SCAN算法"<<endl;SCAN();display();}
else if(choice==4){cout<<"循环SCAN算法"<<endl; loop_SCAN();display();}
else cout<<"输入的选择算法的序列出错"<<endl;
}
return 0;
}