磁盘调度算法---C语言代码实现SSTF和SCAN

磁盘调度算法---C语言代码实现SSTF和SCAN

设计思路

1、首先初始化需要的数据:

并且将disk[]进行升序排序

int RW = 0;
  int count;
  printf("\n请输入读写位置:");
  scanf("%d", &RW);
  printf("\n请输入磁盘序列个数:");
  scanf("%d", &count);
  int disk[count];
  printf("\n请输入磁盘序列内容:");
  for (int i = 0; i < count; i++){scanf("%d", &disk[i]);}
  printf("\n你的磁盘序列为:");
  for (int i = 0; i < count; i++){printf("%5d", disk[i]);}
  sort(disk, count); // 对disk[]升序排序
  printf("\n排序后的disk[]:");
  OutPut(disk, count);

2、通用的方法

打印数组OutPut(int *a, int length);打印数组平均值void OutPer(int *a, int length)这两个方法在不同的算法中都需要调用,所以单独写出来。

// 升序排列
void sort(int *a, int length)
{
  for (int i = 0; i < length - 1; i++)
  {
    for (int j = i + 1; j < length; j++)
    {
      if (a[i] > a[j])
      {
        int temp = 0;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    }
  }
}

// 打印数组
void OutPut(int *a, int length)
{
  for (int i = 0; i < length; i++){printf("%5d", a[i]);}
}
// 打印数组平均值
void OutPer(int *a, int length)
{
  float sum = 0;
  for (int i = 0; i < length; i++){sum = sum + a[i];}
  float per = sum / length;
  printf("%5.2f", per);
}

3、SSTF算法

实现思路:

3c515871d4874b5cbbfd6961fc9bc1f9.jpeg

需要的数据:

int distance[count]; // disk的寻道长度
  int access[count];   // 寻道的顺序
  int point = RW;      // 指针   最初为:RW
  int left = -1;       // 左边的数组位置: 从0开始
  int right = -1;      // 右边的数组位置;

4、SCAN算法

SSTF实现以后,SCAN相比较更加容易,和SSTF有太多的相似点。相信大家写完SSTF算法,可以更轻松地写出SCAN。

 

运行结果:

65853179cc894a039a01c31db5e76e29.jpeg

 

总代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
const int MAX = 1000;
// 升序排列
void sort(int *a, int length)
{
  for (int i = 0; i < length - 1; i++)
  {
    for (int j = i + 1; j < length; j++)
    {
      if (a[i] > a[j])
      {
        int temp = 0;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    }
  }
}
// 打印数组
void OutPut(int *a, int length)
{
  for (int i = 0; i < length; i++){printf("%5d", a[i]);}
}
// 打印数组平均值
void OutPer(int *a, int length)
{
  float sum = 0;
  for (int i = 0; i < length; i++){sum = sum + a[i];}
  float per = sum / length;
  printf("%5.2f", per);
}
void SSTF(int *disk, int RW, int count)
{
  int distance[count]; // disk的寻道长度
  int access[count];   // 寻道的顺序
  int point = RW;      // 指针   最初为:RW
  int left = -1;       // 左边的数组位置: 从0开始
  int right = -1;      // 右边的数组位置;

  if (point <= disk[0]) // RW在最左边
  {
    for (int i = 0; i < count; i++)
    {
      access[i] = disk[i];
      distance[i] = disk[i] - point;
      point = disk[i];
    }
  }
  else if (point >= disk[count - 1]) // RW在最右边
  {                                  // RW在最右边
    for (int i = 0; i < count; i++)
    {
      access[i] = disk[count - i - 1];
      distance[i] = point - disk[count - i - 1];
      point = disk[count - i - 1];
    }
  }
  else // 在序列内
  {
    // SSTF
    // 确定 left,right位置
    for (int i = 0; i < count; i++)
    {
      if (disk[i] < point && disk[i + 1] > point){
        left = i;
        right = i + 1;
      }
    }
    int counter = 0; // 方便distance[]和access[]存入数据
    // point和left,right对比大小
    while (counter != count) // 当左右到头时,循环结束
    {
      if (left == -1 || disk[right] - point < point - disk[left])
      {
        access[counter] = disk[right];
        distance[counter] = disk[right] - point;
        point = disk[right];
        right++;
        counter++;
      }
      else if (right == count || disk[right] - point > point - disk[left])
      {
        access[counter] = disk[left];
        distance[counter] = point - disk[left];
        point = disk[left];
        left--;
        counter++;
      }
    }
  }
  printf("\nSSTF的磁道访问顺序为:");
  OutPut(access, count);
  printf("\n每次访问寻道距离为:");
  OutPut(distance, count);
  printf("\n平均访问寻道距离为:");
  OutPer(distance, count);
}
void SCAN(int *disk, int RW, int count)
{
  int distance[count]; // disk的寻道长度
  int access[count];   // 寻道的顺序
  int point = RW;      // 指针   最初为:RW
  int left = -1;       // 左边的数组位置: 从0开始
  int right = -1;      // 右边的数组位置;
  for (int i = 0; i < count; i++)
  {
    if (disk[i] < point && disk[i + 1] > point)
    {
      left = i;
      right = i + 1;
    }
  }
  int leftLen = left;
  int rightLen = right;
  while (left != -1 || right != count)
  {
    if (left != -1)
    {
      for (int i = 0; i <= leftLen; i++)
      {
        access[i] = disk[left];
        distance[i] = point - disk[left];
        point = disk[left];
        left--;
      }
    }
    else if (left == -1 && right != count)
    {
      for (int i = rightLen; i < count; i++)
      {
        access[i] = disk[right];
        distance[i]=disk[right]-point;
        point=disk[right];
        right++;
      }
    }
    else
    {
      exit;
    }
  }
printf("\nSCAN的磁道访问顺序为:");
  OutPut(access, count);
  printf("\n每次访问寻道距离为:");
  OutPut(distance, count);
  printf("\n平均访问寻道距离为:");
  OutPer(distance, count);
}
int main()
{
  int RW = 0;
  int count;
  printf("\n请输入读写位置:");
  scanf("%d", &RW);
  printf("\n请输入磁盘序列个数:");
  scanf("%d", &count);
  int disk[count];
  printf("\n请输入磁盘序列内容:");
  for (int i = 0; i < count; i++){scanf("%d", &disk[i]);}
  printf("\n你的磁盘序列为:");
  for (int i = 0; i < count; i++){printf("%5d", disk[i]);}
  sort(disk, count); // 对disk[]升序排序
  printf("\n排序后的disk[]:");
  OutPut(disk, count);
  while (1)
  {
    int choose = 0;
    printf("\n请选择你要使用的算法:1.SSTF 2.SCAN 3.exit :");
    scanf("%d", &choose);
    switch (choose)
    {
    case 1:
      /* SSTF code */
      SSTF(disk, RW, count);
      break;
    case 2:
      /* SCAN code */
      SCAN(disk, RW, count);
      break;
    case 3:
      printf("exit");
      break;
    default:
      printf("你这可是越界了,可不兴这丫");
      break;
    }
  }
  return 0;
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海豚_qy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值