磁盘调度算法

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");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值