模拟磁盘调度算法 c++

测试结果

流程图

代码实现:

#include<stdio.h>
#include <math.h>
#define INF 999999
typedef struct {
    int pid;//磁道号 
    bool time;//计数器
    //int *element;//线性表的起始地址
}SeqList;

/**********SSTF算法*********/
void SSTF(int n,SeqList *L,int temp){
    int i;
    int k=0;
    int m=n;
    double sum=0;
    int min=INF;
    printf("---------------------------------\n");
    printf("| 下一个磁道号  |  移动的磁道数 |\n");
    printf("---------------------------------\n");
    while(m){
        for(i=0;i<n;i++){
            if(abs(temp-L[i].pid)<min&&(L[i].time==true)){
                min=abs(temp-L[i].pid);
                k=i;
            }
        }
        L[k].time=false;
        sum+=min;
        printf("|%d\t\t|%d\t\t|\n",L[k].pid,min);
        temp=L[k].pid;
        m--;
        min=INF;
    }
    printf("---------------------------------\n");
    printf("平均寻道长度为:%0.2lf\n",sum/(double)n);
}

/**********SCAN算法*********/
void Sort(int *a,int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = i+1; j < n; j++)
        {
            if (a[j] < a[i]){
                int temp=a[j];a[j]=a[i];a[i]=temp;    
            }        
        }
    }
}
void SCAN(int n,SeqList *L,int temp){
    int i;
    int k1=0,k2=0;
    double sum=0;
    int min;
    int a[100],b[100];
    for(i=0;i<n;i++){
        if(L[i].pid<temp)
            a[k1++]=L[i].pid;
        else
            b[k2++]=L[i].pid;
        L[i].time=false;
    }
    Sort(a,k1);
    Sort(b,k2);
    printf("---------------------------------\n");
    printf("| 下一个磁道号  |  移动的磁道数 |\n");
    printf("---------------------------------\n");
    for(i=0;i<k2;i++){
        min=b[i]-temp;
        temp=b[i];
        printf("|%d\t\t|%d\t\t|\n",b[i],min);
        sum+=min;
    }
    for(i=k1-1;i>=0;i--){
        min=abs(a[i]-temp);
        temp=a[i];
        printf("|%d\t\t|%d\t\t|\n",a[i],min);
        sum+=min;
    }
    
    printf("---------------------------------\n");
    printf("平均寻道长度为:%0.2lf\n",sum/(double)n);
}

/**********CSCAN算法*********/
void CSCAN(int n,SeqList *L,int temp){
    int i;
    int k1=0,k2=0;
    double sum=0;
    int min;
    int a[100],b[100];
    for(i=0;i<n;i++){
        if(L[i].pid<temp)
            a[k1++]=L[i].pid;
        else
            b[k2++]=L[i].pid;
        L[i].time=false;
    }
    Sort(a,k1);
    Sort(b,k2);
    printf("---------------------------------\n");
    printf("| 下一个磁道号  |  移动的磁道数 |\n");
    printf("---------------------------------\n");
    for(i=0;i<k2;i++){
        min=b[i]-temp;
        temp=b[i];
        printf("|%d\t\t|%d\t\t|\n",b[i],min);
        sum+=min;
    }
    for(i=0;i<k1;i++){
        min=abs(a[i]-temp);
        temp=a[i];
        printf("|%d\t\t|%d\t\t|\n",a[i],min);
        sum+=min;
    }
    
    printf("---------------------------------\n");
    printf("平均寻道长度为:%0.2lf\n", sum/(double)n);
}

int main(){
    int k;
    int i;
    int temp=100;//当前磁道位置
    printf("\n==================");
    printf("\n= 1.SSTF算法     =" );
    printf("\n= 2.SCAN算法     =");
    printf("\n= 3.CSCAN算法    =");
    printf("\n= 0.结束程序     =");
    printf("\n==================");    
    do
    {
    printf("\n 请选择: \n");
    scanf("%d", &k);
    switch(k)
    {
    case 1:{
            int n;
            SeqList L1[100];
            printf("请输入磁道请求数:\n");
            scanf("%d",&n);
            printf("请输入磁道请求序列:\n");
            for(i=0;i<n;i++){
                scanf("%d",&L1[i].pid);
                L1[i].time=true;
            }
            printf("当前磁头所在位置为%d\n",temp);
            SSTF(n,L1,temp);
            break;
           }
    case 2:{
            int n;
            SeqList L2[100];
            printf("请输入磁道请求数:\n");
            scanf("%d",&n);
            printf("请输入磁道请求序列:\n");
            for(i=0;i<n;i++){
                scanf("%d",&L2[i].pid);
                L2[i].time=true;
            }
            printf("当前磁头所在位置为%d\n",temp);
            SCAN(n,L2,temp);
            break;
           }
    case 3:{
            int n;
            SeqList L3[100];
            printf("请输入磁道请求数:\n");
            scanf("%d",&n);
            printf("请输入磁道请求序列:\n");
            for(i=0;i<n;i++){
                scanf("%d",&L3[i].pid);
                L3[i].time=true;
            }
            printf("当前磁头所在位置为%d\n",temp);
            CSCAN(n,L3,temp);
            break;
           }
        default:return 0;
    } 
    }while(k!=0);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xiaojiansuibi/p/13171520.html