c语言实现计算机系统磁盘调度算法:1.先来先服务算法2.最短寻道时间优先算法3.电梯算法
#define _CRT_SECURE_NO_WARNINGS
#include “cstdio”
#include “string”
#include “iostream”
#include “algorithm”
#include “cstring”
#include"math.h"
using namespace std;
struct {
int address;
bool visted;
}str[15];//从键盘输入数组
int kst[15] = { 0 }; //最终数组
int sort(int c, int n, int z)//最短寻道时间优先的排序算法
{
int b = -1;
int a = z;
for (int i = 0; i < n; i++)
{
if (str[i].visted == 0)
{
if (b == -1 || abs(str[i].address - a) <= abs(str[b].address - a))
b = i;
}
}
a = str[b].address;
kst[c] = str[b].address;
str[b].visted = 1;
return a;
}
int sortz(int c, int n, int z)//方向为左时的电梯排序算法
{
int b = -1;
int a = z;
for (int i = 0; i < n; i++)
{
if (str[i].visted == 0&&a-str[i].address>=0)
{
if (b == -1 || abs(str[i].address - a) <= abs(str[b].address - a))
b = i;
}
}
if (b == -1)
{
for (int j = 0; j < n; j++)
{
if (str[j].visted == 0)
{
if (b == -1 || abs(str[j].address - a) <= abs(str[b].address - a))
b = j;
}
}
a = str[b].address;
kst[c] = str[b].address;
str[b].visted = 1;
return a;
}
a = str[b].address;
kst[c] = str[b].address;
str[b].visted = 1;
return a;
}
int sortk(int c, int n, int z)//方向为右时的电梯排序算法
{
int b = -1;
int a = z;
for (int i = 0; i < n; i++)
{
if (str[i].visted == 0 && a - str[i].address <= 0)
{
if (b == -1 || abs(str[i].address - a) <= abs(str[b].address - a))
b = i;
}
}
if (b == -1)
{
for (int j = 0; j < n; j++)
{
if (str[j].visted == 0)
{
if (b == -1 || abs(str[j].address - a) <= abs(str[b].address - a))
b = j;
}
}
a = str[b].address;
kst[c] = str[b].address;
str[b].visted = 1;
return a;
}
a = str[b].address;
kst[c] = str[b].address;
str[b].visted = 1;
return a;
}
void First(int n, int z)//先来先服务
{
for (int i = 0; i < n; i++)
{
kst[i] = str[i].address;
str[i].visted = 1;
}
}
void SSTF(int n, int z)//最短寻道时间优先
{
sort(0, n, z);
for (int c = 1; c < n; c++)
{
sort(c, n, kst[c - 1]);
}
}
void Dianti(int n, int z, int r)//电梯算法
{
if (r == 1)
{
sortz(0, n, z);
for (int c = 1; c < n; c++)
{
sort(c, n, kst[c - 1]);
}
}
if (r == 2)
{
sortk(0, n, z);
for (int c = 1; c < n; c++)
{
sortk(c, n, kst[c - 1]);
}
}
}
int sum(int n, int z, int a[]) {
int c = 0;
c = abs(z - a[0]);
for (int i = 0; i < n - 1; i++)
c = c + abs(a[i + 1] - a[i]);
return c;
}
int main() {
for (int i = 0; i < 15; i++)
{
str[i].visted = 0;
}
int f;
int n, z;
int s, k;
cout << “请输入磁道数 n(n<15):”;
cin >> n;
cout << “请依次输入磁道地址:”;
for (int i = 0; i < n; i++)
{
cin >> str[i].address;
}
cout << “请输入当前磁头位置:”;
cin >> k;
cout << “请选择磁盘寻道方式:1.先来先服务算法2.最短寻道时间优先算法3.电梯算法” << endl;
cin >> s;
switch (s)
{
case 1:
First(n, k);
cout << "先后访问的磁道依次是:" << endl;
cout <<k<< endl;
for (int i = 0; i < n; i++)
{
cout << kst[i] << endl;
}
cout << "经过磁道数:" << sum(n, k, kst) << endl;
break;
case 2:
SSTF(n, k);
cout << "先后访问的磁道依次是:" << endl;
cout << k << endl;
for (int i = 0; i < n; i++)
{
cout << kst[i] << endl;
}
cout << "经过磁道数:" << sum(n, k, kst) << endl;
break;
case 3:
cout << "请输入寻道初始方向(1.左边,2.右边)" << endl;
cin >> f;
Dianti(n, k, f);
cout << "先后访问的磁道依次是:" << endl;\
cout << k << endl;
for (int i = 0; i < n; i++)
{
cout << kst[i] << endl;
}
cout << "经过磁道数:" << sum(n, k, kst) << endl;
break;
default:
break;
}
system("pause");
}