磁盘读取算法
源代码
#include<stdio.h>
#include<math.h>
#define MAX 50
#define les 32700 //标记极大
int count = 0;//全局变量
int g[] = { 0 };
void FCFS(int m, int n, int track[])//FCFS算法
{
int p, i, j = 0;
double sum = 0;
p = m;
for (i = 0; i < n; i++)
{
sum += abs(track[i] - p);//两两求位移(绝对值)
p = track[i];
}
printf("遍历顺序为:%d", track[j++]);//打印遍历顺序
printf("总长度为:%.1lf\n", sum);
printf("平均长度为:%.1lf\n", sum / n);
}
double FindMax(int m,int n, int track[])//寻找数组最小路径(核心)
{
int i, k = 0;
double s,min = les;
for (i = 0; i < n; i++)
{
s = abs(m - track[i]);
if (s < min)
{
min = s;
k = i;//记录下标
}
}
g[count++] = k;
return min;
}
void SSTF(int m, int n, int track[])
{
double sum=0;
int i;
printf("遍历顺序为:\n");
for (i = 0; i < n; i++)
{
sum += FindMax(m, n, track);
m = track[g[i]];
printf("%d ", m);
track[g[i]] = les;
}
printf("\n");
printf("总长度为:%lf\n", sum);
printf("平均长度为:%.1lf\n", sum / n);
}
void SCAN(int m, int n, int track[],int flag)//增向SCAN算法与CSCAN算法
{
int min[MAX] = { 0 }, max[MAX] = { 0 };
int i, j = 0, k = 0, l;
double sum = 0, x = 0;
for (i = 0; i < n; i++)
{ //以起始位置为分割界,拆分成两个数组
if (track[i] > m)
max[j++] = track[i];
if (track[i] < m)
min[k++] = track[i];
}
printf("遍历顺序为:\n");
for (i = 0; i < j; i++)
{
sum += FindMax(m, j, max);
m = max[g[i]];
printf("%d ", m);
max[g[i]] = les;
}
if (flag == 1)//区分CSCAN算法与SCAN算法
{
l = m;
m = 0;
}
for (i = j; i <j+ k; i++)
{
sum += FindMax(m, k, min);
if (i==j)
x = min[g[i]];
m = min[g[i]];
printf("%d ", m);
min[g[i]] = les;
}
printf("\n");
if (flag == 1)
sum += l - 2 * x;
printf("总长度为:%.1lf\n", sum);
printf("平均长度为:%.1lf\n", sum / n);
}
int main()
{
int m, n, t;
int a[MAX] = { 55,58,39,18,90,160,150,38,184 };
printf("请输入需要计算的磁盘调度方法:(输入对应序号)\n");
printf("1.FCFS算法\n");
printf("2.SSTF算法\n");
printf("3.SCAN算法\n");
printf("4.CSCAN算法\n");
printf("输入你的选择:");
scanf_s("%d", &t);
//可以改成输入型
//printf("请输入磁道起始位置:\n");
//scanf_s("%d", &m);
//printf("请输入磁盘访问个数:\n");
//scanf_s("%d", &n);
switch (t)
{
case 1:
FCFS(100, 9, a);
break;
case 2:
SSTF(100, 9, a);
break;
case 3:
SCAN(100, 9, a, 0);
break;
case 4:
SCAN(100, 9, a, 1);
break;
default:
break;
}
}