📄 nstepscan.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 + -