实验六的SCAN和C-SCAN算法(xjb写的憋照抄啊=。=

void SCAN(int array[],int m){
    int temp;
    int now;
    int pos;
    int i,j,sum=0;
    float avg;
    for(i=0;i<m;i++){
        for(j=i+1;j<m;j++){ //对磁道号进行从小到大排列
            if(array[i]>array[j]){ //两磁道号之间比较
                temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
        }
    }
    for( i=0;i<m;i++)//输出排序后的磁道号数组
        printf("%d ",array[i]);
    printf("\n 请输入当前的磁道号:");
    scanf("%d",&now);
    printf("\n SSTF 调度结果: ");
    {
        pos = 0;
        for(i = 0; i < m; i++){  //找到 第一个 大于等于 当前磁道 的 在要操作的磁道序列中 的 磁道
            if(now <= array[i]){
                pos = i;         //pos 记录下找到的磁道在 在要操作的磁道序列中 的 序数
                break;
            }
        }
        for(i = pos; i < m; i++) printf("%d ", array[i]);   //从 当前磁道 往序数最大的磁道移动
        for(i = pos - 1; i >= 0; i--) printf("%d ", array[i]);  //翻转方向(向序数小的方向移动)向序数最小的磁道移动
        sum = array[m - 1] - now + (pos ? array[m - 1] - array[0] : 0);/* ( array[m - 1] - now )  : 从最开始在的磁道向最大的磁道移动的距离
                                                                        ( pos ? array[m - 1] - array[0] + array[pos - 1] : 0 )  : 如果最开始在的磁道比要操作的序数最小的磁道还要小就不用翻转方向再移动了 */
    }
    avg=(float)sum/m;
    printf("\n 移动的总道数: %d \n",sum);
    printf(" 平均寻道长度: %f \n",avg);
}

void CSCAN(int array[],int m){
    int temp;
    int now;
    int pos;
    int i,j,sum=0;
    float avg;
    for(i=0;i<m;i++){
        for(j=i+1;j<m;j++){ //对磁道号进行从小到大排列
            if(array[i]>array[j]){ //两磁道号之间比较
                temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
        }
    }
    for( i=0;i<m;i++)//输出排序后的磁道号数组
        printf("%d ",array[i]);
    printf("\n 请输入当前的磁道号:");
    scanf("%d",&now);
    printf("\n SSTF 调度结果: ");
    {
        pos = 0;
        for(i = 0; i < m; i++){  //找到 第一个 大于等于 当前磁道 的 在要操作的磁道序列中 的 磁道
            if(now <= array[i]){
                pos = i;         //pos 记录下找到的磁道在 在要操作的磁道序列中 的 序数
                break;
            }
        }
        for(i = pos; i < m; i++) printf("%d ", array[i]);  //从 当前磁道 往序数最大的磁道移动
                                                           //然后返回磁道另一端(序数最小的磁道) (并不需要什么操作
        for(i = 0; i < pos; i++) printf("%d ", array[i]);  //从磁道另一端(序数最小的磁道)沿相同方向(向序数大的方向移动)向不大于 最开始在的磁道 的磁道移动
        sum = array[m - 1] - now + (pos ? array[m - 1] - array[0] + array[pos - 1] : 0); /* ( array[m - 1] - now )  : 从最开始在的磁道向最大的磁道移动的距离
                                                                                          ( pos ? array[m - 1] - array[0] + array[pos - 1] : 0 )  : 如果最开始在的磁道比要操作的序数最小的磁道还要小就不用返回另一端了 */
    }
    avg=(float)sum/m;
    printf("\n 移动的总道数: %d \n",sum);
    printf(" 平均寻道长度: %f \n",avg);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容