1. 程式人生 > >磁碟排程演算法其一(電梯演算法)

磁碟排程演算法其一(電梯演算法)

迴圈掃描演算法CSCAN:CSCAN演算法規定磁頭單向移動,例如,只是自裡向外移動,當磁頭移到最外的磁軌並訪問後,磁頭立即返回到最裡的欲訪問的磁軌,亦即將最小磁軌號緊接著最大磁軌號構成迴圈,進行迴圈掃描。

#include<stdio.h>   
#include<stdlib.h>  
#include<time.h>   
void time_random(int *t)//定義取時間隨機數   
{     
    int i,number=0;  
    srand((unsigned) time(NULL)); //用時間做種,每次產生隨機數不一樣,但還是可能會相同   
    for (i=0; i<20; i++)//取三十個隨機數,放入陣列t中   
    {     
        number = rand() % 201;//對21取餘   
        while(number==0)//若餘數為0,則一直取到不為0為止   
            number = rand() % 21; //產生1-20的隨機數  
        t[i]=number; //將隨機數賦給陣列   
    }   
}   
void Print(int *a)//列印陣列函式   
{  
    for(int i=0;a[i]!='\0';i++)//列印每一次排序的結果   
        printf("%d ",a[i]);  
    printf("\n");//輸個換行符  
}  
void Insert(int *a)//插入排序   
{     
    int j;int k;  
    int temp = 0;   
    for(int i=1;a[i]!='\0';i++)//假設第一個元素已經是有序佇列   
    {  
        for(j=0;j<i&&a[j]<a[i];)  
            j++;  
        if(i!=j)  
        {     
            temp = a[i];  
            for(k = i-1;k>=j;k--)  
                a[k+1]=a[k];  
            a[j] = temp;   
        }         
    }   
}  
void change(int *a,int *b)  
{     
    int i,j = 0;  
    for(i =  1;j<15;i++)  
    {  
        if(a[i]!=a[i-1])  
        {  
            b[j]=a[i-1];  
            j++;  
        }     
    }  
    b[15]='\0';  
}  
void run(int *x)  
{     
    int loc ;  
    int avglength;  
    for(loc = 0;loc<15&&x[loc]<100;loc++)  
        ;//空語句,只為 loc++   
    avglength = x[14]*2-x[0]-100;  
    avglength /=15;  
    for(int i = loc;i<15;i++)  
    {     
        printf("\n%3d訪問",x[i]);  
        x[i] = '0';  
    }  
    for(int j = loc-1;j>=0;j--)  
    {  
        printf("\n%3d訪問",x[j]);  
        x[j] = '0';   
    }  
    printf("\n\n平均尋道長度:%d",avglength);   
}  
int main()  
{         
    int t[21]={0};  
    int tx[16];  
    time_random(t);  
    Insert(t);  
    printf("磁頭在100號磁軌上,並向磁軌號增加的方向上移動\n");   
    printf("\n15個程序訪問磁碟:\n");  
    change(t,tx);  
    Print(tx);   
    //開始執行   
    run(tx);      
    return 0;  
}