//stu001.c 磁盘调度算法,程序模板,由学生完成缺失代码
//输出:SCAN:260,FCFS:810,SSTF:270
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
const int StartPos=90;
int YuanShiSeq[]={30,50,100,180,20,90,150,70,80,10,160}; //11个元素
int PaiXuSeq[] ={10,20,30,50,70,80,90,100,150,160,180}; //11个元素
int SCAN()
{ //扫描算法
int totaltracks=0;
int curNum=StartPos;
//请在begin end语句间补全程序语句实现扫描算法,算出总访问磁道数存入totaltracks变量
/* begin ************************************************************** */
//使用已经排好序的数组,可以简化计算
// 找到开始位置的索引
int direction = 1;
int startIndex = 0;
while (PaiXuSeq[startIndex] < StartPos && startIndex < 11)
{
startIndex++;
}
// 先扫描右边
for (int i = startIndex; i < 11; i++)
{
totaltracks += abs(curNum - PaiXuSeq[i]);
curNum = PaiXuSeq[i];
}
// 再扫描左边
for (int i = startIndex - 1; i >= 0; i--)
{
totaltracks += abs(curNum - PaiXuSeq[i]);
curNum = PaiXuSeq[i];
}
/* end ************************************************************** */
//程序输出总访问磁道数
return totaltracks;
}
int FCFS()
{ //先来先服务
int totaltracks=0;
int curNum=StartPos;
//请在begin end语句间补全程序语句实现FCFS算法,算出总访问磁道数存入totaltracks变量
/* begin ************************************************************** */
for (int i = 0; i < 11; i++)
{
totaltracks += abs(curNum - YuanShiSeq[i]);
curNum = YuanShiSeq[i];
}
/* end ************************************************************** */
return totaltracks;
}
int SSTF()
{ //最短寻道优先
int totaltracks=0;
int curNum=StartPos;
int i=0;
//假设当前curNum磁道大于所有的作业的当前磁道
//即curNum>PaiXuSeq[10]
int little=10,big=11;
//找出curNum磁道在PaiXuSeq[little]<=curNum<PaiXuSeq[big]的位置
//curNum磁道与左右相等的情况下,优先磁道大的方向。如果优先磁道小的方向,最短寻道时间会不一样。
//请在begin end语句间补全程序语句最短寻道优先算法,算出总访问磁道数存入totaltracks变量
/* begin ************************************************************** */
int visited[11] = {0};
for (int i = 0; i < 11; ++i)
{
int minDistance = INT_MAX;
int minIndex = -1;
for (int j = 0; j < 11; ++j)
{
if (!visited[j])
{
int distance = abs(curNum - YuanShiSeq[j]); // 使用 YuanShiSeq
if (distance < minDistance)
{
minDistance = distance;
minIndex = j;
}
}
}
// 标记为已访问
visited[minIndex] = 1;
// 更新总磁道数
totaltracks += minDistance;
curNum = YuanShiSeq[minIndex]; // 使用 YuanShiSeq
}
/* end ************************************************************** */
return totaltracks;
}
int main()
{
//为方便在线结果测试直接输出总磁道数
printf("SCAN:%d,FCFS:%d,SSTF:%d",SCAN(),FCFS(),SSTF());
return 0;
}