C++实现 循环扫描算法 【输入】 当前磁头位置: 磁头运动方向:(1:正向,磁道号增加的方向移动,0:反向,磁道号增加的方向移动) 磁盘读写请求队列(用顿号隔开): 【输出】 磁盘访问序列 平均移动道数为
时间: 2024-02-26 10:57:58 浏览: 213
很抱歉,我刚才的回答出现了重复。以下是 C++ 实现的循环扫描算法,可以解决你提出的问题:
```c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int cur_pos, direction, sum = 0;
string queue_str;
vector<int> queue;
cout << "当前磁头位置:";
cin >> cur_pos;
cout << "磁头运动方向:(1:正向,0:反向)";
cin >> direction;
cout << "磁盘读写请求队列(用顿号隔开):";
cin >> queue_str;
stringstream ss(queue_str);
string token;
while (getline(ss, token, ' ')) {
queue.push_back(stoi(token));
}
queue.push_back(cur_pos);
sort(queue.begin(), queue.end());
int idx = 0;
for (int i = 0; i < queue.size(); i++) {
if (queue[i] == cur_pos) {
idx = i;
break;
}
}
if (direction == 1) {
for (int i = idx; i < queue.size(); i++) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
for (int i = 0; i < idx; i++) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
} else {
for (int i = idx; i >= 0; i--) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
for (int i = queue.size() - 1; i > idx; i--) {
cout << queue[i] << " ";
sum += abs(queue[i] - cur_pos);
cur_pos = queue[i];
}
}
double avg = (double) sum / (double) queue.size();
cout << "\n平均移动道数为:" << avg << endl;
return 0;
}
```
这个程序可以接收用户输入的当前磁头位置、磁头运动方向和磁盘读写请求队列,然后输出磁盘访问序列和平均移动道数。具体实现如下:
首先,读入用户输入的数据,并将磁盘读写请求队列从字符串转换成 vector<int> 类型。在队列末尾加入当前磁头位置,并将队列排序。
其次,找到当前磁头位置在队列中的位置 idx,然后根据磁头运动方向选择正向或反向扫描。
如果是正向扫描,从 idx 开始,按顺序输出队列中的元素,计算磁头移动道数,并将磁头位置更新为当前元素的位置。然后,从队首开始,按顺序输出队列中的元素,计算磁头移动道数,并更新磁头位置。如果是反向扫描,类似地处理即可。
最后,计算平均移动道数并输出即可。
注意,在实际使用中,需要将输入和输出的部分改为适合实际应用的形式。同时,在程序中尽量添加注释,保证代码的可读性和可维护性。
阅读全文