磁盘调度算法sstf scan cscan C语言实现

//先来先服务因为太简单就没写

#include

#include
#include
#include
void sstf( int *a,int p,int y );//最短寻道优先
void scan( int *a,int m,int y );//电梯扫描算法
void cscan(int *a,int m ,int y);//循环扫描算法
void hugee(int *a,int m,int y,int value);
int main()
{
int i,a[200],m,n,isprime,y;
printf("                           请选择您要执行的磁盘调度算法\n ");
printf("                         **********************************\n");
printf("                          *                                *\n");
printf("                          *                                *\n");
printf("                          *    最短寻道优先  sstf: 1       *\n");
printf("                          *    电梯扫描算法  scan:2       *\n");
printf("                          *    循环扫描算法 cscan: 3       *\n");
printf("                          *                                *\n");
printf("                          *                                *\n");
printf("                          **********************************\n");
scanf("%d",&isprime);
    if(isprime==1){
printf("请输入共有多少磁道 :\n");
scanf("%d",&y);
printf("请输入当前磁头所在的磁道号 :\n");
scanf("%d",&m);
printf("请输入最大磁道号 :\n");
scanf("%d",&n);
srand((int)time(0));
printf("这是随机产生的磁道数 :\n");
for(i=0;i a[i]=rand()%n;
printf("%d ",a[i]);
}
printf("\n");
   sstf(a,m,y);
}
    else if(isprime==2){
    printf("请输入共有多少磁道 :\n");
scanf("%d",&y);
printf("请输入当前磁头所在的磁道号 :\n");
scanf("%d",&m);
printf("请输入最大磁道号 :\n");
scanf("%d",&n);
srand((int)time(0));
printf("这是随机产生的磁道数 :\n");
for(i=0;i a[i]=rand()%n;
printf("%d ",a[i]);
}
printf("\n");
scan(a,m,y);
}
else if(isprime==3){
printf("请输入共有多少磁道 :\n");
scanf("%d",&y);
printf("请输入当前磁头所在的磁道号 :\n");
scanf("%d",&m);
printf("请输入最大磁道号 :\n");
scanf("%d",&n);
srand((int)time(0));
printf("这是随机产生的磁道数 :\n");
for(i=0;i a[i]=rand()%n;
printf("%d ",a[i]);
}
printf("\n");
cscan(a,m,y);
}
else{
printf("wrong 退出程序!!!!!!!!!!!!\n");
}
    return 0;
}
void sstf(int a[],int p,int y)
{
    int i,j,tempt,x,sum=0;
    printf("磁头即将要走的磁道分别为:\n");
    for(i=0;i        tempt = abs(a[0]-p);
        x = 0;
        for(j=1;j            if(abs(a[j]-p)                x = j; //记录下来最近距离所对应的磁道号的数组的下标
                tempt = abs(a[j]-p);
            }
        }
        sum+=tempt;
        if(i        printf("%d->",a[x]);
}
else{
printf("%d",a[x]);
}
        p = a[x];
        for(j=0;j            a[x+j]=a[x+j+1];
   }
    }
    printf("\n");
    printf("磁头所经过的磁道道数和为:%d\n",sum);
    printf("磁头的平均寻道总数为:%.1lf\n",sum*1.0/y);
}
void scan(int *a,int m,int y)
{
int x;
printf("请选择初始扫描方向 :\n");
printf("外方向:1\n");
printf("内方向: 2\n");
scanf("%d",&x);
if(x==1){
printf("磁头要经过的磁道分别为:\n");
hugee(a,m,y,x);
}
if(x==2){
printf("磁头要经过的磁道分别为:\n");
hugee(a,m,y,x);
}
if(x!=1&&x!=2){
printf("输入错误,退出程序!!!!!!\n");
}
}
void cscan(int *a,int m,int y)
{
int f,s;
printf("请选择当前磁头的移动方向:\n");
printf("向外 : 1       \n");
printf("向里 : 2       \n");
scanf("%d",&f);
switch(f)
{
case 1:
printf("磁头要经过的磁道分别为:\n");
s=f+2;
hugee(a,m,y,s);  
break;
case 2:
printf("磁头要经过的磁道分别为:\n");
s=f+2;
hugee(a,m,y,s);
break;
default :
printf("输入错误,退出程序!!!\n");
}
}
void hugee(int *a,int m,int y,int value)
{
int i=0,j=0,t=0,c[200],d[200],e[200],f[200],q1,q2,q3,q4,isprime,sum=0;//sdt
for(i=0,j=0,t=0;i if(a[i]>=m){
c[j]=a[i];
j++;
t++;
}
}
q1=t;
for(i=0;i for(j=0;j if(c[j]>c[j+1]) {
isprime=c[j];
c[j]=c[j+1];
c[j+1]=isprime;
}
}
}
for(i=0,j=0,t=0;i if(a[i] d[j]=a[i];
j++;
t++;
}
}
q2=t;
for(i=0;i for(j=0;j if(d[j] isprime=d[j];
d[j]=d[j+1];
d[j+1]=isprime;
}
}
}
for(i=0,j=0,t=0;i if(a[i]>=m){
e[j]=a[i];
j++;
t++;
}
}
q3=t;
for(i=0,j=0;i if(a[i]>=m){
}
}
for(i=0;i for(j=0;j if(e[j] isprime=e[j];
e[j]=e[j+1];
e[j+1]=isprime;
}
}
}
printf("\n");
for(i=0,j=0,t=0;i if(a[i] f[j]=a[i];
j++;
t++;
}
}
q4=t;
for(i=0;i for(j=0;j if(f[j]>f[j+1]) {
isprime=f[j];
f[j]=f[j+1];
f[j+1]=isprime;
}
}
}
printf("\n");
if(value==1){//sdtjdt
sum=abs(c[0]-m);
printf("%d",m);
for(i=0;i if((i+1) sum+=abs(c[i+1]-c[i]);
}
printf("->%d",c[i]);
}
sum=sum+abs(d[0]-c[q1-1]);
for(i=0;i if((i+1) sum+=(abs(d[i+1]-d[i]));
}
printf("->%d",d[i]);
}
printf("\n磁头所经过的磁道道数和为:%d\n",sum);
    printf("磁头的平均寻道总数为:%.1lf\n",sum*1.0/y);
}
if(value==2){//jdtsdt
sum=abs(d[0]-m);
printf("%d",m);
for(i=0;i if((i+1) sum+=abs(d[i+1]-d[i]);
}
printf("->%d",d[i]);
}
sum=sum+abs(c[0]-d[q2-1]);
for(i=0;i if((i+1) sum+=(abs(c[i+1]-c[i]));
}
printf("->%d",c[i]);
}
printf("\n磁头所经过的磁道道数和为:%d\n",sum);
    printf("磁头的平均寻道总数为:%.1lf\n",sum*1.0/y);
}
if(value==3){//sdtrejdt
sum=abs(c[0]-m);
printf("%d",m);
for(i=0;i if((i+1) sum+=abs(c[i+1]-c[i]);
}
printf("->%d",c[i]);
}
for(i=0;i if((i+1) sum+=(abs(f[i+1]-f[i]));
}
printf("->%d",f[i]);
}
printf("\n磁头所经过的磁道道数和为:%d\n",sum);
    printf("磁头的平均寻道总数为:%.1lf\n",sum*1.0/y);
}
if(value==4){//jdtresdt
sum=abs(d[0]-m);
printf("%d",m);
for(i=0;i if((i+1) sum+=abs(d[i+1]-d[i]);
}
printf("->%d",d[i]);
}
for(i=0;i if((i+1) sum+=(abs(e[i+1]-e[i]));
}
printf("->%d",e[i]);
}
printf("\n磁头所经过的磁道道数和为:%d\n",sum);
    printf("磁头的平均寻道总数为:%.1lf\n",sum*1.0/y);
}
}

你可能感兴趣的:(磁盘调度算法sstf scan cscan C语言实现)