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

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
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<y;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<y;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<y;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<y;i++){
        tempt = abs(a[0]-p);
        x = 0;
        for(j=1;j<y-i;j++){//循环查找距离磁头最近的磁道
            if(abs(a[j]-p)<tempt){
                x = j; //记录下来最近距离所对应的磁道号的数组的下标
                tempt = abs(a[j]-p);
            }
        }
        sum+=tempt;
        if(i<y-1){
        printf("%d->",a[x]);
}
else{
printf("%d",a[x]);
}
        p = a[x];
        for(j=0;j<y-x-i;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<y;i++){
if(a[i]>=m){
c[j]=a[i];
j++;
t++;
}
}
q1=t;
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;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<y;i++){
if(a[i]<m){
d[j]=a[i];
j++;
t++;
}
}
q2=t;
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;j++){
if(d[j]<d[j+1]) {
isprime=d[j];
d[j]=d[j+1];
d[j+1]=isprime;
}
}
}
for(i=0,j=0,t=0;i<y;i++){
if(a[i]>=m){
e[j]=a[i];
j++;
t++;
}
}
q3=t;
for(i=0,j=0;i<y;i++){
if(a[i]>=m){
}
}
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;j++){
if(e[j]<e[j+1]) {
isprime=e[j];
e[j]=e[j+1];
e[j+1]=isprime;
}
}
}
printf("\n");
for(i=0,j=0,t=0;i<y;i++){
if(a[i]<m){
f[j]=a[i];
j++;
t++;
}
}
q4=t;
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;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<q1;i++){
if((i+1)<q1){
sum+=abs(c[i+1]-c[i]);
}
printf("->%d",c[i]);
}
sum=sum+abs(d[0]-c[q1-1]);
for(i=0;i<q2;i++){
if((i+1)<q2){
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<q2;i++){
if((i+1)<q2){
sum+=abs(d[i+1]-d[i]);
}
printf("->%d",d[i]);
}
sum=sum+abs(c[0]-d[q2-1]);
for(i=0;i<q1;i++){
if((i+1)<q1){
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<q1;i++){
if((i+1)<q1){
sum+=abs(c[i+1]-c[i]);
}
printf("->%d",c[i]);
}
for(i=0;i<q4;i++){
if((i+1)<q4){
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<q2;i++){
if((i+1)<q2){
sum+=abs(d[i+1]-d[i]);
}
printf("->%d",d[i]);
}
for(i=0;i<q3;i++){
if((i+1)<q3){
sum+=(abs(e[i+1]-e[i]));
}
printf("->%d",e[i]);
}
printf("\n磁头所经过的磁道道数和为:%d\n",sum);
    printf("磁头的平均寻道总数为:%.1lf\n",sum*1.0/y);
}
}

猜你喜欢

转载自blog.csdn.net/qq_40394168/article/details/80437718