用c语言实现SCAN的磁盘调度算法,包括以下功能(1)从键盘输入访盘序列;(2)从键盘控制磁头移动的方向;(3)给出各算法的调度次序(不可重复调度)及平均寻道长度。
时间: 2024-01-08 11:04:56 浏览: 40
好的,我可以为您提供SCAN磁盘调度算法的C语言实现代码。以下是完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 1000
int main() {
int i, j, n, head, len, sum, temp, q[MAX], seq[MAX];
bool direction; // true 表示向上移动,false 表示向下移动
float avg;
printf("请输入磁盘访问序列的长度:");
scanf("%d", &len);
printf("请输入磁盘访问序列:");
for (i = 0; i < len; i++) {
scanf("%d", &seq[i]);
}
printf("请输入磁头的起始位置:");
scanf("%d", &head);
printf("请输入磁头移动的方向(1表示向上,0表示向下):");
scanf("%d", &temp);
direction = (temp == 1) ? true : false;
// 冒泡排序,将访问序列按升序排列
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - i - 1; j++) {
if (seq[j] > seq[j+1]) {
temp = seq[j];
seq[j] = seq[j+1];
seq[j+1] = temp;
}
}
}
// 找到磁头所在的位置,并将访问序列分成两部分
for (i = 0; i < len; i++) {
if (seq[i] >= head) {
break;
}
}
int mid = i;
// SCAN 算法
sum = 0;
int front = 0, rear = -1;
if (direction) {
for (i = mid; i < len; i++) {
q[++rear] = seq[i];
}
for (i = mid - 1; i >= 0; i--) {
q[++rear] = seq[i];
}
} else {
for (i = mid - 1; i >= 0; i--) {
q[++rear] = seq[i];
}
for (i = mid; i < len; i++) {
q[++rear] = seq[i];
}
}
printf("磁头移动顺序:");
for (i = 0; i < len; i++) {
printf("%d ", q[i]);
sum += abs(head - q[i]);
head = q[i];
}
avg = (float)sum / len;
printf("\n平均寻道长度为:%.2f\n", avg);
return 0;
}
```
运行程序后,输入磁盘访问序列的长度、访问序列、磁头的起始位置和磁头移动的方向(1表示向上,0表示向下),即可得到SCAN算法的调度次序和平均寻道长度。
注意:本程序中的SCAN算法是按照访问序列的升序排列进行调度的。如果要改为降序排列,请将冒泡排序的符号改为“<”。