📄 cipan.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
typedef struct
{
int nums; //请求队列长度
int *mem; //访问请求
int *f; //每次访问磁臂移动磁道数
int *tmp; //SSTF临时变量
int *sh; //访问顺序
int *m; //SSTF调度队列
}Cibi;
Cibi *read(Cibi *p) //文件打开
{
int i;
FILE *file;
char str[30]; //文件名存放变量
char empty[30],full[30];
printf("请输入文件名:");
scanf("%s",str);
getchar();
if((file=fopen(str,"r"))==NULL)
{
printf("文件打开错误!");
exit(1);
}
p=(Cibi*)malloc(sizeof(Cibi));
fscanf(file,"%5s%d",empty,&p->nums);
fscanf(file,"%12s",full);
p->mem=(int *)malloc(sizeof(int)*p->nums);//为结构体分配空间
p->sh=(int *)malloc(sizeof(int)*p->nums);
p->f=(int *)malloc(sizeof(int)*p->nums);
p->tmp=(int *)malloc(sizeof(int)*p->nums);
p->sh=(int *)malloc(sizeof(int)*p->nums);
p->m=(int *)malloc(sizeof(int)*p->nums);
for(i=0;i<p->nums;i++)
{
fscanf(file,"%d ",&p->mem[i]);
};
printf("数据文件内容:\n");
printf("%5s%d\n",empty,p->nums);
printf("%12s",full);
for(i=0;i<p->nums;i++)
{
printf("%d ",p->mem[i]);
};
fclose(file); //文件关闭
return(p);
}
void SSTF(Cibi *p) //SSTF调度算法
{
int j,k,t=0,sum=0,x,l;
printf("\n请输入当前磁臂位置:");
scanf("%d",&t); //当前磁臂位置
printf("\n最短路径优先调度算法\n");
for(l=0;l<p->nums;l++)
{
p->m[l]=p->mem[l]; //复制请求队列到调度队列
};
for(j=0;j<p->nums;j++)
{
for(k=0;k<p->nums-j;k++)
p->tmp[k]=abs(t-p->m[k]); //求出当前磁臂所在位置与各个请求的距离
l=0;
for(k=0;k<p->nums-j;k++)
l=(p->tmp[l]>p->tmp[k])?k:l; //判断距离最短的那个请求在请求队列中的位置
x=l;
t=p->m[x]; //将访问的磁道号存入当前磁道
p->sh[j]=p->m[x]; //将访问的磁道号存入sh[j]
p->f[j]=p->tmp[x]; //将距离存入f[j]
sum+=p->f[j];
for(k=x;k<p->nums-1;k++)
p->m[k]=p->m[k+1]; //删除已经访问过的请求
}
printf("\n请求顺序\t访问顺序\t移动距离\n");
for(j=0;j<p->nums;j++)
{
printf("%d\t\t%d\t\t%d\n",p->mem[j],p->sh[j],p->f[j]);
}
printf("\n磁臂移动的总磁道数:");
printf("%d\n",sum);
}
void main()
{
Cibi *p;
p=read(p);
SSTF(p);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -