📄 diaodu.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#include <iostream.h>
void CopyL(int Sour[],int Dist[] ,int x);
void SetDI(int DiscL[]);
void Print(int Pri[],int x);
void DelInq(int Sour[],int x,int y);
void FCFS(int Han,int DiscL[]);
void SSTF(int Han,int DiscL[]);
int SCAN(int Han,int DiscL[],int x,int y);
void CSCAN(int Han,int DiscL[]);
void N_Step_SCAN(int Han1,int DiscL[]);
void PaiXu();
void Pri();
int NAll=0;
int Best[5][2];
int Limit=0;
int Jage;
int Aver=0;
void main()
{
int i;
int DiscLine[10];
int Hand;
int Con;
while(Con!=0)
{
Jage=0;
printf("\n+ 请输入初始的磁道数(0<n<65000):");
cin>>Hand;
printf("\n+ 输入寻找的范围:");
cin>>Limit;
if(Limit>65000)
break;
cout<<" 选择如下算法: "<<endl;
cout<<" 1.先来先服务算法"<<endl;
cout<<endl;
cout<<" 2.最短寻道时间优先算法"<<endl;
cout<<endl;
cout<<" 3.SCAN算法"<<endl;
cout<<endl;
cout<<" 4.循环扫描算法"<<endl;
cout<<endl;
cout<<" 5.N_Step_SCAN算法"<<endl;
cout<<endl;
cout<<" 6.各类算法的比较"<<endl;
int n;
cin >>n;
switch(n)
{
case 1:
SetDI(DiscLine);
FCFS(Hand,DiscLine);
break;
case 2:
SetDI(DiscLine);
SSTF(Hand,DiscLine);
break;
case 3:
SetDI(DiscLine);
SCAN(Hand,DiscLine,0,9);
break;
case 4:
SetDI(DiscLine);
CSCAN(Hand,DiscLine);
break;
case 5:
SetDI(DiscLine);
N_Step_SCAN(Hand,DiscLine);
break;
case 6:
SetDI(DiscLine);
FCFS(Hand,DiscLine);
SSTF(Hand,DiscLine);
SCAN(Hand,DiscLine,0,9);
CSCAN(Hand,DiscLine);
N_Step_SCAN(Hand,DiscLine);
PaiXu();
printf("\n+ 寻道长度由低到高排序 :");
for(i=0;i<5;i++)
{
printf("%4d ",Best[i][0]);
}
break;
}
printf("\n+ 是否继续(0 or 1)?");
scanf("%5d",&Con);
}
}
void CopyL(int Sour[],int Dist[] ,int x)
{
int i;
for(i=0;i<=x;i++)
{
Dist[i]=Sour[i];
}
}
void Print(int Pri[],int x)
{
int i;
for(i=0;i<=x;i++)
{
printf("%5d",Pri[i]);
}
}
void SetDI(int DiscL[])
{
int i;
for(i=0;i<=9;i++)
{
DiscL[i]=rand()%Limit;
}
printf("+ 需要寻找的磁道号 :");
Print(DiscL,9);
}
void DelInq(int Sour[],int x,int y)
{
int i;
for(i=x;i<y;i++)
{
Sour[i]=Sour[i+1];
x++;
}
}
void FCFS(int Han,int DiscL[])
{
int RLine[10];
int i,k,All,Temp;
All=0;
k=9;
CopyL(DiscL,RLine,9);
printf("\n+ 按照FCFS算法磁道的访问顺序为 :");
for(i=0;i<=9;i++)
{
Temp=RLine[0]-Han;
if(Temp<0)
Temp=(-Temp);
printf("%5d",RLine[0]);
All=Temp+All;
DelInq(RLine,0,k);
k--;
}
Best[Jage][1]=All;
Best[Jage][0]=1;
Jage++;
Aver=All/10;
printf("\n+ 移动磁道数 :<%5d> ",All);
printf("\n+ 平均寻道长度 :*%5d* ",Aver);
}
void SSTF(int Han,int DiscL[])
{
int i,j,k,h,All;
int Temp;
int RLine[10];
int Min;
All=0;
k=9;
CopyL(DiscL,RLine,9);
printf("\n+ 按照SSTF算法磁道的访问顺序为 : ");
for(i=0;i<=9;i++)
{
Min=64000;
for(j=0;j<=k;j++)
{
if(RLine[j]>Han)
Temp=RLine[j]-Han;
else
Temp=Han-RLine[j];
if(Temp<Min)
{
Min=Temp;
h=j;
}
}
All=All+Min;
printf("%5d",RLine[h]);
Han=RLine[h];
DelInq(RLine,h,k);
k--;
}
Best[Jage][1]=All;
Best[Jage][0]=2;
Jage++;
Aver=All/10;
printf("\n+ 移动磁道数 :<%5d> ",All);
printf("\n+ 平均寻道长度 :*%5d* ",Aver);
}
int SCAN(int Han,int DiscL[],int x,int y)
{
int j,n,k,h,m,All;
int Temp;
int Min;
int RLine[10];
int Order;
Order=1;
k=y;
m=2;
All=0;
CopyL(DiscL,RLine,9);
printf("\n+ 按照SCAN算法磁道的访问顺序为 :");
Min=64000;
for(j=x;j<=y;j++)
{
if(RLine[j]>Han)
Temp=RLine[j]-Han;
else
Temp=Han-RLine[j];
if(Temp<Min)
{
Min=Temp;
h=j;
}
}
All=All+Min;
printf("%5d",RLine[h]);
if(RLine[h]>=Han)
Order=0;
Han=RLine[h];
DelInq(RLine,h,k);
k--;
while(m>0)
{
if(Order==1)
{
for(j=x;j<=y;j++)
{
h=-1;
Min=64000;
for(n=x;n<=k;n++)
{
if(RLine[n]<=Han)
{
Temp=Han-RLine[n];
if(Temp<Min)
{
Min=Temp;
h=n;
}
}
}
if(h!=-1)
{
All=All+Min;
printf("%5d",RLine[h]);
Han=RLine[h];
DelInq(RLine,h,k);
k--;
}
}
Order=0;
m--;
}
else
{
for(j=x;j<=y;j++)
{
h=-1;
Min=64000;
for(n=x;n<=k;n++)
{
if(RLine[n]>=Han)
{
Temp=RLine[n]-Han;
if(Temp<Min)
{
Min=Temp;
h=n;
}
}
}
if(h!=-1)
{
All=All+Min;
printf("%5d",RLine[h]);
Han=RLine[h];
DelInq(RLine,h,k);
k--;
}
}
Order=1;
m--;
}
}
NAll=NAll+All;
if((y-x)>5)
{
Best[Jage][1]=All;
Best[Jage][0]=3;
Jage++;
Aver=All/10;
printf("\n+ 移动磁道数 :<%5d> ",All);
printf("\n+ 平均寻道长度 :*%5d* ",Aver);
}
return(Han);
}
void CSCAN(int Han,int DiscL[])
{
int j,h,n,Temp,m,k,All,Last;
int RLine[10];
int Min;
m=2;
k=9;
All=0;
Last=Han;
CopyL(DiscL,RLine,9);
printf("\n+ ");
printf("按照CSCAN算法磁道的访问顺序为 :");
while(k>=0)
{
for(j=0;j<=9;j++)
{
h=-1;
Min=64000;
for(n=0;n<=k;n++)
{
if(RLine[n]>=Han)
{
Temp=RLine[n]-Han;
if(Temp<Min)
{
Min=Temp;
h=n;
}
}
}
if(h!=-1)
{
All=All+Min;
printf("%5d",RLine[h]);
Han=RLine[h];
Last=RLine[h];
DelInq(RLine,h,k);
k--;
}
}
m--;
Han=0;
if(k>=0)
{
Temp=Last-Han;
All=All+Temp;
}
}
Best[Jage][1]=All;
Best[Jage][0]=4;
Jage++;
Aver=All/10;
printf("\n+ 移动磁道数 :<%5d> ",All);
printf("\n+ 平均寻道长度 :*%5d* ",Aver);
}
void N_Step_SCAN(int Han1,int DiscL[])
{
int i,m,k;
int RLine1[10];
NAll=0;
m=2;
k=9;
i=-1;
CopyL(DiscL,RLine1,9);
printf("\n+ ");
printf("按照N_Step_SCAN算法磁道的访问顺序为 ::");
for(m=0;m<2;m++)
{
Han1=SCAN(Han1,RLine1,i+1,i+5);
i=i+5;
}
Best[Jage][1]=NAll;
Best[Jage][0]=5;
Aver=NAll/10;
printf("\n+ 移动磁道数 :<%5d> ",NAll);
printf("\n+ 平均寻道长度 :*%5d* ",Aver);
}
void PaiXu()
{
int i,j,Temp;
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
if(Best[j][1]>Best[j+1][1])
{
Temp=Best[j+1][1];
Best[j+1][1]=Best[j][1];
Best[j][1]=Temp;
Temp=Best[j+1][0];
Best[j+1][0]=Best[j][0];
Best[j][0]=Temp;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -