#include <iostream>
#include<iomanip>
using namespace std;
const int MaxNumber=100;
int TrackOrder[MaxNumber];
int MoveDistance[MaxNumber];
int FCF[MaxNumber];
int SST[MaxNumber];
int a[MaxNumber];
int b[MaxNumber];
int pass[MaxNumber];
double AverageDistance;
bool direction;
int n,m,i,j,k,x,y,z,key;
void input(){
cout<<"========================"<<endl;
cout<<"======磁盘调度算法======"<<endl;
cout<<"========================"<<endl;
cout<<"输入开始磁盘号:";
cin>>m;
cout<<"输入磁道个数:";
cin>>n;
cout<<"输入磁道访问序列"<<endl;
for(i=0;i<n;i++){
cin>>TrackOrder[i];
}
}
void FCFS(){
cout<<"========================="<<endl;
cout<<"=========1-FCFS=========="<<endl;
for(i=0;i<n;i++){
FCF[i]=TrackOrder[i];
MoveDistance[i]=0;
}
y=m;
for(i=0;i<n;i++){
if(y>=FCF[i])
MoveDistance[i]=y-FCF[i];
else if(y<FCF[i])
MoveDistance[i]=FCF[i]-y;
y=FCF[i];
}
cout<<"从 "<<m<<" 号磁道开始;"<<endl;
cout<<"被访问的下一个磁道号(->)"<<endl;
for(i=0;i<n;i++){
cout<<setw(5)<<FCF[i]<<" ";
}
x=0;
cout<<"移动距离(磁道数->)"<<endl;
for(i=0;i<n;i++){
x+=MoveDistance[i];
cout<<setw(5)<<MoveDistance[i]<<" ";
}
cout<<endl;
cout<<"平均寻道长度:"<<(double)x/(double)n;
cout<<endl;
}
void SSTF(){
cout<<"========================="<<endl;
cout<<"==========2-SSTF========="<<endl;
for(i=0;i<n;i++){
FCF[i]=TrackOrder[i];
MoveDistance[i]=0;
pass[i]=0;
}
y=m;
for(i=0;i<n;i++){
for(j=i;j<n;j++){
if(y>=FCF[j])
pass[j]=y-FCF[j];
else if(y<FCF[j])
pass[j]=FCF[j]-y;
}
x=0;
for(j=i;j<n;j++)
{
if(pass[i]>pass[j])
{ x++;
pass[i]=pass[j];
k=j;
}
}
if(x!=0){
y=FCF[k];
z=FCF[i];
FCF[i]=FCF[k];
FCF[k]=z;
if(x==0){
FCF[i]=FCF[k];
y=FCF[k];
}
}
}
y=m;
for(i=0;i<n;i++){
if(y>=FCF[i])
MoveDistance[i]=y-FCF[i];
else if(y<FCF[i])
MoveDistance[i]=FCF[i]-y;
y=FCF[i];
}
cout<<endl;
cout<<"从 "<<m<<" 号磁道开始;"<<endl;
cout<<"被访问的下一个磁道号(->)"<<endl;
for(i=0;i<n;i++){
cout<<setw(5)<<FCF[i]<<" ";
}
x=0;
cout<<"移动距离(磁道数->)"<<endl;
for(i=0;i<n;i++){
x+=MoveDistance[i];
cout<<setw(5)<<MoveDistance[i]<<" ";
}
cout<<endl;
cout<<"平均寻道长度:"<<(double)x/(double)n;
cout<<endl;
}
void SCAN(){
cout<<"========================="<<endl;
cout<<"==========3-SCAN========="<<endl;
for(i=0;i<n;i++){
FCF[i]=TrackOrder[i];
MoveDistance[i]=0;
pass[i]=FCF[i];
}
y=m;
x=0;
k=0;
for(i=0;i<n;i++)
{
if(y<pass[i])
{a[x]=pass[i];
x++;
}
if(y>pass[i]){
b[k]=pass[i];
k++;
}
}
for(i=0;i<x;i++)
for(j=i;j<x;j++){
if(a[i]>a[j])
{
z=a[i];
a[i]=a[j];
a[j]=z;
}
}
for(i=0;i<k;i++)
for(j=i;j<k;j++){
if(b[i]<b[j])
{
z=b[i];
b[i]=b[j];
b[j]=z;
}
}
for(i=0;i<x;i++){
FCF[i]=a[i];
}
for(j=0;j<k;j++)
{
FCF[j+x]=b[j];
}
y=m;
for(i=0;i<n;i++){
if(y>=FCF[i])
MoveDistance[i]=y-FCF[i];
else if(y<FCF[i])
MoveDistance[i]=FCF[i]-y;
y=FCF[i];
}
cout<<endl;
cout<<"从 "<<m<<" 号磁道开始;"<<endl;
cout<<"被访问的下一个磁道号(->)"<<endl;
for(i=0;i<n;i++){
cout<<setw(5)<<FCF[i]<<" ";
}
x=0;
cout<<"移动距离(磁道数->)"<<endl;
for(i=0;i<n;i++){
x+=MoveDistance[i];
cout<<setw(5)<<MoveDistance[i]<<" ";
}
cout<<endl;
cout<<"平均寻道长度:"<<(double)x/(double)n;
cout<<endl;
}
void CSCAN(){
cout<<"========================="<<endl;
cout<<"==========3-SCAN========="<<endl;
for(i=0;i<n;i++){
FCF[i]=TrackOrder[i];
MoveDistance[i]=0;
pass[i]=FCF[i];
}
y=m;
x=0;
k=0;
for(i=0;i<n;i++)
{
if(y<pass[i])
{a[x]=pass[i];
x++;
}
if(y>pass[i]){
b[k]=pass[i];
k++;
}
}
for(i=0;i<x;i++)
for(j=i;j<x;j++){
if(a[i]>a[j])
{
z=a[i];
a[i]=a[j];
a[j]=z;
}
}
for(i=0;i<k;i++)
for(j=i;j<k;j++){
if(b[i]>b[j])
{
z=b[i];
b[i]=b[j];
b[j]=z;
}
}
for(i=0;i<x;i++){
FCF[i]=a[i];
}
for(j=0;j<k;j++)
{
FCF[j+x]=b[j];
}
y=m;
for(i=0;i<n;i++){
if(y>=FCF[i])
MoveDistance[i]=y-FCF[i];
else if(y<FCF[i])
MoveDistance[i]=FCF[i]-y;
y=FCF[i];
}
cout<<endl;
cout<<"从 "<<m<<" 号磁道开始;"<<endl;
cout<<"被访问的下一个磁道号(->)"<<endl;
for(i=0;i<n;i++){
cout<<setw(5)<<FCF[i]<<" ";
}
x=0;
cout<<"移动距离(磁道数->)"<<endl;
for(i=0;i<n;i++){
x+=MoveDistance[i];
cout<<setw(5)<<MoveDistance[i]<<" ";
}
cout<<endl;
cout<<"平均寻道长度:"<<(double)x/(double)n;
cout<<endl;
}
void main(){
input();
FCFS();
SSTF();
SCAN();
CSCAN();
}