// Test2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#define maxsize 100 //定义最大数组域
void FIFO(int array[],int m)//先进先出调度算法
{
int sum = 0;
int now; //当前的磁道
float avg;
cout << "请输入当前的磁道:" << endl;
cin >> now;
cout << "FIFO的磁盘调度结果为:" << endl;
cout << now << endl;
for (int i = 0; i < m; i++)
cout << array[i]<<'\t';
sum = abs(now - array[0]);
for (int j = 1; j < m; j++)
sum += abs(array[j] - array[j - 1]);
avg = (float)sum / m; //计算平均寻道长度
cout << endl;
cout << "移动的总道数为" <<sum<< endl;
cout << "平均寻道长度为:" <<avg<< endl;
}
void SSTF(int array[], int m) //最短服务时间优先调度算法
{
int temp;
int k = 1;
int now, l, r;
int sum = 0;
float avg;
for (int i = 0; i < m; i++)
{
for (int j = i + 1; j < m; j++) //对磁道号进行从小到大排列
{
if (array[i] > array[j])//两磁道号之间比较
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
for (int i = 0; i < m; i++) //输出排序后的磁道号数组
cout << array[i] << '\t';
cout << endl;
cout<<" 请输入当前的磁道: "<<endl;
cin >> now;
cout<<"SSTF磁盘调度结果: "<<endl;
if (array[m - 1] <= now)//判断整个数组里的数是否都小于当前磁道号
{
for (int i = m - 1; i >= 0; i--) //将数组磁道号从大到小输出
cout << array[i] << '\t';
sum = now - array[0];//计算移动距离
}
else if (array[0] >= now)//判断整个数组里的数是否都大于当前磁道号
{
for (int i = 0; i < m; i++) //将磁道号从小到大输出
cout << array[i] << '\t';
sum = array[m - 1] - now;//计算移动距离
}
else
{
while (array[k] < now)//逐一比较以确定 K 值
{
k++;
}
l = k - 1;
r = k;
//确定当前磁道在已排的序列中的位置
while ((l >= 0) && (r < m))
{
if ((now - array[l]) <= (array[r] - now))//判断最短距离
{
cout<< array[l]<<'\t';
sum += now - array[l];//计算移动距离
now = array[l];
l = l - 1;
}
else
{
cout<<array[r]<<endl;
sum += array[r] - now;//计算移动距离
now = array[r];
r = r + 1;
}
}
if (l = -1)
{
for (int j = r; j < m; j++)
{
cout<<array[j]<<endl;
}
sum += array[m - 1] - array[0];//计算移动距离
}
else
{
for (int j = l; j >= 0; j--)
{
cout<<array[j]<<endl;
}
sum += array[m - 1] - array[0];//计算移动距离
}
}
avg = (float)sum / m;
cout<<"移动的总道数"<<sum<<endl;
cout<<"平均寻道长度:"<<avg<<endl;
}
void SCAN(int array[], int m) //扫描算法
{
int sum = 0;
for (int i = 0; i < m; i++)
{
for (int j = i + 1; j < m; j++) //对磁道号进行从小到大排列
{
if (array[i] > array[j])//两磁道号之间比较
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
for (int i = 0; i < m; i++)
{
cout<<array[i]<<'\t';
}
cout << endl;
cout<<"请输入当前的磁道号: "<<endl;
int now;
cin>>now;
cout<<"SCAN磁盘调度结果:"<<endl;
int pos;
for (int i = 0; i < m; i++)
{
if (array[i] >= now)
{
pos = i;
sum += abs(array[i] - now);
break;
}
}
for (int i = pos; i < m; i++)
{
if (i != pos)
sum += abs(array[i] - array[i - 1]);
cout<<array[i]<<'\t';
}
if (pos >= 1)
sum += abs(array[m - 1] - array[pos - 1]);
for (int i = pos - 1; i >= 0; i--)
{
if (i)
sum += abs(array[i] - array[i - 1]);
cout<<array[i]<<'\t';
}
cout << endl;
cout << "移动的总道数:" << sum << endl;
cout<<"平均寻道长度:"<<1.0*sum / m<<endl;
}
void CSCAN(int array[], int m) //循环扫描算法
{
int sum = 0;
for (int i = 0; i < m; i++)
{
for (int j = i + 1; j < m; j++) //对磁道号进行从小到大排列
{
if (array[i] > array[j])//两磁道号之间比较
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
for (int i = 0; i < m; i++)
{
cout<<array[i]<<'\t';
}
cout << endl;
cout<<"请输入当前的磁道: "<<endl;
int now;
cin>>now;
cout<<"CSCAN磁盘调度结果:"<<endl;
int pos;
for (int i = 0; i < m; i++)
{
if (array[i] >= now)
{
pos = i;
sum += abs(array[i] - now);
break;
}
}
for (int i = pos; i < m; i++)
{
if (i != pos)
sum += abs(array[i] - array[i - 1]);
cout<<array[i]<<'\t';
}
if (pos >= 1)
sum += abs(array[m - 1] - array[0]);
for (int i = 0; i < pos; i++)
{
if (i)
sum += abs(array[i] - array[i - 1]);
cout<<array[i]<<'\t';
}
cout << endl;
cout << "移动的总道数:" << sum << endl;
cout<<"平均寻道长度:"<<1.0*sum / m<<endl;
}
int main()
{
int choice;
int count;
int m = 0;
int cidao[maxsize]; //定义磁道号数组
int b;
cout << "情输入磁盘数量:" << endl;
cin >> b;
cout << "请输入磁盘序列:" << endl;
for (int i = 0; i < b; i++)
{
cin >> cidao[i];
}
cout << "磁盘读取结果是:" << endl;
for (int i = 0; i < b; i++)
{
cout << cidao[i]<<'\t';
}
count = b;
cout << endl;
while (1)
{
cout << "------------磁盘选择算法-----------" << endl;
cout << "------------1.先进先出算法---------" << endl;
cout << "------------2.最短服务时间优先算法-" << endl;
cout << "------------3.扫描算法-------------" << endl;
cout << "------------4.循环扫描算法---------" << endl;
cout << "------------5.退出-----------------" << endl;
cout << "-------------请输入选择------------" << endl;
cin >> choice;
if (choice > 5)
break;
switch (choice)
{
case 1:
FIFO(cidao, count);
break;
case 2:
SSTF(cidao, count);
break;
case 3:
SCAN(cidao, count);
break;
case 4:
CSCAN(cidao, count);
break;
case 5:
exit(0);
}
}
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件