磁盤調度 FCFS、SSTF、SCAN 算法c++實現(大學生專用)

前言

大家放實驗報告裏面的時候,好歹要把變量名什麼的改改吧。。。一模一樣的給老師發現就不好了。。。


代碼

#include <iostream>
#include <algorithm>

#define MAX 10000
using namespace std;

//求平均尋道長度
double average(int *length, int n)
{
    double sum=0;
    for(int i= 0;i<n;i++)
        sum+=length[i];
    return sum/n;
}

//求移動赤道總數
double sum(int* length, int n)
{
    double sum_=0;
    for(int i= 0;i<n;i++)
        sum_+=length[i];
    return sum_;
}

void FCFS(int *a, int n, int now)
{
    int t=n;
    int start = now;
    int k=0;
    int next[MAX], length[MAX]; //next數組存放訪問序列,length存放每次訪問所移動的磁道數
    int visit[MAX]={0}; //標記某個赤道是否已被訪問過

    for(int i = 0;i < n;i++) {
        length[k] = abs(a[i] - now);
        next[k++] = a[i];
        now = a[i];
     }

    cout <<"\n磁道移動軌跡\n";
    cout << start <<" ";
    for(int i=0;i<n;i++)
       cout<<next[i]<<" ";
    cout <<endl;
    cout <<"移動磁道數 ="<<sum(length,n)<<endl;
    cout <<"平均尋道長度 = "<<average(length,n)<<endl;
}

void SSTF(int *a, int n, int now)
{
    
    int k = 0;
    int t = n;
    int start = now;
    int flag = 0; //最短路徑下標
    int next[MAX], length[MAX], visit[MAX]={0};

    while(t--)
    {
        int min=999999; //最短路徑
        for(int i=0;i<n;i++)
        {
            if(visit[i])
                continue;
            if(abs(a[i]-now)<min)
            {
                min = abs(a[i]-now);
                flag = i;
            }
        }
        length[k]=min;
        next[k++] = a[flag];
        visit[flag]=1;
        now = a[flag];
    }
    cout <<"\n磁道移動軌跡\n";
    cout<<start<<" ";
    for(int i=0;i<n;i++)
       cout<<next[i]<<" ";
    cout <<endl;
    cout <<"移動磁道數 ="<<sum(length,n)<<endl;
    cout <<"平均尋道長度 = "<<average(length,n)<<endl;
}

void SCAN(int *a, int n, int now)
{
    int flag=0,k=0;
    int start = now;
    int next[MAX], length[MAX];
    int b[MAX] = {0}; //替代a數組,否則下面的sort()會改變數組a
    for(int i=0;i<n;i++)
        b[i] = a[i];
    sort(b,b+n); //數組內部排序

    for(int i=0;i<n;i++)
    {
        if(b[i]>now)
        {
            flag = i;
            break;
        }
    }
    //往遞增方向
    for(int i = flag; i<n;i++)
    {
        next[k] = b[i];
        length[k++] = abs(b[i] - now);
        now = b[i];
    }
    //返回往遞減方向
    for(int i=flag-1;i>=0;i--)
    {
        next[k] = b[i];
        length[k++] = abs(b[i] - now);
        now = b[i];
    }
    cout <<"\n磁道移動軌跡\n";
    cout<<start<<" ";
    for(int i=0;i<n;i++)
        cout<<next[i]<<" ";
    cout <<endl;
    cout <<"移動磁道數 ="<<sum(length,n)<<endl;
    cout <<"平均尋道長度 = "<<average(length,n)<<endl;
}

int main()
{
    int a[MAX]; //存放要用到的磁道號
    int start; //開始磁道
    int n,flag =1 ;
    cout << "磁道數:";
    cin >> n;
    cout <<"磁道序列:";
    srand((int)time(0));
    for(int i=0;i<n;i++)
    {
        a[i] = rand()%1001; //磁道序列序號0~1000
        cout << a[i]<<" ";
    }
    cout <<endl;
    cout <<"開始時的磁道:";
    cin >>start;

    //磁盤調度目錄
	while(flag){
		cout<<"請選一種磁盤調度算法:"<<endl;;
		cout<<"1.先來先服務尋道算法"<<endl;
		cout<<"2.最短尋道時間優先"<<endl;
		cout<<"3.掃描算法"<<endl;
		cout<<"0.退出"<<endl;
		cin>>flag;
		switch(flag){
		    case 1:
		        FCFS(a,n,start);break;
		    case 2:
		        SSTF(a, n, start);break;
            case 3:
                SCAN(a, n, start);break;
            case 0:
			    break;
		}
	}
	return 0;
}

代碼比較簡單,只是能體現這三個算法的原理罷了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章