#include "stdio.h"
#include "stdlib.h"
void Copy(int number[],int line[] ,int x); //数组number复制到数组line,复制到x个数
void Delete(int number[],int x,int y); //数组number把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)
void SSTF(int Han,int number[],int numall); //最短寻道时间优先算法(SSTF)
void SCAN(int Han,int number[],int x,int y); //扫描算法(SCAN)
int NAll=0;
float Average=0;
void main()
{
int i;
int start; //起始磁道
int numall;//需要查找的磁道数量
int number[100];//磁道号存放数组
int Con=1;
int n;
printf(" 请输入所有磁道数量:");
scanf("%d",&numall);
printf(" 请输入所有的磁道号:");
for(int j=0;j<numall;j++){
scanf("%d",&number[j]);
}
printf(" 请输入初始的磁道号:");
scanf("%d",&start);
while(Con==1){
printf(" *********************************************\n");
printf(" **************** 磁盘调度算法 ***************\n");
printf(" *********************************************\n");
printf(" * 1.最短寻道时间优先算法(SSTF) *\n");
printf(" * 2.扫描算法(SCAN) *\n");
printf(" * 0.退出 *\n");
printf(" *********************************************\n");
printf(" 输入你的选择:");
scanf("%d",&n);
if(n==0) exit(0);
printf("\n");
switch(n){
case 1:
printf(" 需要查找的磁道号:");
for(i=0;i<numall;i++){
printf("%d ",number[i]);
}
SSTF(start,number,numall); //最短寻道时间优先算法(SSTF)
break;
case 2:
printf(" 需要查找的磁道号:");
for(i=0;i<numall;i++){
printf("%d ",number[i]);
}
SCAN(start,number,0,numall); //扫描算法(SCAN)
break;
}
printf("\n 是否继续(按0结束,按1继续)?");
scanf("%5d",&Con);
}
}
//数组number复制到数组line,复制到x个数
void Copy(int number[],int line[] ,int x){
int i;
for(i=0;i<=x;i++){
line[i]=number[i];
}
}
//数组number把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)
void Delete(int number[],int x,int y){
int i;
for(i=x;i<y;i++){
number[i]=number[i+1];
x++;
}
}
void SSTF(int start,int number[],int numall)
{
int i,j,h,k,All;
int Temp; //Temp是计算移动的磁道距离的临时变量
int line[100]; //数组number[]复制给数组line[]
int Min;
All=0; //统计全部的磁道数变量
k=numall;
Copy(number,line,numall); //复制磁道号到临时数组line
printf("\n 按照SSTF算法磁道的访问顺序为:");
for(i=0;i<numall;i++){
Min=10000;
for(j=0;j<k;j++){ //内循环寻找与当前磁道号最短寻道的时间的磁道号
if(line[j]>start){ //如果第一个随机生成的磁道号大于当前的磁道号,执行下一句
Temp=line[j]-start; //求出临时的移动距离
}else{
Temp=start-line[j]; //求出临时的移动距离
}
if(Temp<Min){ //如果每求出一次的移动距离小于Min,执行下一句
Min=Temp; //Temp临时值赋予Min
h=j; //把最近当前磁道号的数组下标赋予h
}
}
All=All+Min; //统计一共移动的距离
printf("%d ",line[h]);
start=line[h];
Delete(line,h,k); //每个磁道数向前移动一位
k--;
}
Average=((float)All)/numall;//求平均寻道次数
printf("\n 移动磁道数:<%5d> ",All);
printf("\n 平均寻道长度:%0.2f ",Average);
}
//扫描算法(SCAN)
void SCAN(int start,int number[],int x,int numall)
{
int j,n,k,h,m,All;
int t=0;
int Temp;
int Min;
int line[100]; //将随机生成的磁道数数组number[]复制给数组line[]
int Order;
//Order=1;
k=numall;
m=2; //控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到
All=0; //统计全部的磁道数变量
printf("\n 请输入当前移动臂的移动的方向(1 表示向磁道号减小方向,0 表示向磁道号增加方向): ");
scanf("%d" ,&Order);
Copy(number,line,numall); //复制磁道号到临时数组line
printf(" 按照SCAN算法磁道的访问顺序为:");
while(m>0){
if(Order==1){ //order是判断磁盘扫描的方向标签,order是1的话,磁道向内移动
for(j=x;j<numall;j++){
h=-1;
Min=10000;
for(n=x;n<k;n++){ //判断离当前磁道最近的磁道号
if(line[n]<=start){
Temp=start-line[n];
if(Temp<Min){
Min=Temp; //Temp临时值赋予Min
h=n; //把最近当前磁道号的数组下标赋予h
}
}
}
if(h!=-1){
All=All+Min; //叠加移动距离
printf("%5d",line[h]);
start=line[h]; //最近的磁道号作为当前磁道
Delete(line,h,k);
k--;
}
}
Order=0; //当完成向内的移动,order赋予0,执行else语句,使磁道向外移动
m--; //向内完成一次,m减一次,保证while循环执行两次
}else{ //order是0的话,磁道向外移动
for(j=x;j<numall;j++){
h=-1;
Min=10000;
for(n=x;n<k;n++){ //判断离当前磁道最近的磁道号
if(line[n]>=start){
Temp=line[n]-start;
if(Temp<Min){
Min=Temp; //Temp临时值赋予Min
h=n; //把最近当前磁道号的数组下标赋予h
}
}
}
if(h!=-1){
All=All+Min; //叠加移动距离
printf("%5d",line[h]);
start=line[h]; //最近的磁道号作为当前磁道
Delete(line,h,k);
k--;
}
}
Order=1; //当完成向内的移动,order赋予0,执行else语句,使磁道向外移动
m--; //向内完成一次,m减一次,保证while循环执行两次
}
}
NAll=NAll+All;
Average=((float)NAll)/numall;//求平均寻道次数
printf("\n 移动磁道数:<%5d> ",NAll);
printf("\n 平均寻道长度:%0.2f ",Average);
}
scan_and_sstf.rar_SCAN寻道_SSTF
版权申诉
14 浏览量
2022-09-20
18:29:23
上传
评论
收藏 193KB RAR 举报
APei
- 粉丝: 63
- 资源: 1万+