⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nstepscan.txt

📁 课程设计之磁盘调度算法:N-Step—Scan
💻 TXT
字号:
//  Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"

int L,P;
int a[20];
int flag;//访问位
typedef struct TASK
{
 int requrie;
 int io;

} TASK;

TASK T[50][50];
TASK N[50];

int diskway;//当前磁道

void iodowith();

void init()
{   
 int i,j;
 for(i=0;i<20;i++)
 {
  for(j=0;j<20;j++)
  {
   T[i][j].requrie=-1;
      
  }
 }
 for(i=0;i<L;i++)
 {
  for(j=0;j<P;j++)
  {
   T[i][j].requrie=rand()%200;
      T[i][j].io=rand()%2;
  }
 }

}
void output()
{
 printf("磁盘访问的初始顺序是:\n");
  for(int i=0;i<L;i++)
 {
   printf("第%d组是:\n",i+1);
  for(int j=0;j<P;j++)
  {
   printf("%d %d\t",T[i][j].requrie,T[i][j].io);
  
  }
  printf("\n");
 }
}


void sort_btos(TASK x[],int n)
{ 
 int i,j,k;
 TASK t;
 for(i=0;i<n-1;i++)
 {
  k=i;
  for(j=i+1;j<n;j++)
   if(x[j].requrie>x[k].requrie)
    k=j;
   if(k!=i)
   {
    t=x[i];
    x[i]=x[k];
    x[k]=t;
   }
 }

}

void sort_stob(TASK x[],int n)
{ int i,j,k;
 TASK t;
 for(i=0;i<n-1;i++)
 {
  k=i;
  for(j=i+1;j<n;j++)
   if(x[j].requrie<x[k].requrie)
    k=j;
   if(k!=i)
   {
    t=x[i];
    x[i]=x[k];
    x[k]=t;
   }
 }

}

void SortInToOut(TASK x[],int nowdiskway,int num)
{
        TASK a[50],b[50];
  int s=0,t=0;
  for(int i=0;i<num;i++)
 {
 
  if(x[i].requrie>=nowdiskway)
  {
          a[t]=x[i];
    t++;
          
  }
  else
  {
          b[s]=x[i];
    s++;
  
  }

 }
 sort_stob(a,t);
 sort_btos(b,s);
 for(i=0;i<t;i++)
 {
        x[i]=a[i];
 }
 for(i=t;i<num;i++)
 {
  x[i]=b[i-t];
 }
}

void SortOutToIn(TASK x[],int nowdiskway,int num)
{
        TASK a[50],b[50];
  int s=0,t=0;
  for(int i=0;i<num;i++)
 {
 
  if(x[i].requrie<=nowdiskway)
  {
          a[t]=x[i];
    t++;
         }
  else
  {
          b[s]=x[i];
    s++;
  }

 }
 sort_btos(a,t);
 sort_stob(b,s);
 for(i=0;i<t;i++)
 {
        x[i]=a[i];
 }
 for(i=t;i<num;i++)
 {
  x[i]=b[i-t];
 }
}

void iodowith()
{   
 
 int p=P;
    a[0]=p;
 for(int i=0;i<L;i++)
 {   
  if(i==L-1)
  {   
   p=0;
   for(int j=0;j<P;j++)
   {   
   if(T[i][j].io==1)
   {       
    
   T[i+1][p].requrie=rand()%200;
   printf("在第%d队第%d行设定io请求%d\n",i+1,j+1,T[i+1][p].requrie);
   p++;
   }
   a[i+1]=p;
  }

  }
  else
  {
  p=P;
        for(int j=0;j<P;j++)
  {  
   if(T[i][j].io==1)
   {       
   T[i+1][p].requrie=rand()%200;
   printf("在第%d队第%d行设定io请求%d\n",i+1,j+1,T[i+1][p].requrie);
   p++;
   }
  }
  a[i+1]=p;
  }
 }


}
void NStepScan()
{   
 
 int D[50];
 int M;
 TASK Y[50];
 printf("-----------------------------------------------------\n");

 printf("next disk number\tmove distance\n");
    
    

 for(int i=0;i<L+1;i++)
 {   
        
  M=a[i];

  for(int j=0;j<M;j++)
  {
  
   N[j]=T[i][j];
  
  }

        if(i==0)
  {

  if(flag==1)
  SortInToOut(N,diskway,M);
  else
  {SortOutToIn(N,diskway,M);}
  for(int j=0;j<M;j++)
  {
   Y[j]=N[j];
  }
  
  }
  else
  {
    if(Y[a[i-1]-2].requrie<Y[a[i-1]-1].requrie)
    {
     SortInToOut(N,diskway,M);
    }
    else
    {
                     SortOutToIn(N,diskway,M);
    }
  
    for(int j=0;j<M;j++)
  
    {
   
     Y[j]=N[j];
  
    }

  }


        D[0]=abs(diskway-N[0].requrie);

  for(int t=1;t<M;t++)
        {
   D[t]=abs(N[t].requrie-N[t-1].requrie);      
  }

     printf("-----------------------------------------------------\n");

  printf("第%d组的情况:\n",i+1);

  for(t=0;t<M;t++)
  {

   printf("\t%3d\t\t\t%3d\n",N[t].requrie,D[t]);

  }

  diskway=N[M-1].requrie;
 }
    

}

int main(int argc, char* argv[])
{
    
    
 printf("n-STEP-SCAN算演示!\n");

    printf("随机产生小于200的磁道号\n");

 printf("请输入队列个数 队列中磁道个数 输入当前磁道号(0-200)\n");
    
    printf("请设定此时磁盘访问的方向(1.从里向外 2.从外向里)\n");

    scanf("%d%d%d%d",&L,&P,&diskway,&flag);

    init();

    output();
 
    iodowith();
    
    NStepScan();

 return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -