// 磁盘调度算法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
#include<cmath>
const int MaxNumber=100;
    int  TrackOrder[MaxNumber];//磁道访问序列
    int  MoveDistance[MaxNumber];//移动的磁道数
    double  AverageDistance;//平均寻道长度
    bool direction;//移动方向;若为1时是想磁道号增加的方向访问,否者,反方向访问。
    int visit[MaxNumber];
    int n;//磁道个数
    int m;//开始磁道号
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 初始化 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void initial(){
        //cout<<"输入磁道个数"<<endl;
        cin>>n;
        //cout<<"输入开始磁道序号"<<endl;
        cin>>m;
        //cout<<"初始化磁道访问序列"<<endl;
        for(int i=0;i<n;cin>>TrackOrder[i++]);
        for(int i=0;i<n;cout<<TrackOrder[i++]<<"  ");
        cout<<endl;
        
    }
    void display(){
        int i=0;
        for(int i=0;i<n;cout<<"被访问的磁道号: "<<TrackOrder[i]<<"  "<<"移动距离(磁道数): "<<MoveDistance[i]<<endl,i++);
        cout<<"平均寻道长度:  "<<AverageDistance<<endl;
    
    }

    void average_dis(){
        int sum=0;
        for(int i=0;i<n;i++)sum+=MoveDistance[i];
        AverageDistance=(sum*1.0)/n;
        
    }
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ FCFS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void FCFS(){
       int i=0;
       int now=m;
       for(i=0;i<n;i++)
       {MoveDistance[i]=(int)fabs(double(now-TrackOrder[i]));now=TrackOrder[i];}
       average_dis();
    }
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SSTF @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void SSTF(){
        int now=m;//当前磁道序号
        memset(visit,0,MaxNumber*sizeof(int));        
        int loop_time=n;
        int index=0;
        int distance=now-TrackOrder[index];
        int i=0;
        while(loop_time--)
        {
            
            for(i=0;i<n;i++)        
                if(!visit[i])
                {index=i;distance=(int)fabs(double(now-TrackOrder[i]));break;}            

            for(i=0;i<n;i++)
                if(!visit[i])
                    if((int)fabs(double(now-TrackOrder[i]))<distance)
                    {index=i;distance=(int)fabs(double(now-TrackOrder[i]));}        
            
            MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
            now=TrackOrder[index];
            visit[index]=true;
        
        }

         average_dis();
        
    }

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SCAN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void SCAN(){
        int now=m;//当前磁道序号
        memset(visit,0,MaxNumber*sizeof(int));    
        int index=0;int distance=0;
        int i=0,j=0;
        bool jmp=false;        
            //先由里向外;
            while(1)
            {
                jmp=true;
                for(j=0;j<n;j++)    
                {                
                    if(!visit[j] && TrackOrder[j]>m )
                    {
                        jmp=false;
                        index=j;
                        distance=TrackOrder[index];

                        for(i=0;i<n;i++)
                            if(!visit[i] && TrackOrder[i]>m)
                                if(TrackOrder[i]<distance)
                                {index=i;distance=TrackOrder[i];}    

                        MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
                        now=TrackOrder[index];
                        visit[index]=true;            
                    }                        
                }
                if(jmp)break;
            }
            //再由外到里;
            while(1)
            {
                jmp=true;
                for(j=0;j<n;j++)    
                {                
                    if(!visit[j] && TrackOrder[j]<m )
                    {
                        jmp=false;
                        index=j;
                        distance=TrackOrder[index];

                        for(i=0;i<n;i++)
                            if(!visit[i] && TrackOrder[i]<m)
                                if(TrackOrder[i]>distance)
                                {index=i;distance=TrackOrder[i];}    

                        MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
                        now=TrackOrder[index];
                        visit[index]=true;            
                    }                        
                }
                if(jmp)break;
            }    

             average_dis();
    
    }

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 循环SCAN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    void loop_SCAN(){
        fclose(stdin);
        freopen("CON","r",stdin);
        cout<<"请手动输入磁道访问方向(1表示增加方向;否者为减少方向)"<<endl;
        direction=1;
        cin>>direction;
        int now=m;//当前磁道序号
        memset(visit,0,MaxNumber*sizeof(int));         
        int index=0;int distance=0;
        int i=0,j=0;
        bool jmp=false;        
        
            if(direction==1){
            //始终想增加方向
                while(1)
                {
                    jmp=true;
                    for(j=0;j<n;j++)    
                    {                
                        if(!visit[j] && TrackOrder[j]>m )
                        {
                            jmp=false;
                            index=j;
                            distance=TrackOrder[index];

                            for(i=0;i<n;i++)
                                if(!visit[i] && TrackOrder[i]>m)
                                    if(TrackOrder[i]<distance)
                                    {index=i;distance=TrackOrder[i];}    

                            MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
                            now=TrackOrder[index];
                            visit[index]=true;            
                        }                        
                    }
                    if(jmp)break;
                }
                //再由外到里;
                while(1)
                {
                    jmp=true;
                    for(j=0;j<n;j++)    
                    {                
                        if(!visit[j] && TrackOrder[j]<m )
                        {
                            jmp=false;
                            index=j;
                            distance=TrackOrder[index];

                            for(i=0;i<n;i++)
                                if(!visit[i] && TrackOrder[i]<m)
                                    if(TrackOrder[i]<distance)
                                    {index=i;distance=TrackOrder[i];}    

                            MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
                            now=TrackOrder[index];
                            visit[index]=true;            
                        }                        
                    }
                    if(jmp)break;
                }        
            }
            else
            {
                while(1)
                    {
                        jmp=true;
                        for(j=0;j<n;j++)    
                        {                
                            if(!visit[j] && TrackOrder[j]>m )
                            {
                                jmp=false;
                                index=j;
                                distance=TrackOrder[index];

                                for(i=0;i<n;i++)
                                    if(!visit[i] && TrackOrder[i]>m)
                                        if(TrackOrder[i]>distance)
                                        {index=i;distance=TrackOrder[i];}    

                                MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
                                now=TrackOrder[index];
                                visit[index]=true;            
                            }                        
                        }
                        if(jmp)break;
                    }
                    //再由外到里;
                    while(1)
                    {
                        jmp=true;
                        for(j=0;j<n;j++)    
                        {                
                            if(!visit[j] && TrackOrder[j]<m )
                            {
                                jmp=false;
                                index=j;
                                distance=TrackOrder[index];

                                for(i=0;i<n;i++)
                                    if(!visit[i] && TrackOrder[i]<m)
                                        if( TrackOrder[i]>distance)
                                        {index=i;distance=TrackOrder[i];}    

                                MoveDistance[index]=(int)fabs(double(now-TrackOrder[index]));
                                now=TrackOrder[index];
                                visit[index]=true;            
                            }                        
                        }
                        if(jmp)break;
                    }        
            
            }

         average_dis();
    
    }

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 主函数 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

int _tmain(int argc, _TCHAR* argv[])
{
    freopen("text.txt","rt",stdin);
    int choice=0;
    initial();
    display();
    cout<<"******"<<endl;
    while(cin>>choice)
    {
        if(choice==1){cout<<"FCFS算法"<<endl;FCFS();display();}
        else if(choice==2){cout<<"SSTF算法"<<endl;SSTF();display();}
        else if(choice==3){cout<<"SCAN算法"<<endl;SCAN();display();}
        else if(choice==4){cout<<"循环SCAN算法"<<endl; loop_SCAN();display();}
        else cout<<"输入的选择算法的序列出错"<<endl;
    
    }
    return 0;
}

posted on 2012-12-01 14:46  叶城宇  阅读(283)  评论(0编辑  收藏  举报