#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include <time.h>
using namespace std;
const int maxn = 100;
int n, now, s, sum, nnow, everage, p[maxn], b[maxn], sp[maxn], lenp[maxn];
//显示结果
void show()
{
sum = 0;
printf("磁盘请求的服务状况:");
printf("%d",now);
for(int i = 0;i < n; ++i)
{
printf("->%d ",sp[i]);
sum += lenp[i];
}printf("\n");
printf("移动的距离:");
for(int j = 0;j<n;j++){
printf("%d ",lenp[j]);
}
printf("\n");
cout <<"平均寻道长度: "<<(double)sum/n <<"\n";
}
//先来先服务
void FCFS()
{
for(int i = 0;i < n; ++i)
{
sp[i] = p[i];
if(i) lenp[i] = abs(sp[i-1] - sp[i]);
else lenp[i] = abs(now - sp[i]);
}
}
//最短寻道优先
void SSTF()
{
nnow = now;
int fl[maxn] = {0};
for(int i = 0;i < n; ++i)
{
int minx = 999999, pp;
for(int j = 0;j < n; ++j)
{
if(!fl[j] && abs(nnow - p[j]) < minx)
{
minx = abs(nnow - p[j]);
pp = j;
}
}
sp[i] = p[pp];
lenp[i] = minx;
nnow = p[pp];
fl[pp] = 1;
}
}
//扫描算法
bool cmp(int a, int b)
{
return a > b;
}
void SCAN()
{
nnow = now;
int aa[maxn], bb[maxn], ak = 0, bk = 0;
for(int i = 0;i < n; ++i)
{
if(p[i] < nnow) aa[ak++] = p[i];
else bb[bk++] = p[i];
}
sort(aa, aa+ak,cmp);
sort(bb, bb+bk);
int k = 0;
for(int j = 0;j < bk; ++j)
{
sp[k] = bb[j];
lenp[k++] = bb[j] - nnow;
nnow = bb[j];
}
for(int n = 0; n< ak; ++n)
{
sp[k] = aa[n];
lenp[k++] = nnow - aa[n];
nnow = aa[n];
}
}
//循环扫描算法
void CSCAN()
{
nnow = now;
int aa[maxn], bb[maxn], ak = 0, bk = 0;
for(int i = 0;i < n; ++i)
{
if(p[i] < nnow) aa[ak++] = p[i];
else bb[bk++] = p[i];
}
sort(aa, aa+ak);
sort(bb, bb+bk);
int k = 0;
for(int j = 0;j < bk; ++j)
{
sp[k] = bb[j];
lenp[k++] = bb[j] - nnow;
nnow = bb[j];
}
for(int a = 0;a < ak; ++a)
{
sp[k] = aa[a];
lenp[k++] = abs(aa[a] - nnow);
nnow = aa[a];
}
}
int main()
{
xbegin:
srand(time(NULL)); //添加随机数种子
n = rand() % 15 + 1;
printf("总磁道数:%d\n",n);
if(n <= 0 || n > 100)
{
cout <<"输入不合法,请重新输入!\n";
goto xbegin;
}
nowCD:
now = rand() % 100;
printf("当前磁道:%d\n",now);
if(now < 0)
{
cout <<"磁道不存在,请重新输入!";
goto nowCD;
}
pCD:
printf("随机磁盘序列:");
for(int i = 0;i < n; ++i)
{
b[i] = rand() % 200 + 1;
printf("%d ",b[i]);
if(p[i] < 0)
{
cout <<"输入中有不存在的磁道,请重新输入!\n";
goto pCD;
}
} printf("\n");
serve:
cout <<" 1、先来先服务算法(FCFS)\n";
cout <<" 2、最短寻道优先算法(SSTF)\n";
cout <<" 3、扫描算法(SCAN)\n";
cout <<" 4、循环扫描算法(CSCAN)\n";
cout <<"请输入所用磁盘调度的算法: ";
cin >> s;
if(s < 1 || s > 4)
{
cout <<"输入有误,请重新输入!\n";
goto serve;
}
work:
for(int k = 0;k < n; ++k) p[k] = b[k];
if(s == 1) FCFS();
else if(s == 2) SSTF();
else if(s == 3) SCAN();
else CSCAN();
show();
xend:
char ch;
cout <<"重新选择算法或重新输入数据(输入C选择算法,输入R重新输入数据): ";
cin >> ch;
if(ch == 'C') goto serve;
if(ch == 'R') goto xbegin;
return 0;
}