#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <Windows.h>
#include <vector>
//#include<bits/stdc++.h
using namespace std;

const int MaxNumber = 100;
int TrackOrder[MaxNumber];       //初始序列 
int MoveDistance[MaxNumber];     //----移动距离;
int FindOrder[MaxNumber];        //-----寻道序列。
double AverageDistance;          //-----平均寻道长度
bool direction;                   //-----方向   true时为向外,false为向里
int BeginNum;                     //----开始磁道号。
int M;                            //----磁道数。
int N;                            //-----提出磁盘I/O申请的进程数
int SortOrder[MaxNumber];         //----排序后的序列
bool Finished[MaxNumber];            

void input() {
	cout << "请输入磁道数:";
	cin >> M;
	cout << "请输入提出磁盘I/O申请的进程数:";
	cin >> N;
	cout << "请依次输入要访问的磁道号:";
	for (int i = 0; i < N; i++)
		cin >> TrackOrder[i];
	for (int j = 0; j < N; j++)
		MoveDistance[j] = 0;
	cout << "请输入开始磁道号:";
	cin >> BeginNum;
	for (int k = 0; k < N; k++)
		Finished[k] = false;
	for (int l = 0; l < N; l++)
		SortOrder[l] = TrackOrder[l];
}

//=====================排序函数,将各进程申请的磁道按从小到大排列=================//
void Sort() {
	                 //------冒泡排序
		int temp;
        for (int i = N - 1; i >= 0; i--)
		for (int j = 0; j < i; j++)
		{
			if (SortOrder[j] > SortOrder[j + 1])
			{
				swap(SortOrder[j], SortOrder[j + 1]);
			}
		}
}

//============FCFS,先来先服务=================================//
void FCFS() {
	int temp;
	temp = BeginNum;                                      //--------将BeginNum赋给temp作为寻道时的当前所在磁道号
	for (int i = 0; i < N; i++)
	{
		MoveDistance[i] = abs(TrackOrder[i] - temp);        //-------计算移动磁道数
		temp = TrackOrder[i];                             //-------寻到后,将此道作为当前所在磁道号,赋给temp
		FindOrder[i] = TrackOrder[i];                     //-------FindOrder为寻道序列 
	}
}

//========SSTF,最短寻道法=============================//
void SSTF() {
	int temp, n;
	int A = M;
	temp = BeginNum;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (abs(TrackOrder[j] - temp) < A && Finished[j] == false) {
				A = abs(TrackOrder[j] - temp);
				n = j;
			}
		}
		Finished[n] = true;
		MoveDistance[i] = A;
		temp = TrackOrder[n];
		FindOrder[i] = TrackOrder[n];
		A = M;
	}
}

//=====================SCAN,扫描算法==========================//
void SCAN() {
	int direction, pos, temp;
	temp = BeginNum;
	sort(SortOrder, SortOrder + N);           //升序排序 
	cout << "请选择开始方向:0向里,1向外";  //向里为延柱面号增加的方向 
	cin >> direction;
	
	for (int i = 0; i < N; i++) {
		if (SortOrder[i] > BeginNum) {
			pos = i;
			break;
		}
	}
	int k = 0;
	if (!direction) {
		for (int i = pos; i < N; i++) {
			MoveDistance[k] = abs(SortOrder[i] - temp);
			temp = SortOrder[i];
			FindOrder[k] = SortOrder[i];
			k++;
		}
		for (int j = pos - 1; j >= 0; j--) {    //调转方向 
			MoveDistance[k] = abs(SortOrder[j] - temp);
			temp = SortOrder[j];
			FindOrder[k] = SortOrder[j];
			k++;
		}
	} else {
		for (int i = pos - 1; i >= 0; i--) {
			MoveDistance[k] = abs(SortOrder[i] - temp);
			temp = SortOrder[i];
			FindOrder[k] = SortOrder[i];
			k++;
		}
		for (int j = pos; j <= N; j++) {    //调转方向 
			MoveDistance[k] = abs(SortOrder[j] - temp);
			temp = SortOrder[j];
			FindOrder[k] = SortOrder[j];
			k++;
		}	
	}	
}

//=================CSCAN,循环扫描算法=======================//
void CSCAN() {
	int direction, pos, temp;
	temp = BeginNum;
	sort(SortOrder, SortOrder + N);           //升序排序 
	cout << "请选择开始方向:0向里,1向外";  //向里为延柱面号增加的方向 
	cin >> direction;
	
	for (int i = 0; i < N; i++) {
		if (SortOrder[i] > BeginNum) {
			pos = i;
			break;
		}
	}
	int k = 0;
	if (!direction) {
		for (int i = pos; i < N; i++) {
			MoveDistance[k] = abs(SortOrder[i] - temp);
			temp = SortOrder[i];
			FindOrder[k] = SortOrder[i];
			k++;
		}
		for (int j = 0; j < pos; j++) {
			MoveDistance[k] = abs(SortOrder[j] - temp);
			temp = SortOrder[j];
			FindOrder[k] = SortOrder[j];
			k++;
		}
	} else {
		for (int i = pos - 1; i >= 0; i--) {
			MoveDistance[k] = abs(SortOrder[i] - temp);
			temp = SortOrder[i];
			FindOrder[k] = SortOrder[i];
			k++;
		}
		for (int j = N - 1; j >= pos; j--) {
			MoveDistance[k] = abs(SortOrder[j] - temp);
			temp = SortOrder[j];
			FindOrder[k] = SortOrder[j];
			k++;
		}	
	}
}
//========计算平均寻道时间==============
void Count() {
	int Total = 0;
	for (int i = 0; i < N; i++)
	{
		Total += MoveDistance[i];
	}
	AverageDistance = ((double)Total) / ((double)N);
}

void Show() {
	cout << "================从" << BeginNum << "号磁道开始=====================" << endl;
	cout << setw(20) << "被访问的下一个磁道号" << setw(20) << "移动距离(磁道数)" << endl;
	for (int i = 0; i < N; i++)
	{
		cout << setw(15) << FindOrder[i] << setw(15) << MoveDistance[i] << endl;
	}
	cout << setw(20) << "平均寻道长度:" << AverageDistance << endl;
	cout << endl;
}

int main() {
	int flag = 1;
	int s;
	input();
	while (flag == 1) {
		cout << "请选择寻道方式:1--FCFS; 2--SSTF; 3--SCAN;4--CSCAN;";
		cin >> s;
		switch (s) {
		case 1: FCFS(); Count(); Show(); break;
		case 2: SSTF(); Count(); Show(); break;
		case 3: SCAN(); Count(); Show(); break;
		case 4: CSCAN(); Count(); Show(); break;
		}
		cout << "是否继续选择寻道算法?1--是;2--否";
		cin >> flag;
	}
	system("pause");
	return 0;
}

打开程序“磁盘调度算法.cpp”文件,画出流程图。

内容:很抱歉,我们无法为您提供画流程图的服务。建议您使用在线流程图工具或手动绘制流程图。

磁盘调度算法:FCFS、SSTF、SCAN、CSCAN 实现与比较

原文地址: https://www.cveoy.top/t/topic/osg7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录