#include<stdio.h>#include<math.h>#include<stdlib.h>int firstItem,inputSize,outputSize,nextItem,nextIndex;int sstfCount=0,scanCount=0;static int input[50],output[50];void SSTF(int a[],int n);void lengthReduce(int a[],int index,int length);double ave(int a[],int length);void init(){ int i,j; printf("磁盘调度算法\n"); printf("请输入磁盘请求序列的长度:"); scanf("%d",&inputSize); printf("请输入磁盘请求序列:"); for(i=0;i<inputSize;i++) { scanf("%d",&input[i]); } printf("请选择磁头的起始位置 firstItem:"); scanf("%d",&nextItem); input[inputSize]=nextItem; inputSize++; //对访问序列进行选择排序 for (i = 0; i < inputSize; i++) { for (j = i; j < inputSize; j++) { if(input[j]<input[i]) { int tem=input[j]; input[j]=input[i]; input[i]=tem; } } }}void SSTF(int a[],int n){ int runTime,b,c,i; int outputSize=0;//输出序列的位置 runTime=inputSize; while(runTime>0) { //获得起始位置在有序序列的下标 for(i=0;i<inputSize;i++) { if(nextItem==input[i]) { nextIndex=i; } } /*printf("nextItem:%d\n",nextItem); printf("inputSize=:%d\n",inputSize); printf("nextIndex=:%d\n",nextIndex);*/ b=abs(input[nextIndex-1]-nextItem); c=abs(input[nextIndex+1]-nextItem); if(nextIndex==inputSize||b<=c) { output[outputSize]=input[nextIndex]; nextItem=input[nextIndex-1]; } else if(nextIndex==0||b>c) { output[outputSize]=input[nextIndex]; nextItem=input[nextIndex+1]; } lengthReduce(input,nextIndex,inputSize); outputSize++; runTime--; } printf("output为:"); for(i=0;i<outputSize;i++) { printf("%d\t",output[i]); } printf("\n"); //printf("outputSize:%d\n",outputSize);// for(i=0;i<outputSize-1;i++)// {// sstfCount=sstfCount+abs(output[i+1]-output[i]);// }// printf("sstfCount:%d\n",sstfCount); printf("平均寻道时间为:%.2f\n",ave(output,outputSize));}void SCAN(){ int i,j,choice; printf("请选择磁道增加的方向(1.向外;2.向内):"); scanf("%d",&choice); for(i=0;i<inputSize;i++) { if(nextItem==input[i]) { nextIndex=i; } } if(choice==1) { for(j=nextIndex;j<inputSize;j++) { output[outputSize]=input[j]; outputSize++; } for(j=nextIndex-1;j>=0;j--) { output[outputSize]=input[j]; outputSize++; } //printf("output:%d\n",outputSize); for(j=0;j<outputSize;j++) { printf("%d\t",output[j]); } printf("\n"); printf("平均寻道时间为:%.2f\n",ave(output,outputSize)); } else if(choice==2) { for(j=nextIndex;j>=0;j--) { output[outputSize]=input[j]; outputSize++; } for(j=nextIndex+1;j<inputSize;j++) { output[outputSize]=input[j]; outputSize++; } printf("output:%d\n",outputSize); for(j=0;j<outputSize;j++) { printf("%d\t",output[j]); } printf("\n"); //printf("平均寻道时间为:%.2f\n",ave(output,outputSize)); }}void lengthReduce(int a[],int index,int length){ int i; for(i=index;i<inputSize;i++) { input[i]=input[i+1]; } inputSize--;}double ave(int a[],int length){ int i,count=0,num; double average; num=length-1; for(i=0;i<num;i++) { count=count+abs(a[i+1]-a[i]); } printf("count:%d;num:%d\n",count,num); average=(double)count/num; return average;}//void reverse(int a[],int index,int length)//{// int i,j,tem;// for(i=index;i>0;i--)// {// tem=input[i];// input[i]=input[length-i];// input[length-i]=tem;// }//}int menu(){ int i; char j; contin: { init(); printf("请选择算法:\n"); printf("\t1.SSTF"); printf("\t2.SCAN\n"); scanf("%d",&i); switch(i) { case 1:SSTF(input,firstItem);break; case 2:SCAN();break; } } printf("是否继续?(y/n)"); getchar(); scanf("%c",&j); if(j=='y') { system("CLS"); goto contin; } else { printf("欢迎下次使用!"); return 0; } getchar();}int main(){ menu(); return 0;}