#include<stdio.h>
#include<math.h>
int array[9]={55,58,39,18,90,160,150,38,184},intial_num;
//FCFS
int FCFS(){
int begin=intial_num,sum=0;
for(int i=0;i<9;i++){
sum+=abs(array[i]-begin);
begin=array[i];
printf("%5d",array[i]);
}
printf("\n");
return sum;
}
//sstf
//1已被寻 0没有被寻 全为1 寻完了
bool IsUsed(int *flag){
for(int i=0;i<9;i++){
if(flag[i]==0)
return false;
}
return true;
}
//寻找与磁头最小距离磁道的下标
int Get_SSTF_Index(int x,int *flag){
int t=0,min_d=1000;
for(int i=0;i<9;i++){
int d=abs(array[i]-x);
if(d<min_d&&flag[i]==0){
min_d=d;
t=i;
}
}
return t;
}
int SSTF(){
int begin=intial_num,sum=0,index;
int flag[9]={0};
while(!IsUsed(flag)){
index=Get_SSTF_Index(begin,flag);
sum+=abs(array[index]-begin);
begin=array[index];
flag[index]=1;//已寻道 标记1
printf("%5d",array[index]);
}
printf("\n");
return sum;
}
//SCAN
//冒泡排序 大到小
int sort(int *a){
for(int i=0;i<8;i++){
int t;
for(int j=0;j<8-i;j++){
if(a[j]<a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int Get_SCAN_Index(int x,int *a){
int t;
for(int i=0;i<9;i++){
//首个比磁头所在磁道大或等于对应磁道的下标
if(x<a[i]&&x>a[i+1]||x==a[i]){
t=i;
}
//边界 磁头比所有磁道大
else if(x>a[0]){
t=0;
}
//边界 磁头比所有磁道小
else if(x<a[8]){
t=8;
}
}
return t;
}
int SCAN(){
int begin=intial_num,sum=0,index,array2[9];
for(int i=0;i<9;i++){
array2[i]=array[i];
}
sort(array2);
index=Get_SCAN_Index(begin,array2);
//边界 寻道从小到大
if(index==0||index==8){
for(int i=8;i>=0;i--){
sum+=abs(array2[i]-begin);
begin=array2[i];
printf("%5d",array2[i]);
}
}
//中间
else{
for(int i=index;i>=0;i--){
sum+=abs(array2[i]-begin);
begin=array2[i];
printf("%5d",array2[i]);
}
for(int i=index+1;i<9;i++){
sum+=abs(array2[i]-begin);
begin=array2[i];
printf("%5d",array2[i]);
}
}
printf("\n");
return sum;
}
//CSCAN
int CSCAN(){
int begin=intial_num,sum=0,index,array2[9];
for(int i=0;i<9;i++){
array2[i]=array[i];
}
sort(array2);
index=Get_SCAN_Index(begin,array2);
//边界 寻道从小到大
if(index==0||index==8){
for(int i=8;i>=0;i--){
sum+=abs(array2[i]-begin);
begin=array2[i];
printf("%5d",array2[i]);
}
}
//中间 index
else{
for(int i=index;i>=0;i--){
sum+=abs(array2[i]-begin);
begin=array2[i];
printf("%5d",array2[i]);
}
for(int i=8;i>=index+1;i--){
sum+=abs(array2[i]-begin);
begin=array2[i];
printf("%5d",array2[i]);
}
}
printf("\n");
return sum;
}
int main(){
int num;
printf("请输入当前磁头位置:");
scanf("%d",&intial_num);
// printf("\n请输入磁道请求顺序:");
// for(int i=0;i<9;i++){
// scanf("%d",&array[i]);
// }
printf("\n请选择算法:");
while(num){
scanf("%d",&num);
switch (num) {
case 1:
printf("FCFS:\n调度顺序:");
printf("平均寻道长度:%.1f\n",FCFS()/9.0);
break;
case 2:
printf("SSTF:\n调度顺序:");
printf("平均寻道长度:%.1f\n",SSTF()/9.0);
break;
case 3:
printf("SCAN:\n调度顺序:");
printf("平均寻道长度:%.1f\n",SCAN()/9.0);
break;
case 4:
printf("CSACN:\n调度顺序:");
printf("平均寻道长度:%.1f\n",CSCAN()/9.0);
break;
default:
printf("输入错误。");
break;
}
}
}